local p = {}
function p.dpl( f )
local debug = f:callParserFunction( '#dplvar:debug' )
local args = require( 'Module:ProcessArgs' ).merge()
if args.ignoreusage then return end
local title = f:callParserFunction( '#dplvar:craftingdplingredient' )
if title == '' then
title = mw.title.getCurrentTitle().text
end
local craftingArgs = {
args[1] or args.A1 or '', args[2] or args.B1 or '', args[3] or args.C1 or '',
args[4] or args.A2 or '', args[5] or args.B2 or '', args[6] or args.C2 or '',
args[7] or args.A3 or '', args[8] or args.B3 or '', args[9] or args.C3 or '',
Output = args.Output
}
local matchType = f:callParserFunction( '#dplvar:craftingdplmatch' )
function matchPattern( ingredient )
local pattern
local escaped = mw.ustring.lower( ingredient ):gsub( '([%(%)])', '%%%1' )
if matchType == 'start' then
pattern = '[;:%]]%s*' .. escaped
elseif matchType == 'end' then
pattern = escaped .. '%s*[,;%[]'
elseif matchType == 'any' then
pattern = escaped
else
pattern = '[;:%]]%s*' .. escaped .. '%s*[,;%[]'
end
return pattern
end
local usedRecipes = f:callParserFunction( '#dplvar:craftingdplrecipes' )
local hasIngredient
for _, v in ipairs( craftingArgs ) do
if ( ';' .. mw.ustring.lower( v ) .. ';' ):find( matchPattern( title ) ) then
if usedRecipes:find( matchPattern( args.Output ) ) then return end
if not v:find( ';' ) then
hasIngredient = 'static'
elseif not hasIngredient then
hasIngredient = 'animated'
end
end
end
if not hasIngredient then return end
local maxFrames = 1
local requiredFrames = {}
if hasIngredient == 'animated' then
for _, v in ipairs( craftingArgs ) do
if v:find( ';' ) then
local frameNum = 0
for frame in mw.text.gsplit( v, '%s*;%s*' ) do
frameNum = frameNum + 1
if frameNum > maxFrames then maxFrames = frameNum end
if not requiredFrames[frameNum] and ( ';' .. mw.ustring.lower( frame ) .. ';' ):find( matchPattern( title ) ) then
requiredFrames[frameNum] = true
end
end
end
end
end
if maxFrames > 1 then
local frames = {}
for k, arg in pairs( craftingArgs ) do
if arg:find( ';' ) then
local frameNum = 0
for frame in mw.text.gsplit( arg, '%s*;%s*' ) do
frameNum = frameNum + 1
if requiredFrames[frameNum] then
if not frames[k] then frames[k] = {} end
table.insert( frames[k], frame )
end
end
frames[k] = table.concat( frames[k], ';' )
else
frames[k] = arg
end
end
f:callParserFunction( '#dplvar:set', 'craftingdplrecipes', usedRecipes .. ';' .. mw.ustring.lower( frames.Output ) .. ';' )
if args[1] then
local argNum = 0
for _, arg in ipairs( frames ) do
if arg ~= '' then
argNum = argNum + 1
args[argNum] = arg
end
end
args.Output = frames.Output
else
args.A1 = frames[1]; args.B1 = frames[2]; args.C1 = frames[3]
args.A2 = frames[4]; args.B2 = frames[5]; args.C2 = frames[6]
args.A3 = frames[7]; args.B3 = frames[8]; args.C3 = frames[9]
args.Output = frames.Output
end
-- If not all frames are used, overwrite custom name and ingredient values
if maxFrames > #requiredFrames then
args.name = nil
args.ingredients = nil
end
else
f:callParserFunction( '#dplvar:set', 'craftingdplrecipes', usedRecipes .. ';' .. mw.ustring.lower( args.Output ) .. ';' )
end
if debug == '1' then
args.name = 'From: [[' .. args['%PAGE%'] .. ']]'
end
local crafting = require( 'Module:Crafting' ).table
args.head = '1'
args.showname = nil
args.foot = nil
args.nocat = '1'
args.showdescription = f:callParserFunction( '#dplvar:craftingdescription' )
return crafting( args )
end
return p