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 3: | Line 3: | ||
local currency = require('Module:Currency').parse |
local currency = require('Module:Currency').parse |
||
local yesno = require('Module:Yesno') |
local yesno = require('Module:Yesno') |
||
local purge = require('Module:Purge')._purge |
|||
local p = {} |
local p = {} |
||
Line 12: | Line 11: | ||
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 33: | ||
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 48: | ||
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 63: | ||
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 125: | ||
: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 131: | ||
: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() |