Module:Sandbox/User:Jakesterwars/Uses material list: Difference between revisions

no edit summary
(Created page with "local p = {} local geprice = require('Module:Exchange')._price local commas = require('Module:Addcommas') local skillpic = require('Module:SCP')._main local yesno = require('Module:Yesno') local lang = mw.getContentLanguage() local trim = mw.text.trim -- Sorting function for two item objects, first by name, then by sub-text function sortItemsByNameSubtext(item1, item2) if (item1.output.name < item2.output.name) then return true elseif (item1.output.name > item2.out...")
 
No edit summary
 
Line 7:
local lang = mw.getContentLanguage()
local trim = mw.text.trim
local split = mw.text.split
 
-- Sorting function for two item objects, first by name, then by sub-text
function sortItemsByNameSubtext(item1, item2)
if (item1.output.name < item2.output.name) then
return true
elseif (item1.output.name > item2.output.name) then
return false
else
return (item1.output.subtxt or '') < (item2.output.subtxt or '')
end
end
 
function p.main(frame)
Line 25 ⟶ 15:
function p._main(args)
local materials = {}
local materials_lowered = {}
if (args == nil) then
table.insert(materials, mw.title.getCurrentTitle().text)
else
local isplitMultiple = 1{}
for type in string.gmatch(args[1], '([^,]+)') do
table.insert(splitMultiple, type)
end
for _, v in ipairs(splitMultiple) do
while args[i] do
mw.log(v)
local arg = trim(args[i])
table.insert(materials, trim(v))
table.insert(materials, arg)
materials_lowered[arg:lower()] = true
i = i + 1
end
end
local materialsLowered = {}
for index, material in pairs(materials) do
materialsLowered[material:lower()] = true
end
 
Line 50 ⟶ 42:
limit = args.limit or 500,
}
local t1 = os.clock()
local smw_datasmwdata = mw.smw.ask(query)
local t2 = os.clock()
 
if not smw_datasmwdata then
return 'Failed to find products with those materials - ensure they are spelled correctly. (ERR: no results from SMW)[[Category:Empty drop lists]]'
end
mw.log(string.format('SMW: entries %d, time elapsed: %.3f ms.', #smwdata, (t2 - t1) * 1000))
mw.log(string.format('SMW: entries %d, time elapsed: %.3f ms.', #smw_data, (t2 - t1) * 1000))
 
-- Post-process
data = {}
for _, e in ipairs(smwdata) do
 
if type(e['json']) == 'string' then
for _, e in ipairs(smw_data) do
local j = mw.text.jsonDecode(e['json'])
if type(e.json) == 'string' then
local json = mwtable.text.jsonDecodeinsert(e.jsondata, j)
elseif type(e['json']) == 'table.insert(data,' json)then
elseif for type_, f in ipairs(e.['json) == 'table']) thendo
for local _,j f= in ipairsmw.text.jsonDecode(e.jsonf) do
local json = mw table.text.jsonDecodeinsert(fdata, j)
table.insert(data, json)
end
end
end
smwdata = nil
smw_data = nil
-- Items with different variants (e.g. Divine battlemage potion has (1), (2), (3), (4) variants)
-- or methods (e.g. "4-dose oil" vs "3-dose oil" for pyre logs) may not come in sorted, so now do a final alphabetical sort on name, sub-text
table.sort(data, sortItemsByNameSubtext)
 
-- Render page
local t = mw.html.create('table')
t:addClass('wikitable sortable products-list align-center-1 align-right-3 align-right-4')
 
local ttlrow = t:tag('tr')
:tag('th')
:attr('colspan', '2')
:wikitext('Item')
:done()
:tag('th')
:wikitext('Members')
:done()
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Skills')
:done()
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('XP')
:done()
:tag('th')
:wikitext('Materials')
:done()
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('Skills')
:done()
:tag('th')
:attr('data-sort-type', 'number')
:wikitext('XP')
:done()
:tag('th')
:wikitext('Materials')
:done()
 
local rows = 0
Line 111 ⟶ 94:
for _, item in ipairs(data) do
local _found = false
for _,mat_info in ipairs(item.materials) do
 
if materialsLowered[mat_info.name:lower()] == true then
for _, mat_info in ipairs(item.materials) do
if materials_lowered[mat_info.name:lower()] then
_found = true
break
end
end
 
if _found then
local name_strnamestr
if (tonumber(item.output.quantity) or 1) > 1 then
 
if namestr = string.format(tonumber('[[%s]] × %s', item.output.name, item.output.quantity) or 0) > 1 then
name_str = string.format('[[%s]] × %s', item.output.name, item.output.quantity)
else
name_strnamestr = string.format('[[%s]]', item.output.name)
end
if item.output.subtxt then
name_strnamestr = string.format('%s <br /><small>(%s)</small>', name_strnamestr, item.output.subtxt)
end
local member_strmemberstr
members = item.members
 
if item.members == 'Yes' then
member_strmemberstr = "[[File:Member icon.png|center|link=Members|alt=Members]]"
elseif item.members == 'No' then
member_strmemberstr = "[[File:Free-to-play icon.png|center|link=Free-to-play|alt=Free-to-play]]"
end
local experience_cell = mw.html.create('td')
experience_cell:addClass('plainlist')
 
local experience_ul = experience_cell:tag('ul')
experience_ul:addClass('skills-list')
:css({
 
['list-style-type'] = 'none',
['list-style-image'] = 'none',
margin = 0
})
local skills_cell = mw.html.create('td')
skills_cell:addClass('plainlist')
 
local skills_ul = skills_cell:tag('ul')
skills_ul:addClass('skills-list')
:css({
 
['list-style-type'] = 'none',
['list-style-image'] = 'none',
margin = 0
})
if #item.skills == 0 then
local skill_li = skills_ul:tag('li')
local experience_li = experience_ul:tag('li')
experience_cell:addClass('table-na')
 
experience_cell:addClass('table-na'):css('text-align', 'center')
experience_li:wikitext(string.format('None'))
skills_cell:addClass('table-na'):css('text-align', 'center')
skill_li:wikitext(string.format('None'))
else
Line 164 ⟶ 147:
local skill_li = skills_ul:tag('li')
local experience_li = experience_ul:tag('li')
local stripped_experience = vstring.experience:gsub(v.experience, ',', '')
skill_li:attr('data-sort-value', index == 1 and v.level or ''):wikitext(skillpic(lang:ucfirst(v.name), v.level))
 
experience_li:attr('data-sort-value', index == 1 and v.experience or ''):wikitext(tonumber(stripped_experience) ~= nil and skillpic(lang:ucfirst(v.name), v.experience) or v.experience)
skill_li
:attr('data-sort-value', index == 1 and v.level or '')
:wikitext(skillpic(lang:ucfirst(v.name), v.level))
experience_li
:attr('data-sort-value', index == 1 and v.experience or '')
:wikitext(tonumber(stripped_experience) ~= nil and skillpic(lang:ucfirst(v.name), v.experience) or v.experience)
end
end
 
local mats_ul = mw.html.create('ul')
mats_ul:addClass('products-materials')
:css({
 
local mat_sort_val ['list-style-type'] = nil'none',
['list-style-image'] = 'none',
 
margin = 0
})
local materialsortvalue = nil
for _, mat_info in ipairs(item.materials) do
local mat_li = mats_ul:tag('li')
local qty = mat_infostring.quantity:gsub(mat_info.quantity, '%-', '–')
local mat_namematnm = mat_info.name
for _,mat in ipairs(materialsLowered) do
 
for if _,mat_info.name:lower() == mat in ipairs(materials_lowered) dothen
if mat_name:lower() == mat then
mat_li:addClass('production-selected')
end
end
if materialsLowered[mat_info.name:lower()] == true then
 
if materials_lowered[mat_name:lower()] then
mat_li:addClass('production-selected')
end
if mat_sort_valmaterialsortvalue == nil then
mat_sort_valmaterialsortvalue = qty
end
mat_li:wikitext(string.format('%s × [[%s]]', commas._add(qty), mat_namematnm))
end
 
Line 207 ⟶ 185:
:tag('td')
:attr('data-sort-value', item.product)
:wikitext(name_strnamestr)
:done()
:tag('td')
:wikitext(member_strmemberstr)
:node(skills_cell)
:node(experience_cell)
:tag('td')
:attr('data-sort-value', mat_sort_valmaterialsortvalue)
:addClass('plainlist')
:node(mats_ul)
:done()