<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.mineinabyss.com/w/Module:Recipe_table/history?feed=atom</id>
	<title>Module:Recipe table - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mineinabyss.com/w/Module:Recipe_table/history?feed=atom"/>
	<link rel="alternate" type="text/html" href="https://wiki.mineinabyss.com/w/Module:Recipe_table/history"/>
	<updated>2026-04-10T13:19:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://wiki.mineinabyss.com/index.php?title=Module:Recipe_table&amp;diff=319&amp;oldid=prev</id>
		<title>Scyu: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.mineinabyss.com/index.php?title=Module:Recipe_table&amp;diff=319&amp;oldid=prev"/>
		<updated>2024-10-11T12:47:11Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&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 12:47, 11 October 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&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;!-- diff cache key my_wiki:diff:1.41:old-318:rev-319 --&gt;
&lt;/table&gt;</summary>
		<author><name>Scyu</name></author>
	</entry>
	<entry>
		<id>https://wiki.mineinabyss.com/index.php?title=Module:Recipe_table&amp;diff=318&amp;oldid=prev</id>
		<title>minecraft&gt;Mudscape: Implement changes from dev wiki from User:BabylonAS</title>
		<link rel="alternate" type="text/html" href="https://wiki.mineinabyss.com/index.php?title=Module:Recipe_table&amp;diff=318&amp;oldid=prev"/>
		<updated>2024-07-15T01:51:18Z</updated>

		<summary type="html">&lt;p&gt;Implement changes from dev wiki from User:BabylonAS&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;
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;
--[[Merges a list, or inserts a string&lt;br /&gt;
	or table into a table&lt;br /&gt;
--]]&lt;br /&gt;
local function mergeList( parentTable, content )&lt;br /&gt;
	local i = #parentTable + 1&lt;br /&gt;
	if content[1] then&lt;br /&gt;
		-- Merge list into table&lt;br /&gt;
		for _, v in ipairs( content ) do&lt;br /&gt;
			parentTable[i] = v&lt;br /&gt;
			i = i + 1&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Add strings or tables to table&lt;br /&gt;
		parentTable[i] = content&lt;br /&gt;
	end&lt;br /&gt;
end&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;
	&lt;br /&gt;
	Identical slots reuse the same table, to allow them to be compared like strings&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;
--[[Creates a link (with mod name if specified) with&lt;br /&gt;
	any prefix moved outside&lt;br /&gt;
--]]&lt;br /&gt;
function m.prefixedLink( name, mod )&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 = thisPrefix .. &amp;#039; &amp;#039;&lt;br /&gt;
			name = name:sub( #prefix + 1 )&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;
	local page = name&lt;br /&gt;
	if mod then&lt;br /&gt;
		page = slot.i18n.modLink:gsub( &amp;#039;%$1&amp;#039;, mod ):gsub( &amp;#039;%$2&amp;#039;, name )&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&lt;br /&gt;
	original alias name if available&lt;br /&gt;
	&lt;br /&gt;
	Each set of items are the frames of that slot&lt;br /&gt;
--]]&lt;br /&gt;
function m.makeItemSets( argVals, parsedArgs )&lt;br /&gt;
	local usedItems = {}&lt;br /&gt;
	local function addItem( items, arg, 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, arg, 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, arg, 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;
--[[Creates links for the name/ingredients columns out of&lt;br /&gt;
	item sets, with the appropriate separators, and optionally&lt;br /&gt;
	&amp;quot;Any&amp;quot; and &amp;quot;Matching&amp;quot; prefixes removed.&lt;br /&gt;
--]]&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;
				-- 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;
			local disjunctionA, disjunctionB = name:match(&amp;quot;(.-) or (.+)&amp;quot;) -- hardcoding &amp;quot;A or B&amp;quot; names in English&lt;br /&gt;
			if disjunctionA then&lt;br /&gt;
				linkSet[i2] = m.prefixedLink( disjunctionA, item.mod ) &lt;br /&gt;
				    .. &amp;#039; or &amp;#039; &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&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 collapsible &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;
-- Create the contents for the name cell&lt;br /&gt;
function m.makeNameCell( name, itemSets )&lt;br /&gt;
	local cell = {}&lt;br /&gt;
	if name then&lt;br /&gt;
		cell[1] = name&lt;br /&gt;
	else&lt;br /&gt;
		cell[1] = m.makeItemLinks( itemSets, true )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat( cell, &amp;#039;&amp;lt;br&amp;gt;&amp;#039; )&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;
--[[Main entry point, creates the table with the relevant DPL vars&lt;br /&gt;
	to allow multiple table rows from separate template calls&lt;br /&gt;
	&lt;br /&gt;
	Also returns the unique ingredients, for categorisation purposes in&lt;br /&gt;
	Module:Crafting&lt;br /&gt;
--]]&lt;br /&gt;
function m.table( args, settings )&lt;br /&gt;
	local f = mw.getCurrentFrame()&lt;br /&gt;
	&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;
	local showHead = args.head&lt;br /&gt;
	local showFoot = args.foot&lt;br /&gt;
	if multirow then&lt;br /&gt;
		showHead = nil&lt;br /&gt;
	elseif showHead and not showFoot then&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;
		showHead = true&lt;br /&gt;
		showFoot = true&lt;br /&gt;
	end&lt;br /&gt;
		&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;
	local out = {}&lt;br /&gt;
	&lt;br /&gt;
	if showHead then&lt;br /&gt;
		out[1] = m.makeHeader( 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;
	&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;
	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;
	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>minecraft&gt;Mudscape</name></author>
	</entry>
</feed>