Module:Craft Usage: Difference between revisions
No edit summary |
mNo edit summary |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local recipeParams = { | local recipeParams = { | ||
station = | station = 'station', | ||
time = | time = 'time', | ||
output = | output = 'output', | ||
yield = | yield = 'yield', | ||
} | } | ||
local labels = { | local labels = { | ||
craftTitle = 'Crafting', | |||
craftInputText = 'The item can be used in the following craft recipes', | |||
craftOutputText = 'The item can be created in the following craft recipes', | |||
incineratorTitle = 'Incinerator', | |||
incineratorInputText = 'The item can be used in the following incinerator recipes', | |||
incineratorOutputText = 'The item can be created in the following incinerator recipes', | |||
cookingTitle = 'Cooking', | |||
cookingInputText = 'The item can be used in the following cooking recipes', | |||
cookingOutputText = 'The item can be created in the following cooking recipes', | |||
farmingTitle = 'Farming', | |||
farmingInputText = 'The item can be used to farm the following items', | |||
farmingOutputText = 'The item can be grown from the following items', | |||
waterTitle = 'Water Source', | |||
waterInputText = 'The item can be used at a water source to gain the following items', | |||
waterOutputText = 'The item can be gained at a water source by using the following items', | |||
} | } | ||
function split(str, delimiter) | |||
local | local returnTable = {} | ||
for k, v in string.gmatch(str, "([^" .. delimiter .. "]+)") do | |||
returnTable[#returnTable+1] = k | |||
for | |||
end | end | ||
return returnTable | |||
return | |||
end | end | ||
function p.main(frame) | function p.main(frame) | ||
local args = require('Module:Arguments').getArgs(frame, { | |||
parentFirst = true, | |||
wrapper = { 'Template:Craft_Usage' } | |||
}) | |||
if not args.item then | |||
args.item = mw.title.getCurrentTitle().text | |||
end | |||
local title = mw.title.new('Recipes') | |||
local content = title:getContent() | |||
if not content then | |||
return '<div class="error">Strona Recipes nie istnieje.</div>' | |||
end | |||
local recipeStringResult = '' | |||
for recipe in content:gmatch('{{Recipe|[^}]*}}') do | |||
recipeStringResult = recipeStringResult..recipe | |||
end | |||
local recipes = { | |||
craftRecipes = {}, | |||
incineratorRecipes = {}, | |||
cookingRecipes = {}, | |||
farmingRecipes = {}, | |||
waterRecipes = {} | |||
} | |||
for recipeKey, recipe in pairs(split(recipeStringResult, '}}{{')) do | |||
local typeKey = 'craftRecipes' | |||
local recipeTable = {} | |||
local inputText = '' | |||
local inputs = {} | |||
local outputs = {} | |||
for propertyStringKey, propertyString in pairs(split(recipe, '|')) do | |||
if not (propertyString == 'Recipe') then | |||
local propertySplitTable = split(propertyString, '=') | |||
if not recipeParams[propertySplitTable[1]] then | |||
inputText = inputText..'[['..propertySplitTable[1]..']]'..' x '..propertySplitTable[2]..'<br />' | |||
inputs[propertySplitTable[1]] = true | |||
else | |||
recipeTable[propertySplitTable[1]] = propertySplitTable[2] | |||
if propertySplitTable[1] == 'output' then | |||
outputs[propertySplitTable[2]] = true | |||
elseif propertySplitTable[1] == 'station' then | |||
inputs[propertySplitTable[2]] = true | |||
end | |||
end | |||
end | |||
end | |||
recipeTable['inputText'] = inputText | |||
if recipeTable.station == 'Incinerator' then | |||
typeKey = 'incineratorRecipes' | |||
elseif recipeTable.station == 'Cooking' then | |||
typeKey = 'cookingRecipes' | |||
elseif recipeTable.station == 'Farming' then | |||
typeKey = 'farmingRecipes' | |||
elseif recipeTable.station == 'Water Source' then | |||
typeKey = 'waterRecipes' | |||
end | |||
if (args.mode == 'input' and inputs[args.item]) or (args.mode == 'output' and outputs[args.item]) then | |||
table.insert(recipes[typeKey], recipeTable) | |||
end | |||
end | |||
local wrapper = mw.html.create('div') | |||
local function buildTable(wrapper, titleText, labelText, recipeList, showStation, showTime) | |||
if not recipeList[1] then return end | |||
local section = wrapper:tag('div') | |||
section:tag('h3'):tag('span'):addClass('mw-headline'):wikitext(titleText) | |||
section:tag('p'):wikitext(labelText) | |||
-- używamy wikitable zamiast fandom-table | |||
local _table = section:tag('table'):addClass('wikitable sortable') | |||
local tr = _table:tag('tr') | |||
tr:tag('th'):wikitext('Ingredients') | |||
if showStation then tr:tag('th'):wikitext('Station') end | |||
if showTime then tr:tag('th'):wikitext('Time') end | |||
tr:tag('th'):wikitext('Output') | |||
for _, recipe in pairs(recipeList) do | |||
if recipe.output then | |||
local row = _table:tag('tr') | |||
row:tag('td'):wikitext(recipe.inputText or '-') | |||
if showStation then row:tag('td'):wikitext(recipe.station and '[['..recipe.station..']]' or '-') end | |||
if showTime then row:tag('td'):wikitext(recipe.time or '-') end | |||
row:tag('td'):wikitext('[['..recipe.output..']]'..' x '..(recipe.yield or 1)) | |||
end | |||
end | |||
end | |||
local mode = args.mode or 'output' | |||
buildTable(wrapper, labels.craftTitle, | |||
mode == 'input' and labels.craftInputText or labels.craftOutputText, | |||
recipes.craftRecipes, true, true) | |||
buildTable(wrapper, labels.incineratorTitle, | |||
mode == 'input' and labels.incineratorInputText or labels.incineratorOutputText, | |||
recipes.incineratorRecipes, false, false) | |||
buildTable(wrapper, labels.cookingTitle, | |||
mode == 'input' and labels.cookingInputText or labels.cookingOutputText, | |||
recipes.cookingRecipes, false, false) | |||
buildTable(wrapper, labels.farmingTitle, | |||
mode == 'input' and labels.farmingInputText or labels.farmingOutputText, | |||
recipes.farmingRecipes, false, false) | |||
buildTable(wrapper, labels.waterTitle, | |||
mode == 'input' and labels.waterInputText or labels.waterOutputText, | |||
recipes.waterRecipes, false, false) | |||
return wrapper | |||
end | end | ||
return p | return p | ||