<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AGraphical_updates</id>
	<title>Module:Graphical updates - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AGraphical_updates"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Graphical_updates&amp;action=history"/>
	<updated>2026-06-15T18:37:19Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Graphical_updates&amp;diff=34973&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;--&lt;nowiki&gt;  local p = {}  local params = require(&#039;Module:Paramtest&#039;) local clean = require(&#039;Module:Clean image2&#039;).clean  function p.main(frame) 	local args = frame:getParent().args  	local function endDateFormat(revNum, dateType) 		local dateTypes = {[&#039;main&#039;]=&#039;&#039;, [&#039;upper&#039;]=&#039;up&#039;, [&#039;middle&#039;]=&#039;mid&#039;} 		local endDateType = string.format(&#039;rev%s%send&#039;, revNum, dateTypes[dateType])  		if params.has_content(args[endDateType]) then															-- If an ending date has been expli...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Graphical_updates&amp;diff=34973&amp;oldid=prev"/>
		<updated>2024-10-16T23:12:14Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--&amp;lt;nowiki&amp;gt;  local p = {}  local params = require(&amp;#039;Module:Paramtest&amp;#039;) local clean = require(&amp;#039;Module:Clean image2&amp;#039;).clean  function p.main(frame) 	local args = frame:getParent().args  	local function endDateFormat(revNum, dateType) 		local dateTypes = {[&amp;#039;main&amp;#039;]=&amp;#039;&amp;#039;, [&amp;#039;upper&amp;#039;]=&amp;#039;up&amp;#039;, [&amp;#039;middle&amp;#039;]=&amp;#039;mid&amp;#039;} 		local endDateType = string.format(&amp;#039;rev%s%send&amp;#039;, revNum, dateTypes[dateType])  		if params.has_content(args[endDateType]) then															-- If an ending date has been expli...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local params = require(&amp;#039;Module:Paramtest&amp;#039;)&lt;br /&gt;
local clean = require(&amp;#039;Module:Clean image2&amp;#039;).clean&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
&lt;br /&gt;
	local function endDateFormat(revNum, dateType)&lt;br /&gt;
		local dateTypes = {[&amp;#039;main&amp;#039;]=&amp;#039;&amp;#039;, [&amp;#039;upper&amp;#039;]=&amp;#039;up&amp;#039;, [&amp;#039;middle&amp;#039;]=&amp;#039;mid&amp;#039;}&lt;br /&gt;
		local endDateType = string.format(&amp;#039;rev%s%send&amp;#039;, revNum, dateTypes[dateType])&lt;br /&gt;
&lt;br /&gt;
		if params.has_content(args[endDateType]) then															-- If an ending date has been explicitely specified, use that one &lt;br /&gt;
			endDate = args[endDateType]&lt;br /&gt;
		elseif params.has_content(args[string.format(&amp;#039;rev%s%sstart&amp;#039;, revNum +1, dateTypes[dateType])]) then		-- If there is a starting date defined for the next revision, use that as the ending date&lt;br /&gt;
			endDate = args[string.format(&amp;#039;rev%s%sstart&amp;#039;, revNum +1, dateTypes[dateType])]&lt;br /&gt;
		else																									-- If not, then the current revision is the last revision&lt;br /&gt;
			endDate = &amp;#039;Present&amp;#039;&lt;br /&gt;
		end	&lt;br /&gt;
	return endDate&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function imageFormat(revNum, rowLevel)&lt;br /&gt;
		&lt;br /&gt;
		local rowImages = {[&amp;#039;upper&amp;#039;]=&amp;#039;img&amp;#039;, [&amp;#039;middle&amp;#039;]=&amp;#039;midimg&amp;#039;, [&amp;#039;lower&amp;#039;]=&amp;#039;lowimg&amp;#039;}&lt;br /&gt;
		local rowDefaultImage  = rowImages[rowLevel]&lt;br /&gt;
		local rowSpecificImage = string.format(&amp;#039;rev%s%s&amp;#039;, revNum, rowImages[rowLevel])		&lt;br /&gt;
		&lt;br /&gt;
		if params.has_content(args[rowSpecificImage]) then																	-- If a filename has been specified, use that one&lt;br /&gt;
			formattedImage = args[rowSpecificImage]&lt;br /&gt;
		elseif params.has_content(args[rowDefaultImage]) then																-- If not, use a variation of the base filename&lt;br /&gt;
			local imageArg = args[rowDefaultImage]&lt;br /&gt;
			if (params.has_content(args[&amp;#039;rev2start&amp;#039;]) and params.is_empty(args[&amp;#039;rev3start&amp;#039;])) then							-- Check if there are only two revisions in the gallery&lt;br /&gt;
				if revNum == 1 then&lt;br /&gt;
					formattedImage = string.format(&amp;#039;%s (historical)&amp;#039;, imageArg)												-- If so, append (historical) to the base filename for the first revision&lt;br /&gt;
				elseif revNum == 2 then&lt;br /&gt;
					formattedImage = imageArg&lt;br /&gt;
				end&lt;br /&gt;
			elseif params.is_empty(args[&amp;#039;rev&amp;#039;..(revNum+1)..&amp;#039;start&amp;#039;]) then													-- We&amp;#039;ve made it so far, so there must be three or more revisions&lt;br /&gt;
				formattedImage = imageArg																					-- In which case, use the base filename for the last revision&lt;br /&gt;
			else&lt;br /&gt;
				local commaSeparatedHistorical = string.format(&amp;#039;[[File:%s (historical, v%s).png]]&amp;#039;, imageArg, revNum)&lt;br /&gt;
				local cleanComma = clean({file=commaSeparatedHistorical})&lt;br /&gt;
				if cleanComma == nil then																					-- Check if there is a file with (historical, v#) appended, and use it if so&lt;br /&gt;
					formattedImage = string.format(&amp;#039;%s (historical v%s)&amp;#039;, imageArg, revNum)&lt;br /&gt;
				else																										-- If not, append (historical v#) to the base filename&lt;br /&gt;
					formattedImage = string.format(&amp;#039;%s (historical, v%s)&amp;#039;, imageArg, revNum)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	return formattedImage&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function sizeFormat(revNum, rowLevel)&lt;br /&gt;
		local rowSizes = {[&amp;#039;upper&amp;#039;]=&amp;#039;size&amp;#039;, [&amp;#039;middle&amp;#039;]=&amp;#039;midsize&amp;#039;, [&amp;#039;lower&amp;#039;]=&amp;#039;lowsize&amp;#039;}&lt;br /&gt;
		local fallbackSizes = {[&amp;#039;upper&amp;#039;]=&amp;#039;|300x150px&amp;#039;, [&amp;#039;middle&amp;#039;]=&amp;#039;&amp;#039;, [&amp;#039;lower&amp;#039;]=&amp;#039;&amp;#039;}				-- Define the base sizes per image row, in case no size is specified at all&lt;br /&gt;
		local rowDefaultSize	= rowSizes[rowLevel]&lt;br /&gt;
		local rowSpecificSize	= string.format(&amp;#039;rev%s%s&amp;#039;, revNum, rowSizes[rowLevel])		&lt;br /&gt;
		&lt;br /&gt;
		if params.has_content(args[rowSpecificSize]) then										-- If a specific size is defined for a revision, use that one &lt;br /&gt;
			formattedSize = &amp;#039;|&amp;#039; .. args[rowSpecificSize]		&lt;br /&gt;
		elseif params.has_content(args[rowDefaultSize]) then									-- If not, use the size specified for all images in that row (by the user)&lt;br /&gt;
			formattedSize = &amp;#039;|&amp;#039; .. args[rowDefaultSize]&lt;br /&gt;
		else																					-- If neither is specified, use the base size for that row (defined in the table above)&lt;br /&gt;
			formattedSize = fallbackSizes[rowLevel]&lt;br /&gt;
		end&lt;br /&gt;
	return formattedSize&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--	Iterate through the arguments, and for each rev#start that is defined, compile a list of parameters relevant to that revision and add them as an entry to the rev_list table&lt;br /&gt;
--	Parameters pertaining to optional rows are checked for content, and default to nil if empty&lt;br /&gt;
--	Formatted size and formatted filename are combined prior to being entered into the table&lt;br /&gt;
	local function revisionList()&lt;br /&gt;
		local rev_list = {}&lt;br /&gt;
		for i=1,10,1 do&lt;br /&gt;
			local definedRevision = args[&amp;#039;rev&amp;#039;..i..&amp;#039;start&amp;#039;]&lt;br /&gt;
			if definedRevision and params.has_content(definedRevision) then&lt;br /&gt;
				local startDate			= params.default_to(args[&amp;#039;rev&amp;#039;..i..&amp;#039;start&amp;#039;],&amp;#039;?&amp;#039;)&lt;br /&gt;
				local endDate			= endDateFormat(i, &amp;#039;main&amp;#039;)&lt;br /&gt;
				local upperStartDate	= params.default_to(args[&amp;#039;rev&amp;#039;..i..&amp;#039;upstart&amp;#039;], nil)&lt;br /&gt;
				local upperEndDate	    = params.has_content(args[&amp;#039;rev&amp;#039;..i..&amp;#039;upstart&amp;#039;]) and endDateFormat(i, &amp;#039;upper&amp;#039;) or nil&lt;br /&gt;
				local middleStartDate	= params.default_to(args[&amp;#039;rev&amp;#039;..i..&amp;#039;midstart&amp;#039;], nil)&lt;br /&gt;
				local middleEndDate		= params.has_content(args[&amp;#039;rev&amp;#039;..i..&amp;#039;midstart&amp;#039;]) and endDateFormat(i, &amp;#039;middle&amp;#039;) or nil&lt;br /&gt;
				local upperImage		= imageFormat(i, &amp;#039;upper&amp;#039;)&lt;br /&gt;
				local upperSize			= sizeFormat(i, &amp;#039;upper&amp;#039;)&lt;br /&gt;
				local middleImage		= imageFormat (i, &amp;#039;middle&amp;#039;)&lt;br /&gt;
				local middleSize		= sizeFormat (i, &amp;#039;middle&amp;#039;)&lt;br /&gt;
				local lowerImage		= imageFormat (i, &amp;#039;lower&amp;#039;)&lt;br /&gt;
				local lowerSize			= sizeFormat (i, &amp;#039;lower&amp;#039;)&lt;br /&gt;
				&lt;br /&gt;
				local resizedUpperImage = string.format(&amp;#039;[[File:%s.png%s]]&amp;#039;, upperImage, upperSize)&lt;br /&gt;
				local resizedMiddleImage = params.has_content(args[&amp;#039;midimg&amp;#039;]) and string.format(&amp;#039;[[File:%s.png%s]]&amp;#039;, middleImage, middleSize) or nil&lt;br /&gt;
				local resizedLowerImage = params.has_content(args[&amp;#039;lowimg&amp;#039;]) and string.format(&amp;#039;[[File:%s.png%s]]&amp;#039;, lowerImage, lowerSize) or nil&lt;br /&gt;
&lt;br /&gt;
				table.insert(rev_list, {&lt;br /&gt;
					startDate = startDate,&lt;br /&gt;
					endDate = endDate,&lt;br /&gt;
					upperImage = resizedUpperImage,&lt;br /&gt;
					middleImage = resizedMiddleImage,&lt;br /&gt;
					lowerImage = resizedLowerImage,&lt;br /&gt;
					upperStartDate = upperStartDate,&lt;br /&gt;
					upperEndDate = upperEndDate,&lt;br /&gt;
					middleStartDate = middleStartDate,&lt;br /&gt;
					middleEndDate = middleEndDate,&lt;br /&gt;
				} )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return rev_list&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
--	Shove that big table of revisions into a variable called revisions	&lt;br /&gt;
	local revisions = revisionList()&lt;br /&gt;
&lt;br /&gt;
--	Build a div containing the starting date, a stylised horizontal rule, and ending date&lt;br /&gt;
	local function buildDateRange(revisions, revNum, dateRangeType)&lt;br /&gt;
		local startDateTypes = {[&amp;#039;main&amp;#039;]= &amp;#039;startDate&amp;#039;, [&amp;#039;upper&amp;#039;]= &amp;#039;upperStartDate&amp;#039;, [&amp;#039;middle&amp;#039;]= &amp;#039;middleStartDate&amp;#039;}&lt;br /&gt;
		local endDateTypes = {[&amp;#039;main&amp;#039;]= &amp;#039;endDate&amp;#039;, [&amp;#039;upper&amp;#039;]= &amp;#039;upperEndDate&amp;#039;, [&amp;#039;middle&amp;#039;]= &amp;#039;middleEndDate&amp;#039;}&lt;br /&gt;
		local startingDate = startDateTypes[dateRangeType]&lt;br /&gt;
		local endingDate   = endDateTypes[dateRangeType]&lt;br /&gt;
		local dateRange = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		dateRange&lt;br /&gt;
					:css({ [&amp;#039;text-align&amp;#039;] = &amp;#039;center&amp;#039;})&lt;br /&gt;
					:wikitext(revisions[revNum][startingDate])&lt;br /&gt;
						:tag(&amp;#039;hr&amp;#039;)&lt;br /&gt;
							:css({&lt;br /&gt;
									[&amp;#039;border-bottom&amp;#039;] = &amp;#039;0.175em solid var(--body-dark)&amp;#039;,&lt;br /&gt;
									[&amp;#039;border-top&amp;#039;] = &amp;#039;hidden&amp;#039;,&lt;br /&gt;
									[&amp;#039;margin&amp;#039;] = &amp;#039;0 0.45em&amp;#039;&lt;br /&gt;
								})&lt;br /&gt;
							:done()&lt;br /&gt;
						:wikitext(revisions[revNum][endingDate])&lt;br /&gt;
					:done()&lt;br /&gt;
						&lt;br /&gt;
	return tostring(dateRange)&lt;br /&gt;
	end	&lt;br /&gt;
&lt;br /&gt;
-- The buildRows function will be called by buildColumns later on, and will return a div for each row with content in the revisions table for that specific column&lt;br /&gt;
	local function buildRows(revisions, revisionNum)&lt;br /&gt;
		local rows = mw.html.create(nil)&lt;br /&gt;
			rows&lt;br /&gt;
				:tag(&amp;#039;div&amp;#039;):wikitext(revisions[revisionNum][&amp;#039;upperImage&amp;#039;]):done()&lt;br /&gt;
			if params.has_content(args[&amp;#039;rev&amp;#039; .. revisionNum .. &amp;#039;upstart&amp;#039;]) then&lt;br /&gt;
				rows&lt;br /&gt;
					:wikitext(buildDateRange(revisions, revisionNum, &amp;#039;upper&amp;#039;))&lt;br /&gt;
			end&lt;br /&gt;
			if params.has_content(args[&amp;#039;midimg&amp;#039;]) then&lt;br /&gt;
				rows:tag(&amp;#039;div&amp;#039;):wikitext(revisions[revisionNum][&amp;#039;middleImage&amp;#039;]):done()&lt;br /&gt;
			end&lt;br /&gt;
			if params.has_content(args[&amp;#039;rev&amp;#039; .. revisionNum .. &amp;#039;midstart&amp;#039;]) then&lt;br /&gt;
				rows&lt;br /&gt;
					:wikitext(buildDateRange(revisions, revisionNum, &amp;#039;middle&amp;#039;))&lt;br /&gt;
			end&lt;br /&gt;
			if params.has_content(args[&amp;#039;lowimg&amp;#039;]) then&lt;br /&gt;
				rows:tag(&amp;#039;div&amp;#039;):wikitext(revisions[revisionNum][&amp;#039;lowerImage&amp;#039;]):done()&lt;br /&gt;
			end&lt;br /&gt;
	return tostring(rows)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
--	Determine the number of CSS grid rows to span for the parent div holding a single column&lt;br /&gt;
	local function gridSpanFormat(revNum)&lt;br /&gt;
		local gridSpan = 2&lt;br /&gt;
		if params.has_content(args[&amp;#039;midimg&amp;#039;]) then&lt;br /&gt;
			gridSpan = gridSpan + 1&lt;br /&gt;
		end&lt;br /&gt;
		if params.has_content(args[&amp;#039;lowimg&amp;#039;]) then&lt;br /&gt;
			gridSpan = gridSpan + 1&lt;br /&gt;
		end&lt;br /&gt;
		if params.has_content(args[&amp;#039;rev&amp;#039; .. revNum .. &amp;#039;upstart&amp;#039;]) then&lt;br /&gt;
			gridSpan = gridSpan + 1&lt;br /&gt;
		end&lt;br /&gt;
		if params.has_content(args[&amp;#039;rev&amp;#039; .. revNum .. &amp;#039;midstart&amp;#039;]) then&lt;br /&gt;
			gridSpan = gridSpan + 1&lt;br /&gt;
		end&lt;br /&gt;
		gridSpan = string.format(&amp;#039;auto / span %s&amp;#039;, gridSpan)&lt;br /&gt;
	return gridSpan&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
--  So let&amp;#039;s put it all together&lt;br /&gt;
--	For each entry into the revisions table, which contains the relevant args for a single historical revision, we&amp;#039;re going to build a column&lt;br /&gt;
--	First it makes a div holding the column, which is then made a subgrid of the grid container, so that the cells will align vertically between different columns&lt;br /&gt;
--	We call the gridSpanFormat function to tell it how many rows the container of the column has to span&lt;br /&gt;
--	Then we fill it with the buildRows function, which returns a div for each relevant row entry for that column&lt;br /&gt;
--	Finally we put the main date range at the bottom to close out the column&lt;br /&gt;
--	Each iteration is then added to the columns variable, which will grow to contain the whole gallery by the end&lt;br /&gt;
&lt;br /&gt;
	local function buildColumns(revisions)&lt;br /&gt;
		local columns = mw.html.create(nil)&lt;br /&gt;
		for i, v in ipairs(revisions) do&lt;br /&gt;
			columns&lt;br /&gt;
				:tag(&amp;#039;div&amp;#039;) &lt;br /&gt;
				:css({&lt;br /&gt;
						[&amp;#039;display&amp;#039;] = &amp;#039;grid&amp;#039;,&lt;br /&gt;
						[&amp;#039;grid-template-rows&amp;#039;] = &amp;#039;subgrid&amp;#039;,&lt;br /&gt;
						[&amp;#039;grid-row&amp;#039;] = gridSpanFormat(i),&lt;br /&gt;
						[&amp;#039;justify-items&amp;#039;] = &amp;#039;center&amp;#039;,&lt;br /&gt;
						[&amp;#039;align-items&amp;#039;] = &amp;#039;center&amp;#039;,&lt;br /&gt;
					})&lt;br /&gt;
				:wikitext(buildRows(revisions, i))&lt;br /&gt;
				:wikitext(buildDateRange(revisions, i, &amp;#039;main&amp;#039;))&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(columns)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
-- Now we create a div which will hold all the columns, and we make it a CSS grid container&lt;br /&gt;
-- We tell it to fill as many columns as can fit the screen along implicit grid tracks, which are as wide as the content of those columns at minimum&lt;br /&gt;
-- We also need to set a max-width to be divvied up by the auto-placed columns&lt;br /&gt;
	local revisionsTable = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	local gridColumnWidth	= params.has_content(args[&amp;#039;colwidth&amp;#039;]) and args[&amp;#039;colwidth&amp;#039;] or &amp;#039;150&amp;#039;&lt;br /&gt;
	local gridWidth			= params.has_content(args[&amp;#039;colwidth&amp;#039;]) and (args[&amp;#039;colwidth&amp;#039;] + 25) * #revisions or 250 * #revisions&lt;br /&gt;
		revisionsTable&lt;br /&gt;
				:css({	[&amp;#039;margin-top&amp;#039;] = &amp;#039;20px&amp;#039;,&lt;br /&gt;
						[&amp;#039;max-width&amp;#039;] = string.format(&amp;#039;%spx&amp;#039;, gridWidth),&lt;br /&gt;
						[&amp;#039;display&amp;#039;] = &amp;#039;grid&amp;#039;,&lt;br /&gt;
						[&amp;#039;gap&amp;#039;] = &amp;#039;15px 25px&amp;#039;,&lt;br /&gt;
						[&amp;#039;grid-template-columns&amp;#039;] = string.format(&amp;#039;repeat(auto-fill, minmax(min-content, %spx) )&amp;#039;, gridColumnWidth),&lt;br /&gt;
					})	&lt;br /&gt;
				:wikitext(buildColumns(revisions))&lt;br /&gt;
	&lt;br /&gt;
	return revisionsTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>