<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pandorabox.io/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ywang</id>
	<title>Pandorabox - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://pandorabox.io/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ywang"/>
	<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php/Special:Contributions/Ywang"/>
	<updated>2026-05-24T13:41:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2546</id>
		<title>Module:Translated</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2546"/>
		<updated>2021-07-17T20:34:58Z</updated>

		<summary type="html">&lt;p&gt;Ywang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[ This module is created as a proposal to partially replace the existing Template:Translated&lt;br /&gt;
&lt;br /&gt;
Note on zh-*:&lt;br /&gt;
Certain language conversion tools for conversion between zh-hant and zh-hans appear to be quite reliable. However:&lt;br /&gt;
* I am not sure whether the use of such tools makes sense for this particular wiki.&lt;br /&gt;
* I am not sure which particular tool should be used. Currently I only know OpenCC (used for the l10n branch of advtrains) and the conversion tool used for zh.wikipedia.org&lt;br /&gt;
  * OpenCC does not provide a Lua API, and I don't think Scribunto allows loading C/C++ wrapper libraries. Therefore, it would involve a re-implementation.&lt;br /&gt;
  * I do not know whether the tool used on zh.wikipedia.org can be used on this wiki (note that zh.wikipedia.org is dedicated for a single language) or has a Lua API.&lt;br /&gt;
Further discussions can take place on the talk page.&lt;br /&gt;
- ywang&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
-- List of languages to check localized pages for&lt;br /&gt;
local langlist = {&lt;br /&gt;
  de = &amp;quot;🇩🇪&amp;quot;,&lt;br /&gt;
  ru = &amp;quot;🇷🇺&amp;quot;,&lt;br /&gt;
  fr = &amp;quot;🇫🇷&amp;quot;,&lt;br /&gt;
  es = &amp;quot;🇪🇸&amp;quot;,&lt;br /&gt;
  -- I did not add the flags for zh-hans and zh-hant mainly for political reasons&lt;br /&gt;
  [&amp;quot;zh-hans&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
  [&amp;quot;zh-hant&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
  -- It is common for modules to have wrapper functions. In this case it can be (for example) {{#invoke:Translated|main|{{{pagename|{{NAMESPACE}}:{{BASEPAGENAME}}}}}}}, which should work in most cases.&lt;br /&gt;
  local pagename = frame.args.pagename or error(&amp;quot;No page name supplied&amp;quot;)&lt;br /&gt;
  local basestr = string.format([=[&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Other languagues''' || &lt;br /&gt;
[[%s|🇬🇧 English]]]=], pagename)&lt;br /&gt;
  local stringlist = {basestr}&lt;br /&gt;
  for lang, icon in pairs(langlist) do&lt;br /&gt;
    local title = mw.title.new(pagename .. &amp;quot;/&amp;quot; .. lang)&lt;br /&gt;
    if title.exists then -- WARNING: EXPENSIVE OPERATION&lt;br /&gt;
      stringlist[#stringlist+1] = string.format(&amp;quot; - [[%s/%s|%s %s]]&amp;quot;, pagename, lang, icon, mw.language.fetchLanguageName(lang))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  stringlist[#stringlist+1] = &amp;quot;\n|}&amp;quot;&lt;br /&gt;
  return table.concat(stringlist)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2545</id>
		<title>Module:Translated</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2545"/>
		<updated>2021-07-17T20:31:34Z</updated>

		<summary type="html">&lt;p&gt;Ywang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[ This module is created as a proposal to partially replace the existing Template:Translated&lt;br /&gt;
&lt;br /&gt;
Note on zh-*:&lt;br /&gt;
Certain language conversion tools for conversion between zh-hant and zh-hans appear to be quite reliable. However:&lt;br /&gt;
* I am not sure whether the use of such tools makes sense for this particular wiki.&lt;br /&gt;
* I am not sure which particular tool should be used. Currently I only know OpenCC (used for the l10n branch of advtrains) and the conversion tool used for zh.wikipedia.org&lt;br /&gt;
  * OpenCC does not provide a Lua API, and I don't think Scribunto allows loading C/C++ wrapper libraries. Therefore, it would involve a re-implementation.&lt;br /&gt;
  * I do not know whether the tool used on zh.wikipedia.org can be used on this wiki or has a Lua API.&lt;br /&gt;
Further discussions can take place on the talk page.&lt;br /&gt;
- ywang&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
-- List of languages to check localized pages for&lt;br /&gt;
local langlist = {&lt;br /&gt;
  de = &amp;quot;🇩🇪&amp;quot;,&lt;br /&gt;
  ru = &amp;quot;🇷🇺&amp;quot;,&lt;br /&gt;
  fr = &amp;quot;🇫🇷&amp;quot;,&lt;br /&gt;
  es = &amp;quot;🇪🇸&amp;quot;,&lt;br /&gt;
  -- I did not add the flags for zh-hans and zh-hant mainly for political reasons&lt;br /&gt;
  [&amp;quot;zh-hans&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
  [&amp;quot;zh-hant&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
  -- It is common for modules to have wrapper functions. In this case it can be (for example) {{#invoke:Translated|main|{{{pagename|{{NAMESPACE}}:{{BASEPAGENAME}}}}}}}, which should work in most cases.&lt;br /&gt;
  local pagename = frame.args.pagename or error(&amp;quot;No page name supplied&amp;quot;)&lt;br /&gt;
  local basestr = string.format([=[&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Other languagues''' || &lt;br /&gt;
[[%s|🇬🇧 English]]]=], pagename)&lt;br /&gt;
  local stringlist = {basestr}&lt;br /&gt;
  for lang, icon in pairs(langlist) do&lt;br /&gt;
    local title = mw.title.new(pagename .. &amp;quot;/&amp;quot; .. lang)&lt;br /&gt;
    if title.exists then -- WARNING: EXPENSIVE OPERATION&lt;br /&gt;
      stringlist[#stringlist+1] = string.format(&amp;quot; - [[%s/%s|%s %s]]&amp;quot;, pagename, lang, icon, mw.language.fetchLanguageName(lang))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  stringlist[#stringlist+1] = &amp;quot;\n|}&amp;quot;&lt;br /&gt;
  return table.concat(stringlist)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2544</id>
		<title>Module:Translated</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2544"/>
		<updated>2021-07-17T20:31:14Z</updated>

		<summary type="html">&lt;p&gt;Ywang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[ This module is created as a proposal to partially replace the existing Template:Translated&lt;br /&gt;
&lt;br /&gt;
Note on zh-*:&lt;br /&gt;
Certain language conversion tools for conversion between zh-hant and zh-hans appears to be quite reliable. However:&lt;br /&gt;
* I am not sure whether the use of such tools makes sense for this particular wiki.&lt;br /&gt;
* I am not sure which particular tool should be used. Currently I only know OpenCC (used for the l10n branch of advtrains) and the conversion tool used for zh.wikipedia.org&lt;br /&gt;
  * OpenCC does not provide a Lua API, and I don't think Scribunto allows loading C/C++ wrapper libraries. Therefore, it would involve a re-implementation.&lt;br /&gt;
  * I do not know whether the tool used on zh.wikipedia.org can be used on this wiki or has a Lua API.&lt;br /&gt;
Further discussions can take place on the talk page.&lt;br /&gt;
- ywang&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
-- List of languages to check localized pages for&lt;br /&gt;
local langlist = {&lt;br /&gt;
  de = &amp;quot;🇩🇪&amp;quot;,&lt;br /&gt;
  ru = &amp;quot;🇷🇺&amp;quot;,&lt;br /&gt;
  fr = &amp;quot;🇫🇷&amp;quot;,&lt;br /&gt;
  es = &amp;quot;🇪🇸&amp;quot;,&lt;br /&gt;
  -- I did not add the flags for zh-hans and zh-hant mainly for political reasons&lt;br /&gt;
  [&amp;quot;zh-hans&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
  [&amp;quot;zh-hant&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
  -- It is common for modules to have wrapper functions. In this case it can be (for example) {{#invoke:Translated|main|{{{pagename|{{NAMESPACE}}:{{BASEPAGENAME}}}}}}}, which should work in most cases.&lt;br /&gt;
  local pagename = frame.args.pagename or error(&amp;quot;No page name supplied&amp;quot;)&lt;br /&gt;
  local basestr = string.format([=[&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Other languagues''' || &lt;br /&gt;
[[%s|🇬🇧 English]]]=], pagename)&lt;br /&gt;
  local stringlist = {basestr}&lt;br /&gt;
  for lang, icon in pairs(langlist) do&lt;br /&gt;
    local title = mw.title.new(pagename .. &amp;quot;/&amp;quot; .. lang)&lt;br /&gt;
    if title.exists then -- WARNING: EXPENSIVE OPERATION&lt;br /&gt;
      stringlist[#stringlist+1] = string.format(&amp;quot; - [[%s/%s|%s %s]]&amp;quot;, pagename, lang, icon, mw.language.fetchLanguageName(lang))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  stringlist[#stringlist+1] = &amp;quot;\n|}&amp;quot;&lt;br /&gt;
  return table.concat(stringlist)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Basic_infobox/doc&amp;diff=2493</id>
		<title>Module:Basic infobox/doc</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Basic_infobox/doc&amp;diff=2493"/>
		<updated>2021-06-23T18:15:50Z</updated>

		<summary type="html">&lt;p&gt;Ywang: Created page with &amp;quot;This is a simple module that generates infoboxes.  == Usage == The &amp;lt;code&amp;gt;above&amp;lt;/code&amp;gt; field is the content of the header column at the top of the infobox.  Each row is indexed...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a simple module that generates infoboxes.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
The &amp;lt;code&amp;gt;above&amp;lt;/code&amp;gt; field is the content of the header column at the top of the infobox.&lt;br /&gt;
&lt;br /&gt;
Each row is indexed by a number and can have the following elements:&lt;br /&gt;
* &amp;lt;code&amp;gt;header&amp;lt;sub&amp;gt;''n''&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;: used for header rows&lt;br /&gt;
* &amp;lt;code&amp;gt;label&amp;lt;sub&amp;gt;''n''&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;: optional label for data rows&lt;br /&gt;
* &amp;lt;code&amp;gt;data&amp;lt;sub&amp;gt;''n&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;: data for the row (ignored for header rows; hides row when absent or empty otherwise)&lt;br /&gt;
Row indices do not have to be continuous.&lt;br /&gt;
&lt;br /&gt;
Styles can be defined with e.g. &amp;lt;code&amp;gt;abovestyle&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;labelstyle&amp;lt;sub&amp;gt;''n''&amp;lt;/sub&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{#invoke:basic infobox|main&lt;br /&gt;
| above = [[Module:Basic infobox]]&amp;lt;br/&amp;gt;''Simple infobox generator''&lt;br /&gt;
| data1 = [[File:Placeholder.png|frameless|upright=1.0]]&lt;br /&gt;
| header2 = &amp;amp;nbsp;&lt;br /&gt;
| headerstyle2 = font-size:0.5em&lt;br /&gt;
| label3 = Type&lt;br /&gt;
| data3 = Module&lt;br /&gt;
| label4 = Status&lt;br /&gt;
| data4 = Testing&lt;br /&gt;
| datastyle4 = background-color:orange&lt;br /&gt;
| header10 = Discussion page&lt;br /&gt;
| data11 = [[Module talk:Basic infobox]]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Generates:&lt;br /&gt;
{{#invoke:basic infobox|main&lt;br /&gt;
| above = [[Module:Basic infobox]]&amp;lt;br/&amp;gt;''Simple infobox generator''&lt;br /&gt;
| data1 = [[File:Placeholder.png|frameless|upright=1.0]]&lt;br /&gt;
| header2 = &amp;amp;nbsp;&lt;br /&gt;
| headerstyle2 = font-size:0.5em&lt;br /&gt;
| label3 = Type&lt;br /&gt;
| data3 = Module&lt;br /&gt;
| label4 = Status&lt;br /&gt;
| data4 = Testing&lt;br /&gt;
| datastyle4 = background-color:orange&lt;br /&gt;
| header10 = Discussion page&lt;br /&gt;
| data11 = [[Module talk:Basic infobox]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2492</id>
		<title>Module:Basic infobox</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2492"/>
		<updated>2021-06-23T18:14:46Z</updated>

		<summary type="html">&lt;p&gt;Ywang: fix text alignment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
This module implements a basic infobox template.&lt;br /&gt;
This is designed to be at least partially compatitable with the one seen on Wikipedia, but is not a replacement of it.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
	local args = frame.args or error(&amp;quot;No argument supplied&amp;quot;)&lt;br /&gt;
	local style = args.style or &amp;quot;&amp;quot;&lt;br /&gt;
	style = &amp;quot;float:right;&amp;quot; .. style&lt;br /&gt;
	local tclass = args.class or &amp;quot;&amp;quot;&lt;br /&gt;
	tclass = &amp;quot;wikitable &amp;quot;..tclass&lt;br /&gt;
	local node = mw.html.create(&amp;quot;table&amp;quot;):attr{class = tclass, style = style}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local oargs = {} -- organized argument list&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local attr, idx = string.match(k, &amp;quot;^(%D+)(%d+)$&amp;quot;)&lt;br /&gt;
		idx = tonumber(idx)&lt;br /&gt;
		local body = v&lt;br /&gt;
		if body == &amp;quot;&amp;quot; then body = nil end&lt;br /&gt;
		if idx and body then&lt;br /&gt;
			if not oargs[idx] then oargs[idx] = {} end&lt;br /&gt;
			oargs[idx][attr] = body&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.above then&lt;br /&gt;
		node:tag(&amp;quot;tr&amp;quot;):tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;background:green&amp;quot;):cssText(args.abovestyle):wikitext(args.above)&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, table.maxn(oargs) do&lt;br /&gt;
		local rowargs = oargs[i]&lt;br /&gt;
		if rowargs then&lt;br /&gt;
			local row = node:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
			if rowargs.header then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;background:green&amp;quot;):cssText(rowargs.headerstyle):wikitext(rowargs.header)&lt;br /&gt;
			elseif rowargs.label and rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):cssText(&amp;quot;font-weight:bold&amp;quot;):cssText(rowargs.labelstyle):wikitext(rowargs.label)&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			elseif rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;text-align:center&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(node)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;br /&gt;
&lt;br /&gt;
--[[ Testing code:&lt;br /&gt;
mw.log(p.main(mw.getCurrentFrame():newChild{args = {&lt;br /&gt;
	style=&amp;quot;width:fit-content&amp;quot;,&lt;br /&gt;
	class=&amp;quot;sample-class&amp;quot;,&lt;br /&gt;
	above=&amp;quot;Title&amp;quot;,&lt;br /&gt;
	header1=&amp;quot;Header&amp;quot;,&lt;br /&gt;
	headerstyle1=&amp;quot;background-color:green&amp;quot;,&lt;br /&gt;
	header2=&amp;quot;&amp;quot;, -- should not be shown&lt;br /&gt;
	label10=&amp;quot;Field&amp;quot;,&lt;br /&gt;
	labelstyle10=&amp;quot;color:blue&amp;quot;,&lt;br /&gt;
	data10=&amp;quot;No&amp;quot;,&lt;br /&gt;
	datastyle10=&amp;quot;color:red&amp;quot;,&lt;br /&gt;
	data11=&amp;quot;content-only&amp;quot;,&lt;br /&gt;
	label12=&amp;quot;label with no data&amp;quot;, -- should not be shown&lt;br /&gt;
}}))&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2491</id>
		<title>Module:Basic infobox</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2491"/>
		<updated>2021-06-23T18:06:56Z</updated>

		<summary type="html">&lt;p&gt;Ywang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
This module implements a basic infobox template.&lt;br /&gt;
This is designed to be at least partially compatitable with the one seen on Wikipedia, but is not a replacement of it.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
	local args = frame.args or error(&amp;quot;No argument supplied&amp;quot;)&lt;br /&gt;
	local style = args.style or &amp;quot;&amp;quot;&lt;br /&gt;
	style = &amp;quot;float:right;&amp;quot; .. style&lt;br /&gt;
	local tclass = args.class or &amp;quot;&amp;quot;&lt;br /&gt;
	tclass = &amp;quot;wikitable &amp;quot;..tclass&lt;br /&gt;
	local node = mw.html.create(&amp;quot;table&amp;quot;):attr{class = tclass, style = style}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local oargs = {} -- organized argument list&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local attr, idx = string.match(k, &amp;quot;^(%D+)(%d+)$&amp;quot;)&lt;br /&gt;
		idx = tonumber(idx)&lt;br /&gt;
		local body = v&lt;br /&gt;
		if body == &amp;quot;&amp;quot; then body = nil end&lt;br /&gt;
		if idx and body then&lt;br /&gt;
			if not oargs[idx] then oargs[idx] = {} end&lt;br /&gt;
			oargs[idx][attr] = body&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.above then&lt;br /&gt;
		node:tag(&amp;quot;tr&amp;quot;):tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;background:green&amp;quot;):cssText(args.abovestyle):wikitext(args.above)&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, table.maxn(oargs) do&lt;br /&gt;
		local rowargs = oargs[i]&lt;br /&gt;
		if rowargs then&lt;br /&gt;
			local row = node:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
			if rowargs.header then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;background:green&amp;quot;):cssText(rowargs.headerstyle):wikitext(rowargs.header)&lt;br /&gt;
			elseif rowargs.label and rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):cssText(rowargs.labelstyle):wikitext(rowargs.label)&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			elseif rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(node)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;br /&gt;
&lt;br /&gt;
--[[ Testing code:&lt;br /&gt;
mw.log(p.main(mw.getCurrentFrame():newChild{args = {&lt;br /&gt;
	style=&amp;quot;width:fit-content&amp;quot;,&lt;br /&gt;
	class=&amp;quot;sample-class&amp;quot;,&lt;br /&gt;
	above=&amp;quot;Title&amp;quot;,&lt;br /&gt;
	header1=&amp;quot;Header&amp;quot;,&lt;br /&gt;
	headerstyle1=&amp;quot;background-color:green&amp;quot;,&lt;br /&gt;
	header2=&amp;quot;&amp;quot;, -- should not be shown&lt;br /&gt;
	label10=&amp;quot;Field&amp;quot;,&lt;br /&gt;
	labelstyle10=&amp;quot;color:blue&amp;quot;,&lt;br /&gt;
	data10=&amp;quot;No&amp;quot;,&lt;br /&gt;
	datastyle10=&amp;quot;color:red&amp;quot;,&lt;br /&gt;
	data11=&amp;quot;content-only&amp;quot;,&lt;br /&gt;
	label12=&amp;quot;label with no data&amp;quot;, -- should not be shown&lt;br /&gt;
}}))&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2490</id>
		<title>Module:Basic infobox</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2490"/>
		<updated>2021-06-23T17:56:27Z</updated>

		<summary type="html">&lt;p&gt;Ywang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
This module implements a basic infobox template.&lt;br /&gt;
This is designed to be at least partially compatitable with the one seen on Wikipedia, but is not a replacement of it.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
	local args = frame.args or error(&amp;quot;No argument supplied&amp;quot;)&lt;br /&gt;
	local style = args.style or &amp;quot;&amp;quot;&lt;br /&gt;
	style = &amp;quot;float:right;&amp;quot; .. style&lt;br /&gt;
	local tclass = args.class or &amp;quot;&amp;quot;&lt;br /&gt;
	tclass = &amp;quot;wikitable &amp;quot;..tclass&lt;br /&gt;
	local node = mw.html.create(&amp;quot;table&amp;quot;):attr{class = tclass, style = style}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local oargs = {} -- organized argument list&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local attr, idx = string.match(k, &amp;quot;^(%D+)(%d+)$&amp;quot;)&lt;br /&gt;
		idx = tonumber(idx)&lt;br /&gt;
		local body = v&lt;br /&gt;
		if body == &amp;quot;&amp;quot; then body = nil end&lt;br /&gt;
		if idx and body then&lt;br /&gt;
			if not oargs[idx] then oargs[idx] = {} end&lt;br /&gt;
			oargs[idx][attr] = body&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args.above then&lt;br /&gt;
		node:tag(&amp;quot;tr&amp;quot;):tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;background:green;font-size:2em&amp;quot;):cssText(args.abovestyle):wikitext(args.above)&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, table.maxn(oargs) do&lt;br /&gt;
		local rowargs = oargs[i]&lt;br /&gt;
		if rowargs then&lt;br /&gt;
			local row = node:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
			if rowargs.header then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;background:green&amp;quot;):cssText(rowargs.headerstyle):wikitext(rowargs.header)&lt;br /&gt;
			elseif rowargs.label and rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):cssText(rowargs.labelstyle):wikitext(rowargs.label)&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			elseif rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(node)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;br /&gt;
&lt;br /&gt;
--[[ Testing code:&lt;br /&gt;
mw.log(p.main(mw.getCurrentFrame():newChild{args = {&lt;br /&gt;
	style=&amp;quot;width:fit-content&amp;quot;,&lt;br /&gt;
	class=&amp;quot;sample-class&amp;quot;,&lt;br /&gt;
	above=&amp;quot;Title&amp;quot;,&lt;br /&gt;
	header1=&amp;quot;Header&amp;quot;,&lt;br /&gt;
	headerstyle1=&amp;quot;background-color:green&amp;quot;,&lt;br /&gt;
	header2=&amp;quot;&amp;quot;, -- should not be shown&lt;br /&gt;
	label10=&amp;quot;Field&amp;quot;,&lt;br /&gt;
	labelstyle10=&amp;quot;color:blue&amp;quot;,&lt;br /&gt;
	data10=&amp;quot;No&amp;quot;,&lt;br /&gt;
	datastyle10=&amp;quot;color:red&amp;quot;,&lt;br /&gt;
	data11=&amp;quot;content-only&amp;quot;,&lt;br /&gt;
	label12=&amp;quot;label with no data&amp;quot;, -- should not be shown&lt;br /&gt;
}}))&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2489</id>
		<title>Module:Basic infobox</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2489"/>
		<updated>2021-06-23T17:36:58Z</updated>

		<summary type="html">&lt;p&gt;Ywang: allow data-only rows (e.g. for pictures or screenshots)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
This module implements a basic infobox template.&lt;br /&gt;
This is designed to be at least partially compatitable with the one seen on Wikipedia, but is not a replacement of it.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
	local args = frame.args or error(&amp;quot;No argument supplied&amp;quot;)&lt;br /&gt;
	local style = args.style or &amp;quot;&amp;quot;&lt;br /&gt;
	style = &amp;quot;float:right;&amp;quot; .. style&lt;br /&gt;
	local tclass = args.class or &amp;quot;&amp;quot;&lt;br /&gt;
	tclass = &amp;quot;wikitable &amp;quot;..tclass&lt;br /&gt;
	local node = mw.html.create(&amp;quot;table&amp;quot;):attr{class = tclass, style = style}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local oargs = {} -- organized argument list&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local attr, idx = string.match(k, &amp;quot;^(%D+)(%d+)$&amp;quot;)&lt;br /&gt;
		idx = tonumber(idx)&lt;br /&gt;
		local body = v&lt;br /&gt;
		if body == &amp;quot;&amp;quot; then body = nil end&lt;br /&gt;
		if idx and body then&lt;br /&gt;
			if not oargs[idx] then oargs[idx] = {} end&lt;br /&gt;
			oargs[idx][attr] = body&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, table.maxn(oargs) do&lt;br /&gt;
		local rowargs = oargs[i]&lt;br /&gt;
		if rowargs then&lt;br /&gt;
			local row = node:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
			if rowargs.header then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;background:green&amp;quot;):cssText(rowargs.headerstyle):wikitext(rowargs.header)&lt;br /&gt;
			elseif rowargs.label and rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):cssText(rowargs.labelstyle):wikitext(rowargs.label)&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			elseif rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(node)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;br /&gt;
&lt;br /&gt;
--[[ Testing code:&lt;br /&gt;
mw.log(p.main(mw.getCurrentFrame():newChild{args = {&lt;br /&gt;
	style=&amp;quot;width:fit-content&amp;quot;,&lt;br /&gt;
	class=&amp;quot;sample-class&amp;quot;,&lt;br /&gt;
	header1=&amp;quot;Header&amp;quot;,&lt;br /&gt;
	headerstyle1=&amp;quot;background-color:green&amp;quot;,&lt;br /&gt;
	header2=&amp;quot;&amp;quot;, -- should not be shown&lt;br /&gt;
	label10=&amp;quot;Field&amp;quot;,&lt;br /&gt;
	labelstyle10=&amp;quot;color:blue&amp;quot;,&lt;br /&gt;
	data10=&amp;quot;No&amp;quot;,&lt;br /&gt;
	datastyle10=&amp;quot;color:red&amp;quot;,&lt;br /&gt;
	data11=&amp;quot;content-only&amp;quot;,&lt;br /&gt;
	label12=&amp;quot;label with no data&amp;quot;, -- should not be shown&lt;br /&gt;
}}))&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2469</id>
		<title>Module:Basic infobox</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2469"/>
		<updated>2021-06-23T06:17:44Z</updated>

		<summary type="html">&lt;p&gt;Ywang: fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
This module implements a basic infobox template.&lt;br /&gt;
This is designed to be at least partially compatitable with the one seen on Wikipedia, but is not a replacement of it.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
	local args = frame.args or error(&amp;quot;No argument supplied&amp;quot;)&lt;br /&gt;
	local style = args.style or &amp;quot;&amp;quot;&lt;br /&gt;
	style = &amp;quot;float:right;&amp;quot; .. style&lt;br /&gt;
	local tclass = args.class or &amp;quot;&amp;quot;&lt;br /&gt;
	tclass = &amp;quot;wikitable &amp;quot;..tclass&lt;br /&gt;
	local node = mw.html.create(&amp;quot;table&amp;quot;):attr{class = tclass, style = style}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local oargs = {} -- organized argument list&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local attr, idx = string.match(k, &amp;quot;^(%D+)(%d+)$&amp;quot;)&lt;br /&gt;
		idx = tonumber(idx)&lt;br /&gt;
		local body = v&lt;br /&gt;
		if body == &amp;quot;&amp;quot; then body = nil end&lt;br /&gt;
		if idx and body then&lt;br /&gt;
			if not oargs[idx] then oargs[idx] = {} end&lt;br /&gt;
			oargs[idx][attr] = body&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, table.maxn(oargs) do&lt;br /&gt;
		local rowargs = oargs[i]&lt;br /&gt;
		if rowargs then&lt;br /&gt;
			local row = node:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
			if rowargs.header then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;background:green&amp;quot;):cssText(rowargs.headerstyle):wikitext(rowargs.header)&lt;br /&gt;
			elseif rowargs.label and rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):cssText(rowargs.labelstyle):wikitext(rowargs.label)&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(node)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;br /&gt;
&lt;br /&gt;
--[[ Testing code:&lt;br /&gt;
mw.log(p.main(mw.getCurrentFrame():newChild{args = {&lt;br /&gt;
	style=&amp;quot;width:fit-content&amp;quot;,&lt;br /&gt;
	class=&amp;quot;sample-class&amp;quot;,&lt;br /&gt;
	header1=&amp;quot;Header&amp;quot;,&lt;br /&gt;
	headerstyle1=&amp;quot;background-color:green&amp;quot;,&lt;br /&gt;
	header2=&amp;quot;&amp;quot;, -- should not be shown&lt;br /&gt;
	label10=&amp;quot;Field&amp;quot;,&lt;br /&gt;
	labelstyle10=&amp;quot;color:blue&amp;quot;,&lt;br /&gt;
	data10=&amp;quot;No&amp;quot;,&lt;br /&gt;
	datastyle10=&amp;quot;color:red&amp;quot;,&lt;br /&gt;
	data11=&amp;quot;data with no label&amp;quot;, -- should not be shown&lt;br /&gt;
	label12=&amp;quot;label with no data&amp;quot;, -- should not be shown&lt;br /&gt;
}}))&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2468</id>
		<title>Module:Basic infobox</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2468"/>
		<updated>2021-06-23T06:17:08Z</updated>

		<summary type="html">&lt;p&gt;Ywang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
This module implements a basic infobox template.&lt;br /&gt;
This is designed to be at least partially compatitable with the one seen on Wikipedia, but is not a replacement of it.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
	local args = frame.args or error(&amp;quot;No argument supplied&amp;quot;)&lt;br /&gt;
	local style = args.style or &amp;quot;&amp;quot;&lt;br /&gt;
	style = &amp;quot;float:right;&amp;quot; .. style&lt;br /&gt;
	local tclass = args.class or &amp;quot;&amp;quot;&lt;br /&gt;
	tclass = &amp;quot;wikitable &amp;quot;..tclass&lt;br /&gt;
	local node = mw.html.create(&amp;quot;table&amp;quot;):attr{class = tclass, style = style}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local oargs = {} -- organized argument list&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local attr, idx = string.match(k, &amp;quot;^(%D+)(%d+)$&amp;quot;)&lt;br /&gt;
		idx = tonumber(idx)&lt;br /&gt;
		local body = v&lt;br /&gt;
		if body == &amp;quot;&amp;quot; then body = nil end&lt;br /&gt;
		if idx and body then&lt;br /&gt;
			if not oargs[idx] then oargs[idx] = {} end&lt;br /&gt;
			oargs[idx][attr] = body&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, table.maxn(oargs) do&lt;br /&gt;
		local rowargs = oargs[i]&lt;br /&gt;
		if rowargs then&lt;br /&gt;
			local row = node:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
			if rowargs.header then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(&amp;quot;backgrond:green&amp;quot;):cssText(rowargs.headerstyle):wikitext(rowargs.header)&lt;br /&gt;
			elseif rowargs.label and rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):cssText(rowargs.labelstyle):wikitext(rowargs.label)&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(node)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;br /&gt;
&lt;br /&gt;
--[[ Testing code:&lt;br /&gt;
mw.log(p.main(mw.getCurrentFrame():newChild{args = {&lt;br /&gt;
	style=&amp;quot;width:fit-content&amp;quot;,&lt;br /&gt;
	class=&amp;quot;sample-class&amp;quot;,&lt;br /&gt;
	header1=&amp;quot;Header&amp;quot;,&lt;br /&gt;
	headerstyle1=&amp;quot;background-color:green&amp;quot;,&lt;br /&gt;
	header2=&amp;quot;&amp;quot;, -- should not be shown&lt;br /&gt;
	label10=&amp;quot;Field&amp;quot;,&lt;br /&gt;
	labelstyle10=&amp;quot;color:blue&amp;quot;,&lt;br /&gt;
	data10=&amp;quot;No&amp;quot;,&lt;br /&gt;
	datastyle10=&amp;quot;color:red&amp;quot;,&lt;br /&gt;
	data11=&amp;quot;data with no label&amp;quot;, -- should not be shown&lt;br /&gt;
	label12=&amp;quot;label with no data&amp;quot;, -- should not be shown&lt;br /&gt;
}}))&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2467</id>
		<title>Module:Basic infobox</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2467"/>
		<updated>2021-06-23T06:16:33Z</updated>

		<summary type="html">&lt;p&gt;Ywang: Use consistent styling with existing infobox templates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
This module implements a basic infobox template.&lt;br /&gt;
This is designed to be at least partially compatitable with the one seen on Wikipedia, but is not a replacement of it.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
	local args = frame.args or error(&amp;quot;No argument supplied&amp;quot;)&lt;br /&gt;
	local style = args.style or &amp;quot;&amp;quot;&lt;br /&gt;
	style = &amp;quot;float:right;&amp;quot; .. style&lt;br /&gt;
	local tclass = args.class or &amp;quot;&amp;quot;&lt;br /&gt;
	tclass = &amp;quot;wikitable &amp;quot;..tclass&lt;br /&gt;
	local node = mw.html.create(&amp;quot;table&amp;quot;):attr{class = tclass, style = style}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local oargs = {} -- organized argument list&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local attr, idx = string.match(k, &amp;quot;^(%D+)(%d+)$&amp;quot;)&lt;br /&gt;
		idx = tonumber(idx)&lt;br /&gt;
		local body = v&lt;br /&gt;
		if body == &amp;quot;&amp;quot; then body = nil end&lt;br /&gt;
		if idx and body then&lt;br /&gt;
			if not oargs[idx] then oargs[idx] = {} end&lt;br /&gt;
			oargs[idx][attr] = body&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, table.maxn(oargs) do&lt;br /&gt;
		local rowargs = oargs[i]&lt;br /&gt;
		if rowargs then&lt;br /&gt;
			local row = node:tag(&amp;quot;tr&amp;quot;):cssText(&amp;quot;background:green&amp;quot;)&lt;br /&gt;
			if rowargs.header then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(rowargs.headerstyle):wikitext(rowargs.header)&lt;br /&gt;
			elseif rowargs.label and rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):cssText(rowargs.labelstyle):wikitext(rowargs.label)&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(node)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;br /&gt;
&lt;br /&gt;
--[[ Testing code:&lt;br /&gt;
mw.log(p.main(mw.getCurrentFrame():newChild{args = {&lt;br /&gt;
	style=&amp;quot;width:fit-content&amp;quot;,&lt;br /&gt;
	class=&amp;quot;sample-class&amp;quot;,&lt;br /&gt;
	header1=&amp;quot;Header&amp;quot;,&lt;br /&gt;
	headerstyle1=&amp;quot;background-color:green&amp;quot;,&lt;br /&gt;
	header2=&amp;quot;&amp;quot;, -- should not be shown&lt;br /&gt;
	label10=&amp;quot;Field&amp;quot;,&lt;br /&gt;
	labelstyle10=&amp;quot;color:blue&amp;quot;,&lt;br /&gt;
	data10=&amp;quot;No&amp;quot;,&lt;br /&gt;
	datastyle10=&amp;quot;color:red&amp;quot;,&lt;br /&gt;
	data11=&amp;quot;data with no label&amp;quot;, -- should not be shown&lt;br /&gt;
	label12=&amp;quot;label with no data&amp;quot;, -- should not be shown&lt;br /&gt;
}}))&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=User:Ywang/sandbox&amp;diff=2466</id>
		<title>User:Ywang/sandbox</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=User:Ywang/sandbox&amp;diff=2466"/>
		<updated>2021-06-23T06:14:32Z</updated>

		<summary type="html">&lt;p&gt;Ywang: Created page with &amp;quot;&amp;lt;!-- testing the infobox module --&amp;gt; {{#invoke:basic infobox|main | header10 = Header | header11 = Styled header | headerstyle11 = background:blue | header15 = &amp;lt;!-- empty --&amp;gt; |...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- testing the infobox module --&amp;gt;&lt;br /&gt;
{{#invoke:basic infobox|main&lt;br /&gt;
| header10 = Header&lt;br /&gt;
| header11 = Styled header&lt;br /&gt;
| headerstyle11 = background:blue&lt;br /&gt;
| header15 = &amp;lt;!-- empty --&amp;gt;&lt;br /&gt;
| label20 = hidden label&lt;br /&gt;
| label21 = hidden value&lt;br /&gt;
| label25 = some label&lt;br /&gt;
| data25 = some data&lt;br /&gt;
| label26 = styled label&lt;br /&gt;
| data26 = styled data&lt;br /&gt;
| labelstyle26 = background:orange&lt;br /&gt;
| datastyle26 = color:red&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2465</id>
		<title>Module:Basic infobox</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Basic_infobox&amp;diff=2465"/>
		<updated>2021-06-23T06:09:45Z</updated>

		<summary type="html">&lt;p&gt;Ywang: simple infobox implementation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
This module implements a basic infobox template.&lt;br /&gt;
This is designed to be at least partially compatitable with the one seen on Wikipedia, but is not a replacement of it.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
	local args = frame.args or error(&amp;quot;No argument supplied&amp;quot;)&lt;br /&gt;
	local style = args.style or &amp;quot;&amp;quot;&lt;br /&gt;
	style = &amp;quot;float:right;&amp;quot; .. style&lt;br /&gt;
	local tclass = args.class or &amp;quot;&amp;quot;&lt;br /&gt;
	tclass = &amp;quot;wikitable &amp;quot;..tclass&lt;br /&gt;
	local node = mw.html.create(&amp;quot;table&amp;quot;):attr{class = tclass, style = style}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	local oargs = {} -- organized argument list&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local attr, idx = string.match(k, &amp;quot;^(%D+)(%d+)$&amp;quot;)&lt;br /&gt;
		idx = tonumber(idx)&lt;br /&gt;
		local body = v&lt;br /&gt;
		if body == &amp;quot;&amp;quot; then body = nil end&lt;br /&gt;
		if idx and body then&lt;br /&gt;
			if not oargs[idx] then oargs[idx] = {} end&lt;br /&gt;
			oargs[idx][attr] = body&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, table.maxn(oargs) do&lt;br /&gt;
		local rowargs = oargs[i]&lt;br /&gt;
		if rowargs then&lt;br /&gt;
			local row = node:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
			if rowargs.header then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):attr(&amp;quot;colspan&amp;quot;, &amp;quot;2&amp;quot;):cssText(rowargs.headerstyle):wikitext(rowargs.header)&lt;br /&gt;
			elseif rowargs.label and rowargs.data then&lt;br /&gt;
				row:tag(&amp;quot;th&amp;quot;):cssText(rowargs.labelstyle):wikitext(rowargs.label)&lt;br /&gt;
				row:tag(&amp;quot;td&amp;quot;):cssText(rowargs.datastyle):wikitext(rowargs.data)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(node)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;br /&gt;
&lt;br /&gt;
--[[ Testing code:&lt;br /&gt;
mw.log(p.main(mw.getCurrentFrame():newChild{args = {&lt;br /&gt;
	style=&amp;quot;width:fit-content&amp;quot;,&lt;br /&gt;
	class=&amp;quot;sample-class&amp;quot;,&lt;br /&gt;
	header1=&amp;quot;Header&amp;quot;,&lt;br /&gt;
	headerstyle1=&amp;quot;background-color:green&amp;quot;,&lt;br /&gt;
	header2=&amp;quot;&amp;quot;, -- should not be shown&lt;br /&gt;
	label10=&amp;quot;Field&amp;quot;,&lt;br /&gt;
	labelstyle10=&amp;quot;color:blue&amp;quot;,&lt;br /&gt;
	data10=&amp;quot;No&amp;quot;,&lt;br /&gt;
	datastyle10=&amp;quot;color:red&amp;quot;,&lt;br /&gt;
	data11=&amp;quot;data with no label&amp;quot;, -- should not be shown&lt;br /&gt;
	label12=&amp;quot;label with no data&amp;quot;, -- should not be shown&lt;br /&gt;
}}))&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Template:Translated&amp;diff=2424</id>
		<title>Template:Translated</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Template:Translated&amp;diff=2424"/>
		<updated>2021-05-30T18:38:16Z</updated>

		<summary type="html">&lt;p&gt;Ywang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;!-- Please change Module:Translated instead&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Other languagues''' || &lt;br /&gt;
[[{{{pagename}}}|🇬🇧 English]] - &lt;br /&gt;
[[{{{pagename}}}/de|🇩🇪 Deutsch]] - &lt;br /&gt;
[[{{{pagename}}}/ru|🇷🇺 русский]] -&lt;br /&gt;
[[{{{pagename}}}/fr|🇫🇷 français]] -&lt;br /&gt;
[[{{{pagename}}}/es|‎🇪🇸 español]]&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;{{#invoke:Translated|main|pagename={{{pagename|{{NAMESPACE}}:{{BASEPAGENAME}}}}}}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Translated}}&lt;br /&gt;
&lt;br /&gt;
This template is a wrapper for [[Module:Translated]], which generates a header with the list of translations available for a page.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Translated|pagename=Template:Translated}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;pagename&amp;lt;/code&amp;gt; field is set to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{NAMESPACE}}:{{BASEPAGENAME}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; if not provided, which works in most cases.&lt;br /&gt;
&lt;br /&gt;
[[Category:Template]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2423</id>
		<title>Module:Translated</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2423"/>
		<updated>2021-05-30T18:29:27Z</updated>

		<summary type="html">&lt;p&gt;Ywang: avoid unnecessary newline&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module is created as a proposal to partially replace the existing Template:Translated&lt;br /&gt;
&lt;br /&gt;
-- List of languages to check localized pages for&lt;br /&gt;
local langlist = {&lt;br /&gt;
  de = &amp;quot;🇩🇪&amp;quot;,&lt;br /&gt;
  ru = &amp;quot;🇷🇺&amp;quot;,&lt;br /&gt;
  fr = &amp;quot;🇫🇷&amp;quot;,&lt;br /&gt;
  es = &amp;quot;🇪🇸&amp;quot;,&lt;br /&gt;
  -- I did not add the flags for zh-hans and zh-hant mainly for political reasons&lt;br /&gt;
  [&amp;quot;zh-hans&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
  [&amp;quot;zh-hant&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
  -- It is common for modules to have wrapper functions. In this case it can be (for example) {{#invoke:Translated|main|{{{pagename|{{NAMESPACE}}:{{BASEPAGENAME}}}}}}}, which should work in most cases.&lt;br /&gt;
  local pagename = frame.args.pagename or error(&amp;quot;No page name supplied&amp;quot;)&lt;br /&gt;
  local basestr = string.format([=[&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Other languagues''' || &lt;br /&gt;
[[%s|🇬🇧 English]]]=], pagename)&lt;br /&gt;
  local stringlist = {basestr}&lt;br /&gt;
  for lang, icon in pairs(langlist) do&lt;br /&gt;
    local title = mw.title.new(pagename .. &amp;quot;/&amp;quot; .. lang)&lt;br /&gt;
    if title.exists then -- WARNING: EXPENSIVE OPERATION&lt;br /&gt;
      stringlist[#stringlist+1] = string.format(&amp;quot; - [[%s/%s|%s %s]]&amp;quot;, pagename, lang, icon, mw.language.fetchLanguageName(lang))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  stringlist[#stringlist+1] = &amp;quot;\n|}&amp;quot;&lt;br /&gt;
  return table.concat(stringlist)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2422</id>
		<title>Module:Translated</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Module:Translated&amp;diff=2422"/>
		<updated>2021-05-29T21:38:13Z</updated>

		<summary type="html">&lt;p&gt;Ywang: Created page with &amp;quot;-- This module is created as a proposal to partially replace the existing Template:Translated  -- List of languages to check localized pages for local langlist = {   de = &amp;quot;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module is created as a proposal to partially replace the existing Template:Translated&lt;br /&gt;
&lt;br /&gt;
-- List of languages to check localized pages for&lt;br /&gt;
local langlist = {&lt;br /&gt;
  de = &amp;quot;🇩🇪&amp;quot;,&lt;br /&gt;
  ru = &amp;quot;🇷🇺&amp;quot;,&lt;br /&gt;
  fr = &amp;quot;🇫🇷&amp;quot;,&lt;br /&gt;
  es = &amp;quot;🇪🇸&amp;quot;,&lt;br /&gt;
  -- I did not add the flags for zh-hans and zh-hant mainly for political reasons&lt;br /&gt;
  [&amp;quot;zh-hans&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
  [&amp;quot;zh-hant&amp;quot;] = &amp;quot;&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
  -- It is common for modules to have wrapper functions. In this case it can be (for example) {{#invoke:Translated|main|{{{pagename|{{NAMESPACE}}:{{BASEPAGENAME}}}}}}}, which should work in most cases.&lt;br /&gt;
  local pagename = frame.args.pagename or error(&amp;quot;No page name supplied&amp;quot;)&lt;br /&gt;
  local basestr = string.format([=[&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''Other languagues''' || &lt;br /&gt;
[[%s|🇬🇧 English]]&lt;br /&gt;
]=], pagename)&lt;br /&gt;
  local stringlist = {basestr}&lt;br /&gt;
  for lang, icon in pairs(langlist) do&lt;br /&gt;
    local title = mw.title.new(pagename .. &amp;quot;/&amp;quot; .. lang)&lt;br /&gt;
    if title.exists then -- WARNING: EXPENSIVE OPERATION&lt;br /&gt;
      stringlist[#stringlist+1] = string.format(&amp;quot; - [[%s/%s|%s %s]]&amp;quot;, pagename, lang, icon, mw.language.fetchLanguageName(lang))&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  stringlist[#stringlist+1] = &amp;quot;\n|}&amp;quot;&lt;br /&gt;
  return table.concat(stringlist)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {main = main}&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=User:Ywang&amp;diff=2421</id>
		<title>User:Ywang</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=User:Ywang&amp;diff=2421"/>
		<updated>2021-05-29T20:23:59Z</updated>

		<summary type="html">&lt;p&gt;Ywang: Use lowercase initial letter (Ywang -&amp;gt; ywang)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&lt;br /&gt;
{{DISPLAYTITLE:User:ywang}}&lt;br /&gt;
&lt;br /&gt;
{{Translated|pagename={{NAMESPACE}}:{{BASEPAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
ywang (''y5nw'' on Discord) is a player who lives in a small town he built for himself. He has worked a bit on the advtrains mod, particularly the train HUD and some translations.&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=User:Ywang&amp;diff=2420</id>
		<title>User:Ywang</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=User:Ywang&amp;diff=2420"/>
		<updated>2021-05-29T20:17:53Z</updated>

		<summary type="html">&lt;p&gt;Ywang: add missing argument to Template:Translated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&lt;br /&gt;
{{Translated|pagename={{NAMESPACE}}:{{BASEPAGENAME}}}}&lt;br /&gt;
&lt;br /&gt;
ywang (''y5nw'' on Discord) is a player who lives in a small town he built for himself. He has worked a bit on the advtrains mod, particularly the train HUD and some translations.&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=User:Ywang&amp;diff=2419</id>
		<title>User:Ywang</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=User:Ywang&amp;diff=2419"/>
		<updated>2021-05-29T20:14:18Z</updated>

		<summary type="html">&lt;p&gt;Ywang: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOINDEX__&lt;br /&gt;
&lt;br /&gt;
{{Translated}}&lt;br /&gt;
&lt;br /&gt;
ywang (''y5nw'' on Discord) is a player who lives in a small town he built for himself. He has worked a bit on the advtrains mod, particularly the train HUD and some translations.&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=User:Ywang&amp;diff=2418</id>
		<title>User:Ywang</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=User:Ywang&amp;diff=2418"/>
		<updated>2021-05-29T19:45:55Z</updated>

		<summary type="html">&lt;p&gt;Ywang: Created page with &amp;quot;ywang (''y5nw'' on Discord) is a player who lives in a small town he built for himself. He has worked a bit on the advtrains mod, particularly the train HUD and some translati...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ywang (''y5nw'' on Discord) is a player who lives in a small town he built for himself. He has worked a bit on the advtrains mod, particularly the train HUD and some translations.&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Template_talk:Place&amp;diff=2331</id>
		<title>Template talk:Place</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Template_talk:Place&amp;diff=2331"/>
		<updated>2021-03-25T17:17:34Z</updated>

		<summary type="html">&lt;p&gt;Ywang: add link to Module:Infobox on Wikipedia as a reference&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Infoboxes ==&lt;br /&gt;
I noticed that [[Template:Place]] and [[Template:Event]] calls which can potentially be avoided with Lua modules such as [https://en.wikipedia.org/wiki/Module:Infobox Module:Infobox on Wikipedia]. Having such a module (or a simplified version/custom implementation) may help with the creation of infoboxes or infobox-like templates (train stations and travelnet networks, for example). --[[User:Ywang|Ywang]] ([[User talk:Ywang|talk]]) 17:17, 25 March 2021 (UTC)&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
	<entry>
		<id>https://pandorabox.io/index.php?title=Template_talk:Place&amp;diff=2330</id>
		<title>Template talk:Place</title>
		<link rel="alternate" type="text/html" href="https://pandorabox.io/index.php?title=Template_talk:Place&amp;diff=2330"/>
		<updated>2021-03-25T17:13:10Z</updated>

		<summary type="html">&lt;p&gt;Ywang: Created page with &amp;quot;== Infoboxes == I noticed that Template:Place and Template:Event calls which can potentially be avoided with Lua modules such as Module:Infobox used on Wikipedia. Havi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Infoboxes ==&lt;br /&gt;
I noticed that [[Template:Place]] and [[Template:Event]] calls which can potentially be avoided with Lua modules such as Module:Infobox used on Wikipedia. Having such a module (or a simplified version/custom implementation) may help with the creation of infoboxes or infobox-like templates (train stations and travelnet networks, for example). --[[User:Ywang|Ywang]] ([[User talk:Ywang|talk]]) 17:12, 25 March 2021 (UTC)&lt;/div&gt;</summary>
		<author><name>Ywang</name></author>
	</entry>
</feed>