<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.jcraft-eoe.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ARecipe_table</id>
	<title>Module:Recipe table - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.jcraft-eoe.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ARecipe_table"/>
	<link rel="alternate" type="text/html" href="https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;action=history"/>
	<updated>2026-05-21T03:58:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=215&amp;oldid=prev</id>
		<title>Ayutac: even more hailmary</title>
		<link rel="alternate" type="text/html" href="https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=215&amp;oldid=prev"/>
		<updated>2026-04-25T05:05:50Z</updated>

		<summary type="html">&lt;p&gt;even more hailmary&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:05, 25 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l405&quot;&gt;Line 405:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 405:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	bucket(settings.type:lower() .. &#039;_recipe&#039;).put(bucketData)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--&lt;/ins&gt;bucket(settings.type:lower() .. &#039;_recipe&#039;).put(bucketData)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key jcraft:diff:1.41:old-214:rev-215:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Ayutac</name></author>
	</entry>
	<entry>
		<id>https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=214&amp;oldid=prev</id>
		<title>Ayutac: hailmary the second</title>
		<link rel="alternate" type="text/html" href="https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=214&amp;oldid=prev"/>
		<updated>2026-04-25T05:04:44Z</updated>

		<summary type="html">&lt;p&gt;hailmary the second&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:04, 25 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l420&quot;&gt;Line 420:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 420:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- are we continuing a previous table?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- are we continuing a previous table?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local multirow = f:callParserFunction( &#039;#dplvar&#039;, &#039;recipetable-multirow&#039; )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;local multirow = nil&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	if multirow == &#039;&#039; then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	--&lt;/ins&gt;local multirow = f:callParserFunction( &#039;#dplvar&#039;, &#039;recipetable-multirow&#039; )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		&lt;/del&gt;multirow = nil&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--&lt;/ins&gt;if multirow == &#039;&#039; then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	--	&lt;/ins&gt;multirow = nil&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--&lt;/ins&gt;end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- Table head and foot parameters&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- Table head and foot parameters&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l434&quot;&gt;Line 434:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 435:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		-- table head&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		-- table head&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		multirow = true&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		multirow = true&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		f:callParserFunction( &#039;#dplvar:set&#039;, &#039;recipetable-multirow&#039;, &#039;1&#039; )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--&lt;/ins&gt;f:callParserFunction( &#039;#dplvar:set&#039;, &#039;recipetable-multirow&#039;, &#039;1&#039; )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	else&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	else&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		-- only one row&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		-- only one row&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l447&quot;&gt;Line 447:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 448:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if showHead then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		if showHead then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			showName = args.showname or &amp;#039;1&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			showName = args.showname or &amp;#039;1&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			f:callParserFunction( &#039;#dplvar:set&#039;, &#039;recipetable-name&#039;, showName, &#039;recipetable-description&#039;, showDescription )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--&lt;/ins&gt;f:callParserFunction( &#039;#dplvar:set&#039;, &#039;recipetable-name&#039;, showName, &#039;recipetable-description&#039;, showDescription )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		else&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		else&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			showName = f:callParserFunction( &amp;#039;#dplvar&amp;#039;, &amp;#039;recipetable-name&amp;#039; )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			showName = f:callParserFunction( &amp;#039;#dplvar&amp;#039;, &amp;#039;recipetable-name&amp;#039; )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			showDescription = f:callParserFunction( &#039;#dplvar&#039;, &#039;recipetable-description&#039; )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--&lt;/ins&gt;showDescription = f:callParserFunction( &#039;#dplvar&#039;, &#039;recipetable-description&#039; )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l511&quot;&gt;Line 511:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 512:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- Table footer&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- Table footer&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	out[#out + 1] = showFoot and &amp;#039;|}&amp;#039; or &amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	out[#out + 1] = showFoot and &amp;#039;|}&amp;#039; or &amp;#039;&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	if showFoot then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--&lt;/ins&gt;if showFoot then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		&lt;/del&gt;f:callParserFunction( &#039;#dplvar:set&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	--	&lt;/ins&gt;f:callParserFunction( &#039;#dplvar:set&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			&lt;/del&gt;&#039;recipetable-multirow&#039;, &#039;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	--		&lt;/ins&gt;&#039;recipetable-multirow&#039;, &#039;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			&lt;/del&gt;&#039;recipetable-name&#039;, &#039;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	--		&lt;/ins&gt;&#039;recipetable-name&#039;, &#039;&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			&lt;/del&gt;&#039;recipetable-description&#039;, &#039;&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	--		&lt;/ins&gt;&#039;recipetable-description&#039;, &#039;&#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	--	&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--&lt;/ins&gt;end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- Save recipe data if asked to&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- Save recipe data if asked to&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key jcraft:diff:1.41:old-213:rev-214:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Ayutac</name></author>
	</entry>
	<entry>
		<id>https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=213&amp;oldid=prev</id>
		<title>Ayutac: Undo revision 212 by Ayutac (talk)</title>
		<link rel="alternate" type="text/html" href="https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=213&amp;oldid=prev"/>
		<updated>2026-04-25T04:55:30Z</updated>

		<summary type="html">&lt;p&gt;Undo revision &lt;a href=&quot;/Special:Diff/212&quot; title=&quot;Special:Diff/212&quot;&gt;212&lt;/a&gt; by &lt;a href=&quot;/Special:Contributions/Ayutac&quot; title=&quot;Special:Contributions/Ayutac&quot;&gt;Ayutac&lt;/a&gt; (&lt;a href=&quot;/index.php?title=User_talk:Ayutac&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Ayutac (page does not exist)&quot;&gt;talk&lt;/a&gt;)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:55, 25 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l420&quot;&gt;Line 420:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 420:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- are we continuing a previous table?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- are we continuing a previous table?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local multirow = f:callParserFunction( &#039;recipetable-multirow&#039; )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local multirow = f:callParserFunction( &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;#dplvar&#039;, &lt;/ins&gt;&#039;recipetable-multirow&#039; )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	if multirow == &amp;#039;&amp;#039; then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	if multirow == &amp;#039;&amp;#039; then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		multirow = nil&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		multirow = nil&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key jcraft:diff:1.41:old-212:rev-213:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Ayutac</name></author>
	</entry>
	<entry>
		<id>https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=212&amp;oldid=prev</id>
		<title>Ayutac: hailmary</title>
		<link rel="alternate" type="text/html" href="https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=212&amp;oldid=prev"/>
		<updated>2026-04-25T04:52:12Z</updated>

		<summary type="html">&lt;p&gt;hailmary&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:52, 25 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l420&quot;&gt;Line 420:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 420:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- are we continuing a previous table?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	-- are we continuing a previous table?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local multirow = f:callParserFunction( &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;#dplvar&#039;, &lt;/del&gt;&#039;recipetable-multirow&#039; )&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local multirow = f:callParserFunction( &#039;recipetable-multirow&#039; )&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	if multirow == &amp;#039;&amp;#039; then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	if multirow == &amp;#039;&amp;#039; then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		multirow = nil&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		multirow = nil&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key jcraft:diff:1.41:old-198:rev-212:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Ayutac</name></author>
	</entry>
	<entry>
		<id>https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=198&amp;oldid=prev</id>
		<title>Ayutac: boldly copied from minecraft wiki</title>
		<link rel="alternate" type="text/html" href="https://wiki.jcraft-eoe.com/index.php?title=Module:Recipe_table&amp;diff=198&amp;oldid=prev"/>
		<updated>2026-04-25T04:34:37Z</updated>

		<summary type="html">&lt;p&gt;boldly copied from minecraft wiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local m = {}&lt;br /&gt;
&lt;br /&gt;
-- Internationalization&lt;br /&gt;
local i18n = {&lt;br /&gt;
	-- Dependencies&lt;br /&gt;
	moduleSlot = [[Module:Inventory slot]],&lt;br /&gt;
	moduleUi = [[Module:UI]],&lt;br /&gt;
	&lt;br /&gt;
	-- Table headings&lt;br /&gt;
	headingDescription = &amp;#039;Description&amp;#039;,&lt;br /&gt;
	headingIngredients = &amp;#039;Ingredients&amp;#039;,&lt;br /&gt;
	headingName = &amp;#039;Name&amp;#039;,&lt;br /&gt;
	headingRecipe = &amp;#039;[[$1]] recipe&amp;#039;, -- may require an inflected form instead&lt;br /&gt;
	headingRecipeFallback = &amp;#039;Recipe&amp;#039;, -- if one table has multiple recipe types&lt;br /&gt;
	&lt;br /&gt;
	-- Ingredient separator&lt;br /&gt;
	separator = &amp;#039;&amp;amp;nbsp;+&amp;#039;,&lt;br /&gt;
	setSeparator = &amp;#039;&amp;amp;nbsp;or&amp;amp;nbsp;&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- Table data description&lt;br /&gt;
	tableDescription = &amp;#039;$1 recipes&amp;#039;, -- may require an inflected form instead&lt;br /&gt;
	tableDescriptionFallback = &amp;#039;Recipes&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- Property naming format (may require an inflected form instead)&lt;br /&gt;
	propertyIngredients = &amp;#039;$1 ingredient&amp;#039;,&lt;br /&gt;
	propertyJSON = &amp;#039;$1 JSON&amp;#039;,&lt;br /&gt;
	propertyOutput = &amp;#039;$1 output&amp;#039;,&lt;br /&gt;
	propertyExtra = &amp;#039;$1 $2&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Global dependencies and constants&lt;br /&gt;
local slot = require( i18n.moduleSlot )&lt;br /&gt;
local prefixes = slot.i18n.prefixes&lt;br /&gt;
local suffixes = slot.i18n.suffixes&lt;br /&gt;
local curTitle = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
-- Loops through the input and output args and parses them into a single table,&lt;br /&gt;
-- with alias reference data.&lt;br /&gt;
-- Identical slots reuse the same table, to allow them to be compared&lt;br /&gt;
-- like strings.&lt;br /&gt;
-- The first parameter is module arguments table, the second and third are names&lt;br /&gt;
-- of ingredient and output arguments respectively.&lt;br /&gt;
local function parseRecipeArgs( args, ingredientArgVals, outputArgs )&lt;br /&gt;
	-- Raw arguments&lt;br /&gt;
	local recipeArgs = {}&lt;br /&gt;
	local isOutputArg = {}&lt;br /&gt;
	for _, arg in pairs( ingredientArgVals ) do&lt;br /&gt;
		recipeArgs[arg] = args[arg]&lt;br /&gt;
	end&lt;br /&gt;
	for _, arg in pairs( outputArgs ) do&lt;br /&gt;
		recipeArgs[arg] = args[arg]&lt;br /&gt;
		isOutputArg[arg] = 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Argument parsing&lt;br /&gt;
	local parsedFrameText = {}&lt;br /&gt;
	local parsedRecipeArgs = {}&lt;br /&gt;
	for arg, frameText in pairs( recipeArgs ) do&lt;br /&gt;
		if frameText then -- is there any frame content?&lt;br /&gt;
			local randomise&lt;br /&gt;
			if isOutputArg[arg] then&lt;br /&gt;
				-- Do not randomize output parameters&lt;br /&gt;
				randomise = &amp;#039;never&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			-- Remember the frame sequence&lt;br /&gt;
			-- TODO: Normalize (frame sequences with minute whitespace changes&lt;br /&gt;
			-- but the same content are currently treated as different)&lt;br /&gt;
			local frames = not randomise and parsedFrameText[frameText]&lt;br /&gt;
			if not frames then&lt;br /&gt;
				frames = slot.parseFrameText( frameText, randomise, true )&lt;br /&gt;
				parsedFrameText[frameText] = frames&lt;br /&gt;
			end&lt;br /&gt;
			parsedRecipeArgs[arg] = frames&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return parsedRecipeArgs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Creates a link (with mod name if specified) with any prefix moved outside&lt;br /&gt;
function m.prefixedLink( name, mod )&lt;br /&gt;
	-- Search for and remove prefixes&lt;br /&gt;
	local prefix = &amp;#039;&amp;#039;&lt;br /&gt;
	for _, thisPrefix in pairs( prefixes ) do&lt;br /&gt;
		if name:find( &amp;#039;^&amp;#039; .. thisPrefix .. &amp;#039; &amp;#039; ) then&lt;br /&gt;
			-- Prefix found, strip it away&lt;br /&gt;
			prefix = thisPrefix .. &amp;#039; &amp;#039;&lt;br /&gt;
			name = name:sub( #prefix + 1 )&lt;br /&gt;
			&lt;br /&gt;
			-- Also remove unwaxed prefixes&lt;br /&gt;
			-- TODO: Make it less hard-coded&lt;br /&gt;
			if name:find( &amp;#039;^&amp;#039; .. prefixes.unwaxed .. &amp;#039; &amp;#039; ) then&lt;br /&gt;
				prefix = prefix .. prefixes.unwaxed .. &amp;#039; &amp;#039;&lt;br /&gt;
				name = name:sub( #prefixes.unwaxed + 1 )&lt;br /&gt;
			end&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Legacy: Add the mod prefix, if specified&lt;br /&gt;
	-- NB: When disabling mod support, please comment the code out instead of&lt;br /&gt;
	-- deleting it. While EnMCW doesn’t cover mods, other wikis who adapt its&lt;br /&gt;
	-- templates and modules may do.&lt;br /&gt;
	local page = name&lt;br /&gt;
	if mod then&lt;br /&gt;
		page = (slot.i18n.modLink&lt;br /&gt;
		           :gsub( &amp;#039;%$1&amp;#039;, mod )&lt;br /&gt;
		           :gsub( &amp;#039;%$2&amp;#039;, name:gsub(&amp;#039;^%l&amp;#039;, string.upper) )&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat{ prefix, &amp;#039;[[&amp;#039;, page, &amp;#039;|&amp;#039;, name, &amp;#039;]]&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Creates sets of unique items from a set of slots, using the original alias&lt;br /&gt;
-- name if available. Each set of items are the frames of that slot. These sets&lt;br /&gt;
-- are used for automatically generating links in ingredient and output cells.&lt;br /&gt;
-- The first parameter is a list of argument names, the second is a table of&lt;br /&gt;
-- argument values processed with parseRecipeArgs().&lt;br /&gt;
-- If the third parameter is true, also returns unique items (including aliases&lt;br /&gt;
-- and their contents) to save in Bucket, so that they can be queried for in&lt;br /&gt;
-- templates like Crafting usage.&lt;br /&gt;
function m.makeItemSets( argVals, parsedArgs, listUnique )&lt;br /&gt;
	-- Add an item (arg 2) to the specific set (arg 1), as long as it was not&lt;br /&gt;
	-- added before (whether to the current set or to a previous one). If we’re&lt;br /&gt;
	-- dealing with an alias (arg 3 provides reference data), its original name&lt;br /&gt;
	-- is added instead of the current frame (which will be the first frame in&lt;br /&gt;
	-- that alias’ expansion).&lt;br /&gt;
	local usedItems = {}&lt;br /&gt;
	local function addItemToSet( items, frame, alias )&lt;br /&gt;
		-- This function accepts the current item set, the current frame, and&lt;br /&gt;
		-- the alias reference data if present. &lt;br /&gt;
		if alias then&lt;br /&gt;
			frame = alias.frame&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Add the item, if not added already&lt;br /&gt;
		local uniqName = ( frame.mod or &amp;#039;&amp;#039; ) .. &amp;#039;:&amp;#039; .. frame.name&lt;br /&gt;
		if not usedItems[uniqName] then&lt;br /&gt;
			usedItems[uniqName] = true&lt;br /&gt;
			items[#items + 1] = frame&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Return the number of frames for the processing loop to advance by.&lt;br /&gt;
		-- For a group alias, return the number of frames it expands to.&lt;br /&gt;
		-- This way, the loop can skip over the remaining frames.&lt;br /&gt;
		return alias and alias.length or 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Add item to the unique lists if asked&lt;br /&gt;
	local uniqueItems, usedUniqueItems, addUniqueItems&lt;br /&gt;
	if listUnique then&lt;br /&gt;
		uniqueItems = {}&lt;br /&gt;
		usedUniqueItems = {}&lt;br /&gt;
		addUniqueItems = function(frames, frameStart, frameCount, alias)&lt;br /&gt;
			-- This function takes advantage of group aliases already being&lt;br /&gt;
			-- expanded in the parsed args list by this point. The first para-&lt;br /&gt;
			-- meter is the frame table (or subframe container), the second is&lt;br /&gt;
			-- the starting (sub)frame index, the third is the number of frames&lt;br /&gt;
			-- to process (larger than one if dealing with a group alias), the&lt;br /&gt;
			-- fourth is alias reference data.&lt;br /&gt;
			if alias then&lt;br /&gt;
				-- Add the original alias’ name to unique items. This way we can&lt;br /&gt;
				-- query recipes by alias names.&lt;br /&gt;
				local uniqAliasName = alias.frame.name&lt;br /&gt;
				if alias.frame.mod then&lt;br /&gt;
					uniqAliasName = alias.frame.mod .. &amp;quot;:&amp;quot; .. alias.frame.name&lt;br /&gt;
				end&lt;br /&gt;
				if not usedUniqueItems[uniqAliasName] then&lt;br /&gt;
					usedUniqueItems[uniqAliasName] = true&lt;br /&gt;
					uniqueItems[#uniqueItems+1] = uniqAliasName&lt;br /&gt;
				else&lt;br /&gt;
					-- The alias’ expanded frames are assumed to be already added&lt;br /&gt;
					return&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			-- Determine index for the last frame to add; the same as start if&lt;br /&gt;
			-- dealing with a single frame&lt;br /&gt;
			local frameEnd = frameStart&lt;br /&gt;
			if frameCount &amp;gt; 1 then&lt;br /&gt;
				frameEnd = frameStart + frameCount - 1&lt;br /&gt;
				if frameEnd &amp;gt; #frames then&lt;br /&gt;
					frameEnd = #frames&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			-- Add each frame to the unique items&lt;br /&gt;
			for i = frameStart, frameEnd do&lt;br /&gt;
				local curFrame = frames[i]&lt;br /&gt;
				if curFrame.name then&lt;br /&gt;
					local uniqName = curFrame.name&lt;br /&gt;
					if curFrame.mod then&lt;br /&gt;
						uniqName = curFrame.mod .. &amp;#039;:&amp;#039; .. curFrame.name&lt;br /&gt;
					end&lt;br /&gt;
					if not usedUniqueItems[uniqName] then&lt;br /&gt;
						usedUniqueItems[uniqName] = true&lt;br /&gt;
						uniqueItems[#uniqueItems+1] = uniqName&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- No-op if not asked for unique items&lt;br /&gt;
		addUniqueItems = function() end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Process the parsed argument values&lt;br /&gt;
	local itemSets = {}&lt;br /&gt;
	local i = 1&lt;br /&gt;
	for _, arg in ipairs( argVals ) do&lt;br /&gt;
		local frames = parsedArgs[arg]&lt;br /&gt;
		if frames then -- not empty&lt;br /&gt;
			local items = {}&lt;br /&gt;
			local frameNum = 1&lt;br /&gt;
			while frameNum &amp;lt;= #frames do&lt;br /&gt;
				-- A while loop is used instead of for so that we can skip alias&lt;br /&gt;
				-- expansions&lt;br /&gt;
				local frame = frames[frameNum]&lt;br /&gt;
				if frame[1] then&lt;br /&gt;
					-- The frame is a subframe container (curly braces), process&lt;br /&gt;
					-- it like the entire frame sequence&lt;br /&gt;
					local subframeNum = 1&lt;br /&gt;
					while subframeNum &amp;lt;= #frame do&lt;br /&gt;
						local subframe = frame[subframeNum]&lt;br /&gt;
						if subframe.name ~= &amp;#039;&amp;#039; then&lt;br /&gt;
							-- Add the current subframe to the item set (and&lt;br /&gt;
							-- unique items, if asked). If it’s part of an alias&lt;br /&gt;
							-- expansion, add the alias to the set instead and&lt;br /&gt;
							-- skip over the other subframes from that alias;&lt;br /&gt;
							-- addUniqueItems will add both the alias and its&lt;br /&gt;
							-- expansion’s frames to the unique items list.&lt;br /&gt;
							local alias = frame.aliasReference and frame.aliasReference[subframeNum]&lt;br /&gt;
							local aliasLength = addItemToSet( items, subframe, alias )&lt;br /&gt;
							addUniqueItems(frame, subframeNum, aliasLength, alias)&lt;br /&gt;
							subframeNum = subframeNum + aliasLength&lt;br /&gt;
						else&lt;br /&gt;
							-- Empty frame&lt;br /&gt;
							subframeNum = subframeNum + 1&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					frameNum = frameNum + 1&lt;br /&gt;
				elseif frame.name ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					-- Add the current frame (or its parent alias)&lt;br /&gt;
					local alias = frames.aliasReference and frames.aliasReference[frameNum]&lt;br /&gt;
					local aliasLength = addItemToSet( items, frame, alias )&lt;br /&gt;
					addUniqueItems(frames, frameNum, aliasLength, alias)&lt;br /&gt;
					frameNum = frameNum + aliasLength&lt;br /&gt;
				else&lt;br /&gt;
					-- Empty frame&lt;br /&gt;
					frameNum = frameNum + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if #items &amp;gt; 0 then&lt;br /&gt;
				-- Add the current item set to the list&lt;br /&gt;
				itemSets[i] = items&lt;br /&gt;
				i = i + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return itemSets, uniqueItems&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Creates links for the name/ingredients columns out of item sets, with the&lt;br /&gt;
-- appropriate separators, and optionally &amp;quot;Any&amp;quot; and &amp;quot;Matching&amp;quot; prefixes removed.&lt;br /&gt;
function m.makeItemLinks( itemSets, removePrefixes )&lt;br /&gt;
	-- Iterate over item sets&lt;br /&gt;
	local links = {}&lt;br /&gt;
	for i, itemSet in ipairs( itemSets ) do&lt;br /&gt;
		local linkSet = {}&lt;br /&gt;
		for i2, item in ipairs( itemSet ) do&lt;br /&gt;
			local name = item.name&lt;br /&gt;
			if removePrefixes then&lt;br /&gt;
				-- Remove prefixes and uppercase first letter&lt;br /&gt;
				name = name&lt;br /&gt;
					:gsub( &amp;#039;^&amp;#039; .. prefixes.any .. &amp;#039; &amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
					:gsub( &amp;#039;^&amp;#039; .. prefixes.matching .. &amp;#039; &amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
					:gsub( &amp;#039;^%l&amp;#039;, string.upper )&lt;br /&gt;
			end&lt;br /&gt;
			-- Strip suffixes out&lt;br /&gt;
			for _, suffix in pairs( suffixes ) do&lt;br /&gt;
				name = name:gsub( &amp;#039; &amp;#039; .. suffix .. &amp;#039;$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			-- Create the link(s)&lt;br /&gt;
			-- “A or B” names are treated like two separate items in a set.&lt;br /&gt;
			local disjunctionA, disjunctionB = name:match(&amp;quot;(.-) or (.+)&amp;quot;)&lt;br /&gt;
			if disjunctionA then&lt;br /&gt;
				linkSet[i2] = m.prefixedLink( disjunctionA, item.mod ) &lt;br /&gt;
				    .. i18n.setSeparator&lt;br /&gt;
				    .. m.prefixedLink( disjunctionB, item.mod )&lt;br /&gt;
			else&lt;br /&gt;
				linkSet[i2] = m.prefixedLink( name, item.mod )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		links[i] = table.concat( linkSet, i18n.setSeparator .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat( links, i18n.separator .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Creates the table header. Accepts the recipe’s settings, the recipe type&lt;br /&gt;
-- name’s override, the table’s CSS class, flags for controlling whether to show&lt;br /&gt;
-- name and description columns, and the multirow flag (controls whether the&lt;br /&gt;
-- table will be sortable).&lt;br /&gt;
function m.makeHeader(recipeSettings, recipeTypeOverride, class, showName, showDescription, multirow)&lt;br /&gt;
	-- CSS class&lt;br /&gt;
	class = class or &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	-- Recipe result’s name&lt;br /&gt;
	local nameCell = &amp;#039;&amp;#039;&lt;br /&gt;
	if showName then&lt;br /&gt;
		nameCell = i18n.headingName .. &amp;#039;!!&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Recipe’s description&lt;br /&gt;
	local descriptionCell = &amp;#039;&amp;#039;&lt;br /&gt;
	if showDescription then&lt;br /&gt;
		descriptionCell = &amp;#039;!!class=&amp;quot;unsortable&amp;quot;|&amp;#039; .. i18n.headingDescription&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- If the table has multiple rows, make the table sortable except the&lt;br /&gt;
	-- recipe cell. If present, the description cell is made unsortable above&lt;br /&gt;
	local recipeAttribs = &amp;#039;&amp;#039;&lt;br /&gt;
	if multirow then&lt;br /&gt;
		class = &amp;#039;sortable &amp;#039; .. class&lt;br /&gt;
		recipeAttribs = &amp;#039;class=&amp;quot;unsortable&amp;quot;|&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Recipe heading and table description&lt;br /&gt;
	local headingRecipe = i18n.recipeHeadingFallback&lt;br /&gt;
	local tableDescription = i18n.tableDescriptionFallback&lt;br /&gt;
	if recipeTypeOverride ~= &amp;#039;none&amp;#039; and recipeSettings.type then&lt;br /&gt;
		headingRecipe = i18n.headingRecipe:gsub( &amp;#039;%$1&amp;#039;, recipeTypeOverride or recipeSettings.type )&lt;br /&gt;
		tableDescription = i18n.tableDescription:gsub( &amp;#039;%$1&amp;#039;, recipeTypeOverride or recipeSettings.type )&lt;br /&gt;
		&lt;br /&gt;
		-- If using an inflected language like Russian, you may want to use a&lt;br /&gt;
		-- grammatically appropriate form of recipeSettings.type supplied by a&lt;br /&gt;
		-- separate setting, like this:&lt;br /&gt;
		--headingRecipe = i18n.headingRecipe:gsub( &amp;#039;%$1&amp;#039;, recipeSettings.type .. &amp;#039;|&amp;#039; .. recipeSettings.ofType )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Header&lt;br /&gt;
	local header = table.concat( {&lt;br /&gt;
		&amp;#039; {| class=&amp;quot;wikitable collapsible &amp;#039; .. class .. &amp;#039;&amp;quot; data-description=&amp;quot;&amp;#039; .. tableDescription .. &amp;#039;&amp;quot;&amp;#039;,&lt;br /&gt;
		&amp;#039;!&amp;#039; .. nameCell ..&lt;br /&gt;
		i18n.headingIngredients .. &amp;#039;!!&amp;#039; ..&lt;br /&gt;
		recipeAttribs .. headingRecipe ..&lt;br /&gt;
		descriptionCell&lt;br /&gt;
	}, &amp;#039;\n&amp;#039; )&lt;br /&gt;
	return header&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Create the contents for the name cell&lt;br /&gt;
function m.makeNameCell( name, itemSets )&lt;br /&gt;
	return name or m.makeItemLinks( itemSets, true )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Create the contents for the ingredients cell&lt;br /&gt;
function m.makeIngredientsCell( ingredients, itemSets )&lt;br /&gt;
	return ingredients or m.makeItemLinks( itemSets )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Create a database entry with recipe data for querying&lt;br /&gt;
-- Powered by Semantic MediaWiki&lt;br /&gt;
function m.saveToDatabase(args, ingredientItems, outputItems, settings)&lt;br /&gt;
	if not settings.type then&lt;br /&gt;
		error(&amp;quot;Missing type in recipe settings (required for saving recipe data)&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Main data&lt;br /&gt;
	local recipeData = {&lt;br /&gt;
		-- Standard parameters&lt;br /&gt;
		[&amp;quot;description&amp;quot;] = mw.text.unstrip(args.description or &amp;#039;&amp;#039;), --Remove ref tags&lt;br /&gt;
		[&amp;quot;name&amp;quot;] = args.name,&lt;br /&gt;
		[&amp;quot;ingredients&amp;quot;] = args.ingredients,&lt;br /&gt;
		[&amp;quot;nocat&amp;quot;] = args.nocat,&lt;br /&gt;
	}&lt;br /&gt;
	-- Also save ingredient and output arguments, as well as a few others that&lt;br /&gt;
	-- might be important for the specific recipe (like Crafting’s shapeless)&lt;br /&gt;
	for _, arg in ipairs(settings.ingredientArgs) do&lt;br /&gt;
		recipeData[arg] = args[arg]&lt;br /&gt;
	end&lt;br /&gt;
	for _, arg in ipairs(settings.outputArgs) do&lt;br /&gt;
		recipeData[arg] = args[arg]&lt;br /&gt;
	end&lt;br /&gt;
	if settings.otherArgsToSave then&lt;br /&gt;
		for _, arg in ipairs(settings.otherArgsToSave) do&lt;br /&gt;
			recipeData[arg] = args[arg]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local recipeJson = mw.text.jsonEncode(recipeData)&lt;br /&gt;
	&lt;br /&gt;
	local bucketData = {&lt;br /&gt;
		json = recipeJson,&lt;br /&gt;
		ingredient = ingredientItems,&lt;br /&gt;
		output = outputItems&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	-- Additional recipe-specific properties to save&lt;br /&gt;
	for k, v in pairs(settings.extraProperties or {}) do&lt;br /&gt;
		bucketData[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	bucket(settings.type:lower() .. &amp;#039;_recipe&amp;#039;).put(bucketData)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Main entry point: Creates the table with the relevant DPL vars to allow&lt;br /&gt;
-- multiple table rows from separate template calls. Also returns ingredient and&lt;br /&gt;
-- output item sets.&lt;br /&gt;
-- If set in the recipe settings, also saves the recipe data to database so it&lt;br /&gt;
-- can be queried using templates like Crafting usage.&lt;br /&gt;
-- Call this function from a different module — recipe settings can’t be passed&lt;br /&gt;
-- from a template via #invoke.&lt;br /&gt;
function m.table( args, settings )&lt;br /&gt;
	-- Current MediaWiki frame&lt;br /&gt;
	local f = mw.getCurrentFrame()&lt;br /&gt;
	&lt;br /&gt;
	-- are we continuing a previous table?&lt;br /&gt;
	local multirow = f:callParserFunction( &amp;#039;#dplvar&amp;#039;, &amp;#039;recipetable-multirow&amp;#039; )&lt;br /&gt;
	if multirow == &amp;#039;&amp;#039; then&lt;br /&gt;
		multirow = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Table head and foot parameters&lt;br /&gt;
	local showHead = args.head&lt;br /&gt;
	local showFoot = args.foot&lt;br /&gt;
	if multirow then&lt;br /&gt;
		-- ignore head if continuing a table&lt;br /&gt;
		showHead = nil&lt;br /&gt;
	elseif showHead and not showFoot then&lt;br /&gt;
		-- table head&lt;br /&gt;
		multirow = true&lt;br /&gt;
		f:callParserFunction( &amp;#039;#dplvar:set&amp;#039;, &amp;#039;recipetable-multirow&amp;#039;, &amp;#039;1&amp;#039; )&lt;br /&gt;
	else&lt;br /&gt;
		-- only one row&lt;br /&gt;
		showHead = true&lt;br /&gt;
		showFoot = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Do we show product names and recipe descriptions for this table?&lt;br /&gt;
	local showName = args.showname&lt;br /&gt;
	local showDescription = args.showdescription&lt;br /&gt;
	if multirow then&lt;br /&gt;
		if showHead then&lt;br /&gt;
			showName = args.showname or &amp;#039;1&amp;#039;&lt;br /&gt;
			f:callParserFunction( &amp;#039;#dplvar:set&amp;#039;, &amp;#039;recipetable-name&amp;#039;, showName, &amp;#039;recipetable-description&amp;#039;, showDescription )&lt;br /&gt;
		else&lt;br /&gt;
			showName = f:callParserFunction( &amp;#039;#dplvar&amp;#039;, &amp;#039;recipetable-name&amp;#039; )&lt;br /&gt;
			showDescription = f:callParserFunction( &amp;#039;#dplvar&amp;#039;, &amp;#039;recipetable-description&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if showName ~= &amp;#039;1&amp;#039; then&lt;br /&gt;
		showName = nil&lt;br /&gt;
	end&lt;br /&gt;
	if showDescription == &amp;#039;&amp;#039; then&lt;br /&gt;
		showDescription = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Components of the recipe table or its part&lt;br /&gt;
	local out = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Table header&lt;br /&gt;
	if showHead then&lt;br /&gt;
		out[1] = m.makeHeader( settings, args.recipeType, args.class, showName, showDescription, multirow )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Argument processing&lt;br /&gt;
	local ingredientArgVals = settings.ingredientArgs&lt;br /&gt;
	local outputArgs = settings.outputArgs&lt;br /&gt;
	&lt;br /&gt;
	-- Parse the arguments&lt;br /&gt;
	local parsedRecipeArgs = args&lt;br /&gt;
	if not args.parsed then&lt;br /&gt;
		parsedRecipeArgs = parseRecipeArgs( args, ingredientArgVals, outputArgs )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Are we saving recipe data to Bucket?&lt;br /&gt;
	-- Must be explicitly enabled in the recipe settings, can be disabled by the&lt;br /&gt;
	-- ignoreusage parameter, and is never done on non-article namespaces or&lt;br /&gt;
	-- subpages (hopefully the latter condition will be temporary).&lt;br /&gt;
	local saveToDatabase = settings.saveToDatabase and not (args[&amp;quot;ignoreusage&amp;quot;] or curTitle.namespace ~= 0 or curTitle.isSubpage) &lt;br /&gt;
	&lt;br /&gt;
	-- Row cells&lt;br /&gt;
	local cells = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Cell with names for the recipe’s product(s) (optional)&lt;br /&gt;
	local outputItemSets, uniqueOutputItems = m.makeItemSets( outputArgs, parsedRecipeArgs, saveToDatabase )&lt;br /&gt;
	if showName then&lt;br /&gt;
		cells[1] = &amp;#039;!&amp;#039; .. m.makeNameCell( args.name, outputItemSets )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Cell with ingredients for the recipe&lt;br /&gt;
	local ingredientsItemSets, uniqueIngredientItems = m.makeItemSets( ingredientArgVals, parsedRecipeArgs, saveToDatabase )&lt;br /&gt;
	cells[#cells + 1] = &amp;#039;|&amp;#039; .. m.makeIngredientsCell( args.ingredients, ingredientsItemSets )&lt;br /&gt;
	&lt;br /&gt;
	-- Cell with the recipe itself&lt;br /&gt;
	local funcUi = require( i18n.moduleUi )[settings.uiFunc]&lt;br /&gt;
	cells[#cells + 1] = &amp;#039;|style=&amp;quot;padding:1px;text-align:center&amp;quot;|&amp;#039; .. funcUi(args)&lt;br /&gt;
	&lt;br /&gt;
	-- Cell with the recipe’s description (optional)&lt;br /&gt;
	if showDescription then&lt;br /&gt;
		cells[#cells + 1] = &amp;#039;|&amp;#039; .. ( args.description or &amp;#039;&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Put all cells together into a row&lt;br /&gt;
	out[#out + 1] = table.concat( cells, &amp;#039;\n&amp;#039; )&lt;br /&gt;
	&lt;br /&gt;
	-- Table footer&lt;br /&gt;
	out[#out + 1] = showFoot and &amp;#039;|}&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
	if showFoot then&lt;br /&gt;
		f:callParserFunction( &amp;#039;#dplvar:set&amp;#039;,&lt;br /&gt;
			&amp;#039;recipetable-multirow&amp;#039;, &amp;#039;&amp;#039;,&lt;br /&gt;
			&amp;#039;recipetable-name&amp;#039;, &amp;#039;&amp;#039;,&lt;br /&gt;
			&amp;#039;recipetable-description&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Save recipe data if asked to&lt;br /&gt;
	if saveToDatabase then&lt;br /&gt;
		m.saveToDatabase(args, uniqueIngredientItems, uniqueOutputItems, settings)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat( out, &amp;#039;\n|-\n&amp;#039; ), ingredientsItemSets, outputItemSets&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return m&lt;/div&gt;</summary>
		<author><name>Ayutac</name></author>
	</entry>
</feed>