<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ARecipes_by_category_table</id>
	<title>Module:Recipes by category table - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ARecipes_by_category_table"/>
	<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:Recipes_by_category_table&amp;action=history"/>
	<updated>2026-04-11T16:49:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://mbwiki.stairwaygames.work/w/index.php?title=Module:Recipes_by_category_table&amp;diff=5584&amp;oldid=prev</id>
		<title>Admin coral island: Created page with &quot;local p = {} local lib = require(&#039;Module:Feature&#039;) local Icon = require(&#039;Module:Icon&#039;)._main local Icon_list = require(&#039;Module:Icon list&#039;)._main local Parse = require(&#039;Module:Parser&#039;).getTemplateArgs local LL = require(&#039;Module:Link label&#039;)._main local show_time = false  function p.main(frame) 	local args = require(&#039;Module:Arguments&#039;).getArgs(frame) 	if lib.isEmpty(frame.args.pages) then 		local result = args.noresult or &#039;&#039; 		if result ~= &#039;&#039; then return result 		elseif ar...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:Recipes_by_category_table&amp;diff=5584&amp;oldid=prev"/>
		<updated>2023-08-03T06:52:07Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {} local lib = require(&amp;#039;Module:Feature&amp;#039;) local Icon = require(&amp;#039;Module:Icon&amp;#039;)._main local Icon_list = require(&amp;#039;Module:Icon list&amp;#039;)._main local Parse = require(&amp;#039;Module:Parser&amp;#039;).getTemplateArgs local LL = require(&amp;#039;Module:Link label&amp;#039;)._main local show_time = false  function p.main(frame) 	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame) 	if lib.isEmpty(frame.args.pages) then 		local result = args.noresult or &amp;#039;&amp;#039; 		if result ~= &amp;#039;&amp;#039; then return result 		elseif ar...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local lib = require(&amp;#039;Module:Feature&amp;#039;)&lt;br /&gt;
local Icon = require(&amp;#039;Module:Icon&amp;#039;)._main&lt;br /&gt;
local Icon_list = require(&amp;#039;Module:Icon list&amp;#039;)._main&lt;br /&gt;
local Parse = require(&amp;#039;Module:Parser&amp;#039;).getTemplateArgs&lt;br /&gt;
local LL = require(&amp;#039;Module:Link label&amp;#039;)._main&lt;br /&gt;
local show_time = false&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame)&lt;br /&gt;
	if lib.isEmpty(frame.args.pages) then&lt;br /&gt;
		local result = args.noresult or &amp;#039;&amp;#039;&lt;br /&gt;
		if result ~= &amp;#039;&amp;#039; then return result&lt;br /&gt;
		elseif args[1] then&lt;br /&gt;
			local array = lib.split(string.lower(args[1]), &amp;#039;;&amp;#039;)&lt;br /&gt;
			local link = (args.noresultlink and args.noresultlink) or &amp;#039;crafting recipe&amp;#039;&lt;br /&gt;
			if #array == 0 then result = &amp;#039;No page matches category selection.&amp;#039;&lt;br /&gt;
			elseif #array == 1 then result = &amp;#039;No &amp;#039; .. link .. &amp;#039; needs &amp;#039; .. array[1] .. &amp;#039;.&amp;#039;&lt;br /&gt;
			elseif #array == 2 then result = &amp;#039;No &amp;#039; .. link .. &amp;#039; needs &amp;#039; .. array[1] .. &amp;#039; or &amp;#039; .. array[2] .. &amp;#039;.&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				local last = table.remove(array, #array)&lt;br /&gt;
				result = &amp;#039;No &amp;#039; .. link .. &amp;#039; needs any of the following: &amp;#039; .. table.concat(array, &amp;#039;, &amp;#039;) .. &amp;#039;, or &amp;#039; .. last .. &amp;#039;.&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		else &lt;br /&gt;
			result = &amp;#039;No page matches category selection.&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		result = result  .. require(&amp;#039;Module:Namespace detect&amp;#039;).main{main=&amp;#039;[[Category:Pages with empty template results|Recipes by category table]]&amp;#039;}&lt;br /&gt;
		return result&lt;br /&gt;
	else&lt;br /&gt;
		args.pages = frame.args.pages&lt;br /&gt;
		local mustHave = {&lt;br /&gt;
			ingredient = {},&lt;br /&gt;
			medium = {}&lt;br /&gt;
		}&lt;br /&gt;
		if args[1] then&lt;br /&gt;
			for item in lib.gsplit(args[1], &amp;#039;;&amp;#039;) do&lt;br /&gt;
				mustHave.ingredient[string.lower(item)] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if args.medium then&lt;br /&gt;
			for item in lib.gsplit(args.medium, &amp;#039;;&amp;#039;) do&lt;br /&gt;
				mustHave.medium[string.lower(item)] = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local Recipes = p.parsePages(args, mustHave)&lt;br /&gt;
		-- mw.logObject(Recipes) --debug&lt;br /&gt;
		if args.col1 then&lt;br /&gt;
			local i = &amp;#039;1&amp;#039;&lt;br /&gt;
			local cols = {}&lt;br /&gt;
			while lib.isNotEmpty(args[&amp;#039;col&amp;#039;..i]) do&lt;br /&gt;
				local col = {}&lt;br /&gt;
				col.name = args[&amp;#039;col&amp;#039;..i .. &amp;#039;_name&amp;#039;] or (&amp;#039;Info &amp;#039; .. i)&lt;br /&gt;
				col.form = args[&amp;#039;col&amp;#039;..i .. &amp;#039;_format&amp;#039;] ~= nil and lib.split((args[&amp;#039;col&amp;#039;..i .. &amp;#039;_format&amp;#039;]:gsub(&amp;#039;²{&amp;#039;, &amp;#039;{{&amp;#039;):gsub(&amp;#039;}²&amp;#039;, &amp;#039;}}&amp;#039;):gsub(&amp;#039;¦&amp;#039;, &amp;#039;|&amp;#039;):gsub(&amp;#039;«(.-)»&amp;#039;, &amp;#039;&amp;lt;%1&amp;gt;&amp;#039;)), &amp;#039;,&amp;#039;, {noTrim=true}) or nil&lt;br /&gt;
				col.params = {}&lt;br /&gt;
				for group in lib.gsplit(args[&amp;#039;col&amp;#039;..i], &amp;#039;,&amp;#039;) do&lt;br /&gt;
					local template, params = string.match(group, &amp;#039;^{(.+)}:(.+)$&amp;#039;)&lt;br /&gt;
					for param in lib.gsplit(params, &amp;#039;:&amp;#039;) do&lt;br /&gt;
						table.insert(col.params, {&lt;br /&gt;
							template = template,&lt;br /&gt;
							param = param&lt;br /&gt;
						})&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(cols, col)&lt;br /&gt;
				i = tostring(tonumber(i)+1)&lt;br /&gt;
			end&lt;br /&gt;
			args.CUSTOM_COLUMNS = cols&lt;br /&gt;
		end&lt;br /&gt;
		return p._main(Recipes, args, frame)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(Recipes, args, frame)&lt;br /&gt;
	local out  = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;fandom-table article-table sortable &amp;#039; .. (args.class or &amp;#039;&amp;#039;))&lt;br /&gt;
	&lt;br /&gt;
	--header&lt;br /&gt;
	local tr = out:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Product&amp;#039;)&lt;br /&gt;
	tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Ingredients&amp;#039;)&lt;br /&gt;
	if not args.nomedium and (not args.medium or args.medium:find(&amp;#039;;&amp;#039;)) then tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Crafting&amp;lt;br /&amp;gt;medium&amp;#039;) end&lt;br /&gt;
	if show_time and not args.notime then tr:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Time&amp;#039;) end&lt;br /&gt;
	if args.CUSTOM_COLUMNS and type(args.CUSTOM_COLUMNS) == &amp;#039;table&amp;#039; and  #args.CUSTOM_COLUMNS &amp;gt; 0 then&lt;br /&gt;
		for col_num, col_data in ipairs(args.CUSTOM_COLUMNS) do&lt;br /&gt;
			tr:tag(&amp;#039;th&amp;#039;):wikitext(col_data.name)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--recipes&lt;br /&gt;
	for _, recipe  in ipairs(Recipes) do&lt;br /&gt;
		local tr = out:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		recipe[1] = recipe.items or recipe[1]&lt;br /&gt;
		recipe.amount = &amp;#039;1&amp;#039;&lt;br /&gt;
		tr:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:node(Icon{&lt;br /&gt;
				(recipe.product or recipe.PAGENAME),&lt;br /&gt;
				(recipe[&amp;#039;yield&amp;#039;] or &amp;#039;1&amp;#039;),&lt;br /&gt;
				size = 60,&lt;br /&gt;
			})&lt;br /&gt;
		tr:tag(&amp;#039;td&amp;#039;):node(Icon_list(recipe))&lt;br /&gt;
		if not args.nomedium and (not args.medium or args.medium:find(&amp;#039;;&amp;#039;)) then&lt;br /&gt;
			if recipe.medium and recipe.medium ~= &amp;#039;Menu&amp;#039; then&lt;br /&gt;
				tr:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
					:node(Icon{&lt;br /&gt;
						recipe.medium,&lt;br /&gt;
						size = 60&lt;br /&gt;
					})&lt;br /&gt;
			else&lt;br /&gt;
				tr:tag(&amp;#039;td&amp;#039;):wikitext(&amp;#039;[[Crafting|In-menu&amp;lt;br /&amp;gt;crafting]]&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if show_time and not args.notime then tr:tag(&amp;#039;td&amp;#039;):wikitext(recipe[&amp;#039;time&amp;#039;] or &amp;#039;&amp;#039;) end&lt;br /&gt;
		if args.CUSTOM_COLUMNS and type(args.CUSTOM_COLUMNS) == &amp;#039;table&amp;#039; and  #args.CUSTOM_COLUMNS &amp;gt; 0 then&lt;br /&gt;
			local Pdata = recipe.PAGEDATA&lt;br /&gt;
			for col_num, col_data in ipairs(args.CUSTOM_COLUMNS) do&lt;br /&gt;
				local td = tr:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				local ret = mw.html.create()&lt;br /&gt;
				if col_data.form ~= nil then&lt;br /&gt;
					for part, str in ipairs(col_data.form) do&lt;br /&gt;
						ret:wikitext(str)&lt;br /&gt;
						local pair = col_data.params[part]&lt;br /&gt;
						if pair then&lt;br /&gt;
							if pair.param == &amp;#039;%PAGE%&amp;#039; then&lt;br /&gt;
								ret:wikitext(recipe.PAGENAME)&lt;br /&gt;
							elseif Pdata[pair.template] and Pdata[pair.template][pair.param] then&lt;br /&gt;
								ret:wikitext(Pdata[pair.template][pair.param])&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					for _, pair in ipairs(col_data.params) do&lt;br /&gt;
						if pair.param == &amp;#039;%PAGE%&amp;#039; then&lt;br /&gt;
							ret:wikitext(recipe.PAGENAME)&lt;br /&gt;
						elseif Pdata[pair.template] and Pdata[pair.template][pair.param] then&lt;br /&gt;
							ret:wikitext(Pdata[pair.template][pair.param])&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				td:wikitext(frame:preprocess(tostring(ret)))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.parsePages(args, mustHave)&lt;br /&gt;
	local Recipes = {}&lt;br /&gt;
	local defaults = {&lt;br /&gt;
		delim = &amp;#039;;&amp;#039;,&lt;br /&gt;
		delim_amount = &amp;#039;*&amp;#039;,&lt;br /&gt;
		delim_quality = &amp;#039;/&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	local function inString(data)&lt;br /&gt;
		for str in lib.gsplit(data.items, data.delim) do&lt;br /&gt;
			for item in lib.gsplit(str, &amp;#039;//&amp;#039;) do&lt;br /&gt;
				local pre, quality = string.match(item, data.quality)&lt;br /&gt;
				if not pre then&lt;br /&gt;
					pre = item&lt;br /&gt;
				end&lt;br /&gt;
				local name, amount = string.match(pre, data.amount)&lt;br /&gt;
				if not name then&lt;br /&gt;
					name = pre&lt;br /&gt;
					amount = &amp;#039;1&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
				-- mw.logObject(string.lower(name), &amp;#039;name&amp;#039;)&lt;br /&gt;
				-- mw.logObject(mustHave, &amp;#039;mustHave&amp;#039;)&lt;br /&gt;
				&lt;br /&gt;
				if (next(mustHave.ingredient) ~= nil and next(mustHave.medium) ~= nil and mustHave.ingredient[string.lower(name)] and mustHave.medium[string.lower(data.medium or &amp;#039;menu&amp;#039;)]) then&lt;br /&gt;
					return true&lt;br /&gt;
				elseif (next(mustHave.ingredient) ~= nil and next(mustHave.medium) == nil and mustHave.ingredient[string.lower(name)]) then&lt;br /&gt;
					return true&lt;br /&gt;
				elseif (next(mustHave.ingredient) == nil and next(mustHave.medium) ~= nil and mustHave.medium[string.lower(data.medium or &amp;#039;crafting menu&amp;#039;)]) then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	for page in lib.gsplit(args.pages, &amp;#039;;;;&amp;#039;) do&lt;br /&gt;
		local page_data = Parse(page)&lt;br /&gt;
		if page_data.Recipe then&lt;br /&gt;
			if next(mustHave.ingredient) ~= nil or next(mustHave.medium) ~= nil then&lt;br /&gt;
				if type(page_data.Recipe[1]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
					for _, call in ipairs(page_data.Recipe) do&lt;br /&gt;
						local data = {&lt;br /&gt;
							items = call.items or call[1],&lt;br /&gt;
							medium = call.medium or &amp;#039;crafting menu&amp;#039;,&lt;br /&gt;
							delim = call.delim or defaults.delim,&lt;br /&gt;
							quality = &amp;#039;^(.-)&amp;#039; .. (call.delim_quality or defaults.delim_quality) .. &amp;#039;(.*)$&amp;#039;,&lt;br /&gt;
							amount = &amp;#039;^(.-)&amp;#039; .. (call.delim_amount or defaults.delim_amount) .. &amp;#039;(.*)$&amp;#039;&lt;br /&gt;
						}&lt;br /&gt;
						if inString(data) then&lt;br /&gt;
							if not show_time and lib.isNotEmpty(call[&amp;#039;time&amp;#039;]) then show_time = true end&lt;br /&gt;
							call.PAGENAME = page&lt;br /&gt;
							call.PAGEDATA = page_data&lt;br /&gt;
							table.insert(Recipes, call)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					local data = {&lt;br /&gt;
						items = page_data.Recipe.items or page_data.Recipe[1],&lt;br /&gt;
						delim = page_data.Recipe.delim or defaults.delim,&lt;br /&gt;
						medium = page_data.Recipe.medium or &amp;#039;crafting menu&amp;#039;,&lt;br /&gt;
						amount = &amp;#039;^(.-)&amp;#039; .. (page_data.Recipe.delim_amount or defaults.delim_amount) .. &amp;#039;(.*)$&amp;#039;,&lt;br /&gt;
						quality = &amp;#039;^(.-)&amp;#039; .. (page_data.Recipe.delim_quality or defaults.delim_quality) .. &amp;#039;(.*)$&amp;#039;&lt;br /&gt;
					}&lt;br /&gt;
					if inString(data) then&lt;br /&gt;
						if not show_time and lib.isNotEmpty(page_data.Recipe[&amp;#039;time&amp;#039;]) then show_time = true end&lt;br /&gt;
						page_data.Recipe.PAGENAME = page&lt;br /&gt;
						page_data.Recipe.PAGEDATA = page_data&lt;br /&gt;
						table.insert(Recipes, page_data.Recipe)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				if page_data.Recipe[1] and type(page_data.Recipe[1]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
					for _, call in ipairs(page_data.Recipe) do&lt;br /&gt;
						if not show_time and lib.isNotEmpty(call[&amp;#039;time&amp;#039;]) then show_time = true end&lt;br /&gt;
						call.PAGENAME = page&lt;br /&gt;
						call.PAGEDATA = page_data&lt;br /&gt;
						table.insert(Recipes, call)&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					if not show_time and lib.isNotEmpty(page_data.Recipe[&amp;#039;time&amp;#039;]) then show_time = true end&lt;br /&gt;
					page_data.Recipe.PAGENAME = page&lt;br /&gt;
					page_data.Recipe.PAGEDATA = page_data&lt;br /&gt;
					table.insert(Recipes, page_data.Recipe)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return Recipes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin coral island</name></author>
	</entry>
</feed>