Minecraft Wiki
Registre-se
Sem resumo de edição
Sem resumo de edição
 
(37 revisões intermediárias por 3 usuários não estão sendo mostradas)
Linha 1: Linha 1:
 
local p = {}
 
local p = {}
  +
  +
local i18n = {
  +
colored = 'Colorido',
  +
coloredDyes = {
  +
'Corante laranja', 'Corante magenta', 'Corante azul-claro', 'Corante amarelo', 'Corante verde-limão',
  +
'Corante rosa', 'Corante cinza', 'Corante cinza-claro', 'Corante ciano', 'Corante roxo',
  +
'Corante azul', 'Corante marrom', 'Corante verde', 'Corante vermelho', 'Corante preto',
  +
},
  +
categoryIngredientUsage = 'Categoria:Receita usando $1',
  +
categoryRecipeType = 'Categoria:Receita de $1',
  +
categoryUpcoming = 'Categoria:Em breve',
  +
itemBlockOfQuartz = 'Bloco de quartzo',
  +
itemBoneMeal = 'Farinha de osso',
  +
itemBrownMushroom = 'Cogumelo marrom',
  +
itemCharcoal = 'Carvão vegetal',
  +
itemCoal = 'Carvão',
  +
itemColoredDye = 'Corante colorido',
  +
itemDye = 'Corante',
  +
itemMushroom = 'Cogumelo',
  +
itemQuartzBlock = 'Bloco de quartzo',
  +
itemRedMushroom = 'Cogumelo vermelho',
  +
itemStone = 'Pedra',
  +
moduleArgs = [[Módulo:ProcessArgs]],
  +
moduleRecipe = [[Módulo:Recipe table]],
  +
moduleSlot = [[Módulo:Inventory slot]],
  +
stoneVariants = { 'Pedra', 'Andesito', 'Granito', 'Diorito' },
  +
type = 'Fabricação',
  +
variantPages = {
  +
'Andesito', 'Estandarte', 'Cama', 'Diorito', 'Estrela de fogo de artifício', 'Granito',
  +
'Placa de pressão', 'Areia', 'Arenito', 'Escudo', 'Laje', 'Vidraça tingida',
  +
'Vidro tingido', 'Escadas', 'Tijolos de pedra', 'Tábuas', 'Madeira', 'Lã', 'Concreto',
  +
'Cimento', 'Azulejo',
  +
},
  +
}
  +
p.i18n = i18n
  +
  +
local slot = require( i18n.moduleSlot )
  +
local recipeTable = require( i18n.moduleRecipe ).table
  +
local cArgVals = { 'A1', 'B1', 'C1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3' }
  +
p.cArgVals = cArgVals
  +
 
function p.table( f )
 
function p.table( f )
 
local args = f
 
local args = f
 
if f == mw.getCurrentFrame() then
 
if f == mw.getCurrentFrame() then
args = require( 'Módulo:ProcessArgs' ).merge()
+
args = require( i18n.moduleArgs ).merge( true )
 
else
 
else
 
f = mw.getCurrentFrame()
 
f = mw.getCurrentFrame()
end
 
local grid = require( 'Módulo:Grid' )
 
 
-- Start table when appropriate
 
local multirow = f:callParserFunction( '#dplvar', 'multirow' )
 
if multirow ~= '1' then
 
multirow = nil
 
end
 
local head = args.head or ''
 
if multirow then
 
head = ''
 
elseif head ~= '' then
 
multirow = 1
 
f:callParserFunction( '#dplvar:set', 'multirow', '1' )
 
else
 
head = 1
 
end
 
 
-- End table when appropriate
 
local foot = args.foot or ''
 
if multirow then
 
if foot ~= '' then
 
multirow = nil
 
f:callParserFunction( '#dplvar:set', 'multirow', '0' )
 
end
 
else
 
foot = 1
 
end
 
 
local header = ''
 
if head ~= '' then
 
local name = ''
 
local description = ''
 
if args.showname == '1' or multirow and args.showname ~= '0' then
 
name = 'Name !! '
 
f:callParserFunction( '#dplvar:set', 'craftingname', '1' )
 
end
 
if args.showdescription == '1' then
 
description = ' !! class="unsortable" | Description'
 
f:callParserFunction( '#dplvar:set', 'craftingdescription', '1' )
 
end
 
local class = args.class or ''
 
local recipeClass = ''
 
if multirow then
 
class = 'sortable collapsible ' .. class
 
recipeClass = 'class="unsortable collapse-button" |'
 
end
 
header = table.concat( {
 
' {| class="wikitable ' .. class .. '"',
 
'! ' .. name .. 'Ingredientes !! ' .. recipeClass .. ' Recentra de [[criação]]' .. description,
 
'|-'
 
}, '\n' )
 
end
 
 
-- Name cell
 
local nameCell
 
if f:callParserFunction( '#dplvar', 'craftingname' ) == '1' then
 
if args.name or '' ~= '' then
 
nameCell = args.name
 
else
 
local names = {}
 
local links = {}
 
for v in mw.text.gsplit( args.Output or '', '%s*;%s*' ) do
 
parts = grid.getParts( v, args.Mod )
 
parts.mod = parts.mod or ''
 
if not names[parts.mod .. ':' .. parts.name] then
 
local link = ''
 
if parts.mod ~= '' then
 
link = 'Mods/' .. parts.mod .. '/' .. parts.name .. '|'
 
end
 
 
if parts.name:find( '^Qualquer ' ) then
 
table.insert( links, 'Qualquer [[' .. link .. parts.name:sub( 10 ) .. ']]' )
 
else
 
table.insert( links, '[[' .. link .. parts.name .. ']]' )
 
end
 
names[parts.mod .. ':' .. parts.name] = 1
 
end
 
end
 
 
nameCell = table.concat( links, '&nbsp;or<br>' )
 
end
 
end
 
 
if nameCell and args.upcoming then
 
nameCell = nameCell .. '<br>([[' .. args.upcoming .. ']])'
 
end
 
 
-- Create ingredient list
 
local ingredients = {}
 
local ingredientKeys = {}
 
local animatedIngredients = {}
 
local animatedKeys = {}
 
for k, v in pairs( args ) do
 
v = mw.text.trim( v )
 
if v ~= '' and tostring( k ):find( '^%u?%d%d?$' ) then
 
if v:find( ';' ) then
 
table.insert( animatedKeys, v )
 
else
 
local parts = grid.getParts( v, args.Mod )
 
parts.mod = parts.mod or ''
 
local fullName = parts.mod .. ':' .. parts.name
 
if not ingredients[fullName] then
 
table.insert( ingredientKeys, fullName )
 
ingredients[fullName] = { mod = parts.mod, name = parts.name }
 
end
 
end
 
end
 
end
 
for k, v in ipairs( animatedKeys ) do
 
local frames = mw.text.split( v, '%s*;%s*' )
 
local length = #frames
 
for k2, v2 in ipairs( frames ) do
 
local parts = grid.getParts( v2, args.Mod )
 
parts.mod = parts.mod or ''
 
local fullName = parts.mod .. ':' .. parts.name
 
if v2 ~= '' and not ingredients[fullName] and not animatedIngredients[fullName] then
 
table.insert( ingredientKeys, fullName )
 
animatedIngredients[fullName] = { mod = parts.mod, name = parts.name, final = k2 == length }
 
end
 
end
 
end
 
 
-- Ingredients cell
 
local ingredientsCell
 
if args.ingredients or '' ~= '' then
 
ingredientsCell = args.ingredients
 
else
 
ingredientsCell = {}
 
for k, v in ipairs( ingredientKeys ) do
 
local link = ''
 
local separator = '&nbsp;+'
 
if k == #ingredientKeys then
 
separator = ''
 
elseif animatedIngredients[v] and not animatedIngredients[v].final then
 
separator = '&nbsp;or'
 
end
 
local mod = ( ingredients[v] or animatedIngredients[v] ).mod
 
local name = ( ingredients[v] or animatedIngredients[v] ).name
 
if mod ~= '' then
 
link = 'Mods/'.. mod .. '/' .. name .. '|'
 
end
 
 
if name:find( '^Qualquer ' ) then
 
table.insert( ingredientsCell, 'Qualquer [[' .. link .. name:sub( 10 ) .. ']]' .. separator )
 
else
 
table.insert( ingredientsCell, '[[' .. link .. name .. ']]' .. separator )
 
end
 
end
 
 
ingredientsCell = table.concat( ingredientsCell, '<br>\n' )
 
 
end
 
end
 
 
 
-- Automatic shapeless positioning
 
-- Automatic shapeless positioning
local newArgs = {}
 
 
if args[1] then
 
if args[1] then
newArgs.shapeless = 1
+
args.shapeless = 1
 
if args[7] then
 
if args[7] then
newArgs.A1 = args[1]
+
args.A1 = args[1]
newArgs.B1 = args[2]
+
args.B1 = args[2]
newArgs.C1 = args[3]
+
args.C1 = args[3]
newArgs.A2 = args[4]
+
args.A2 = args[4]
newArgs.B2 = args[5]
+
args.B2 = args[5]
newArgs.C2 = args[6]
+
args.C2 = args[6]
 
if args[8] then
 
if args[8] then
 
-- ◼◼◼ ◼◼◼
 
-- ◼◼◼ ◼◼◼
 
-- ◼◼◼ OR ◼◼◼
 
-- ◼◼◼ OR ◼◼◼
 
-- ◼◼◼ ◼◼◻
 
-- ◼◼◼ ◼◼◻
newArgs.A3 = args[7]
+
args.A3 = args[7]
newArgs.B3 = args[8]
+
args.B3 = args[8]
newArgs.C3 = args[9]
+
args.C3 = args[9]
  +
if args[9] then
  +
local identical = true
  +
for i = 1, 8 do
  +
if args[i] ~= args[i + 1] then
  +
identical = false
  +
break
  +
end
  +
end
  +
if identical then
  +
args.shapeless = nil
  +
end
  +
end
 
else
 
else
 
-- ◼◼◼
 
-- ◼◼◼
 
-- ◼◼◼
 
-- ◼◼◼
 
-- ◻◼◻
 
-- ◻◼◻
newArgs.B3 = args[7]
+
args.B3 = args[7]
 
end
 
end
 
elseif args[2] then
 
elseif args[2] then
newArgs.A2 = args[1]
+
args.A2 = args[1]
newArgs.B2 = args[2]
+
args.B2 = args[2]
 
if args[5] then
 
if args[5] then
 
-- ◻◻◻ ◻◻◻
 
-- ◻◻◻ ◻◻◻
 
-- ◼◼◼ OR ◼◼◼
 
-- ◼◼◼ OR ◼◼◼
 
-- ◼◼◼ ◼◼◻
 
-- ◼◼◼ ◼◼◻
newArgs.C2 = args[3]
+
args.C2 = args[3]
newArgs.A3 = args[4]
+
args.A3 = args[4]
newArgs.B3 = args[5]
+
args.B3 = args[5]
newArgs.C3 = args[6]
+
args.C3 = args[6]
 
elseif args[4] then
 
elseif args[4] then
 
-- ◻◻◻
 
-- ◻◻◻
 
-- ◼◼◻
 
-- ◼◼◻
 
-- ◼◼◻
 
-- ◼◼◻
newArgs.A3 = args[3]
+
args.A3 = args[3]
newArgs.B3 = args[4]
+
args.B3 = args[4]
 
else
 
else
 
-- ◻◻◻ ◻◻◻
 
-- ◻◻◻ ◻◻◻
 
-- ◼◼◻ OR ◼◼◻
 
-- ◼◼◻ OR ◼◼◻
 
-- ◻◼◻ ◻◻◻
 
-- ◻◼◻ ◻◻◻
newArgs.B3 = args[3]
+
args.B3 = args[3]
 
end
 
end
 
else
 
else
Linha 210: Linha 111:
 
-- ◻◼◻
 
-- ◻◼◻
 
-- ◻◻◻
 
-- ◻◻◻
newArgs.B2 = args[1]
+
args.B2 = args[1]
  +
args.shapeless = nil
  +
end
  +
  +
for i = 1, 9 do
  +
args[i] = nil
 
end
 
end
else
 
newArgs.A1 = args.A1
 
newArgs.B1 = args.B1
 
newArgs.C1 = args.C1
 
newArgs.A2 = args.A2
 
newArgs.B2 = args.B2
 
newArgs.C2 = args.C2
 
newArgs.A3 = args.A3
 
newArgs.B3 = args.B3
 
newArgs.C3 = args.C3
 
 
end
 
end
 
 
-- Any other args we want to pass along
+
-- Create recipe table, and list of ingredients
  +
local out, ingredientSets = recipeTable( args, {
newArgs.Mod = args.Mod
 
  +
uiFunc = 'craftingTable',
newArgs.Output = args.Output
 
  +
type = i18n.type,
newArgs.Otitle = args.Otitle
 
  +
ingredientArgs = cArgVals,
  +
outputArgs = { 'Output' },
  +
} )
 
 
  +
local title = mw.title.getCurrentTitle()
-- Recipe cell
 
  +
if args.nocat == '1' or title.namespace ~= 0 or title.isSubpage then
local recipeCell = grid.craftingTable( newArgs )
 
  +
return out
 
local row = { ingredientsCell, recipeCell }
 
if nameCell then
 
table.insert( row, 1, nameCell )
 
 
end
 
end
if ( args.description or '' ) ~= '' and f:callParserFunction( '#dplvar', 'craftingdescription' ) == '1' then
 
table.insert( row, args.description )
 
end
 
row = table.concat( row, '\n|\n' )
 
 
 
  +
local categories = {}
if nameCell then
 
  +
local cI = 1
row = '!\n' .. row
 
  +
if args.upcoming then
else
 
  +
categories[cI] = '[[' .. i18n.categoryUpcoming .. ']]'
row = '|\n' .. row
 
  +
cI = cI + 1
 
end
 
end
 
 
  +
if args.type then
local footer = ''
 
  +
categories[cI] = '[[' .. i18n.categoryRecipeType:gsub( '%$1', args.type:lower() ) .. ']]'
if foot ~= '' then
 
footer = '|}'
+
cI = cI + 1
f:callParserFunction( '#dplvar:set', 'craftingname', '0', 'craftingdescription', '0' )
 
 
end
 
end
 
 
  +
if args.ignoreusage ~= '1' then
-- Create ingredient categories for DPL
 
  +
-- Create ingredient categories for DPL
local title = mw.title.getCurrentTitle()
 
local categories = ''
+
local usedNames = {}
  +
for _, ingredientSet in pairs( ingredientSets ) do
if args.nocat ~= '1' and title.namespace == 0 and not title.isSubpage then
 
  +
for _, ingredient in pairs( ingredientSet ) do
categories = {}
 
  +
local name = ingredient.name
 
  +
if not ingredient.mod and not usedNames[name] and name ~= title.text then
if args.upcoming then
 
  +
-- List each dye individually as they have their own pages
table.insert( categories, '[[Categoria:Em breve]]' )
 
end
+
if
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemDye or
 
  +
name == i18n.itemDye .. ' ' .. slot.i18n.suffixes.matching or
if args.ignoreusage ~= '1' then
 
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemColoredDye or
for k, v in ipairs( ingredientKeys ) do
 
  +
name == i18n.itemColoredDye .. ' '.. slot.i18n.suffixes.matching
v = v:sub( 2 )
 
if not v:find( ':' ) then
+
then
if v == 'Qualquer Corante' then
+
if not name:find( i18n.colored ) then
  +
categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', i18n.itemBoneMeal ) .. ']]'
for _, dye in ipairs( {
 
  +
cI = cI + 1
'Corante Laranja', 'Corante Magenta', 'Corante Azul Claro', 'Amarelo do Dente-de-Leão', 'Corante Verde Limão',
 
  +
usedNames[i18n.itemBoneMeal] = true
'Corante Rosa', 'Corante Cinza', 'Corante Cinza Claro', 'Corante Ciano', 'Corante Roxo',
 
  +
end
'Lápis-Lazúli', 'Sementes de Cacau', 'Verde do Cacto', 'Vermelho da Rosa', 'Saco de Tinta'
 
} ) do
+
  +
for _, dye in ipairs( i18n.coloredDyes ) do
table.insert( categories, '[[Categoria:Receita usando ' .. dye .. ']]' )
 
  +
categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', dye ) .. ']]'
  +
cI = cI + 1
  +
usedNames[dye] = true
  +
end
  +
-- List stone variants individually as they have their own pages
  +
elseif
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemStone or
  +
name == i18n.itemStone .. ' ' .. slot.i18n.suffixes.matching
  +
then
  +
for _, stone in pairs( i18n.stoneVariants ) do
  +
categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', stone ) .. ']]'
  +
cI = cI + 1
  +
usedNames[stone] = true
 
end
 
end
 
else
 
else
if v == 'Sticky Piston' then v = 'Piston'
+
-- Merge item variants which use a single page
  +
if
elseif v == 'Red Mushroom' or v == 'Brown Mushroom' then v = 'Mushroom'
 
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemMushroom or
elseif v == 'Red Sand' then v = 'Sand'
 
  +
name == i18n.itemMushroom .. ' ' .. slot.i18n.suffixes.matching or
elseif v == 'Charcoal' then v = 'Coal'
 
  +
name == i18n.itemRedMushroom or
elseif v:find( ' Wood$' ) then v = 'Wood'
 
  +
name == i18n.itemBrownMushroom
elseif v:find( ' Wood Planks$' ) then v = 'Wood Planks'
 
  +
then name = i18n.itemMushroom
elseif v:find( ' Stained Glass$' ) then v = 'Stained Glass'
 
elseif v:find( ' Stained Glass Pane$' ) then v = 'Stained Glass Pane'
+
elseif name == i18n.itemCharcoal then name = i18n.itemCoal
elseif v:find( ' Wool$' ) then v = 'Wool'
+
elseif name:find( ' ' .. i18n.itemQuartzBlock .. '$' ) then name = i18n.itemBlockOfQuartz
  +
else
elseif v:find( ' Sandstone$' ) then v = 'Sandstone'
 
  +
for _, variant in pairs( i18n.variantPages ) do
elseif v:find( ' Stairs$' ) then v = 'Stairs'
 
elseif v:find( ' Slab$' ) then v = 'Slab'
+
if name:find( '^' .. variant .. ' ' ) then
  +
name = variant
elseif v:find( ' Pressure Plate$' ) then v = 'Pressure Plate'
 
  +
break
elseif v:find( ' Firework Star$' ) then v = 'Firework Star'
 
  +
end
elseif v:find( ' Stone Bricks$' ) then v = 'Stone Bricks'
 
  +
end
elseif v:find( ' Quartz Block$' ) then v = 'Block of Quartz'
 
  +
elseif v:find( ' Andesite$' ) then v = 'Andesite'
 
  +
-- Remove prefixes
elseif v:find( ' Diorite$' ) then v = 'Diorite'
 
  +
for _, prefix in pairs( slot.i18n.prefixes ) do
elseif v:find( ' Granite$' ) then v = 'Granite'
 
  +
if name:find( '^' .. prefix .. ' ' ) then
  +
name = name:gsub( '^' .. prefix .. ' ', '' )
  +
break
  +
end
  +
end
  +
-- Remove suffixes
  +
for _, suffix in pairs( slot.i18n.suffixes ) do
  +
if name:find( ' ' .. suffix .. '$' ) then
  +
name = name:gsub( suffix .. '$', '' )
  +
break
  +
end
  +
end
 
end
 
end
 
 
  +
if not usedNames[name] then
table.insert( categories, '[[Categoria:Receita usando ' .. v .. ']]' )
 
  +
categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', name ) .. ']]'
  +
cI = cI + 1
  +
usedNames[name] = true
  +
end
 
end
 
end
 
end
 
end
 
end
 
end
 
end
 
end
 
categories = table.concat( categories, '' )
 
 
end
 
end
 
 
  +
return out, table.concat( categories, '' )
if args.debug == '1' then
 
return '<pre>' .. header .. '\n' .. row .. '\n|-\n' .. footer .. categories .. '</pre>'
 
else
 
return header .. '\n' .. row .. '\n|-\n' .. footer .. categories
 
end
 
 
end
 
end
  +
 
return p
 
return p

Edição atual tal como às 22h14min de 5 de setembro de 2020

Este módulo implementa {{Fabricação}}.

Argumentos pais são automaticamente mesclados com argumentos diretamente passados (o último substituindo o anterior).

Dependências

Veja também

[ver | editar | histórico | purgar]A documentação acima é transcluída de Módulo:Crafting/doc.
local p = {}

local i18n = {
	colored = 'Colorido',
	coloredDyes = {
		'Corante laranja', 'Corante magenta', 'Corante azul-claro', 'Corante amarelo', 'Corante verde-limão',
		'Corante rosa', 'Corante cinza', 'Corante cinza-claro', 'Corante ciano', 'Corante roxo',
		'Corante azul', 'Corante marrom', 'Corante verde', 'Corante vermelho', 'Corante preto',
	},
	categoryIngredientUsage = 'Categoria:Receita usando $1',
	categoryRecipeType = 'Categoria:Receita de $1',
	categoryUpcoming = 'Categoria:Em breve',
	itemBlockOfQuartz = 'Bloco de quartzo',
	itemBoneMeal = 'Farinha de osso',
	itemBrownMushroom = 'Cogumelo marrom',
	itemCharcoal = 'Carvão vegetal',
	itemCoal = 'Carvão',
	itemColoredDye = 'Corante colorido',
	itemDye = 'Corante',
	itemMushroom = 'Cogumelo',
	itemQuartzBlock = 'Bloco de quartzo',
	itemRedMushroom = 'Cogumelo vermelho',
	itemStone = 'Pedra',
	moduleArgs = [[Módulo:ProcessArgs]],
	moduleRecipe = [[Módulo:Recipe table]],
	moduleSlot = [[Módulo:Inventory slot]],
	stoneVariants = { 'Pedra', 'Andesito', 'Granito', 'Diorito' },
	type = 'Fabricação',
	variantPages = {
		'Andesito', 'Estandarte', 'Cama', 'Diorito', 'Estrela de fogo de artifício', 'Granito', 
		'Placa de pressão', 'Areia', 'Arenito', 'Escudo', 'Laje', 'Vidraça tingida', 
		'Vidro tingido', 'Escadas', 'Tijolos de pedra', 'Tábuas', 'Madeira', 'Lã', 'Concreto',
		'Cimento', 'Azulejo',
	},
}
p.i18n = i18n

local slot = require( i18n.moduleSlot )
local recipeTable = require( i18n.moduleRecipe ).table
local cArgVals = { 'A1', 'B1', 'C1', 'A2', 'B2', 'C2', 'A3', 'B3', 'C3' }
p.cArgVals = cArgVals

function p.table( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = require( i18n.moduleArgs ).merge( true )
	else
		f = mw.getCurrentFrame()
	end
	
	-- Automatic shapeless positioning
	if args[1] then
		args.shapeless = 1
		if args[7] then
			args.A1 = args[1]
			args.B1 = args[2]
			args.C1 = args[3]
			args.A2 = args[4]
			args.B2 = args[5]
			args.C2 = args[6]
			if args[8] then
				-- ◼◼◼      ◼◼◼
				-- ◼◼◼  OR  ◼◼◼
				-- ◼◼◼      ◼◼◻
				args.A3 = args[7]
				args.B3 = args[8]
				args.C3 = args[9]
				if args[9] then
					local identical = true
					for i = 1, 8 do
						if args[i] ~= args[i + 1] then
							identical = false
							break
						end
					end
					if identical then
						args.shapeless = nil
					end
				end
			else
				-- ◼◼◼
				-- ◼◼◼
				-- ◻◼◻
				args.B3 = args[7]
			end
		elseif args[2] then
			args.A2 = args[1]
			args.B2 = args[2]
			if args[5] then
				-- ◻◻◻      ◻◻◻
				-- ◼◼◼  OR  ◼◼◼
				-- ◼◼◼      ◼◼◻
				args.C2 = args[3]
				args.A3 = args[4]
				args.B3 = args[5]
				args.C3 = args[6]
			elseif args[4] then
				-- ◻◻◻
				-- ◼◼◻
				-- ◼◼◻
				args.A3 = args[3]
				args.B3 = args[4]
			else
				-- ◻◻◻      ◻◻◻
				-- ◼◼◻  OR  ◼◼◻
				-- ◻◼◻      ◻◻◻
				args.B3 = args[3]
			end
		else
			-- ◻◻◻
			-- ◻◼◻
			-- ◻◻◻
			args.B2 = args[1]
			args.shapeless = nil
		end
		
		for i = 1, 9 do
			args[i] = nil
		end
	end
	
	-- Create recipe table, and list of ingredients
	local out, ingredientSets = recipeTable( args, {
		uiFunc = 'craftingTable',
		type = i18n.type,
		ingredientArgs = cArgVals,
		outputArgs = { 'Output' },
	} )
	
	local title = mw.title.getCurrentTitle()
	if args.nocat == '1' or title.namespace ~= 0 or title.isSubpage then
		return out
	end
	
	local categories = {}
	local cI = 1
	if args.upcoming then
		categories[cI] = '[[' .. i18n.categoryUpcoming .. ']]'
		cI = cI + 1
	end
	
	if args.type then
		categories[cI] = '[[' .. i18n.categoryRecipeType:gsub( '%$1', args.type:lower() ) .. ']]'
		cI = cI + 1
	end
	
	if args.ignoreusage ~= '1' then
		-- Create ingredient categories for DPL
		local usedNames = {}
		for _, ingredientSet in pairs( ingredientSets ) do
			for _, ingredient in pairs( ingredientSet ) do
				local name = ingredient.name
				if not ingredient.mod and not usedNames[name] and name ~= title.text then
					-- List each dye individually as they have their own pages
					if
						name == slot.i18n.prefixes.any .. ' ' .. i18n.itemDye or
						name == i18n.itemDye .. ' ' .. slot.i18n.suffixes.matching or
						name == slot.i18n.prefixes.any .. ' ' .. i18n.itemColoredDye or
						name == i18n.itemColoredDye .. ' '.. slot.i18n.suffixes.matching
					then
						if not name:find( i18n.colored ) then
							categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', i18n.itemBoneMeal ) .. ']]'
							cI = cI + 1
							usedNames[i18n.itemBoneMeal] = true
						end
						
						for _, dye in ipairs( i18n.coloredDyes ) do
							categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', dye ) .. ']]'
							cI = cI + 1
							usedNames[dye] = true
						end
					-- List stone variants individually as they have their own pages
					elseif
						name == slot.i18n.prefixes.any .. ' ' .. i18n.itemStone or
						name == i18n.itemStone .. ' ' .. slot.i18n.suffixes.matching
					then
						for _, stone in pairs( i18n.stoneVariants ) do
							categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', stone ) .. ']]'
							cI = cI + 1
							usedNames[stone] = true
						end
					else
						-- Merge item variants which use a single page
						if
							name == slot.i18n.prefixes.any .. ' ' .. i18n.itemMushroom or
							name == i18n.itemMushroom .. ' ' .. slot.i18n.suffixes.matching or
							name == i18n.itemRedMushroom or
							name == i18n.itemBrownMushroom
						then name = i18n.itemMushroom
						elseif name == i18n.itemCharcoal then name = i18n.itemCoal
						elseif name:find( ' ' .. i18n.itemQuartzBlock .. '$' ) then name = i18n.itemBlockOfQuartz
						else
							for _, variant in pairs( i18n.variantPages ) do
								if name:find( '^' .. variant .. ' ' ) then
									name = variant
									break
								end
							end
							
							-- Remove prefixes
							for _, prefix in pairs( slot.i18n.prefixes ) do
								if name:find( '^' .. prefix .. ' ' ) then
									name = name:gsub( '^' .. prefix .. ' ', '' )
									break
								end
							end
							-- Remove suffixes
							for _, suffix in pairs( slot.i18n.suffixes ) do
								if name:find( ' ' .. suffix .. '$' ) then
									name = name:gsub( suffix .. '$', '' )
									break
								end
							end
						end
						
						if not usedNames[name] then
							categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', name ) .. ']]'
							cI = cI + 1
							usedNames[name] = true
						end
					end
				end
			end
		end
	end
	
	return out, table.concat( categories, '' )
end

return p