<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_military_conflict%2Fsandbox</id>
	<title>Module:Infobox military conflict/sandbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_military_conflict%2Fsandbox"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Infobox_military_conflict/sandbox&amp;action=history"/>
	<updated>2026-05-24T18:07:59Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Infobox_military_conflict/sandbox&amp;diff=136944&amp;oldid=prev</id>
		<title>imported&gt;WOSlinker: use require(&#039;strict&#039;) instead of require(&#039;Module:No globals&#039;)</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Infobox_military_conflict/sandbox&amp;diff=136944&amp;oldid=prev"/>
		<updated>2022-10-21T10:03:27Z</updated>

		<summary type="html">&lt;p&gt;use require(&amp;#039;strict&amp;#039;) instead of require(&amp;#039;Module:No globals&amp;#039;)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local infoboxStyle = mw.loadData(&amp;#039;Module:WPMILHIST Infobox style&amp;#039;)&lt;br /&gt;
local templatestyles = &amp;#039;Module:Infobox military conflict/styles.css&amp;#039;&lt;br /&gt;
local cfg = mw.loadData(&amp;#039;Module:Infobox military conflict/configuration&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local IMC = {}&lt;br /&gt;
IMC.__index = IMC&lt;br /&gt;
&lt;br /&gt;
-- mw.message.newRawMessage (msg, args)&lt;br /&gt;
&lt;br /&gt;
function IMC:renderPerCombatant(builder, headerText, prefix, suffix)&lt;br /&gt;
	prefix = prefix or &amp;#039;&amp;#039;&lt;br /&gt;
	suffix = suffix or &amp;#039;&amp;#039;&lt;br /&gt;
	local colspans = {}&lt;br /&gt;
	&lt;br /&gt;
	-- This may result in colspans[1] getting set twice, but&lt;br /&gt;
	-- this is no big deal. The second set will be correct.&lt;br /&gt;
	local lastCombatant = 1&lt;br /&gt;
	&lt;br /&gt;
	for i = 1,self.combatants do&lt;br /&gt;
		if self.args[mw.message.newRawMessage(cfg.arg.arg_order, prefix, i, suffix)] then&lt;br /&gt;
			colspans[lastCombatant] = i - lastCombatant&lt;br /&gt;
			lastCombatant = i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local jointText = self.args[mw.message.newRawMessage(cfg.arg.arg_order, prefix, self.combatants + 1, suffix)]&lt;br /&gt;
	&lt;br /&gt;
	if headerText and (colspans[1] or jointText) then&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, self.combatants)&lt;br /&gt;
				:cssText(infoboxStyle.header_raw)&lt;br /&gt;
				:wikitext(headerText)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- The only time colspans[1] wouldn&amp;#039;t be set is if no&lt;br /&gt;
	-- combatant has a field with the given prefix and suffix.&lt;br /&gt;
	if colspans[1] then&lt;br /&gt;
		-- Since each found argument set the colspan for the previous&lt;br /&gt;
		-- one, the final one wasn&amp;#039;t set above, so set it now.&lt;br /&gt;
		colspans[lastCombatant] = self.combatants - lastCombatant + 1&lt;br /&gt;
		builder = builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		for i = 1,self.combatants do&lt;br /&gt;
			-- At this point, colspans[i] will be set for i=1 unconditionally, and for&lt;br /&gt;
			-- any other value of i where self.args[prefix .. i .. suffix] is set.&lt;br /&gt;
			if colspans[i] then&lt;br /&gt;
				builder:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
					-- don&amp;#039;t bother emitting colspan=&amp;quot;1&amp;quot;&lt;br /&gt;
					:attr(&amp;#039;colspan&amp;#039;, colspans[i] ~= 1 and colspans[i] or nil)&lt;br /&gt;
					:css(&amp;#039;width&amp;#039;, math.floor(100 / self.combatants * colspans[i] + 0.5) .. &amp;#039;%&amp;#039;)&lt;br /&gt;
					-- no border on the right of the rightmost column&lt;br /&gt;
					:css(&amp;#039;border-right&amp;#039;, i ~= lastCombatant and infoboxStyle.internal_border or nil)&lt;br /&gt;
					-- no padding on the left of the leftmost column&lt;br /&gt;
					:css(&amp;#039;padding-left&amp;#039;, i ~= 1 and &amp;#039;0.25em&amp;#039; or nil)&lt;br /&gt;
					-- don&amp;#039;t show the border if we&amp;#039;re directly under a header&lt;br /&gt;
					:css(&amp;#039;border-top&amp;#039;, not headerText and infoboxStyle.internal_border or nil)&lt;br /&gt;
					:newline()&lt;br /&gt;
					:wikitext(self.args[mw.message.newRawMessage(cfg.arg.arg_order, prefix, i, suffix)])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if jointText then&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, self.combatants)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
				-- don&amp;#039;t show the border if we&amp;#039;re directly under a header&lt;br /&gt;
				:css(&amp;#039;border-top&amp;#039;, (not headerText or colspans[1]) and infoboxStyle.internal_border or nil)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(jointText)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function IMC:renderHeaderTable(builder)&lt;br /&gt;
	builder = builder:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;width&amp;#039;, &amp;#039;100%&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;margin&amp;#039;, 0)&lt;br /&gt;
		:css(&amp;#039;padding&amp;#039;, 0)&lt;br /&gt;
		:css(&amp;#039;border&amp;#039;, 0)&lt;br /&gt;
		:css(&amp;#039;display&amp;#039;, &amp;#039;inline-table&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if self.args[cfg.arg[&amp;#039;date&amp;#039;]] then&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding-right&amp;#039;, &amp;#039;1em&amp;#039;)&lt;br /&gt;
				:wikitext(cfg.i18n[&amp;#039;date&amp;#039;])&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:wikitext(self.args[cfg.arg[&amp;#039;date&amp;#039;]])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	builder = builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;padding-right&amp;#039;, &amp;#039;1em&amp;#039;)&lt;br /&gt;
			:wikitext(cfg.i18n.location)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;location&amp;#039;)&lt;br /&gt;
				-- hack so that people who don&amp;#039;t know Lua know that this parameter is required&lt;br /&gt;
				:wikitext(self.args[cfg.arg.place] or cfg.i18n.place)&lt;br /&gt;
			:done()&lt;br /&gt;
	if self.args[cfg.arg.coordinates] then&lt;br /&gt;
		builder:wikitext(self.args[cfg.arg.coordinates])&lt;br /&gt;
	end&lt;br /&gt;
	builder = builder:done():done()&lt;br /&gt;
&lt;br /&gt;
	-- only for &amp;quot;Putsch&amp;quot;&lt;br /&gt;
    if self.args[cfg.arg.action] then&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding-right&amp;#039;, &amp;#039;1em&amp;#039;)&lt;br /&gt;
				:wikitext(self.args[cfg.arg.action] and cfg.i18n.action)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:wikitext(self.args[cfg.arg.action])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if self.args[cfg.arg[&amp;#039;status&amp;#039;]] or self.args[cfg.arg.result] then&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding-right&amp;#039;, &amp;#039;1em&amp;#039;)&lt;br /&gt;
				:wikitext(self.args[cfg.arg[&amp;#039;status&amp;#039;]] and cfg.i18n[&amp;#039;status&amp;#039;] or cfg.i18n.result)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;status&amp;#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(self.args[cfg.arg[&amp;#039;status&amp;#039;]] or self.args[cfg.arg.result])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if self.args[cfg.arg.territory] then&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding-right&amp;#039;, &amp;#039;1em&amp;#039;)&lt;br /&gt;
				:wikitext(cfg.i18n.territory)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(self.args[cfg.arg.territory])&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function IMC:render()&lt;br /&gt;
	local builder = mw.html.create()&lt;br /&gt;
	if self.args[cfg.arg.campaignbox] then&lt;br /&gt;
		-- this should be the same as using {{stack|clear=right|...}}&lt;br /&gt;
		builder:wikitext(self.frame:expandTemplate{ title = &amp;#039;stack begin&amp;#039;, args = {&lt;br /&gt;
				[cfg.dep.stack_begin_clear] = cfg.dep_key.stack_begin_true&lt;br /&gt;
		}})&lt;br /&gt;
	end&lt;br /&gt;
	builder = builder:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;infobox vevent&amp;#039;)&lt;br /&gt;
		:cssText(infoboxStyle.main_box_raw)&lt;br /&gt;
		:css(&amp;#039;width&amp;#039;, self.args[cfg.arg.width] or nil)&lt;br /&gt;
&lt;br /&gt;
	builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;summary&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, self.combatants)&lt;br /&gt;
			:cssText(infoboxStyle.header_raw)&lt;br /&gt;
			:wikitext(self.args[cfg.arg.conflict] or mw.title.getCurrentTitle().text)&lt;br /&gt;
	if self.args[cfg.arg.partof] then&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, self.combatants)&lt;br /&gt;
				:cssText(infoboxStyle.sub_header_raw)&lt;br /&gt;
				:wikitext(string.format(cfg.i18n.part_of, self.args[cfg.arg.partof]))&lt;br /&gt;
	end&lt;br /&gt;
	if self.args[cfg.arg.image] then&lt;br /&gt;
		local caption = self.args[cfg.arg.caption]&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, self.combatants)&lt;br /&gt;
				:cssText(infoboxStyle.image_box_raw)&lt;br /&gt;
				:wikitext(&lt;br /&gt;
					require(&amp;#039;Module:InfoboxImage&amp;#039;).InfoboxImage{ args = {&lt;br /&gt;
						[cfg.dep.iimage_image] = self.args[cfg.arg.image],&lt;br /&gt;
						[cfg.dep.iimage_size] = self.args[cfg.arg.image_size],&lt;br /&gt;
						[cfg.dep.iimage_sizedefault] = cfg.dep_key.iimage_sizedefault_frameless,&lt;br /&gt;
						[cfg.dep.iimage_upright] = cfg.dep_key.iimage_upright_1,&lt;br /&gt;
						[cfg.dep.iimage_alt] = self.args[cfg.arg.alt]&lt;br /&gt;
					}} .. (caption and &amp;#039;&amp;lt;br /&amp;gt;&amp;#039; .. caption or &amp;#039;&amp;#039;) &lt;br /&gt;
				)&lt;br /&gt;
	end&lt;br /&gt;
	self:renderHeaderTable(builder:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;td&amp;#039;):attr(&amp;#039;colspan&amp;#039;, self.combatants))&lt;br /&gt;
	self:renderPerCombatant(&lt;br /&gt;
		builder,&lt;br /&gt;
		self.args[cfg.arg.combatants_header] or cfg.i18n.belligerents,&lt;br /&gt;
		cfg.arg.combatant&lt;br /&gt;
	)&lt;br /&gt;
	-- can be un-hardcoded once gerrit:165108 is merged&lt;br /&gt;
	for _, v in ipairs(cfg.arg.letters) do&lt;br /&gt;
		self:renderPerCombatant(builder, nil, cfg.arg.combatant, v)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self:renderPerCombatant(&lt;br /&gt;
		builder,&lt;br /&gt;
		self.args[cfg.arg.commanders_header] or cfg.i18n.commanders,&lt;br /&gt;
		cfg.arg.commander&lt;br /&gt;
	)&lt;br /&gt;
	for _, v in ipairs(cfg.arg.letters) do&lt;br /&gt;
		self:renderPerCombatant(builder, nil, cfg.arg.commander, v)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	self:renderPerCombatant(&lt;br /&gt;
		builder,&lt;br /&gt;
		self.args[cfg.arg.units_header] or cfg.i18n.units,&lt;br /&gt;
		cfg.arg.units&lt;br /&gt;
	)&lt;br /&gt;
	self:renderPerCombatant(&lt;br /&gt;
		builder,&lt;br /&gt;
		self.args[cfg.arg.strengths_header] or cfg.i18n.strength,&lt;br /&gt;
		cfg.arg.strength&lt;br /&gt;
	)&lt;br /&gt;
	self:renderPerCombatant(&lt;br /&gt;
		builder,&lt;br /&gt;
		self.args[cfg.arg.polstrengths_header] or cfg.i18n.political_support,&lt;br /&gt;
		cfg.arg.polstrength&lt;br /&gt;
	)&lt;br /&gt;
	self:renderPerCombatant(&lt;br /&gt;
		builder,&lt;br /&gt;
		self.args[cfg.arg.milstrengths_header] or cfg.i18n.military_support,&lt;br /&gt;
		cfg.arg.milstrength&lt;br /&gt;
	)&lt;br /&gt;
	self:renderPerCombatant(&lt;br /&gt;
		builder,&lt;br /&gt;
		self.args[cfg.arg.casualties_header] or cfg.i18n.casualties,&lt;br /&gt;
		cfg.arg.casualties&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	if self.args[cfg.arg.notes] then&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, self.combatants)&lt;br /&gt;
				:css(&amp;#039;border-top&amp;#039;, infoboxStyle.section_border)&lt;br /&gt;
				:newline()&lt;br /&gt;
				:wikitext(self.args[cfg.arg.notes])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if self.args[cfg.arg.map_type] then&lt;br /&gt;
		local location_map_mod = require(&amp;#039;Module:Location map&amp;#039;)&lt;br /&gt;
		local location_map = {&lt;br /&gt;
			self.args[cfg.arg.map_type],&lt;br /&gt;
			relief = self.args[cfg.arg.map_relief],&lt;br /&gt;
			coordinates = self.args[cfg.arg.coordinates],&lt;br /&gt;
			width = self.args[cfg.arg.map_size] or 220,&lt;br /&gt;
			float = cfg.dep_key.map_float_center,&lt;br /&gt;
			border = cfg.dep_key.map_border_none,&lt;br /&gt;
			mark = self.args[cfg.arg.map_mark],&lt;br /&gt;
			marksize = self.args[cfg.arg.map_marksize] or 8,&lt;br /&gt;
			label = self.args[cfg.arg.map_label],&lt;br /&gt;
			alt = self.args[cfg.arg.map_alt],&lt;br /&gt;
			caption = self.args[cfg.arg.map_caption] or string.format(&lt;br /&gt;
				cfg.i18n.location_within,&lt;br /&gt;
				location_map_mod.data(self.frame, {self.args[cfg.arg.map_type], &amp;#039;name&amp;#039;})&lt;br /&gt;
			)&lt;br /&gt;
		}&lt;br /&gt;
		builder:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, self.combatants)&lt;br /&gt;
				:css(&amp;#039;border-top&amp;#039;, infoboxStyle.internal_border)&lt;br /&gt;
				:node(location_map_mod.main(self.frame, location_map))&lt;br /&gt;
	end&lt;br /&gt;
	builder = builder:done()&lt;br /&gt;
	if self.args[cfg.arg.campaignbox] then&lt;br /&gt;
		builder = builder:done()&lt;br /&gt;
		builder:wikitext(self.args[cfg.arg.campaignbox] .. self.frame:expandTemplate{ title = &amp;#039;stack end&amp;#039;})&lt;br /&gt;
	end&lt;br /&gt;
	return builder&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function IMC.new(frame, args)&lt;br /&gt;
	if not args then&lt;br /&gt;
		args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {wrappers = &amp;#039;Template:Infobox military conflict&amp;#039;})&lt;br /&gt;
	end&lt;br /&gt;
	local obj = {&lt;br /&gt;
		frame = frame,&lt;br /&gt;
		args = args&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- until gerrit:165108 is merged, there&amp;#039;s still a cap on combatants, but as soon as it merges, we can update this little bit of code to uncap it&lt;br /&gt;
	-- also, don&amp;#039;t try to make this more efficient, or references could be in the wrong order&lt;br /&gt;
	obj.combatants = 2&lt;br /&gt;
	for _,v in ipairs(cfg.arg.letters_and_empty) do&lt;br /&gt;
		for i = 1,5 do&lt;br /&gt;
			if args[mw.message.newRawMessage(cfg.arg.arg_order, cfg.arg.combatant, i, v)] then&lt;br /&gt;
				obj.combatants = math.max(obj.combatants, i)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return setmetatable(obj, IMC)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	return frame:extensionTag{ name = &amp;#039;templatestyles&amp;#039;, args = { src = templatestyles} } .. tostring(IMC.new(frame):render())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;WOSlinker</name></author>
	</entry>
</feed>