Editing Module:Products
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 12: | Line 12: | ||
local function recipe_sort(recipe_a, recipe_b) |
local function recipe_sort(recipe_a, recipe_b) |
||
-- |
-- Sort unknown levels to the end |
||
if (recipe_a.level == nil) ~= (recipe_b.level == nil) then |
if (recipe_a.level == nil) ~= (recipe_b.level == nil) then |
||
return recipe_b.level == nil |
return recipe_b.level == nil |
||
end |
end |
||
if recipe_a.level ~= nil then |
|||
⚫ | |||
return recipe_a.output[1].name < recipe_b.output[1].name |
|||
⚫ | |||
-- if neither is nil, sort first by level |
|||
if recipe_a.level ~= recipe_b.level then |
|||
return recipe_a.level < recipe_b.level |
return recipe_a.level < recipe_b.level |
||
end |
end |
||
-- |
-- Sort by name if same level |
||
return recipe_a.output[1].name < recipe_b.output[1].name |
return recipe_a.output[1].name < recipe_b.output[1].name |
||
end |
end |
||
Line 40: | Line 34: | ||
limit = 500 |
limit = 500 |
||
end |
end |
||
-- Query for data |
-- Query for data |
||
local smw_data = mw.smw.ask{ |
local smw_data = mw.smw.ask{ |
||
'[[Uses item |
'[[Uses item::' .. item .. ']]', |
||
'?Uses item', |
|||
'?Recipe JSON', |
'?Recipe JSON', |
||
'?Activity JSON', |
|||
showValues and '?Value', |
showValues and '?Value', |
||
limit = limit |
limit = limit |
||
Line 55: | Line 49: | ||
end |
end |
||
-- Create a list of all recipes |
-- Create a list of all recipes, grouped by output item (to keep them together in the sort) |
||
local |
local produced_items = {} |
||
for _, product in ipairs(smw_data) do |
for _, product in ipairs(smw_data) do |
||
⚫ | |||
-- this part will need to be addressed if a page has both a recipe and an activity |
|||
⚫ | |||
if type(jsons) == 'string' then |
if type(jsons) == 'string' then |
||
jsons = { jsons } |
jsons = { jsons } |
||
end |
end |
||
local parsed = {} |
|||
for _, json in ipairs(jsons) do |
for _, json in ipairs(jsons) do |
||
local json = mw.text.jsonDecode(json) |
local json = mw.text.jsonDecode(json) |
||
Line 70: | Line 64: | ||
return mat.name == item |
return mat.name == item |
||
end) then |
end) then |
||
table.insert( |
table.insert(parsed, json) |
||
end |
end |
||
end |
end |
||
table.sort(parsed, recipe_sort) |
|||
table.insert(produced_items, parsed) |
|||
end |
end |
||
-- Sort |
-- Sort by the smallest recipe in the group |
||
table.sort( |
table.sort(produced_items, function(item1, item2) |
||
local first1 = item1[1] |
|||
local first2 = item2[1] |
|||
if (first1 == nil) ~= (first2 == nil) then |
|||
return first2 == nil |
|||
end |
|||
⚫ | |||
return false -- Both empty, equivalent |
|||
end |
|||
return recipe_sort(first1, first2) |
|||
end) |
|||
-- Flatten into a single list |
|||
local recipes = {} |
|||
for _, product in ipairs(produced_items) do |
|||
for _, json in ipairs(product) do |
|||
table.insert(recipes, json) |
|||
end |
|||
⚫ | |||
-- Calculate shop prices |
-- Calculate shop prices |
||
Line 111: | Line 126: | ||
:tag('th') |
:tag('th') |
||
:attr{ colspan = '3' } |
:attr{ colspan = '3' } |
||
:wikitext(' |
:wikitext('Recipe') |
||
:done() |
:done() |
||
:tag('th'):wikitext('Level'):done() |
:tag('th'):wikitext('Level'):done() |
||
Line 117: | Line 132: | ||
:tag('th'):wikitext('Value'):done() |
:tag('th'):wikitext('Value'):done() |
||
:END() |
:END() |
||
:tag('th'):wikitext(' |
:tag('th'):wikitext('Ingredients'):done() |
||
:IF(showPrices) |
:IF(showPrices) |
||
:tag('th'):wikitext('Price'):done() |
:tag('th'):wikitext('Price'):done() |