مسابقه دانش‌دخت
اسلامیکال از تاریخ ۱۵ دی تا ۲۰ بهمن، میزبان یک همایه با موضوع زنان است. شما می‌توانید در مسابقه مقاله‌نویسی دانش‌دخت، شرکت کنید و با نگارش مقاله، از جوایز آن بهره‌مند باشید. اگر به موضوعات مربوط با زنان علاقه‌مندید، این فرصت را از دست ندهید. فهرستی از مقالات پیشنهادی جهت ایجاد یا ویرایش در اینجا وجود دارد.

پودمان:Infobox military conflict

از اسلامیکال
نسخهٔ تاریخ ‏۲۰ ژانویهٔ ۲۰۲۳، ساعت ۱۲:۳۹ توسط Mojtabakd (بحث | مشارکت‌ها) (ایجاد پودمان)
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)
پرش به ناوبری پرش به جستجو

توضیحات این پودمان می‌تواند در پودمان:Infobox military conflict/توضیحات قرار گیرد.

require('Module:No globals')

local infoboxStyle = mw.loadData('Module:WPMILHIST Infobox style')
local templatestyles = 'Module:Infobox military conflict/styles.css'

local IMC = {}
IMC.__index = IMC

function IMC:renderPerCombatant(builder, headerText, prefix, suffix)
	prefix = prefix or ''
	suffix = suffix or ''
	local colspans = {}
	
	-- This may result in colspans[1] getting set twice, but
	-- this is no big deal. The second set will be correct.
	local lastCombatant = 1
	
	for i = 1,self.combatants do
		if self.args[prefix .. i .. suffix] then
			colspans[lastCombatant] = i - lastCombatant
			lastCombatant = i
		end
	end

	local jointText = self.args[prefix .. (self.combatants + 1) .. suffix]
	
	if headerText and (colspans[1] or jointText) then
		builder:tag('tr')
			:tag('th')
				:attr('colspan', self.combatants)
				:cssText(infoboxStyle.header_raw)
				:wikitext(headerText)
	end

	-- The only time colspans[1] wouldn't be set is if no
	-- combatant has a field with the given prefix and suffix.
	if colspans[1] then
		-- Since each found argument set the colspan for the previous
		-- one, the final one wasn't set above, so set it now.
		colspans[lastCombatant] = self.combatants - lastCombatant + 1
		builder = builder:tag('tr')
		for i = 1,self.combatants do
			-- At this point, colspans[i] will be set for i=1 unconditionally, and for
			-- any other value of i where self.args[prefix .. i .. suffix] is set.
			if colspans[i] then
				builder:tag('td')
					-- don't bother emitting colspan="1"
					:attr('colspan', colspans[i] ~= 1 and colspans[i] or nil)
					:css('width', math.floor(100 / self.combatants * colspans[i] + 0.5) .. '%')
					-- no border on the right of the rightmost column
					:css('border-left', i ~= lastCombatant and infoboxStyle.internal_border or nil)
					-- no padding on the left of the leftmost column
					:css('padding-right', i ~= 1 and '0.25em' or nil)
					-- don't show the border if we're directly under a header
					:css('border-top', not headerText and infoboxStyle.internal_border or nil)
					:newline()
					:wikitext(self.args[prefix .. i .. suffix])
			end
		end
	end

	if jointText then
		builder:tag('tr')
			:tag('td')
				:attr('colspan', self.combatants)
				:css('text-align', 'center')
				-- don't show the border if we're directly under a header
				:css('border-top', (not headerText or colspans[1]) and infoboxStyle.internal_border or nil)
				:newline()
				:wikitext(jointText)
	end
end

function IMC:renderHeaderTable(builder)
	builder = builder:tag('table')
		:css('width', '100%')
		:css('margin', 0)
		:css('padding', 0)
		:css('border', 0)
		:css('display', 'inline-table')

	if self.args.date then
		builder:tag('tr')
			:tag('th')
				:css('padding-left', '1em')
				:wikitext('تاریخ')
			:done()
			:tag('td')
				:wikitext(self.args.date)
	end

	builder = builder:tag('tr')
		:tag('th')
			:css('padding-left', '1em')
			:wikitext('موقعیت')
		:done()
		:tag('td')
			:tag('div')
				:addClass('location')
				:wikitext(self.args.place or '{{{place}}}') -- hack so that people who don't know Lua know that this parameter is required
			:done()
	if self.args.coordinates then
		builder:wikitext(self.args.coordinates)
	end
	builder = builder:done():done()

	-- only for "Putsch"
    if self.args.action then
		builder:tag('tr')
			:tag('th')
				:css('padding-left', '1em')
				:wikitext(self.args.action and 'عمل')
			:done()
			:tag('td')
				:wikitext(self.args.action)
	end

	if self.args.status or self.args.result then
		builder:tag('tr')
			:tag('th')
				:css('padding-left', '1em')
				:wikitext(self.args.status and 'وضعیت' or 'نتایج')
			:done()
			:tag('td')
				:addClass('status')
				:newline()
				:wikitext(self.args.status or self.args.result)
	end

	if self.args.territory then
		builder:tag('tr')
			:tag('th')
				:css('padding-left', '1em')
				:wikitext('تغییرات<br />قلمرو')
			:done()
			:tag('td')
				:newline()
				:wikitext(self.args.territory)
	end
end

function IMC:render()
	local builder = mw.html.create()
	if self.args.campaignbox then
		-- this should be the same as using {{stack|clear=right|...}}
		builder:wikitext(self.frame:expandTemplate{ title = 'stack begin', args = { clear='true'} })
	end
	builder = builder:tag('table')
		:addClass('infobox vevent')
		:cssText(infoboxStyle.main_box_raw)
		:css('width', self.args.width or nil)

	builder:tag('tr')
		:tag('th')
			:addClass('summary')
			:attr('colspan', self.combatants)
			:cssText(infoboxStyle.header_raw)
			:wikitext(self.args.conflict or mw.title.getCurrentTitle().text)
	if self.args.partof then
		builder:tag('tr')
			:tag('td')
				:attr('colspan', self.combatants)
				:cssText(infoboxStyle.sub_header_raw)
				:wikitext('بخشی از ' .. self.args.partof)
	end
	if self.args.image then
		builder:tag('tr')
			:tag('td')
				:attr('colspan', self.combatants)
				:cssText(infoboxStyle.image_box_raw)
				:wikitext(string.format('%s%s%s',
					require('Module:InfoboxImage').InfoboxImage{args = {
						image = self.args.image,
						size = self.args.image_size,
						sizedefault = 'frameless',
						upright = 1,
						alt = self.args.alt
					}},
					self.args.caption and '<br />' or '',
					self.args.caption or ''
				))
	end
	self:renderHeaderTable(builder:tag('tr'):tag('td'):attr('colspan', self.combatants))
	self:renderPerCombatant(builder, self.args.combatants_header or 'طرف‌های درگیر', 'combatant')
	-- can be un-hardcoded once gerrit:165108 is merged
	for _,v in ipairs{'a','b','c','d'} do
		self:renderPerCombatant(builder, nil, 'combatant', v)
	end
	
	self:renderPerCombatant(builder, self.args.commanders_header or 'فرماندهان و رهبران', 'commander')
	for _,v in ipairs{'a','b','c','d'} do
		self:renderPerCombatant(builder, nil, 'commander', v)
	end
	
	self:renderPerCombatant(builder, self.args.units_header or 'واحدهای درگیر', 'units')
	self:renderPerCombatant(builder, self.args.strengths_header or 'قوا', 'strength')
	self:renderPerCombatant(builder, self.args.polstrengths_header or 'پشتیبانی سیاسی', 'polstrength')
	self:renderPerCombatant(builder, self.args.milstrengths_header or 'پشتیبانی نظامی', 'milstrength')
	self:renderPerCombatant(builder, self.args.casualties_header or 'تلفات و ضایعات', 'casualties')

	if self.args.notes then
		builder:tag('tr')
			:tag('td')
				:attr('colspan', self.combatants)
				:css('border-top', infoboxStyle.section_border)
				:newline()
				:wikitext(self.args.notes)
	end
	if self.args.map_type then
		builder:tag('tr')
			:tag('td')
				:attr('colspan', self.combatants)
				:css('border-top', infoboxStyle.internal_border)
				:node(require('Module:Location map').main(self.frame, {
					self.args.map_type,
					relief = self.args.map_relief,
					coordinates = self.args.coordinates,
					width = self.args.map_size or 220,
					float = 'center',
					border = 'none',
					mark = self.args.map_mark,
					marksize = self.args.map_marksize or 8,
					label = self.args.map_label,
					alt = self.args.map_alt,
					caption = self.args.map_caption or ('موقعیت در ' 
						.. (require('Module:Location map').data(self.frame, {self.args.map_type, 'name'})))
				}))
	end
	builder = builder:done()
	if self.args.campaignbox then
		builder = builder:done()
		builder:wikitext(self.args.campaignbox .. self.frame:expandTemplate{ title = 'stack end'})
	end
	return builder
end

function IMC.new(frame, args)
	if not args then
		args = require('Module:Arguments').getArgs(frame, {wrappers = { 'الگو:Infobox military conflict', 'الگو:جعبه اطلاعات درگیری نظامی' } })
		  if args['اندازه تصویر'] then args.image_size = args['اندازه تصویر'] end
          if args['اندازه نشانگر نقشه'] then args.map_marksize = args['اندازه نشانگر نقشه'] end
          if args['اندازه نقشه'] then args.map_size = args['اندازه نقشه'] end
          if args['بخشی از'] then args.partof = args['بخشی از'] end
          if args['برچسب نقشه'] then args.map_label = args['برچسب نقشه'] end
          if args['پانویس'] then args.notes = args['پانویس'] end
          if args['تاریخ'] then args.date = args['تاریخ'] end
          if args['تصویر'] then args.image = args['تصویر'] end
          if args['توضیح تصویر'] then args.caption = args['توضیح تصویر'] end
          if args['توضیح نقشه'] then args.map_caption = args['توضیح نقشه'] end
          if args['جایگزین'] then args.alt = args['جایگزین'] end
          if args['جعبه لشکرکشی'] then args.campaignbox = args['جعبه لشکرکشی'] end
          if args['درگیری'] then args.conflict = args['درگیری'] end
          if args['سرآیند طرفین درگیر'] then args.combatants_header = args['سرآیند طرفین درگیر'] end
          if args['عرض'] then args.width = args['عرض'] end
          if args['عمل'] then args.action = args['عمل'] end
          if args['قلمرو'] then args.territory = args['قلمرو'] end
          if args['مختصات'] then args.coordinates = args['مختصات'] end
          if args['مکان'] then args.place = args['مکان'] end
          if args['نتیجه'] then args.result = args['نتیجه'] end
          if args['نشانگر نقشه'] then args.map_mark = args['نشانگر نقشه'] end
          if args['نقشه'] then args.map_type = args['نقشه'] end
          if args['نقشه برجسته'] then args.map_relief = args['نقشه برجسته'] end
          if args['وضعیت'] then args.status = args['وضعیت'] end
          
          -- "combatant[i][v] Persian parameters; this can be shortened by modifying the loop at L-274
          if args['درگیر۱'] then args.combatant1 = args['درگیر۱'] end
          if args['درگیر۲'] then args.combatant2 = args['درگیر۲'] end
          if args['درگیر۳'] then args.combatant3 = args['درگیر۳'] end
          if args['درگیر۱الف'] then args.combatant1a = args['درگیر۱الف'] end
          if args['درگیر۲الف'] then args.combatant2a = args['درگیر۲الف'] end
          if args['درگیر۳الف'] then args.combatant3a = args['درگیر۳الف'] end
          if args['درگیر۱ب'] then args.combatant1b = args['درگیر۱ب'] end
          if args['درگیر۲ب'] then args.combatant2b = args['درگیر۲ب'] end
          if args['درگیر۳ب'] then args.combatant3b = args['درگیر۳ب'] end
          if args['درگیر۱ج'] then args.combatant1c = args['درگیر۱ج'] end
          if args['درگیر۲ج'] then args.combatant2c = args['درگیر۲ج'] end
          if args['درگیر۳ج'] then args.combatant3c = args['درگیر۳ج'] end
          if args['درگیر۱د'] then args.combatant1d = args['درگیر۱د'] end
          if args['درگیر۲د'] then args.combatant2d = args['درگیر۲د'] end
          if args['درگیر۳د'] then args.combatant3d = args['درگیر۳د'] end   
          
          if args['فرمانده۱'] then args.commander1 = args['فرمانده۱'] end
          if args['فرمانده۲'] then args.commander2 = args['فرمانده۲'] end
          if args['فرمانده۳'] then args.commander3 = args['فرمانده۳'] end
          
          if args['واحدها۱'] then args.units1 = args['واحدها۱'] end
          if args['واحدها۲'] then args.units2 = args['واحدها۲'] end
          if args['واحدها۳'] then args.units3 = args['واحدها۳'] end
          
          if args['قوا۱'] then args.strength1 = args['قوا۱'] end
          if args['قوا۲'] then args.strength2 = args['قوا۲'] end
          if args['قوا۳'] then args.strength3 = args['قوا۳'] end
          
          if args['تلفات۱'] then args.casualties1 = args['تلفات۱'] end
          if args['تلفات۲'] then args.casualties2 = args['تلفات۲'] end
          if args['تلفات۳'] then args.casualties3 = args['تلفات۳'] end

    end
	
	local obj = {
		frame = frame,
		args = args
	}

	-- until gerrit:165108 is merged, there's still a cap on combatants, but as soon as it merges, we can update this little bit of code to uncap it
	-- also, don't try to make this more efficient, or references could be in the wrong order
	obj.combatants = 2
	for _,v in ipairs{'', 'a', 'b', 'c', 'd'} do
		for i = 1,5 do
			if args['combatant' .. i .. v] then
				obj.combatants = math.max(obj.combatants, i)
			end
		end
	end

	return setmetatable(obj, IMC)
end

local p = {}

function p.main(frame)
	return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} } .. tostring(IMC.new(frame):render())
end

return p