<?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%3ASandbox%2FSzqecs%2FAdjacent_stations</id>
	<title>Module:Sandbox/Szqecs/Adjacent stations - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FSzqecs%2FAdjacent_stations"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Szqecs/Adjacent_stations&amp;action=history"/>
	<updated>2026-05-26T12:27:11Z</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:Sandbox/Szqecs/Adjacent_stations&amp;diff=146253&amp;oldid=prev</id>
		<title>imported&gt;Ythlev at 08:25, 21 December 2018</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Szqecs/Adjacent_stations&amp;diff=146253&amp;oldid=prev"/>
		<updated>2018-12-21T08:25:03Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Adjacent stations}}&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local args = {}&lt;br /&gt;
local origArgs&lt;br /&gt;
local root&lt;br /&gt;
local data = {}&lt;br /&gt;
&lt;br /&gt;
local function union(t1, t2, t3, t4)&lt;br /&gt;
	-- Returns the union of the values of four tables, as a sequence.&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for k, v in pairs(t1) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(t2) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(t3) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(t4) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(vals) do&lt;br /&gt;
		table.insert(ret, k)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getArgNums(prefix)&lt;br /&gt;
	-- Returns a table containing the numbers of the arguments that exist&lt;br /&gt;
	-- for the specified prefix. For example, if the prefix was &amp;#039;data&amp;#039;, and&lt;br /&gt;
	-- &amp;#039;line1&amp;#039;, &amp;#039;line2&amp;#039;, and &amp;#039;line5&amp;#039; exist, it would return {1, 2, 5}.&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = tostring(k):match(&amp;#039;^&amp;#039; .. prefix .. &amp;#039;([1-9]%d*)$&amp;#039;)&lt;br /&gt;
		if num then table.insert(nums, tonumber(num)) end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addRow(rowArgs)&lt;br /&gt;
	-- Adds a row to the infobox, with either a header cell&lt;br /&gt;
	-- or a label/data cell combination.&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderHeader()&lt;br /&gt;
	root&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hcA&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Previous station&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, 3)&lt;br /&gt;
				:addClass(&amp;#039;hmA&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Title&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hcA&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Following station&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderRows()&lt;br /&gt;
	-- Gets the union of the header, line, type and note-row argument numbers,&lt;br /&gt;
	-- and renders them all in order using addRow.&lt;br /&gt;
	local rownums = union(getArgNums(&amp;#039;header&amp;#039;), getArgNums(&amp;#039;line&amp;#039;), getArgNums(&amp;#039;type&amp;#039;), getArgNums(&amp;#039;note-row&amp;#039;))&lt;br /&gt;
	table.sort(rownums)&lt;br /&gt;
	for i, num in ipairs(rownums) do&lt;br /&gt;
		local typeName = args[&amp;#039;type&amp;#039; .. tostring(num)] or args[&amp;#039;line&amp;#039; .. tostring(num)]&lt;br /&gt;
		local data&lt;br /&gt;
		if typeName and ((args[&amp;#039;system&amp;#039;] .. tostring(num)) or (arg[&amp;#039;system&amp;#039;] .. tostring(rownums[i - 1]))) then&lt;br /&gt;
		end&lt;br /&gt;
		addRow({&lt;br /&gt;
&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _main()&lt;br /&gt;
	-- Specify the overall layout of the succession box, with special settings&lt;br /&gt;
		root = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
		root:addClass(&amp;#039;wikitable adjacent-stations&amp;#039;)&lt;br /&gt;
			&lt;br /&gt;
		renderHeader()&lt;br /&gt;
		renderRows()&lt;br /&gt;
 &lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function preprocessSingleArg(argName)&lt;br /&gt;
	-- If the argument exists and isn&amp;#039;t blank, add it to the argument table.&lt;br /&gt;
	-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.&lt;br /&gt;
	if not args[argName] and origArgs[argName] and origArgs[argName] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		args[argName] = origArgs[argName]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function preprocessArgs(prefixTable, step)&lt;br /&gt;
	-- Assign the parameters with the given prefixes to the args table, in order, in batches&lt;br /&gt;
	-- of the step size specified. This is to prevent references etc. from appearing in the&lt;br /&gt;
	-- wrong order. The prefixTable should be an array containing tables, each of which has&lt;br /&gt;
	-- two possible fields, a &amp;quot;prefix&amp;quot; string and a &amp;quot;depend&amp;quot; table. The function always parses&lt;br /&gt;
	-- parameters containing the &amp;quot;prefix&amp;quot; string, but only parses parameters in the &amp;quot;depend&amp;quot;&lt;br /&gt;
	-- table if the prefix parameter is present and non-blank.&lt;br /&gt;
	if type(prefixTable) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		error(&amp;quot;Non-table value detected for the prefix table&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	if type(step) ~= &amp;#039;number&amp;#039; then&lt;br /&gt;
		error(&amp;quot;Invalid step value detected&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Get arguments without a number suffix, and check for bad input.&lt;br /&gt;
	for i, v in ipairs(prefixTable) do&lt;br /&gt;
		if type(v) ~= &amp;#039;table&amp;#039; or type(v.prefix) ~= &amp;quot;string&amp;quot; or (v.depend and type(v.depend) ~= &amp;#039;table&amp;#039;) then&lt;br /&gt;
			error(&amp;#039;Invalid input detected to preprocessArgs prefix table&amp;#039;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		preprocessSingleArg(v.prefix)&lt;br /&gt;
		-- Only parse the depend parameter if the prefix parameter is present and not blank.&lt;br /&gt;
		if args[v.prefix] and v.depend then&lt;br /&gt;
			for j, dependValue in ipairs(v.depend) do&lt;br /&gt;
				if type(dependValue) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
					error(&amp;#039;Invalid &amp;quot;depend&amp;quot; parameter value detected in preprocessArgs&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
				preprocessSingleArg(dependValue)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get arguments with number suffixes.&lt;br /&gt;
	local a = 1 -- Counter variable.&lt;br /&gt;
	local moreArgumentsExist = true&lt;br /&gt;
	while moreArgumentsExist == true do&lt;br /&gt;
		moreArgumentsExist = false&lt;br /&gt;
		for i = a, a + step - 1 do&lt;br /&gt;
			for j, v in ipairs(prefixTable) do&lt;br /&gt;
				local prefixArgName = v.prefix .. tostring(i)&lt;br /&gt;
				if origArgs[prefixArgName] then&lt;br /&gt;
					moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones.&lt;br /&gt;
					preprocessSingleArg(prefixArgName)&lt;br /&gt;
				end&lt;br /&gt;
				-- Process the depend table if the prefix argument is present and not blank, or&lt;br /&gt;
				-- we are processing &amp;quot;prefix1&amp;quot; and &amp;quot;prefix&amp;quot; is present and not blank, and&lt;br /&gt;
				-- if the depend table is present.&lt;br /&gt;
				if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then&lt;br /&gt;
					for j, dependValue in ipairs(v.depend) do&lt;br /&gt;
						local dependArgName = dependValue .. tostring(i)&lt;br /&gt;
						preprocessSingleArg(dependArgName)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		a = a + step&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	-- If called via #invoke, use the args passed into the invoking template.&lt;br /&gt;
	-- Otherwise, for testing purposes, assume args are being passed directly in.&lt;br /&gt;
	if frame == mw.getCurrentFrame() then&lt;br /&gt;
		origArgs = frame:getParent().args&lt;br /&gt;
	else&lt;br /&gt;
		origArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
	local dependants = {&lt;br /&gt;
		&amp;#039;left&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;to-left&amp;#039;, &amp;#039;to-right&amp;#039;, &amp;#039;to&amp;#039;, &amp;#039;transfer&amp;#039;,&lt;br /&gt;
		&amp;#039;oneway-left&amp;#039;, &amp;#039;oneway-right&amp;#039;, &amp;#039;non-stop&amp;#039;, &amp;#039;through&amp;#039;,&lt;br /&gt;
		&amp;#039;through-left&amp;#039;, &amp;#039;through-right&amp;#039;, &amp;#039;reverse&amp;#039;, &amp;#039;reverse-left&amp;#039;, &amp;#039;reverse-right&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	preprocessArgs({&lt;br /&gt;
		{prefix = &amp;#039;system&amp;#039;},&lt;br /&gt;
		{prefix = &amp;#039;line&amp;#039;, depend = dependants},&lt;br /&gt;
		{prefix = &amp;#039;type&amp;#039;, depend = dependants}&lt;br /&gt;
	})&lt;br /&gt;
	return _main()&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Ythlev</name></author>
	</entry>
</feed>