<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module</id>
	<title>Module - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module"/>
	<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module&amp;action=history"/>
	<updated>2026-04-18T21:58:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://mbwiki.stairwaygames.work/w/index.php?title=Module&amp;diff=27215&amp;oldid=prev</id>
		<title>Tama07: Created page with &quot;local p = {} local h = {}  -- merge args from frame and frame:getParent() function h.mergeArgs(frame) 	local inputArgs = {} 	 	for k, v in pairs(frame.args) do 		v = mw.text.trim(tostring(v)) 		if v ~= &#039;&#039; then 			inputArgs[k] = v 		end 	end 	 	for k, v in pairs(frame:getParent().args) do 		v = mw.text.trim(v) 		if v ~= &#039;&#039; then 			inputArgs[k] = v 		end 	end 	 	return inputArgs end  --------------------------------------------------------------------  function p.main(fram...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module&amp;diff=27215&amp;oldid=prev"/>
		<updated>2025-11-11T08:16:15Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {} local h = {}  -- merge args from frame and frame:getParent() function h.mergeArgs(frame) 	local inputArgs = {} 	 	for k, v in pairs(frame.args) do 		v = mw.text.trim(tostring(v)) 		if v ~= &amp;#039;&amp;#039; then 			inputArgs[k] = v 		end 	end 	 	for k, v in pairs(frame:getParent().args) do 		v = mw.text.trim(v) 		if v ~= &amp;#039;&amp;#039; then 			inputArgs[k] = v 		end 	end 	 	return inputArgs end  --------------------------------------------------------------------  function p.main(fram...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local h = {}&lt;br /&gt;
&lt;br /&gt;
-- merge args from frame and frame:getParent()&lt;br /&gt;
function h.mergeArgs(frame)&lt;br /&gt;
	local inputArgs = {}&lt;br /&gt;
	&lt;br /&gt;
	for k, v in pairs(frame.args) do&lt;br /&gt;
		v = mw.text.trim(tostring(v))&lt;br /&gt;
		if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			inputArgs[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for k, v in pairs(frame:getParent().args) do&lt;br /&gt;
		v = mw.text.trim(v)&lt;br /&gt;
		if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			inputArgs[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return inputArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
&lt;br /&gt;
	local args = h.mergeArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	-- use the rootpage parameter if given, otherwise use the current page name&lt;br /&gt;
	local rootpage = args[&amp;#039;rootpage&amp;#039;] or mw.title.getCurrentTitle().fullText&lt;br /&gt;
		&lt;br /&gt;
	local layouts = {&amp;#039;desktop&amp;#039;, &amp;#039;tablet&amp;#039;, &amp;#039;mobile&amp;#039;}&lt;br /&gt;
	&lt;br /&gt;
	for _,layout in pairs(layouts) do&lt;br /&gt;
		-- collapse consecutive line breaks and spaces, then trim&lt;br /&gt;
		-- we need to check for permutations of &amp;quot; \n&amp;quot; because trim can&amp;#039;t clean that up if it&amp;#039;s in the middle of the string&lt;br /&gt;
		args[layout] = mw.text.trim(args[layout]):gsub(&amp;quot;\n\n+&amp;quot;, &amp;quot;\n&amp;quot;):gsub(&amp;quot;  +&amp;quot;, &amp;quot; &amp;quot;):gsub(&amp;quot; \n&amp;quot;, &amp;quot;\n&amp;quot;):gsub(&amp;quot;\n &amp;quot;, &amp;quot;\n&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		-- check if columns are consistent in this layout&lt;br /&gt;
		local warn = false&lt;br /&gt;
		local last_column_count = 0&lt;br /&gt;
		local current_column_count = 0&lt;br /&gt;
		for _,row in pairs(mw.text.split(mw.text.trim(args[layout]), &amp;#039;\n&amp;#039;)) do&lt;br /&gt;
			current_column_count = #mw.text.split(row, &amp;#039;%s&amp;#039;) --count elements in this row&lt;br /&gt;
			if last_column_count == 0 then&lt;br /&gt;
				last_column_count = current_column_count&lt;br /&gt;
			elseif last_column_count ~= current_column_count then&lt;br /&gt;
				warn = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if warn then&lt;br /&gt;
			mw.addWarning( &amp;#039;ERROR: the &amp;#039; .. layout .. &amp;#039; layout does not have a consistent number of columns in each row. This will result in all the boxes merging into one.&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- parse the arguments into CSS variables that contain legal syntax for grid-template-areas&lt;br /&gt;
	local desktop_var = &amp;quot;--main-page-layout--desktop: &amp;#039;&amp;quot; .. string.gsub(args[&amp;#039;desktop&amp;#039;], &amp;#039;\n&amp;#039;, &amp;quot;&amp;#039; &amp;#039;&amp;quot;) .. &amp;quot;&amp;#039;;&amp;quot;&lt;br /&gt;
	local tablet_var =  &amp;quot;--main-page-layout--tablet: &amp;#039;&amp;quot;  .. string.gsub(args[&amp;#039;tablet&amp;#039; ], &amp;#039;\n&amp;#039;, &amp;quot;&amp;#039; &amp;#039;&amp;quot;) .. &amp;quot;&amp;#039;;&amp;quot;&lt;br /&gt;
	local mobile_var =  &amp;quot;--main-page-layout--mobile: &amp;#039;&amp;quot;  .. string.gsub(args[&amp;#039;mobile&amp;#039; ], &amp;#039;\n&amp;#039;, &amp;quot;&amp;#039; &amp;#039;&amp;quot;) .. &amp;quot;&amp;#039;;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- grid-template-columns overrides&lt;br /&gt;
	local desktop_cols = mw.text.trim(string.gsub(args[&amp;#039;desktop-columns&amp;#039;] or &amp;#039;&amp;#039;, &amp;#039;;&amp;#039;, &amp;#039;&amp;#039;))&lt;br /&gt;
	local  tablet_cols = mw.text.trim(string.gsub(args[ &amp;#039;tablet-columns&amp;#039;] or &amp;#039;&amp;#039;, &amp;#039;;&amp;#039;, &amp;#039;&amp;#039;))&lt;br /&gt;
	local  mobile_cols = mw.text.trim(string.gsub(args[ &amp;#039;mobile-columns&amp;#039;] or &amp;#039;&amp;#039;, &amp;#039;;&amp;#039;, &amp;#039;&amp;#039;))&lt;br /&gt;
	&lt;br /&gt;
	-- set the variables used by grid-template-columns&lt;br /&gt;
	if desktop_cols ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		desktop_var = desktop_var .. &amp;#039;--main-page-layout-columns--desktop: &amp;#039;.. desktop_cols ..&amp;#039;;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if tablet_cols ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		tablet_var = tablet_var .. &amp;#039;--main-page-layout-columns--tablet: &amp;#039;.. tablet_cols ..&amp;#039;;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if mobile_cols ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		mobile_var = mobile_var .. &amp;#039;--main-page-layout-columns--mobile: &amp;#039;.. mobile_cols ..&amp;#039;;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local boxes = {} -- list of all boxes as a simple list, used to set the order of appearance&lt;br /&gt;
	local seen_boxes = {} -- list of all boxes as a k:v pair, used to filter out duplicates&lt;br /&gt;
	local boxes_in_layout = {} -- list of layouts, then list of all boxes in that layout&lt;br /&gt;
	local missing_boxes = {} -- list of layouts, then list of boxes that are *not* included in that layout&lt;br /&gt;
	&lt;br /&gt;
	-- add every box referenced in the layout rules once&lt;br /&gt;
	function parse_layout(layout)&lt;br /&gt;
		for _,name in pairs(mw.text.split(mw.text.trim(args[layout]), &amp;#039;%s&amp;#039;)) do&lt;br /&gt;
			if not seen_boxes[name] then&lt;br /&gt;
				boxes[#boxes+1] = name -- table with numerical keys for set html order&lt;br /&gt;
				seen_boxes[name] = true&lt;br /&gt;
			end&lt;br /&gt;
			boxes_in_layout[layout][name] = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- loop through the layouts the first time to set up the box lists&lt;br /&gt;
	for _,layout in pairs(layouts) do&lt;br /&gt;
		boxes_in_layout[layout] = {}&lt;br /&gt;
		missing_boxes[layout] = {}&lt;br /&gt;
		parse_layout(layout)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- then loop through the layouts a second time because we need to compare those completed lists to check for missing boxes&lt;br /&gt;
	for _,layout in pairs(layouts) do&lt;br /&gt;
		for _,name in pairs(boxes) do&lt;br /&gt;
			if boxes_in_layout[layout][name] ~= true then&lt;br /&gt;
				mw.addWarning( &amp;#039;WARNING: the \&amp;quot;&amp;#039; .. name .. &amp;#039;\&amp;quot; box is missing in the &amp;#039; .. layout .. &amp;#039; layout. If this is intentional, you can ignore this warning.&amp;#039;)&lt;br /&gt;
				missing_boxes[layout][name] = true	&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- start our mp-container wrapper, and add our variables from earlier as inline styles to declare them&lt;br /&gt;
	-- the rootpage is added to the dataset so it&amp;#039;s easily accessible by mp-edit-links.js and it doesn&amp;#039;t need to make its own API call&lt;br /&gt;
	local output = mw.html.create()&lt;br /&gt;
	local container = output:tag(&amp;#039;div&amp;#039;):attr(&amp;#039;id&amp;#039;, &amp;#039;mp-container&amp;#039;):cssText(desktop_var .. tablet_var .. mobile_var):attr(&amp;#039;data-rootpage&amp;#039;, rootpage)&lt;br /&gt;
	&lt;br /&gt;
	-- loop through boxes and add the relevant main page subpages into the output&lt;br /&gt;
	for _,box in pairs(boxes) do&lt;br /&gt;
		mw.ext.VariablesLua.vardefine(&amp;#039;imp-variable-id&amp;#039;, box) -- using a vardefine lets us pass this directly to the template without going through the user-facing box&lt;br /&gt;
		&lt;br /&gt;
		local pre_vardefine = &amp;#039;&amp;#039;&lt;br /&gt;
		for _,layout in pairs(layouts) do&lt;br /&gt;
			pre_vardefine = pre_vardefine .. (missing_boxes[layout][box] and &amp;#039;0&amp;#039; or &amp;#039;1&amp;#039;) .. &amp;#039;,&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		-- formatted as a psuedo-bitmask to reduce variable usage, &amp;quot;&amp;lt;display-on-destop&amp;gt;, &amp;lt;display-on-tablet&amp;gt;, &amp;lt;display-on-mobile&amp;gt;,&amp;quot; each value is 0 or 1 (trailing comma is insignificant)&lt;br /&gt;
		-- expected to be used with #explode in the template receiving the variable&lt;br /&gt;
		mw.ext.VariablesLua.vardefine(&amp;#039;imp-variable-display-box&amp;#039;, pre_vardefine)&lt;br /&gt;
		&lt;br /&gt;
		if mw.title.new(rootpage .. &amp;#039;/&amp;#039; .. box).exists then&lt;br /&gt;
			container:wikitext(frame:expandTemplate{ title = &amp;#039;:&amp;#039; .. rootpage .. &amp;#039;/&amp;#039; .. box})&lt;br /&gt;
		else&lt;br /&gt;
			container:wikitext(frame:expandTemplate{ title = &amp;#039;Main page box/missing&amp;#039;, args = { box, rootpage = rootpage}}) -- See [[Template:Main page box/missing]]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Tama07</name></author>
	</entry>
</feed>