<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.you107657.duckdns.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ANightmares%2FRecipe_table</id>
	<title>Module:Nightmares/Recipe table - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.you107657.duckdns.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ANightmares%2FRecipe_table"/>
	<link rel="alternate" type="text/html" href="https://wiki.you107657.duckdns.org/index.php?title=Module:Nightmares/Recipe_table&amp;action=history"/>
	<updated>2026-09-27T00:11:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.you107657.duckdns.org/index.php?title=Module:Nightmares/Recipe_table&amp;diff=13205&amp;oldid=prev</id>
		<title>imported&gt;Merge: merge.py</title>
		<link rel="alternate" type="text/html" href="https://wiki.you107657.duckdns.org/index.php?title=Module:Nightmares/Recipe_table&amp;diff=13205&amp;oldid=prev"/>
		<updated>2026-09-25T10:55:52Z</updated>

		<summary type="html">&lt;p&gt;merge.py&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:55, 25 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>imported&gt;Merge</name></author>
	</entry>
	<entry>
		<id>https://wiki.you107657.duckdns.org/index.php?title=Module:Nightmares/Recipe_table&amp;diff=5388&amp;oldid=prev</id>
		<title>imported&gt;Merge: merge.py</title>
		<link rel="alternate" type="text/html" href="https://wiki.you107657.duckdns.org/index.php?title=Module:Nightmares/Recipe_table&amp;diff=5388&amp;oldid=prev"/>
		<updated>2026-09-25T10:55:52Z</updated>

		<summary type="html">&lt;p&gt;merge.py&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module was adapted from:&lt;br /&gt;
-- [https://minecraft.wiki/wiki/Module:Recipe table] on the Minecraft Wiki.&lt;br /&gt;
-- Credit goes to the original authors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local m = {}&lt;br /&gt;
&lt;br /&gt;
local i18n = {&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;,&lt;br /&gt;
	moduleSlot = [[Module:Inventory slot]],&lt;br /&gt;
	moduleUi = [[Module:UI]],&lt;br /&gt;
	separator = &amp;#039;&amp;amp;nbsp;+&amp;#039;,&lt;br /&gt;
	setSeparator = &amp;#039;&amp;amp;nbsp;or&amp;#039;,&lt;br /&gt;
	tableDescription = &amp;#039;$1 recipes&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
local slot = require(i18n.moduleSlot)&lt;br /&gt;
local prefixes = slot.i18n.prefixes&lt;br /&gt;
&lt;br /&gt;
-- Lua state tracking instead of DPL&lt;br /&gt;
local multirow_state = {&lt;br /&gt;
	active = false,&lt;br /&gt;
	showName = nil,&lt;br /&gt;
	showDescription = nil&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function parseRecipeArgs(args, ingredientArgVals, outputArgs)&lt;br /&gt;
	local recipeArgs = {}&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;
	end&lt;br /&gt;
	&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&lt;br /&gt;
			local randomise&lt;br /&gt;
			for _, oArg in pairs(outputArgs) do&lt;br /&gt;
				if arg == oArg then&lt;br /&gt;
					randomise = &amp;#039;never&amp;#039;&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&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;
-- **Re-added makeItemLinks**&lt;br /&gt;
function m.makeItemLinks(itemSets, removePrefixes)&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;
				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;
			local disjunctionA, disjunctionB = name:match(&amp;quot;(.-) or (.+)&amp;quot;)&lt;br /&gt;
			if disjunctionA then&lt;br /&gt;
				linkSet[i2] = &amp;#039;[[&amp;#039; .. disjunctionA .. &amp;#039;]] or [[&amp;#039; .. disjunctionB .. &amp;#039;]]&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				linkSet[i2] = &amp;#039;[[&amp;#039; .. name .. &amp;#039;]]&amp;#039;&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;
-- **Re-added makeItemSets**&lt;br /&gt;
function m.makeItemSets(argVals, parsedArgs)&lt;br /&gt;
	local usedItems = {}&lt;br /&gt;
	local function addItem(items, frame, alias)&lt;br /&gt;
		if alias then&lt;br /&gt;
			frame = alias.frame&lt;br /&gt;
		end&lt;br /&gt;
		&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 alias and alias.length or 1&lt;br /&gt;
	end&lt;br /&gt;
	&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&lt;br /&gt;
			local items = {}&lt;br /&gt;
			local frameNum = 1&lt;br /&gt;
			while frameNum &amp;lt;= #frames do&lt;br /&gt;
				local frame = frames[frameNum]&lt;br /&gt;
				if frame[1] then&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;
							local alias = frame.aliasReference and frame.aliasReference[subframeNum]&lt;br /&gt;
							subframeNum = subframeNum + addItem(items, subframe, alias)&lt;br /&gt;
						else&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;
					local alias = frames.aliasReference and frames.aliasReference[frameNum]&lt;br /&gt;
					frameNum = frameNum + addItem(items, frame, alias)&lt;br /&gt;
				else&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;
				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&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **Re-added makeHeader**&lt;br /&gt;
function m.makeHeader(recipeType, class, showName, showDescription, multirow)&lt;br /&gt;
	class = class or &amp;#039;&amp;#039;&lt;br /&gt;
	&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;
	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;
	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;
	local header = table.concat({&lt;br /&gt;
		&amp;#039; {| class=&amp;quot;wikitable crafting &amp;#039; .. class .. &amp;#039;&amp;quot; data-description=&amp;quot;&amp;#039; .. i18n.tableDescription:gsub(&amp;#039;%$1&amp;#039;, recipeType) .. &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 .. i18n.headingRecipe:gsub(&amp;#039;%$1&amp;#039;, recipeType) ..&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;
-- **Re-added makeNameCell**&lt;br /&gt;
function m.makeNameCell(name, itemSets)&lt;br /&gt;
	if name then&lt;br /&gt;
		return name&lt;br /&gt;
	else&lt;br /&gt;
		return m.makeItemLinks(itemSets, true)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- **Re-added makeIngredientsCell**&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;
function m.table(args, settings)&lt;br /&gt;
	local f = mw.getCurrentFrame()&lt;br /&gt;
	&lt;br /&gt;
	-- Handle multirow without DPL&lt;br /&gt;
	local multirow = multirow_state.active&lt;br /&gt;
	if args.head then&lt;br /&gt;
		multirow_state.active = true&lt;br /&gt;
		multirow_state.showName = args.showname or &amp;#039;1&amp;#039;&lt;br /&gt;
		multirow_state.showDescription = args.showdescription or &amp;#039;&amp;#039;&lt;br /&gt;
	elseif args.foot then&lt;br /&gt;
		multirow_state.active = false&lt;br /&gt;
		multirow_state.showName = nil&lt;br /&gt;
		multirow_state.showDescription = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local showHead = args.head or not multirow&lt;br /&gt;
	local showFoot = args.foot or not multirow&lt;br /&gt;
	local showName = multirow and multirow_state.showName or args.showname&lt;br /&gt;
	local showDescription = multirow and multirow_state.showDescription or args.showdescription&lt;br /&gt;
	&lt;br /&gt;
	local out = {}&lt;br /&gt;
	if showHead then&lt;br /&gt;
		out[1] = m.makeHeader(args.recipeType or settings.type, args.class, showName, showDescription, multirow)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local ingredientArgVals = settings.ingredientArgs&lt;br /&gt;
	local outputArgs = settings.outputArgs&lt;br /&gt;
	&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;
	local cells = {}&lt;br /&gt;
	local outputItemSets = m.makeItemSets(outputArgs, parsedRecipeArgs)&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;
	local ingredientsItemSets = m.makeItemSets(ingredientArgVals, parsedRecipeArgs)&lt;br /&gt;
	cells[#cells + 1] = &amp;#039;|&amp;#039; .. m.makeIngredientsCell(args.ingredients, ingredientsItemSets)&lt;br /&gt;
	&lt;br /&gt;
	cells[#cells + 1] = &amp;#039;|style=&amp;quot;padding:1px;text-align:center&amp;quot;|&amp;#039; .. require(i18n.moduleUi)[settings.uiFunc](args)&lt;br /&gt;
	&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;
	out[#out + 1] = table.concat(cells, &amp;#039;\n&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	out[#out + 1] = showFoot and &amp;#039;|}&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(out, &amp;#039;\n|-\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return m&lt;/div&gt;</summary>
		<author><name>imported&gt;Merge</name></author>
	</entry>
</feed>