模块:FilterWidget
This Lua module provides handling of complex data to be input into respective filter widgets. For instance, getting the list of all unique ability icons for Wyrmprints or all unique affinity icons.
Currently supported widgets
- Wyrmprints: Widget:WyrmprintListFilter
- Filters populated: ability icons, affinities
-- <includeonly> (prevents literal interpretation of links or categories within the module code)
-- Lua Templating for Filter Widget related logic
local p = {}
local cargo = mw.ext.cargo
-- Filter header for wyrmrprint lists
-- Usage: {{#invoke:FilterWidget|Wyrmprints}}
-- Test in console with: `=p.Wyrmprints(mw.getCurrentFrame())`
function p.Wyrmprints(frame)
local abFilterValues = 'abilities=%s|abilityIcons=%s'
local affinityFilterValues = 'affinityIds=%s|affinityIcons=%s|affinityNames=%s'
local result = {}
local abilities = cargo.query('Wyrmprints,Abilities', 'AbilityIconName', {
join = 'Wyrmprints.Abilities13=Abilities.Id',
where = 'Abilities13>0',
groupBy = 'AbilityIconName',
orderBy = 'AbilityIconName',
})
for i, ability in ipairs(abilities) do
-- Ability Icon
local abIcon = ability['AbilityIconName']
local abIconPath = frame:callParserFunction('filepath', abIcon..'.png')
result[#result+1] = string.format(abFilterValues, abIcon, abIconPath)
end
local affinities = cargo.query('Wyrmprints,AffinityBonus',
'UnionAbilityGroupId,AffinityBonus.Name=AffinityName', {
join = 'Wyrmprints.UnionAbilityGroupId=AffinityBonus.Id',
where = 'UnionAbilityGroupId>0',
groupBy = 'UnionAbilityGroupId',
orderBy = 'AffinityBonus.SortId',
})
for i, aff in ipairs(affinities) do
local affinityId = aff['UnionAbilityGroupId']
local affinityIcon = 'Icon_Union_'..string.format("%02d",affinityId)..'.png'
local affinityName = aff['AffinityName']
local affinityIconPath = frame:callParserFunction('filepath', affinityIcon)
result[#result+1] = string.format(affinityFilterValues,
affinityId, affinityIconPath, affinityName)
end
return frame:preprocess(string.format('{{#widget:WyrmprintListFilter|%s}}', table.concat(result, '|')))
end
-- Filter header for Dragon lists
-- Usage: {{#invoke:FilterWidget|Dragons}}
-- Test in console with: `=p.Dragons(mw.getCurrentFrame())`
function p.Dragons(frame)
local abFilterValues = 'abilities=%s|abilityIcons=%s'
local result = {}
local abilityIds = {}
local abilityFields = {'Abilities15', 'Abilities25', 'Abilities16', 'Abilities26'}
local dragonAbilities = cargo.query(
'Dragons', table.concat(abilityFields, ',')
)
for _, dragon in ipairs(dragonAbilities) do
for _, abilityField in ipairs(abilityFields) do
abilityIds[dragon[abilityField]] = 1
end
end
abilityIds[''] = nil
abilityIds['0'] = nil
local uniqueAbilityIds = {}
for id in pairs(abilityIds) do
uniqueAbilityIds[#uniqueAbilityIds + 1] = id
end
local abilities = cargo.query('Abilities', 'AbilityIconName', {
where = ('Id IN (%s)'):format(table.concat(uniqueAbilityIds, ',')),
groupBy = 'AbilityIconName',
orderBy = 'COUNT(AbilityIconName) DESC, Id',
})
for i, ability in ipairs(abilities) do
-- Ability Icon
local abIcon = ability['AbilityIconName']
local abIconPath = frame:callParserFunction('filepath', abIcon..'.png')
result[#result+1] = string.format(abFilterValues, abIcon, abIconPath)
end
return frame:preprocess(string.format('{{#widget:DragonListFilter|%s}}', table.concat(result, '|')))
end
return p
--</includeonly>