Minecraft Wiki
Registrarse
mSin resumen de edición
Sin resumen de edición
(No se muestran 18 ediciones intermedias de 4 usuarios)
Línea 1: Línea 1:
 
local p = {}
 
local p = {}
  +
  +
local i18n = {
  +
colored = 'Colored',
  +
coloredDyes = {
  +
'Orange Dye', 'Magenta Dye', 'Light Blue Dye', 'Yellow Dye', 'Lime Dye',
  +
'Pink Dye', 'Gray Dye', 'Light Gray Dye', 'Cyan Dye', 'Purple Dye',
  +
'Blue Dye', 'Brown Dye', 'Green Dye',
  +
'Red Dye', 'Black Dye',
  +
},
  +
categoryIngredientUsage = 'Categoría:Receta usando $1',
  +
categoryRecipeType = 'Categoría:Receta de $1',
  +
categoryUpcoming = 'Categoría:Próximamante',
  +
itemBlockOfQuartz = 'Bloque de cuarzo',
  +
itemBrownMushroom = 'Brown Mushroom',
  +
itemCharcoal = 'Charcoal',
  +
itemCoal = 'Carbón',
  +
itemColoredDye = 'Colored Dye',
  +
itemDye = 'Tinte',
  +
itemMushroom = 'Champiñón',
  +
itemQuartzBlock = 'Bloque de cuarzo',
  +
itemRedMushroom = 'Red Mushroom',
  +
itemStone = 'Piedra',
  +
itemWhiteDye = 'Tinte blanco',
  +
moduleArgs = [[Módulo:ProcessArgs]],
  +
moduleRecipe = [[Módulo:Recipe table]],
  +
moduleSlot = [[Módulo:Inventory slot]],
  +
stoneVariants = { 'Piedra', 'Andesita', 'Granito', 'Diorita' },
  +
type = 'Fabricación',
  +
variantPages = {
  +
'Andesite', 'Banner', 'Bed', 'Diorite', 'Firework Star', 'Granite',
  +
'Pressure Plate', 'Sand', 'Sandstone', 'Shield', 'Slab', 'Stained Glass Pane',
  +
'Stained Glass', 'Stairs', 'Stone Bricks', 'Wood Planks', 'Wood', 'Wool',
  +
},
  +
}
  +
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 = 'Nombre !! '
 
f:callParserFunction( '#dplvar:set', 'craftingname', '1' )
 
end
 
if args.showdescription == '1' then
 
description = ' !! class="unsortable" | Descripción'
 
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 .. ' Receta de [[fabricación]]' .. 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( '^Cualquier tipo de ' ) then
 
table.insert( links, 'Cualquier tipo <br>de [[' .. link .. parts.name:sub( 18 ) .. ']]' )
 
else
 
table.insert( links, '[[' .. link .. parts.name .. ']]' )
 
end
 
names[parts.mod .. ':' .. parts.name] = 1
 
end
 
end
 
 
nameCell = table.concat( links, '&nbsp;o<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;o'
 
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( '^Cualquier tipo de ' ) then
 
table.insert( ingredientsCell, 'Cualquier tipo <br>de [[' .. link .. name:sub( 18 ) .. ']]' .. 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 ◼◼◼
+
-- ◼◼◼ O ◼◼◼
 
-- ◼◼◼ ◼◼◻
 
-- ◼◼◼ ◼◼◻
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 ◼◼◼
+
-- ◼◼◼ O ◼◼◼
 
-- ◼◼◼ ◼◼◻
 
-- ◼◼◼ ◼◼◻
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 ◼◼◻
+
-- ◼◼◻ O ◼◼◻
 
-- ◻◼◻ ◻◻◻
 
-- ◻◼◻ ◻◻◻
newArgs.B3 = args[3]
+
args.B3 = args[3]
 
end
 
end
 
else
 
else
Línea 210: Línea 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 ) .. ']]'
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, '[[Category:Próximamente]]' )
 
end
+
if
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemDye or
 
  +
name == slot.i18n.prefixes.matching .. ' ' .. i18n.itemDye or
if args.type then
 
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemColoredDye or
table.insert( categories, '[[Category:Receta de ' .. args.type .. ']]' )
 
  +
name == slot.i18n.prefixes.matching .. ' ' .. i18n.itemColoredDye
end
 
+
then
if args.ignoreusage ~= '1' then
+
if not name:find( i18n.colored ) then
  +
categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', i18n.itemWhiteDye ) .. ']]'
for k, v in ipairs( ingredientKeys ) do
 
v = v:sub( 2 )
+
cI = cI + 1
  +
usedNames[i18n.itemWhiteDye] = true
if not v:find( ':' ) then
 
if v == 'Cualquier tipo de tinte' or v == 'Cualquier tipo de tinte de color' then
 
local dyes = {
 
'Tinte naranja', 'Tinte magenta', 'Tinte azul claro', 'Tinte amarillo',
 
'Tinte verde lima', 'Tinte rosa', 'Tinte gris', 'Tinte gris claro', 'Tinte cian', 'Tinte morado',
 
'Lapislázuli', 'Semillas de cacao', 'Tinte verde', 'Tinte rojo', 'Saco de tinta'
 
}
 
if v == 'Cualquier tipo de tinte' then
 
table.insert( dyes, 1, 'Polvo de hueso' )
 
 
end
 
end
 
 
for _, dye in ipairs( dyes ) do
+
for _, dye in pairs( i18n.coloredDyes ) do
table.insert( categories, '[[Category:Receta que usa ' .. dye .. ']]' )
+
categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', dye ) .. ']]'
end
+
cI = cI + 1
  +
usedNames[dye] = true
elseif v:find( 'losa' ) or v:find( 'Losa' ) then
 
  +
end
v = 'Losa'
 
  +
-- List stone variants individually as they have their own pages
table.insert( categories, '[[Category:Receta que usa ' .. v .. ']]' )
 
  +
elseif
elseif v:find( 'escaleras' ) or v:find( 'Escaleras' ) then
 
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemStone or
v = 'Escaleras'
 
  +
name == slot.i18n.prefixes.matching .. ' ' .. i18n.itemStone
table.insert( categories, '[[Category:Receta que usa ' .. v .. ']]' )
 
  +
then
elseif v:find( 'lana' ) or v:find( 'Lana' ) then
 
  +
for _, stone in pairs( i18n.stoneVariants ) do
v = 'Lana'
 
  +
categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', stone ) .. ']]'
table.insert( categories, '[[Category:Receta que usa ' .. v .. ']]' )
 
  +
cI = cI + 1
  +
usedNames[stone] = true
  +
end
 
else
 
else
if v == 'Sticky Piston' then v = 'Piston'
+
-- Merge item variants which use a single page
  +
if
elseif v== 'Cualquier tipo de champiñón' or v == 'Champiñón rojo' or v == 'Champiñón marrón' then v = 'Champiñón'
 
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemMushroom or
elseif v == 'Arena Roja' then v = 'Arena'
 
  +
name == slot.i18n.prefixes.matching .. ' ' .. i18n.itemMushroom or
elseif v == 'Carbón vegetal' then v = 'Carbón'
 
  +
name == i18n.itemRedMushroom or
elseif v:find( ' tronco$' ) then v = 'Tronco'
 
  +
name == i18n.itemBrownMushroom
elseif v:find( '^Madera ' ) then v = 'Madera'
 
elseif v:find( ' estandarte$' ) then v = 'Estandarte'
+
then name = i18n.itemMushroom
elseif v:find( ' cristal tintado$' ) then v = 'Cristal tintado'
+
elseif name == i18n.itemCharcoal then name = i18n.itemCoal
elseif v:find( ' panel de cristal tintado$' ) then v = 'Panel de cristal tintado'
+
elseif name:find( ' ' .. i18n.itemQuartzBlock .. '$' ) then name = i18n.itemBlockOfQuartz
  +
else
elseif v:find( ' arenisca$' ) then v = 'Arenisca'
 
  +
for _, variant in pairs( i18n.variantPages ) do
elseif v:find( ' placa de presión$' ) then v = 'Placa de presión'
 
elseif v:find( ' estrella de fuegos artificiales$' ) then v = 'Estrella de fuegos artificiales'
+
if name:find( ' ' .. variant .. '$' ) then
  +
name = variant
elseif v:find( ' ladrillos de piedra$' ) then v = 'Ladrillos de piedra'
 
  +
break
elseif v:find( ' bloque de cuarzo$' ) then v = 'Bloque de cuarzo'
 
  +
end
elseif v:find( ' pilar de cuarzo$' ) then v = 'Bloque de cuarzo'
 
  +
end
elseif v:find( ' Andesita$' ) then v = 'Andesita'
 
  +
elseif v:find( ' Diorita$' ) then v = 'Diorita'
 
  +
-- Remove prefixes
elseif v:find( ' Granito$' ) then v = 'Granito'
 
  +
for _, prefix in pairs( slot.i18n.prefixes ) do
  +
if name:find( '^' .. prefix .. ' ' ) then
  +
name = name:gsub( '^' .. prefix .. ' ', '' )
  +
break
  +
end
  +
end
 
end
 
end
 
 
  +
if not usedNames[name] then
table.insert( categories, '[[Category:Receta que usa ' .. 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

Revisión del 16:30 26 feb 2021

[Ver | Editar | Purgar]DocumentaciónVer código ↴

This module implements {{Fabricación}}.

Parent arguments are automatically merged with directly passed arguments (the latter overwriting the former).

Dependencies

[Ver | Editar | Purgar]La documentación arriba es transcluída desde Módulo:Fabricación/doc.
local p = {}

local i18n = {
	colored = 'Colored',
	coloredDyes = {
		'Orange Dye', 'Magenta Dye', 'Light Blue Dye', 'Yellow Dye', 'Lime Dye',
		'Pink Dye', 'Gray Dye', 'Light Gray Dye', 'Cyan Dye', 'Purple Dye',
		'Blue Dye', 'Brown Dye', 'Green Dye',
		'Red Dye', 'Black Dye',
	},
	categoryIngredientUsage = 'Categoría:Receta usando $1',
	categoryRecipeType = 'Categoría:Receta de $1',
	categoryUpcoming = 'Categoría:Próximamante',
	itemBlockOfQuartz = 'Bloque de cuarzo',
	itemBrownMushroom = 'Brown Mushroom',
	itemCharcoal = 'Charcoal',
	itemCoal = 'Carbón',
	itemColoredDye = 'Colored Dye',
	itemDye = 'Tinte',
	itemMushroom = 'Champiñón',
	itemQuartzBlock = 'Bloque de cuarzo',
	itemRedMushroom = 'Red Mushroom',
	itemStone = 'Piedra',
	itemWhiteDye = 'Tinte blanco',
	moduleArgs = [[Módulo:ProcessArgs]],
	moduleRecipe = [[Módulo:Recipe table]],
	moduleSlot = [[Módulo:Inventory slot]],
	stoneVariants = { 'Piedra', 'Andesita', 'Granito', 'Diorita' },
	type = 'Fabricación',
	variantPages = {
		'Andesite', 'Banner', 'Bed', 'Diorite', 'Firework Star', 'Granite', 
		'Pressure Plate', 'Sand', 'Sandstone', 'Shield', 'Slab', 'Stained Glass Pane', 
		'Stained Glass', 'Stairs', 'Stone Bricks', 'Wood Planks', 'Wood', 'Wool',
	},
}
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
				-- ◼◼◼      ◼◼◼
				-- ◼◼◼  O   ◼◼◼
				-- ◼◼◼      ◼◼◻
				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
				-- ◻◻◻      ◻◻◻
				-- ◼◼◼  O   ◼◼◼
				-- ◼◼◼      ◼◼◻
				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
				-- ◻◻◻      ◻◻◻
				-- ◼◼◻  O   ◼◼◻
				-- ◻◼◻      ◻◻◻
				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 ) .. ']]'
		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 == slot.i18n.prefixes.matching .. ' ' .. i18n.itemDye or
						name == slot.i18n.prefixes.any .. ' ' .. i18n.itemColoredDye or
						name == slot.i18n.prefixes.matching .. ' ' .. i18n.itemColoredDye
					then
						if not name:find( i18n.colored ) then
							categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', i18n.itemWhiteDye ) .. ']]'
							cI = cI + 1
							usedNames[i18n.itemWhiteDye] = true
						end
						
						for _, dye in pairs( 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 == slot.i18n.prefixes.matching .. ' ' .. i18n.itemStone
					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 == slot.i18n.prefixes.matching .. ' ' .. i18n.itemMushroom 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
						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