Minecraft Wiki
Sem resumo de edição
Sem resumo de edição
 
(9 revisões intermediárias por 3 usuários não estão sendo mostradas)
Linha 1: Linha 1:
 
local p = {}
 
local p = {}
local slot = require( [[Módulo:Inventory slot]] )
 
local getParts = slot.getParts
 
local prefixes = slot.prefixes
 
   
  +
local i18n = {
local function prefixedLink( name, mod )
 
local prefix = ''
+
colored = 'Colorido',
  +
coloredDyes = {
for _, thisPrefix in pairs( prefixes ) do
 
  +
'Corante laranja', 'Corante magenta', 'Corante azul-claro', 'Corante amarelo', 'Corante verde-limão',
if name:find( '^' .. thisPrefix .. ' ' ) then
 
  +
'Corante rosa', 'Corante cinza', 'Corante cinza-claro', 'Corante ciano', 'Corante roxo',
prefix = thisPrefix .. ' '
 
  +
'Corante azul', 'Corante marrom', 'Corante verde', 'Corante vermelho', 'Corante preto',
name = name:gsub( '^' .. prefix, '' )
 
  +
},
break
 
  +
categoryIngredientUsage = 'Categoria:Receita usando $1',
end
 
  +
categoryRecipeType = 'Categoria:Receita de $1',
end
 
  +
categoryUpcoming = 'Categoria:Em breve',
 
  +
itemBlockOfQuartz = 'Bloco de quartzo',
local page = ''
 
  +
itemBoneMeal = 'Farinha de osso',
if mod and mod ~= '' then
 
  +
itemBrownMushroom = 'Cogumelo marrom',
page = 'Mods/' .. mod .. '/'
 
  +
itemCharcoal = 'Carvão vegetal',
end
 
  +
itemCoal = 'Carvão',
 
  +
itemColoredDye = 'Corante colorido',
return prefix .. '[[' .. page .. name .. '|' .. name .. ']]'
 
  +
itemDye = 'Corante',
end
 
  +
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
 
 
-- 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 = 'Nome !! '
 
f:callParserFunction( '#dplvar:set', 'craftingname', '1' )
 
end
 
if args.showdescription == '1' then
 
description = ' !! class="unsortable" | Descrição'
 
f:callParserFunction( '#dplvar:set', 'craftingdescription', '1' )
 
end
 
local class = args.class or ''
 
local recipeClass = ''
 
if multirow then
 
class = 'sortable collapsible ' .. class
 
recipeClass = 'class="unsortable" |'
 
end
 
header = table.concat( {
 
' {| class="wikitable ' .. class .. '" data-description="Receitas de Criação"',
 
'! ' .. name .. 'Ingredientes !! ' .. recipeClass .. ' Receita 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 = getParts( v, args.Mod )
 
parts.mod = parts.mod or ''
 
if not names[parts.mod .. ':' .. parts.name] then
 
table.insert( links, prefixedLink( parts.name, parts.mod ) )
 
names[parts.mod .. ':' .. parts.name] = 1
 
end
 
end
 
 
nameCell = table.concat( links, '&nbsp;ou<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 = 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 = 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 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
 
table.insert( ingredientsCell, prefixedLink( name, mod ) .. separator )
 
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
 
if args[9] then
 
local identical = true
 
local identical = true
Linha 186: Linha 71:
 
if args[i] ~= args[i + 1] then
 
if args[i] ~= args[i + 1] then
 
identical = false
 
identical = false
  +
break
 
end
 
end
 
end
 
end
 
if identical then
 
if identical then
newArgs.shapeless = nil
+
args.shapeless = nil
 
end
 
end
 
end
 
end
Linha 196: Linha 82:
 
-- ◼◼◼
 
-- ◼◼◼
 
-- ◻◼◻
 
-- ◻◼◻
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 225: Linha 111:
 
-- ◻◼◻
 
-- ◻◼◻
 
-- ◻◻◻
 
-- ◻◻◻
newArgs.B2 = args[1]
+
args.B2 = args[1]
newArgs.shapeless = nil
+
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
 
newArgs.fixed = args.fixed
 
newArgs.notfixed = args.notfixed
 
 
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,
newArgs.Olink = args.Olink
 
  +
outputArgs = { 'Output' },
  +
} )
 
 
  +
local title = mw.title.getCurrentTitle()
-- Recipe cell
 
  +
if args.nocat == '1' or title.namespace ~= 0 or title.isSubpage then
local recipeCell = 'style="padding:1px" |\n' .. require( 'Módulo:UI' ).craftingTable( newArgs )
 
  +
return out
 
local row = { ingredientsCell, recipeCell }
 
if nameCell then
 
table.insert( row, 1, nameCell )
 
 
end
 
end
if f:callParserFunction( '#dplvar', 'craftingdescription' ) == '1' then
 
table.insert( row, args.description or '' )
 
end
 
row = table.concat( row, '\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.type then
 
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemColoredDye or
table.insert( categories, '[[Categoria:Receita de ' .. args.type .. ']]' )
 
  +
name == i18n.itemColoredDye .. ' '.. slot.i18n.suffixes.matching
end
 
+
then
if args.ignoreusage ~= '1' then
+
if not name:find( i18n.colored ) then
  +
categories[cI] = '[[' .. i18n.categoryIngredientUsage:gsub( '%$1', i18n.itemBoneMeal ) .. ']]'
local dyes = {
 
  +
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 Lilás',
 
'Lápis-Lazúli', 'Sementes de Cacau', 'Verde do Cacto', 'Vermelho da Rosa', 'Bolsa de Tinta'
 
}
 
local variants = {
 
'Madeira', 'Tábuas', 'Vidro Tingido', 'Painel de Vidro Tingido', 'Lã',
 
'Arenito', 'Escadas', 'Laje', 'Placa de Pressão', 'Estrela de Fogos de Artifício',
 
'Tijolos de Pedra', 'Andesito', 'Diorito', 'Granito', 'Estandarte', 'Escudo'
 
}
 
 
for k, v in ipairs( ingredientKeys ) do
 
v = v:sub( 2 )
 
if not v:find( ':' ) then
 
if v == 'Qualquer Corante' or v == 'Qualquer Corante Colorido' then
 
if v == 'Qualquer Corante' then
 
table.insert( dyes, 1, 'Farinha de Osso' )
 
 
end
 
end
 
 
for _, dye in ipairs( dyes ) 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 == 'Pistão Grudento' then v = 'Pistão'
+
-- Merge item variants which use a single page
  +
if
elseif v== 'Qualquer Cogumelo' or v== 'Cogumelo Vermelho' or v== 'Cogumelo Marrom' then v = 'Cogumelo'
 
  +
name == slot.i18n.prefixes.any .. ' ' .. i18n.itemMushroom or
elseif v== 'Areia Vermelha' then v = 'Areia'
 
  +
name == i18n.itemMushroom .. ' ' .. slot.i18n.suffixes.matching or
elseif v== 'Qualquer Bandeira' then v = 'Bandeira'
 
  +
name == i18n.itemRedMushroom or
elseif v== 'Qualquer Tábuas de Madeira' then v = 'Tábuas'
 
  +
name == i18n.itemBrownMushroom
elseif v== 'Carvão Vegetal' then v = 'Carvão'
 
elseif v== 'Pilar de Quartzo' then v = 'Bloco de Quartzo'
+
then name = i18n.itemMushroom
elseif v== 'Maçã Dourada Encantada' then v = 'Maçã Dourada'
+
elseif name == i18n.itemCharcoal then name = i18n.itemCoal
elseif v== 'Qualquer Arenito Vermelho' then v = 'Arenito Vermelho'
+
elseif name:find( ' ' .. i18n.itemQuartzBlock .. '$' ) then name = i18n.itemBlockOfQuartz
elseif v== 'Qualquer Arenito' or v== 'Arenito' or v== 'Arenito Talhado' or v== 'Arenito Liso' then v = 'Arenito'
 
elseif v== 'Laje de Pedra' or v== 'Laje de Arenito' or v== 'Laje de Pedregulho' or v== 'Laje de Tijolos' or v== 'Laje de Tijolos de Pedra' or v== 'Qualquer Laje de Madeira' or v== 'Laje de Tijolos do Nether' or v== 'Laje de Quartzo' or v== 'Qualquer Laje de Pedra' then v = 'Laje'
 
elseif v:find( ' Madeira$' ) then v = 'Madeira'
 
elseif v:find( ' Laje$' ) then v = 'Laje'
 
elseif v:find( ' Tábuas$' ) then v = 'Tábuas'
 
elseif v:find( ' Vidro Tingido$' ) then v = 'Vidro Tingido'
 
elseif v:find( ' Painel de Vidro Tingido$' ) then v = 'Painel de Vidro Tingido'
 
elseif v:find( ' Lã$' ) then v = 'Lã'
 
elseif v:find( ' Escadas$' ) then v = 'Escadas'
 
elseif v:find( ' Placa de Pressão$' ) then v = 'Placa de Pressão'
 
elseif v:find( ' Estrela de Fogos de Artifício$' ) then v = 'Estrela de Fogos de Artifício'
 
elseif v:find( ' Tijolos de Pedra$' ) then v = 'Tijolos de Pedra'
 
elseif v:find( ' Bloco de Quartzo$' ) then v = 'Bloco de Quartzo'
 
elseif v:find( ' Andesito$' ) then v = 'Andesito'
 
elseif v:find( ' Diorito$' ) then v = 'Diorito'
 
elseif v:find( ' Granito$' ) then v = 'Granito'
 
 
else
 
else
-- Merge variant categories which use a single page
+
for _, variant in pairs( i18n.variantPages ) do
for _, variant in pairs( variants ) do
+
if name:find( '^' .. variant .. ' ' ) then
if v:find( ' ' .. variant .. '$' ) then
+
name = variant
v = variant
 
 
break
 
break
 
end
 
end
Linha 345: Linha 199:
 
 
 
-- Remove prefixes
 
-- Remove prefixes
for _, prefix in pairs( prefixes ) do
+
for _, prefix in pairs( slot.i18n.prefixes ) do
if v:find( '^' .. prefix .. ' ' ) then
+
if name:find( '^' .. prefix .. ' ' ) then
v = v:gsub( '^' .. prefix .. ' ', '' )
+
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
 
break
 
end
 
end
Linha 353: Linha 214:
 
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