<?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%2FYthlev%2FAdjacent_stations</id>
	<title>Module:Sandbox/Ythlev/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%2FYthlev%2FAdjacent_stations"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Ythlev/Adjacent_stations&amp;action=history"/>
	<updated>2026-05-27T04:54:26Z</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/Ythlev/Adjacent_stations&amp;diff=146460&amp;oldid=prev</id>
		<title>imported&gt;Ythlev at 05:52, 7 February 2019</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Ythlev/Adjacent_stations&amp;diff=146460&amp;oldid=prev"/>
		<updated>2019-02-07T05:52:45Z</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;local p, data, defaultData, lineData, typeData, funcIsAdjacent = {}&lt;br /&gt;
local function dig(...)&lt;br /&gt;
	-- Digs through a table with sub-tables using arguments as keys, returning the value of the last key argument&lt;br /&gt;
	-- Analogous to returning a file given a file path with sub-folders&lt;br /&gt;
	-- Returns nil if any given sub-table does not exist&lt;br /&gt;
	local arg, n = {...}, select(&amp;#039;#&amp;#039;, ...)&lt;br /&gt;
	local a, i = arg[1], 1&lt;br /&gt;
	while a and i &amp;lt; n do&lt;br /&gt;
		a = a[arg[i + 1]]&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return a&lt;br /&gt;
end&lt;br /&gt;
local function makeInvokeFunc(funcName)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame)&lt;br /&gt;
		if funcName == &amp;#039;_adjacent&amp;#039; then&lt;br /&gt;
			funcIsAdjacent = true&lt;br /&gt;
			local tableTools = require(&amp;#039;Module:TableTools&amp;#039;)&lt;br /&gt;
			args = tableTools.numData(args)&lt;br /&gt;
			if args.other then&lt;br /&gt;
				args[1] = args[1] or {}&lt;br /&gt;
				for k, _ in pairs(args.other) do args[1][k] = args[1][k] or args[&amp;#039;other&amp;#039;][k] end&lt;br /&gt;
			end&lt;br /&gt;
			return p[funcName](tableTools.compressSparseArray(args))&lt;br /&gt;
		else&lt;br /&gt;
			args.system = args.system or args[1]&lt;br /&gt;
			if args.system then&lt;br /&gt;
				local s = &amp;#039;Module:Rail/&amp;#039; .. args.system&lt;br /&gt;
				local t = &amp;#039;Module:Adjacent stations/&amp;#039; .. args.system&lt;br /&gt;
				data = mw.title.new(s).exists and mw.loadData(s) or mw.title.new(t).exists and mw.loadData(t)&lt;br /&gt;
			end&lt;br /&gt;
			if funcName ~= &amp;#039;_infoboxStation&amp;#039; then&lt;br /&gt;
				args.line = args.line or args[funcName == &amp;#039;_station&amp;#039; and 3 or 2]&lt;br /&gt;
				args[&amp;#039;type&amp;#039;] = args[&amp;#039;type&amp;#039;] or args[funcName == &amp;#039;_station&amp;#039; and 4 or 3]&lt;br /&gt;
				if funcName ~= &amp;#039;_station&amp;#039; then&lt;br /&gt;
					defaultData = dig(data, &amp;#039;lines&amp;#039;, &amp;#039;_default&amp;#039;)&lt;br /&gt;
					if args.line then&lt;br /&gt;
						lineData = &lt;br /&gt;
							dig(data, &amp;#039;lines&amp;#039;, args.line) or&lt;br /&gt;
							dig(data, &amp;#039;lines&amp;#039;, dig(data, &amp;#039;aliases&amp;#039;, string.lower(args.line)))&lt;br /&gt;
					end&lt;br /&gt;
					typeData = dig(lineData, &amp;#039;types&amp;#039;, args[&amp;#039;type&amp;#039;])&lt;br /&gt;
					if funcName == &amp;#039;_icon&amp;#039; or funcName == &amp;#039;_box&amp;#039; then&lt;br /&gt;
						args.style =&lt;br /&gt;
							args.style or args.inline or&lt;br /&gt;
							dig(typeData, &amp;#039;icon format&amp;#039;) or&lt;br /&gt;
							dig(lineData, &amp;#039;icon format&amp;#039;) or&lt;br /&gt;
							dig(data, &amp;#039;system icon format&amp;#039;)&lt;br /&gt;
						args.style = args.style == &amp;#039;image&amp;#039; and nil or args.style&lt;br /&gt;
						funcName = args.style and &amp;#039;_box&amp;#039;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return p[funcName](args, not data and frame)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
p.style = makeInvokeFunc(&amp;#039;_infoboxStation&amp;#039;)&lt;br /&gt;
p.infoboxStation = makeInvokeFunc(&amp;#039;_infoboxStation&amp;#039;)&lt;br /&gt;
function p._infoboxStation(args, frame)&lt;br /&gt;
	local root = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	if args[3] == &amp;#039;_subheader&amp;#039; then&lt;br /&gt;
		root:css(&amp;#039;background-color&amp;#039;, &amp;#039;#EFEFEF&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if args.system then&lt;br /&gt;
		if args[3] == &amp;#039;_subheader&amp;#039; then&lt;br /&gt;
			root:css(&amp;#039;color&amp;#039;, &amp;#039;white&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if data then&lt;br /&gt;
			root:css(&lt;br /&gt;
				dig(data, &amp;#039;infobox station&amp;#039;, args[2], args[3]) or&lt;br /&gt;
				dig(data, &amp;#039;infobox station&amp;#039;, args[3])&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			if args[3] == &amp;#039;_header&amp;#039; then&lt;br /&gt;
				root:cssText(frame:expandTemplate{&lt;br /&gt;
					title = args.system .. &amp;#039; style&amp;#039;,&lt;br /&gt;
					args = {&amp;#039;name_format&amp;#039;}&lt;br /&gt;
				})&lt;br /&gt;
			else&lt;br /&gt;
				local thcolor = frame:expandTemplate{&lt;br /&gt;
					title = args.system .. &amp;#039; style&amp;#039;,&lt;br /&gt;
					args = {&amp;#039;thcolor&amp;#039;}					&lt;br /&gt;
				}&lt;br /&gt;
				root:css(&amp;#039;color&amp;#039;, thcolor and &amp;#039;#&amp;#039; .. thcolor)&lt;br /&gt;
				local thbgcolor = frame:expandTemplate{&lt;br /&gt;
					title = args.system .. &amp;#039; style&amp;#039;,&lt;br /&gt;
					args = {&amp;#039;thbgcolor&amp;#039;}					&lt;br /&gt;
				}&lt;br /&gt;
				root:css(&amp;#039;background-color&amp;#039;, thbgcolor and &amp;#039;#&amp;#039; .. thbgcolor)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return string.match(tostring(root), &amp;#039;&amp;lt;div style=&amp;quot;(.*)&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
local function stationTitle(station, line, typ, n)&lt;br /&gt;
	if station and data then&lt;br /&gt;
		local data, link = funcIsAdjacent and data[n] or data&lt;br /&gt;
		if type(data[&amp;#039;station format&amp;#039;]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
			local defaultFormat = data[&amp;#039;station format&amp;#039;]&lt;br /&gt;
			if type(defaultFormat[station]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
				local stationFormat = defaultFormat[station]&lt;br /&gt;
				if line then&lt;br /&gt;
					line =&lt;br /&gt;
						stationFormat[line] and line or&lt;br /&gt;
						dig(data, &amp;#039;aliases&amp;#039;, string.lower(line))&lt;br /&gt;
				end&lt;br /&gt;
				if type(stationFormat[line]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
					local lineFormat = stationFormat[line]&lt;br /&gt;
					link = lineFormat[typ] or lineFormat[1]&lt;br /&gt;
				else&lt;br /&gt;
					link = stationFormat[line] or stationFormat[1]&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				link = defaultFormat[station] or defaultFormat[1]&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			link = data[&amp;#039;station format&amp;#039;]&lt;br /&gt;
		end&lt;br /&gt;
		link = (string.gsub(link, &amp;#039;%%1&amp;#039;, station))&lt;br /&gt;
		link = line and (string.gsub(link, &amp;#039;%%2&amp;#039;, line)) or link&lt;br /&gt;
		link = typ and (string.gsub(link, &amp;#039;%%3&amp;#039;, typ)) or link&lt;br /&gt;
		return&lt;br /&gt;
			string.match(link, &amp;#039;%[%[.*%]%]&amp;#039;) and link or&lt;br /&gt;
			table.concat({&amp;#039;[[&amp;#039;, link, &amp;#039;|&amp;#039;, station, &amp;#039;]]&amp;#039;})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
p.station = makeInvokeFunc(&amp;#039;_station&amp;#039;)&lt;br /&gt;
function p._station(args, frame)&lt;br /&gt;
	args.station = args.station or args[2]&lt;br /&gt;
	if data then&lt;br /&gt;
		return stationTitle(args.station, args.line, args[&amp;#039;type&amp;#039;])&lt;br /&gt;
	else&lt;br /&gt;
		return frame:expandTemplate{&lt;br /&gt;
			title = args.system .. &amp;#039; stations&amp;#039;,&lt;br /&gt;
			args = {&lt;br /&gt;
				[&amp;#039;station&amp;#039;] = args.station,&lt;br /&gt;
				[&amp;#039;line&amp;#039;] = args.line,&lt;br /&gt;
				[&amp;#039;branch&amp;#039;] = args[&amp;#039;type&amp;#039;]&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
p.line = makeInvokeFunc(&amp;#039;_line&amp;#039;)&lt;br /&gt;
function p._line(args, frame)&lt;br /&gt;
	if data then&lt;br /&gt;
		return&lt;br /&gt;
			typeData and typeData[&amp;#039;title&amp;#039;] and table.concat({lineData[&amp;#039;title&amp;#039;], &amp;#039; (&amp;#039;, typeData[&amp;#039;title&amp;#039;], &amp;#039;)&amp;#039;}) or&lt;br /&gt;
			lineData and lineData[&amp;#039;title&amp;#039;] or&lt;br /&gt;
			defaultData and (string.gsub(defaultData[&amp;#039;title&amp;#039;], &amp;#039;%%1&amp;#039;, args.line or &amp;#039;_default&amp;#039;))&lt;br /&gt;
	else&lt;br /&gt;
		return frame:expandTemplate{&lt;br /&gt;
			title = args.system .. &amp;#039; lines&amp;#039;,&lt;br /&gt;
			args = {args.line, [&amp;#039;branch&amp;#039;] = args[&amp;#039;type&amp;#039;]}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
p.color = makeInvokeFunc(&amp;#039;_color&amp;#039;)&lt;br /&gt;
function p._color(args, frame)&lt;br /&gt;
	if data then&lt;br /&gt;
		return mw.text.nowiki(&lt;br /&gt;
			typeData and typeData[&amp;#039;color&amp;#039;] or&lt;br /&gt;
			lineData and lineData[&amp;#039;color&amp;#039;] or&lt;br /&gt;
			defaultData and defaultData[&amp;#039;color&amp;#039;]			&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		return frame:expandTemplate{&lt;br /&gt;
			title = args.system .. &amp;#039; color&amp;#039;,&lt;br /&gt;
			args = {args.line, [&amp;#039;branch&amp;#039;] = args[&amp;#039;type&amp;#039;]}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
p.icon = makeInvokeFunc(&amp;#039;_icon&amp;#039;)&lt;br /&gt;
function p._icon(args, frame)&lt;br /&gt;
	if data then&lt;br /&gt;
		local s =&lt;br /&gt;
			typedata and typeData[&amp;#039;icon&amp;#039;] or&lt;br /&gt;
			lineData and lineData[&amp;#039;icon&amp;#039;] or&lt;br /&gt;
			data and data[&amp;#039;system icon&amp;#039;]&lt;br /&gt;
		return args.link and (string.gsub(s, &amp;#039;%[%[(.*)|.*%]%]&amp;#039;, args.link)) or s&lt;br /&gt;
	else&lt;br /&gt;
		return frame:expandTemplate{&lt;br /&gt;
			title = &amp;#039;Rail-interchange&amp;#039;,&lt;br /&gt;
			args = {string.lower(args.system), string.lower(args.line),	[&amp;#039;size&amp;#039;] = args.size}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
p.box = makeInvokeFunc(&amp;#039;_box&amp;#039;)&lt;br /&gt;
function p._box(args, frame)&lt;br /&gt;
	local root, style = mw.html.create(&amp;#039;div&amp;#039;), args.style&lt;br /&gt;
	local colour, lineTitle = p._color(args, frame), p._line(args, frame)&lt;br /&gt;
	if colour then&lt;br /&gt;
		colour = string.match(colour, &amp;#039;#&amp;#039;) and colour or &amp;#039;#&amp;#039; .. colour&lt;br /&gt;
	end&lt;br /&gt;
	if args.line then&lt;br /&gt;
		args.line =&lt;br /&gt;
			dig(data, &amp;#039;lines&amp;#039;, args.line) and args.line or&lt;br /&gt;
			dig(data, &amp;#039;aliases&amp;#039;, string.lower(args.line))&lt;br /&gt;
	end&lt;br /&gt;
	local box = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
	if style == nil then&lt;br /&gt;
		root&lt;br /&gt;
			:addClass(&amp;#039;legend&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;-webkit-column-break-inside&amp;#039;, &amp;#039;avoid&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;page-break-inside&amp;#039;, &amp;#039;avoid&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;break-inside&amp;#039;, &amp;#039;avoid-column&amp;#039;)&lt;br /&gt;
		box&lt;br /&gt;
			:addClass(&amp;#039;legend-color&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;display&amp;#039;, &amp;#039;inline-block&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;width&amp;#039;, &amp;#039;1.5em&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;height&amp;#039;, &amp;#039;1.5em&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;margin&amp;#039;, &amp;#039;1px&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if&lt;br /&gt;
		style == &amp;#039;dot&amp;#039; or&lt;br /&gt;
		style == &amp;#039;ldot&amp;#039; or&lt;br /&gt;
		style == &amp;#039;square&amp;#039; or&lt;br /&gt;
		style == &amp;#039;lsquare&amp;#039; then&lt;br /&gt;
		box:css(&amp;#039;line-height&amp;#039;, &amp;#039;initial&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if&lt;br /&gt;
		style == &amp;#039;dot&amp;#039; or&lt;br /&gt;
		style == &amp;#039;ldot&amp;#039; or&lt;br /&gt;
		style == &amp;#039;square&amp;#039; or&lt;br /&gt;
		style == &amp;#039;lsquare&amp;#039; or&lt;br /&gt;
		style == &amp;#039;xroute&amp;#039; then&lt;br /&gt;
		box:css(&amp;#039;color&amp;#039;, colour)&lt;br /&gt;
	else&lt;br /&gt;
		box:css(&amp;#039;background-color&amp;#039;, colour)&lt;br /&gt;
	end&lt;br /&gt;
	if&lt;br /&gt;
		style == nil or&lt;br /&gt;
		style == &amp;#039;link&amp;#039; or&lt;br /&gt;
		style == &amp;#039;inline&amp;#039; or style == &amp;#039;yes&amp;#039; or&lt;br /&gt;
		style == &amp;#039;box&amp;#039; then&lt;br /&gt;
		box:css(&amp;#039;border&amp;#039;, &amp;#039;1px solid black&amp;#039;)&lt;br /&gt;
	elseif style and string.match(style, &amp;#039;route&amp;#039;) then&lt;br /&gt;
		box&lt;br /&gt;
			:css(&amp;#039;border&amp;#039;, &amp;#039;.075em solid &amp;#039; .. (&lt;br /&gt;
				typeData and typeData[&amp;#039;border color&amp;#039;] or&lt;br /&gt;
				lineData and lineData[&amp;#039;border color&amp;#039;] or&lt;br /&gt;
				colour&lt;br /&gt;
				)&lt;br /&gt;
			)&lt;br /&gt;
			:css(&amp;#039;padding&amp;#039;, &amp;#039;0 .3em&amp;#039;)&lt;br /&gt;
		if style ~= &amp;#039;route&amp;#039; then&lt;br /&gt;
			box:css(&amp;#039;border-radius&amp;#039;, &amp;#039;.5em&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if style and string.match(style, &amp;#039;route&amp;#039;) then&lt;br /&gt;
		box&lt;br /&gt;
			:css(&amp;#039;color&amp;#039;,&lt;br /&gt;
				typeData and typeData[&amp;#039;text color&amp;#039;] or&lt;br /&gt;
				lineData and lineData[&amp;#039;text color&amp;#039;] or&lt;br /&gt;
				style == &amp;#039;xroute&amp;#039; and colour or&lt;br /&gt;
				&amp;#039;white&amp;#039;&lt;br /&gt;
			)&lt;br /&gt;
			:css(&amp;#039;font-weight&amp;#039;, args.bold == &amp;#039;no&amp;#039; or &amp;#039;bold&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;font-size&amp;#039;, &amp;#039;inherit&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;white-space&amp;#039;, &amp;#039;nowrap&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local boxText = {&lt;br /&gt;
		[&amp;#039;inline&amp;#039;] = string.rep(&amp;#039;&amp;amp;nbsp;&amp;#039;,4),&lt;br /&gt;
		[&amp;#039;yes&amp;#039;] = string.rep(&amp;#039;&amp;amp;nbsp;&amp;#039;,4),&lt;br /&gt;
		[&amp;#039;small&amp;#039;] = string.rep(&amp;#039;&amp;amp;nbsp;&amp;#039;,1),&lt;br /&gt;
		[&amp;#039;link&amp;#039;] = string.rep(&amp;#039;&amp;amp;nbsp;&amp;#039;,4),&lt;br /&gt;
		[&amp;#039;box&amp;#039;] = string.rep(&amp;#039;&amp;amp;nbsp;&amp;#039;, 4),&lt;br /&gt;
		[&amp;#039;dot&amp;#039;] = &amp;#039;●&amp;#039;,&lt;br /&gt;
		[&amp;#039;ldot&amp;#039;] = &amp;#039;●&amp;#039;,&lt;br /&gt;
		[&amp;#039;square&amp;#039;] = &amp;#039;■&amp;#039;,&lt;br /&gt;
		[&amp;#039;lsquare&amp;#039;] = &amp;#039;■&amp;#039;,&lt;br /&gt;
		[&amp;#039;route&amp;#039;] = args.line,&lt;br /&gt;
		[&amp;#039;croute&amp;#039;] = args.line,&lt;br /&gt;
		[&amp;#039;xroute&amp;#039;] = args.line&lt;br /&gt;
	}&lt;br /&gt;
	box:wikitext(boxText[style] or string.rep(&amp;#039;&amp;amp;nbsp;&amp;#039;,1))&lt;br /&gt;
	if&lt;br /&gt;
		style == &amp;#039;link&amp;#039; or&lt;br /&gt;
		style == &amp;#039;ldot&amp;#039; or&lt;br /&gt;
		style == &amp;#039;lsquare&amp;#039; or&lt;br /&gt;
		style and string.match(style, &amp;#039;route&amp;#039;) then&lt;br /&gt;
			if string.match(lineTitle, &amp;#039;|&amp;#039;) then&lt;br /&gt;
				root:wikitext((string.gsub(lineTitle, &amp;#039;%[%[.*|(.*)%]%]&amp;#039;, tostring(box))))&lt;br /&gt;
			else&lt;br /&gt;
				root:wikitext((string.gsub(lineTitle, &amp;#039;%]%]&amp;#039;, &amp;#039;|&amp;#039; .. tostring(box) .. &amp;#039;]]&amp;#039;)))&lt;br /&gt;
			end&lt;br /&gt;
	elseif style == &amp;#039;box&amp;#039; then&lt;br /&gt;
		root:wikitext(tostring(box))&lt;br /&gt;
	else&lt;br /&gt;
		root:wikitext(tostring(box), &amp;#039;&amp;amp;nbsp;&amp;#039;, lineTitle)&lt;br /&gt;
	end&lt;br /&gt;
	return root&lt;br /&gt;
end&lt;br /&gt;
p.main = makeInvokeFunc(&amp;#039;_adjacent&amp;#039;)&lt;br /&gt;
p.adjacent = makeInvokeFunc(&amp;#039;_adjacent&amp;#039;)&lt;br /&gt;
function p._adjacent(args)&lt;br /&gt;
	local yesNo = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
	local i18n = require(&amp;#039;Module:Adjacent stations/i18n&amp;#039;)&lt;br /&gt;
	local root, lang = mw.html.create(&amp;#039;table&amp;#039;), &amp;#039;en-GB&amp;#039;&lt;br /&gt;
	root:addClass(&amp;#039;wikitable adjacent-stations&amp;#039;)&lt;br /&gt;
	local function renderHeader(stopNoun, systemIcon, systemTitle)&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(i18n[lang][&amp;#039;preceding&amp;#039;](stopNoun))&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
					:attr(&amp;#039;colspan&amp;#039;, 3)&lt;br /&gt;
					:css(&amp;#039;vertical-align&amp;#039;, &amp;#039;middle&amp;#039;)&lt;br /&gt;
					:wikitext(systemIcon and systemIcon .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. systemTitle or systemTitle)&lt;br /&gt;
					:done()&lt;br /&gt;
				:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
					:addClass(&amp;#039;hcA&amp;#039;)&lt;br /&gt;
					:wikitext(i18n[lang][&amp;#039;following&amp;#039;](stopNoun))&lt;br /&gt;
	end&lt;br /&gt;
	local function renderSubHeader(subHeader)&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;
					:attr(&amp;#039;colspan&amp;#039;, 5)&lt;br /&gt;
					:addClass(&amp;#039;hmA&amp;#039;)&lt;br /&gt;
					:wikitext(subHeader)&lt;br /&gt;
	end&lt;br /&gt;
	local function renderSideCell(row, rowSpan, adjacent, terminus, oneWay, circular, through, Reverse, note)&lt;br /&gt;
		local mainText, subText = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		if adjacent then&lt;br /&gt;
			mainText:wikitext(adjacent)&lt;br /&gt;
			subText = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
			subText:addClass(&amp;#039;isA&amp;#039;)&lt;br /&gt;
			if adjacent == terminus then&lt;br /&gt;
				subText:wikitext(&amp;#039;Terminus&amp;#039;)&lt;br /&gt;
			else&lt;br /&gt;
				subText:wikitext(oneWay and &amp;#039;one-way operation&amp;#039; or circular and terminus or i18n[lang][&amp;#039;towards&amp;#039;](terminus))&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			mainText:css(&amp;#039;font-style&amp;#039;, &amp;#039;italic&amp;#039;)&lt;br /&gt;
			mainText:wikitext(Reverse and &amp;#039;Reverses direction&amp;#039; or through and i18n[lang][&amp;#039;through&amp;#039;](through) or &amp;#039;Terminus&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;rowspan&amp;#039;, rowSpan)&lt;br /&gt;
				:addClass(&amp;#039;bcA&amp;#039;)&lt;br /&gt;
				:node(mainText)&lt;br /&gt;
					:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
						:css(&amp;#039;font-size&amp;#039;, &amp;#039;smaller&amp;#039;)&lt;br /&gt;
						:wikitext(note)&lt;br /&gt;
						:done()&lt;br /&gt;
				:node(subText)&lt;br /&gt;
	end&lt;br /&gt;
	local function renderMidCells(row, rowSpan, colour, backgroundColour, lineTitle, typeTitle, note, transfer)&lt;br /&gt;
		if colour then&lt;br /&gt;
			colour = string.match(colour, &amp;#039;#&amp;#039;) and colour or &amp;#039;#&amp;#039; .. colour&lt;br /&gt;
		end&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;rowspan&amp;#039;, rowSpan)&lt;br /&gt;
				:addClass(&amp;#039;bbA&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;background-color&amp;#039;, colour)&lt;br /&gt;
				:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;rowspan&amp;#039;, rowSpan)&lt;br /&gt;
				:addClass(&amp;#039;bcA&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;background-color&amp;#039;, backgroundColour)&lt;br /&gt;
				:wikitext(lineTitle)&lt;br /&gt;
					:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
						:wikitext(typeTitle)&lt;br /&gt;
						:done()&lt;br /&gt;
					:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
						:css(&amp;#039;font-size&amp;#039;, &amp;#039;smaller&amp;#039;)&lt;br /&gt;
						:wikitext(note)&lt;br /&gt;
						:done()&lt;br /&gt;
					:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
						:addClass(&amp;#039;isA&amp;#039;)&lt;br /&gt;
						:wikitext(i18n[lang][&amp;#039;transfer&amp;#039;](transfer))&lt;br /&gt;
						:done()&lt;br /&gt;
				:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;rowspan&amp;#039;, rowSpan)&lt;br /&gt;
				:addClass(&amp;#039;bbA&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;background-color&amp;#039;, colour)&lt;br /&gt;
	end&lt;br /&gt;
	local function renderNonStopRow(title, colour, isFormer)&lt;br /&gt;
		if colour then&lt;br /&gt;
			colour = string.match(colour, &amp;#039;#&amp;#039;) and colour or &amp;#039;#&amp;#039; .. colour&lt;br /&gt;
		end&lt;br /&gt;
		root&lt;br /&gt;
			:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
					:attr(&amp;#039;colspan&amp;#039;, 5)&lt;br /&gt;
					:addClass(&amp;#039;bcA&amp;#039;)&lt;br /&gt;
						:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
							:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
								:css(&amp;#039;border&amp;#039;, &amp;#039;1px solid black&amp;#039;)&lt;br /&gt;
								:css(&amp;#039;background-color&amp;#039;, colour)&lt;br /&gt;
								:wikitext(string.rep(&amp;#039;&amp;amp;nbsp;&amp;#039;, 4))&lt;br /&gt;
								:done()&lt;br /&gt;
							:wikitext(&amp;#039;&amp;amp;nbsp;&amp;#039;, isFormer == true and i18n[lang][&amp;#039;nonstop_past&amp;#039;](title) or i18n[lang][&amp;#039;nonstop_present&amp;#039;](title))&lt;br /&gt;
	end&lt;br /&gt;
	local function renderNoteRow(note)&lt;br /&gt;
		root&lt;br /&gt;
			:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
					:attr(&amp;#039;colspan&amp;#039;, 5)&lt;br /&gt;
					:addClass(&amp;#039;bcA&amp;#039;)&lt;br /&gt;
					:wikitext(note)&lt;br /&gt;
	end&lt;br /&gt;
	local function makeTerminusFunc(n, fallback)&lt;br /&gt;
		return function (side)&lt;br /&gt;
			local termini = fallback(side .. &amp;#039; terminus&amp;#039;)&lt;br /&gt;
			if type(termini) == &amp;#039;string&amp;#039; then&lt;br /&gt;
				return stationTitle(termini, args[n][&amp;#039;line&amp;#039;], args[n][&amp;#039;type&amp;#039;], n)&lt;br /&gt;
			elseif type(termini) == &amp;#039;table&amp;#039; then&lt;br /&gt;
				local i, t, to = 1, {}, args[n][&amp;#039;to-&amp;#039; .. side] or args[n][&amp;#039;to&amp;#039;]&lt;br /&gt;
				while termini[i] and to ~= termini[i] do&lt;br /&gt;
					t[i] = stationTitle(termini[i], args[n][&amp;#039;line&amp;#039;], args[n][&amp;#039;type&amp;#039;], n)&lt;br /&gt;
					i = i + 1&lt;br /&gt;
				end&lt;br /&gt;
				return stationTitle(termini[i], args[n][&amp;#039;line&amp;#039;], args[n][&amp;#039;type&amp;#039;], n) or mw.text.listToText(t, nil, &amp;#039; or &amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	data = {}&lt;br /&gt;
	local j, k, l = 2, 2, 2&lt;br /&gt;
	for i, v in ipairs(args) do&lt;br /&gt;
		args[i][&amp;#039;system&amp;#039;] = args[i][&amp;#039;system&amp;#039;] or args[i - 1][&amp;#039;system&amp;#039;]&lt;br /&gt;
		data[i] = mw.loadData(&amp;#039;Module:Adjacent stations/&amp;#039; .. args[i][&amp;#039;system&amp;#039;])&lt;br /&gt;
		lang = data[i][&amp;#039;lang&amp;#039;] or &amp;#039;en-GB&amp;#039;&lt;br /&gt;
		defaultData = function (n) return dig(data[n], &amp;#039;lines&amp;#039;, &amp;#039;_default&amp;#039;) end&lt;br /&gt;
		if args[i][&amp;#039;line&amp;#039;] then&lt;br /&gt;
			args[i][&amp;#039;line&amp;#039;] =&lt;br /&gt;
				dig(data[i], &amp;#039;lines&amp;#039;, args[i][&amp;#039;line&amp;#039;]) and args[i][&amp;#039;line&amp;#039;] or&lt;br /&gt;
				dig(data[i], &amp;#039;aliases&amp;#039;, string.lower(args[i][&amp;#039;line&amp;#039;])) or&lt;br /&gt;
				error(i18n[lang][&amp;#039;error_unknown&amp;#039;](args[i][&amp;#039;line&amp;#039;]))&lt;br /&gt;
		else&lt;br /&gt;
			args[i][&amp;#039;line&amp;#039;] = i == 1 and &amp;#039;_default&amp;#039; or args[i - 1][&amp;#039;line&amp;#039;]&lt;br /&gt;
		end&lt;br /&gt;
		lineData = function (n, line) return&lt;br /&gt;
			dig(data[n], &amp;#039;lines&amp;#039;, line or v.line) or&lt;br /&gt;
			dig(data[n], &amp;#039;lines&amp;#039;, dig(data[n], &amp;#039;aliases&amp;#039;, string.lower(line or v.line)))&lt;br /&gt;
		end&lt;br /&gt;
		typeData = function (n) return dig(lineData(n), &amp;#039;types&amp;#039;, v[&amp;#039;type&amp;#039;]) end&lt;br /&gt;
		local function fallback(parameter, n)&lt;br /&gt;
			return dig(typeData(n or i), parameter) or dig(lineData(n or i), parameter) or dig(defaultData(n or i), parameter)&lt;br /&gt;
		end&lt;br /&gt;
		local terminus = makeTerminusFunc(i, fallback)&lt;br /&gt;
		if i == 1 or args[i][&amp;#039;system&amp;#039;] ~= args[i - 1][&amp;#039;system&amp;#039;] then&lt;br /&gt;
			renderHeader(&lt;br /&gt;
				data[i][&amp;#039;header stop noun&amp;#039;] or i18n[lang][&amp;#039;stop_noun&amp;#039;],&lt;br /&gt;
				data[i][&amp;#039;system icon&amp;#039;],&lt;br /&gt;
				data[i][&amp;#039;system title&amp;#039;] or &amp;#039;[[&amp;#039; .. args[i][&amp;#039;system&amp;#039;] .. &amp;#039;]]&amp;#039;&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
		if v.header then renderSubHeader(v.header) end&lt;br /&gt;
		if v.nonstop then&lt;br /&gt;
			renderNonStopRow(fallback(&amp;#039;title&amp;#039;), fallback(&amp;#039;color&amp;#039;), v.nonstop == &amp;#039;former&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			local row = root:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			if i &amp;gt; j - 2  then&lt;br /&gt;
				while args[j] and&lt;br /&gt;
					args[j][&amp;#039;left&amp;#039;] == args[i][&amp;#039;left&amp;#039;] and&lt;br /&gt;
					args[j][&amp;#039;to-left&amp;#039;] == args[i][&amp;#039;to-left&amp;#039;] and&lt;br /&gt;
					args[j][&amp;#039;oneway-left&amp;#039;] == args[i][&amp;#039;oneway-left&amp;#039;] and&lt;br /&gt;
					args[j][&amp;#039;note-left&amp;#039;] == args[i][&amp;#039;note-left&amp;#039;] and&lt;br /&gt;
					(args[j][&amp;#039;through-left&amp;#039;] or args[j][&amp;#039;through&amp;#039;]) == (args[i][&amp;#039;through-left&amp;#039;] or args[i][&amp;#039;through&amp;#039;]) and&lt;br /&gt;
					(args[j][&amp;#039;reverse-left&amp;#039;] or args[j][&amp;#039;reverse&amp;#039;]) == (args[i][&amp;#039;reverse-left&amp;#039;] or args[i][&amp;#039;reverse&amp;#039;]) and&lt;br /&gt;
					fallback(&amp;#039;oneway-left&amp;#039;, j) == fallback(&amp;#039;oneway-left&amp;#039;) and&lt;br /&gt;
					fallback(&amp;#039;circular&amp;#039;, j) == fallback(&amp;#039;circular&amp;#039;) and&lt;br /&gt;
					not args[j][&amp;#039;nonstop&amp;#039;] and&lt;br /&gt;
					not args[j][&amp;#039;note-row&amp;#039;] do&lt;br /&gt;
					j = j + 1&lt;br /&gt;
				end&lt;br /&gt;
				renderSideCell(&lt;br /&gt;
					row,&lt;br /&gt;
					j - i,&lt;br /&gt;
					stationTitle(v.left, v.line, v[&amp;#039;type&amp;#039;], i),&lt;br /&gt;
					yesNo(fallback(&amp;#039;circular&amp;#039;)) and fallback(&amp;#039;left terminus&amp;#039;) or terminus(&amp;#039;left&amp;#039;),&lt;br /&gt;
					yesNo(v[&amp;#039;oneway-left&amp;#039;] or fallback(&amp;#039;oneway-left&amp;#039;)),&lt;br /&gt;
					yesNo(fallback(&amp;#039;circular&amp;#039;)),&lt;br /&gt;
					(v[&amp;#039;through-left&amp;#039;] or v[&amp;#039;through&amp;#039;]) and dig(lineData(i, v[&amp;#039;through-left&amp;#039;] or v[&amp;#039;through&amp;#039;]), &amp;#039;title&amp;#039;),&lt;br /&gt;
					yesNo(v[&amp;#039;reverse-left&amp;#039;] or v[&amp;#039;reverse&amp;#039;]),&lt;br /&gt;
					v[&amp;#039;note-left&amp;#039;]&lt;br /&gt;
				)&lt;br /&gt;
				j = j + 1&lt;br /&gt;
			end&lt;br /&gt;
			if i &amp;gt; k - 2 then&lt;br /&gt;
				while args[k] and&lt;br /&gt;
					args[k][&amp;#039;line&amp;#039;] == args[i][&amp;#039;line&amp;#039;] and&lt;br /&gt;
					args[k][&amp;#039;type&amp;#039;] == args[i][&amp;#039;type&amp;#039;] and&lt;br /&gt;
					args[k][&amp;#039;note-mid&amp;#039;] == args[i][&amp;#039;note-mid&amp;#039;] and&lt;br /&gt;
					not args[k][&amp;#039;nonstop&amp;#039;] and&lt;br /&gt;
					not args[k][&amp;#039;note-row&amp;#039;] do&lt;br /&gt;
					k = k + 1&lt;br /&gt;
				end&lt;br /&gt;
				renderMidCells(&lt;br /&gt;
					row,&lt;br /&gt;
					k - i,&lt;br /&gt;
					fallback(&amp;#039;color&amp;#039;),&lt;br /&gt;
					fallback(&amp;#039;background color&amp;#039;),&lt;br /&gt;
					lineData(i)[&amp;#039;title&amp;#039;] or (string.gsub(dig(defaultData(i), &amp;#039;title&amp;#039;), &amp;#039;%%1&amp;#039;, v.line)),&lt;br /&gt;
					typeData(i) and typeData(i)[&amp;#039;title&amp;#039;],&lt;br /&gt;
					v[&amp;#039;note-mid&amp;#039;] or lineData(i)[&amp;#039;note-mid&amp;#039;],&lt;br /&gt;
					stationTitle(v.transfer, v.line, v[&amp;#039;type&amp;#039;], i)&lt;br /&gt;
				)&lt;br /&gt;
				k = k + 1&lt;br /&gt;
			end&lt;br /&gt;
			if i &amp;gt; l - 2  then&lt;br /&gt;
				while args[l] and&lt;br /&gt;
					args[l][&amp;#039;right&amp;#039;] == args[i][&amp;#039;right&amp;#039;] and&lt;br /&gt;
					args[l][&amp;#039;to-right&amp;#039;] == args[i][&amp;#039;to-right&amp;#039;] and&lt;br /&gt;
					args[l][&amp;#039;oneway-right&amp;#039;] == args[i][&amp;#039;oneway-right&amp;#039;] and&lt;br /&gt;
					args[l][&amp;#039;note-right&amp;#039;] == args[i][&amp;#039;note-right&amp;#039;] and&lt;br /&gt;
					(args[l][&amp;#039;through-right&amp;#039;] or args[l][&amp;#039;through&amp;#039;]) == (args[i][&amp;#039;through-right&amp;#039;] or args[i][&amp;#039;through&amp;#039;]) and&lt;br /&gt;
					(args[l][&amp;#039;reverse-right&amp;#039;] or args[l][&amp;#039;reverse&amp;#039;]) == (args[i][&amp;#039;reverse-right&amp;#039;] or args[i][&amp;#039;reverse&amp;#039;]) and&lt;br /&gt;
					fallback(&amp;#039;oneway-right&amp;#039;, l) == fallback(&amp;#039;oneway-right&amp;#039;) and&lt;br /&gt;
					fallback(&amp;#039;circular&amp;#039;, l) == fallback(&amp;#039;circular&amp;#039;) and&lt;br /&gt;
					not args[l][&amp;#039;nonstop&amp;#039;] and&lt;br /&gt;
					not args[l][&amp;#039;note-row&amp;#039;] do&lt;br /&gt;
					l = l + 1&lt;br /&gt;
				end&lt;br /&gt;
				renderSideCell(&lt;br /&gt;
					row,&lt;br /&gt;
					l - i,&lt;br /&gt;
					stationTitle(v.right, v.line, v[&amp;#039;type&amp;#039;], i),&lt;br /&gt;
					yesNo(fallback(&amp;#039;circular&amp;#039;)) and fallback(&amp;#039;right terminus&amp;#039;) or terminus(&amp;#039;right&amp;#039;),&lt;br /&gt;
					yesNo(v[&amp;#039;oneway-right&amp;#039;] or fallback(&amp;#039;oneway-right&amp;#039;)),&lt;br /&gt;
					yesNo(fallback(&amp;#039;circular&amp;#039;)),&lt;br /&gt;
					(v[&amp;#039;through-right&amp;#039;] or v[&amp;#039;through&amp;#039;]) and dig(lineData(i, v[&amp;#039;through-right&amp;#039;] or v[&amp;#039;through&amp;#039;]), &amp;#039;title&amp;#039;),&lt;br /&gt;
					yesNo(v[&amp;#039;reverse-right&amp;#039;] or v[&amp;#039;reverse&amp;#039;]),&lt;br /&gt;
					v[&amp;#039;note-right&amp;#039;]&lt;br /&gt;
				)&lt;br /&gt;
				l = l + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if v[&amp;#039;note-row&amp;#039;] then renderNoteRow(v[&amp;#039;note-row&amp;#039;]) end&lt;br /&gt;
	end&lt;br /&gt;
	return root&lt;br /&gt;
end&lt;br /&gt;
function p.convert(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local code = mw.text.split(mw.ustring.gsub(args[1], &amp;#039;^%s*{{(.*)}}%s*$&amp;#039;, &amp;#039;%1&amp;#039;), &amp;#039;%s*}}%s*{{%s*&amp;#039;)&lt;br /&gt;
	local system&lt;br /&gt;
	local group = 0&lt;br /&gt;
	local delete = {&lt;br /&gt;
		[&amp;#039;s-rail&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;s-rail-next&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;s-rail-national&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;s-start&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;s-rail-start&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;start&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;s-end&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;end&amp;#039;] = true&lt;br /&gt;
	}&lt;br /&gt;
	local order = {&lt;br /&gt;
		&amp;#039;line&amp;#039;, &amp;#039;left&amp;#039;, &amp;#039;right&amp;#039;, &amp;#039;to-left&amp;#039;, &amp;#039;to-right&amp;#039;,&lt;br /&gt;
		&amp;#039;oneway-left&amp;#039;, &amp;#039;oneway-right&amp;#039;, &amp;#039;through-left&amp;#039;, &amp;#039;through-right&amp;#039;,&lt;br /&gt;
		&amp;#039;reverse&amp;#039;, &amp;#039;reverse-left&amp;#039;, &amp;#039;reverse-right&amp;#039;,&lt;br /&gt;
		&amp;#039;note-left&amp;#039;, &amp;#039;note-mid&amp;#039;, &amp;#039;note-right&amp;#039;, &amp;#039;transfer&amp;#039;&lt;br /&gt;
		-- circular: use module subpage&lt;br /&gt;
		-- state: not implemented&lt;br /&gt;
	}&lt;br /&gt;
	local replace = {&lt;br /&gt;
		[&amp;#039;previous&amp;#039;] = &amp;#039;left&amp;#039;,&lt;br /&gt;
		[&amp;#039;next&amp;#039;] = &amp;#039;right&amp;#039;,&lt;br /&gt;
		[&amp;#039;type&amp;#039;] = &amp;#039;to-left&amp;#039;,&lt;br /&gt;
		[&amp;#039;type2&amp;#039;] = &amp;#039;to-right&amp;#039;,&lt;br /&gt;
		[&amp;#039;branch&amp;#039;] = &amp;#039;type&amp;#039;,&lt;br /&gt;
		[&amp;#039;note&amp;#039;] = &amp;#039;note-left&amp;#039;,&lt;br /&gt;
		[&amp;#039;notemid&amp;#039;] = &amp;#039;note-mid&amp;#039;,&lt;br /&gt;
		[&amp;#039;note2&amp;#039;] = &amp;#039;note-right&amp;#039;,&lt;br /&gt;
		[&amp;#039;oneway1&amp;#039;] = &amp;#039;oneway-left&amp;#039;,&lt;br /&gt;
		[&amp;#039;oneway2&amp;#039;] = &amp;#039;oneway-right&amp;#039;,&lt;br /&gt;
		[&amp;#039;through1&amp;#039;] = &amp;#039;through-left&amp;#039;,&lt;br /&gt;
		[&amp;#039;through2&amp;#039;] = &amp;#039;through-right&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	local remove_rows = {}&lt;br /&gt;
	local data = {}&lt;br /&gt;
	for i, v in ipairs(code) do&lt;br /&gt;
		code[i] = mw.ustring.gsub(code[i], &amp;#039;\n&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
		local template = mw.ustring.lower(mw.text.trim(mw.ustring.match(code[i], &amp;#039;^[^|]+&amp;#039;)))&lt;br /&gt;
		code[i] = mw.ustring.match(code[i], &amp;#039;(|.+)$&amp;#039;)&lt;br /&gt;
		if template == &amp;#039;s-line&amp;#039; then&lt;br /&gt;
			data[i] = {}&lt;br /&gt;
			local this_system = mw.text.trim(mw.ustring.match(code[i], &amp;#039;|%s*system%s*=([^|]+)&amp;#039;))&lt;br /&gt;
			code[i] = mw.text.split(code[i], &amp;#039;%s*|%s*&amp;#039;)&lt;br /&gt;
			for m, n in ipairs(code[i]) do&lt;br /&gt;
				local tmp = mw.text.split(n, &amp;#039;%s*=%s*&amp;#039;)&lt;br /&gt;
				if tmp[3] then&lt;br /&gt;
					tmp[2] = mw.ustring.gsub(n, &amp;#039;^.-%s*=&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
				tmp[1] = replace[tmp[1]] or tmp[1]&lt;br /&gt;
				if tmp[2] then&lt;br /&gt;
					-- checks for matching brackets&lt;br /&gt;
					local curly = select(2, mw.ustring.gsub(tmp[2], &amp;quot;{&amp;quot;, &amp;quot;&amp;quot;))-select(2, mw.ustring.gsub(tmp[2], &amp;quot;}&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
					local square = select(2, mw.ustring.gsub(tmp[2], &amp;quot;%[&amp;quot;, &amp;quot;&amp;quot;))-select(2, mw.ustring.gsub(tmp[2], &amp;quot;%]&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
					if not (curly+square==0) then&lt;br /&gt;
						local count = mw.clone(m)+1&lt;br /&gt;
						while not (curly+square==0) do&lt;br /&gt;
							tmp[2] = tmp[2]..&amp;#039;|&amp;#039;..code[i][count]&lt;br /&gt;
							curly = curly+select(2, mw.ustring.gsub(code[i][count], &amp;quot;{&amp;quot;, &amp;quot;&amp;quot;))-select(2, mw.ustring.gsub(code[i][count], &amp;quot;}&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
							square = square+select(2, mw.ustring.gsub(code[i][count], &amp;quot;%[&amp;quot;, &amp;quot;&amp;quot;))-select(2, mw.ustring.gsub(code[i][count], &amp;quot;%]&amp;quot;, &amp;quot;&amp;quot;))&lt;br /&gt;
							code[i][count] = &amp;#039;&amp;#039;&lt;br /&gt;
							count = count+1&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					data[i][tmp[1]] = tmp[2]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if (this_system ~= system) or (not system) then&lt;br /&gt;
				system = this_system&lt;br /&gt;
				data[i][&amp;#039;system&amp;#039;] = system&lt;br /&gt;
			else&lt;br /&gt;
				data[i][&amp;#039;system&amp;#039;] = nil&lt;br /&gt;
			end&lt;br /&gt;
			local last = data[i-1] or data[i-2] or data[i-3]&lt;br /&gt;
			if last then&lt;br /&gt;
				for r, s in pairs({&lt;br /&gt;
					[&amp;#039;hide1&amp;#039;] = {&amp;#039;left&amp;#039;, &amp;#039;to-left&amp;#039;, &amp;#039;note-left&amp;#039;, &amp;#039;oneway-left&amp;#039;},&lt;br /&gt;
					[&amp;#039;hide2&amp;#039;] = {&amp;#039;right&amp;#039;, &amp;#039;to-right&amp;#039;, &amp;#039;note-right&amp;#039;, &amp;#039;oneway-right&amp;#039;},&lt;br /&gt;
					[&amp;#039;hidemid&amp;#039;] = {&amp;#039;type&amp;#039;, &amp;#039;note-mid&amp;#039;}&lt;br /&gt;
					}) do&lt;br /&gt;
					if data[i][r] then&lt;br /&gt;
						for m, n in ipairs(s) do&lt;br /&gt;
							if not data[i][n] then&lt;br /&gt;
								data[i][n] = last[n]&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			code[i] = {}&lt;br /&gt;
			local X = &amp;#039;|&amp;#039;&lt;br /&gt;
			local Y = (i+group)..&amp;#039;=&amp;#039;&lt;br /&gt;
			if data[i][&amp;#039;system&amp;#039;] then&lt;br /&gt;
				table.insert(code[i], &amp;#039;|system&amp;#039;)&lt;br /&gt;
				table.insert(code[i], Y)&lt;br /&gt;
				table.insert(code[i], data[i][&amp;#039;system&amp;#039;])&lt;br /&gt;
				table.insert(code[i], &amp;#039;\n&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			for m, n in ipairs(order) do&lt;br /&gt;
				if data[i][n] then&lt;br /&gt;
					table.insert(code[i], X)&lt;br /&gt;
					table.insert(code[i], n)&lt;br /&gt;
					table.insert(code[i], Y)&lt;br /&gt;
					table.insert(code[i], data[i][n])&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			code[i] = table.concat(code[i])&lt;br /&gt;
		elseif template == &amp;#039;s-note&amp;#039; then&lt;br /&gt;
			code[i] = mw.ustring.gsub(code[i], &amp;#039;|%s*text%s*=&amp;#039;, &amp;#039;|header&amp;#039;..i+group..&amp;#039;=&amp;#039;)&lt;br /&gt;
			code[i] = mw.ustring.gsub(code[i], &amp;#039;|%s*wide%s*=[^|]*&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		elseif template == &amp;#039;s-text&amp;#039; then&lt;br /&gt;
			code[i] = mw.ustring.gsub(code[i], &amp;#039;|%s*text%s*=&amp;#039;, &amp;#039;|note-row&amp;#039;..i+group..&amp;#039;=&amp;#039;)&lt;br /&gt;
		elseif delete[template] then&lt;br /&gt;
			code[i] = &amp;#039;&amp;#039;&lt;br /&gt;
			table.insert(remove_rows, 1, i) -- at the start, so that the rows are deleted in reverse order&lt;br /&gt;
			group = group-1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i, v in ipairs(remove_rows) do&lt;br /&gt;
		table.remove(code, v)&lt;br /&gt;
	end&lt;br /&gt;
	code = table.concat(code, &amp;#039;\n&amp;#039;)&lt;br /&gt;
	local t = {&amp;#039;{{Adjacent stations&amp;#039;, &amp;#039;\n}}&amp;#039;}&lt;br /&gt;
	system = mw.ustring.match(code, &amp;#039;|system(%d*)=&amp;#039;)&lt;br /&gt;
	code = mw.ustring.gsub(code, &amp;#039;\n\n+&amp;#039;, &amp;#039;\n&amp;#039;)&lt;br /&gt;
	if tonumber(system) &amp;gt; 1 then&lt;br /&gt;
		-- If s-line isn&amp;#039;t the first template then the system will have to be moved to the top&lt;br /&gt;
		system = mw.ustring.match(code, &amp;#039;|system%d*=([^|]*[^|\n])&amp;#039;)&lt;br /&gt;
		code = mw.ustring.gsub(code, &amp;#039;|system%d*=[^|]*&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		code = &amp;#039;\n|system1=&amp;#039;..system..code&lt;br /&gt;
	elseif not mw.ustring.match(code, &amp;#039;^[^{%[]*|[^=|]+2=&amp;#039;) then&lt;br /&gt;
		-- If there&amp;#039;s only one parameter group then there&amp;#039;s no need to have line breaks&lt;br /&gt;
		code = mw.ustring.gsub(code, &amp;#039;\n&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		code = mw.ustring.gsub(code, &amp;#039;(|[^=|]+)1=&amp;#039;, &amp;#039;%1=&amp;#039;)&lt;br /&gt;
		t[2] = &amp;#039;}}&amp;#039;&lt;br /&gt;
		if not mw.ustring.match(code, &amp;#039;[%[{]&amp;#039;) then&lt;br /&gt;
			code = mw.ustring.gsub(code, &amp;#039;|[^=|]*=$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
			code = mw.ustring.gsub(code, &amp;#039;|[^=|]*$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not mw.ustring.match(code, &amp;#039;[%[{]&amp;#039;) then&lt;br /&gt;
		code = mw.ustring.gsub(code, &amp;#039;|[^=|]*=|&amp;#039;, &amp;#039;|&amp;#039;)&lt;br /&gt;
		code = mw.ustring.gsub(code, &amp;#039;|[^=|]*|&amp;#039;, &amp;#039;|&amp;#039;)&lt;br /&gt;
		code = mw.ustring.gsub(code, &amp;#039;|[^=|]*=\n&amp;#039;, &amp;#039;\n&amp;#039;)&lt;br /&gt;
		code = mw.ustring.gsub(code, &amp;#039;|[^=|]*\n&amp;#039;, &amp;#039;\n&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return t[1]..code..t[2]&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Ythlev</name></author>
	</entry>
</feed>