[dismiss]
The wiki is currently a work in progress. If you'd like to help out, please check the Community Portal and our getting started guide. Also, check out our sister project on poewiki.net.
Module:Skill link: Difference between revisions
Jump to navigation
Jump to search
>Illviljan (Fix category error.) |
>Illviljan m (Align parameters more with item link) |
||
Line 19: | Line 19: | ||
no_results = 'No results found.', | no_results = 'No results found.', | ||
category = 'Pages with skill infobox errors', | category = 'Pages with skill infobox errors', | ||
-- Skill link: | -- Skill link: | ||
invalid_args = 'id, page or name must be specified', | invalid_args = 'id, page or name must be specified', | ||
Line 43: | Line 43: | ||
} | } | ||
c.selectors = {'id', 'page', ' | c.selectors = {'id', 'page', 'skill_name'} | ||
Line 59: | Line 59: | ||
for i,v in pairs(results) do | for i,v in pairs(results) do | ||
str[#str+1] = string.format( | str[#str+1] = string.format( | ||
'%s - %s ([[%s|page]])', | '%s - %s ([[%s|page]])', | ||
v['skill.skill_id'] or v['skill._pageName'] or '', | v['skill.skill_id'] or v['skill._pageName'] or '', | ||
string.gsub( | string.gsub( | ||
v['skill.stat_text'] or 'N/A', | v['skill.stat_text'] or 'N/A', | ||
'<br>', | '<br>', | ||
', ' | ', ' | ||
) or '', | ) or '', | ||
v['skill._pageName'] or '' | v['skill._pageName'] or '' | ||
) | ) | ||
end | end | ||
return table.concat(str, '<br>') | return table.concat(str, '<br>') | ||
end | end | ||
Line 76: | Line 76: | ||
Add a skill image. | Add a skill image. | ||
]] | ]] | ||
if tpl_args.icon ~= nil then | if tpl_args.icon ~= nil then | ||
skill['skill.skill_icon'] = tpl_args.icon | skill['skill.skill_icon'] = tpl_args.icon | ||
end | end | ||
if skill['skill.skill_icon'] == nil then | if skill['skill.skill_icon'] == nil then | ||
return '' | return '' | ||
end | end | ||
local out | local out | ||
if tpl_args.large then | if tpl_args.large then | ||
out = string.format( | out = string.format( | ||
'[[%s|link=%s]]', | '[[%s|link=%s]]', | ||
skill['skill.skill_icon'], | skill['skill.skill_icon'], | ||
tpl_args.main_page | tpl_args.main_page | ||
) | ) | ||
else | else | ||
-- Inline size | -- Inline size | ||
out = string.format( | out = string.format( | ||
'[[%s|14px|link=%s]]', | '[[%s|14px|link=%s]]', | ||
skill['skill.skill_icon'], | skill['skill.skill_icon'], | ||
tpl_args.main_page | tpl_args.main_page | ||
) | ) | ||
end | end | ||
return out | return out | ||
end | end | ||
Line 113: | Line 113: | ||
--[[ | --[[ | ||
Finds and shows the infobox of a skill. | Finds and shows the infobox of a skill. | ||
Examples: | Examples: | ||
= p.skill_infobox_link{id="IcestormUniqueStaff12"} | = p.skill_infobox_link{id="IcestormUniqueStaff12"} | ||
= p.skill_infobox_link{"Icestorm"} | = p.skill_infobox_link{"Icestorm"} | ||
= p.skill_infobox_link{q_where = 'skill.active_skill_name="Icestorm"'} | = p.skill_infobox_link{q_where = 'skill.active_skill_name="Icestorm"'} | ||
]] | ]] | ||
-- Get args | -- Get args | ||
tpl_args = getArgs(frame, { | tpl_args = getArgs(frame, { | ||
Line 126: | Line 126: | ||
}) | }) | ||
frame = m_util.misc.get_frame(frame) | frame = m_util.misc.get_frame(frame) | ||
if tpl_args.id and (tpl_args.q_where == nil) then | if tpl_args.id and (tpl_args.q_where == nil) then | ||
tpl_args.q_where = string.format( | tpl_args.q_where = string.format( | ||
'skill.skill_id = "%s"', | 'skill.skill_id = "%s"', | ||
tpl_args.id | tpl_args.id | ||
) | ) | ||
elseif tpl_args[1] and (tpl_args.q_where == nil) then | elseif tpl_args[1] and (tpl_args.q_where == nil) then | ||
tpl_args.q_where = string.format( | tpl_args.q_where = string.format( | ||
[[ | |||
skill.skill_id = "%s" | |||
OR skill.active_skill_name LIKE "%%%s%%" | |||
OR skill.stat_text LIKE "%%%s%%" | |||
]], | |||
tpl_args[1], | tpl_args[1], | ||
tpl_args[1], | tpl_args[1], | ||
Line 142: | Line 146: | ||
error(i18n.errors.missing_id_parameter) | error(i18n.errors.missing_id_parameter) | ||
end | end | ||
local results = m_cargo.query( | local results = m_cargo.query( | ||
{'skill'}, | {'skill'}, | ||
Line 148: | Line 152: | ||
'skill.html', | 'skill.html', | ||
'skill.skill_screenshot', | 'skill.skill_screenshot', | ||
'skill.active_skill_name', | 'skill.active_skill_name', | ||
'skill.skill_id', | 'skill.skill_id', | ||
'skill.stat_text', | 'skill.stat_text', | ||
Line 157: | Line 161: | ||
} | } | ||
) | ) | ||
-- Helpful error handling: | -- Helpful error handling: | ||
local err_tbl = { | local err_tbl = { | ||
{ | { | ||
bool = function() | bool = function() | ||
return #results == 0 | return #results == 0 | ||
end, | end, | ||
display = function() | display = function() | ||
return i18n.errors.no_results | return i18n.errors.no_results | ||
end, | end, | ||
Line 174: | Line 178: | ||
display = function() | display = function() | ||
return string.format( | return string.format( | ||
i18n.errors.multiple_results, | i18n.errors.multiple_results, | ||
h.disambiguate_skill(results) | h.disambiguate_skill(results) | ||
) | ) | ||
Line 183: | Line 187: | ||
return tpl_args.id == nil | return tpl_args.id == nil | ||
end, | end, | ||
display = function() | display = function() | ||
return string.format( | return string.format( | ||
i18n.errors.missing_id_parameter, | i18n.errors.missing_id_parameter, | ||
h.disambiguate_skill(results) | h.disambiguate_skill(results) | ||
) | ) | ||
Line 193: | Line 197: | ||
out = {} | out = {} | ||
local cats = {} | local cats = {} | ||
for _,v in ipairs(err_tbl) do | for _,v in ipairs(err_tbl) do | ||
if v.bool() then | if v.bool() then | ||
cats[#cats+1] = i18n.errors.category | cats[#cats+1] = i18n.errors.category | ||
Line 200: | Line 204: | ||
end | end | ||
end | end | ||
local container = mw.html.create('span') | local container = mw.html.create('span') | ||
for _,v in ipairs(results) do | for _,v in ipairs(results) do | ||
container | container | ||
:attr('class', 'skill-box-page-container') | :attr('class', 'skill-box-page-container') | ||
Line 223: | Line 227: | ||
--[[ | --[[ | ||
Links a skill | Links a skill | ||
Examples | Examples | ||
-------- | -------- | ||
Line 229: | Line 233: | ||
= p.skill_link{ | = p.skill_link{ | ||
skip_query=true, | skip_query=true, | ||
page='Skill:IcestormUniqueStaff12', | page='Skill:IcestormUniqueStaff12', | ||
name='test', | name='test', | ||
icon=' | icon='Icestorm skill icon.png', | ||
large=1, | large=1, | ||
} | } | ||
]] | ]] | ||
-- Get args | -- Get args | ||
local tpl_args = getArgs(frame, { | local tpl_args = getArgs(frame, { | ||
Line 241: | Line 245: | ||
}) | }) | ||
frame = m_util.misc.get_frame(frame) | frame = m_util.misc.get_frame(frame) | ||
tpl_args.skill_name = tpl_args.skill_name or tpl_args[1] | |||
tpl_args.name = tpl_args.name or tpl_args[2] | |||
-- Check if the correct parameters have been set: | -- Check if the correct parameters have been set: | ||
if m_util.table.has_all_value(tpl_args, c.selectors) and tpl_args.skip_query == nil then | if m_util.table.has_all_value(tpl_args, c.selectors) and tpl_args.skip_query == nil then | ||
return m_util.html.error{msg=i18n.errors.invalid_args .. m_util.misc.add_category(i18n.errors.broken_skill_links)} | return m_util.html.error{msg=i18n.errors.invalid_args .. m_util.misc.add_category(i18n.errors.broken_skill_links)} | ||
end | end | ||
-- | -- | ||
local skill | local skill | ||
if m_util.table.has_one_value(tpl_args, c.selectors, nil) and tpl_args.skip_query == nil then | if m_util.table.has_one_value(tpl_args, c.selectors, nil) and tpl_args.skip_query == nil then | ||
-- Create q_where depending on the input: | -- Create q_where depending on the input: | ||
if tpl_args. | if tpl_args.skill_name then | ||
tpl_args.q_where = string.format('skill.active_skill_name="%s"', tpl_args. | tpl_args.q_where = string.format('skill.active_skill_name="%s"', tpl_args.skill_name) | ||
elseif tpl_args.id then | elseif tpl_args.id then | ||
tpl_args.q_where = string.format('skill.skill_id="%s"', tpl_args.id) | tpl_args.q_where = string.format('skill.skill_id="%s"', tpl_args.id) | ||
Line 264: | Line 269: | ||
} | } | ||
end | end | ||
-- Query cargo: | -- Query cargo: | ||
local results = m_cargo.query( | local results = m_cargo.query( | ||
{'skill', 'main_pages'}, | {'skill', 'main_pages'}, | ||
{ | { | ||
'skill._pageName', | 'skill._pageName', | ||
'skill.stat_text', | 'skill.stat_text', | ||
-- 'skill.main_page', | -- 'skill.main_page', | ||
Line 276: | Line 281: | ||
-- 'passive_skills.html', | -- 'passive_skills.html', | ||
'main_pages._pageName', | 'main_pages._pageName', | ||
}, | }, | ||
{ | { | ||
join='skill.skill_id=main_pages.id', | join='skill.skill_id=main_pages.id', | ||
where=string.format( | where=string.format( | ||
'(%s)', | '(%s)', | ||
tpl_args.q_where | tpl_args.q_where | ||
), | ), | ||
Line 287: | Line 292: | ||
} | } | ||
) | ) | ||
-- Check number of results, there should only be one result: | -- Check number of results, there should only be one result: | ||
if #results > 1 then | if #results > 1 then | ||
return m_util.html.error{ | return m_util.html.error{ | ||
msg=string.format( | msg=string.format( | ||
i18n.errors.too_many_results, | i18n.errors.too_many_results, | ||
tostring(tpl_args.q_where) .. m_util.misc.add_category(i18n.errors.broken_skill_links) | tostring(tpl_args.q_where) .. m_util.misc.add_category(i18n.errors.broken_skill_links) | ||
) | ) | ||
Line 299: | Line 304: | ||
return m_util.html.error{ | return m_util.html.error{ | ||
msg=string.format( | msg=string.format( | ||
i18n.errors.no_results_found, | i18n.errors.no_results_found, | ||
tostring(tpl_args.q_where) .. m_util.misc.add_category(i18n.errors.broken_skill_links) | tostring(tpl_args.q_where) .. m_util.misc.add_category(i18n.errors.broken_skill_links) | ||
) | ) | ||
Line 311: | Line 316: | ||
} | } | ||
end | end | ||
-- Add allowed parameters: | -- Add allowed parameters: | ||
for k, prop in pairs(c.parameters) do | for k, prop in pairs(c.parameters) do | ||
Line 318: | Line 323: | ||
end | end | ||
end | end | ||
-- Set the link to the main page: | -- Set the link to the main page: | ||
tpl_args.main_page = skill['skill.main_page'] | tpl_args.main_page = skill['skill.main_page'] | ||
or skill['main_pages._pageName'] | |||
or skill['skill._pageName'] | |||
-- Format the skill icon: | -- Format the skill icon: | ||
local img = h.format_skill_icon(skill, tpl_args) | local img = h.format_skill_icon(skill, tpl_args) | ||
--------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ||
-- Output | -- Output | ||
--------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ||
-- Normal inline link: | -- Normal inline link: | ||
if tpl_args.format == nil then | if tpl_args.format == nil then | ||
local container = mw.html.create('span') | local container = mw.html.create('span') | ||
container:addClass('c-item-hoverbox') | container:addClass('c-item-hoverbox') | ||
Line 339: | Line 344: | ||
container:addClass('c-item-hoverbox--large') | container:addClass('c-item-hoverbox--large') | ||
end | end | ||
local activator = mw.html.create('span') | local activator = mw.html.create('span') | ||
activator:addClass('c-item-hoverbox__activator') | activator:addClass('c-item-hoverbox__activator') | ||
Line 346: | Line 351: | ||
activator:wikitext(img) | activator:wikitext(img) | ||
end | end | ||
activator:wikitext(string.format( | activator:wikitext(string.format( | ||
'[[%s|%s]]', | '[[%s|%s]]', | ||
tpl_args.main_page, | tpl_args.main_page, | ||
skill['skill.active_skill_name'] or tpl_args.main_page | tpl_args.name or skill['skill.active_skill_name'] or tpl_args.main_page | ||
) | ) | ||
) | ) | ||
local display = mw.html.create('span') | local display = mw.html.create('span') | ||
display:attr('class', 'c-item-hoverbox__display') | display:attr('class', 'c-item-hoverbox__display') | ||
if skill['skill.html'] ~= nil then | if skill['skill.html'] ~= nil then | ||
display:wikitext(skill['skill.html']) | display:wikitext(skill['skill.html']) | ||
if img then | if img then | ||
display:wikitext(img) | display:wikitext(img) | ||
Line 373: | Line 378: | ||
:node(display) | :node(display) | ||
:done() | :done() | ||
return tostring(container) | return tostring(container) | ||
else | else | ||
return m_util.html.error{ | return m_util.html.error{ | ||
msg=string.format( | msg=string.format( | ||
i18n.error.invalid_format, | i18n.error.invalid_format, | ||
tpl_args.format .. m_util.misc.add_category(i18n.errors.skill_link_cats) | tpl_args.format .. m_util.misc.add_category(i18n.errors.skill_link_cats) | ||
) | ) |
Revision as of 15:50, 8 February 2020
Overview
Module for creating links to skills via cargo.
Skill templates
Module:Item
All templates defined in Module:Skill:
{{Skill}}
{{Skill progression}}
Module:Skill link
All templates defined in Module:Skill link:
The above documentation is transcluded from Module:Skill link/doc.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
Editors can experiment in this module's sandbox and testcases pages.
Subpages of this module.
--
-- Module for skill linking
--
local m_util = require('Module:Util')
local getArgs = require('Module:Arguments').getArgs
local m_cargo = require('Module:cargo')
local p = {}
-- ----------------------------------------------------------------------------
-- Strings
-- ----------------------------------------------------------------------------
local i18n = {
errors = {
missing_id_parameter = 'id parameter must be specified, please choose only one of these ids:<br>%s',
multiple_results = 'Please choose only one of these ids:<br>%s',
no_results = 'No results found.',
category = 'Pages with skill infobox errors',
-- Skill link:
invalid_args = 'id, page or name must be specified',
too_many_results = 'Too many skills found with q_where = %s',
no_results_found = 'No skills found with q_where = %s',
invalid_format = 'Invalid return format specified: %s',
broken_skill_links = 'Pages with skill link errors',
},
}
-- ----------------------------------------------------------------------------
-- Constants & Data
-- ----------------------------------------------------------------------------
local c = {}
-- c.image_size = 39
-- c.image_size_full = c.image_size * 2
c.parameters = {
name = 'skill.active_skill_name',
icon = 'skill.icon',
html = 'skiill.html',
}
c.selectors = {'id', 'page', 'skill_name'}
-- ----------------------------------------------------------------------------
-- Helper functions and globals
-- ----------------------------------------------------------------------------
h = {}
function h.disambiguate_skill(results)
--[[
Disambiguates results from a skill query.
]]
local str = {}
for i,v in pairs(results) do
str[#str+1] = string.format(
'%s - %s ([[%s|page]])',
v['skill.skill_id'] or v['skill._pageName'] or '',
string.gsub(
v['skill.stat_text'] or 'N/A',
'<br>',
', '
) or '',
v['skill._pageName'] or ''
)
end
return table.concat(str, '<br>')
end
function h.format_skill_icon(skill, tpl_args)
--[[
Add a skill image.
]]
if tpl_args.icon ~= nil then
skill['skill.skill_icon'] = tpl_args.icon
end
if skill['skill.skill_icon'] == nil then
return ''
end
local out
if tpl_args.large then
out = string.format(
'[[%s|link=%s]]',
skill['skill.skill_icon'],
tpl_args.main_page
)
else
-- Inline size
out = string.format(
'[[%s|14px|link=%s]]',
skill['skill.skill_icon'],
tpl_args.main_page
)
end
return out
end
-- ----------------------------------------------------------------------------
-- Page functions
-- ----------------------------------------------------------------------------
local p = {}
function p.skill_infobox_link(frame)
--[[
Finds and shows the infobox of a skill.
Examples:
= p.skill_infobox_link{id="IcestormUniqueStaff12"}
= p.skill_infobox_link{"Icestorm"}
= p.skill_infobox_link{q_where = 'skill.active_skill_name="Icestorm"'}
]]
-- Get args
tpl_args = getArgs(frame, {
parentFirst = true
})
frame = m_util.misc.get_frame(frame)
if tpl_args.id and (tpl_args.q_where == nil) then
tpl_args.q_where = string.format(
'skill.skill_id = "%s"',
tpl_args.id
)
elseif tpl_args[1] and (tpl_args.q_where == nil) then
tpl_args.q_where = string.format(
[[
skill.skill_id = "%s"
OR skill.active_skill_name LIKE "%%%s%%"
OR skill.stat_text LIKE "%%%s%%"
]],
tpl_args[1],
tpl_args[1],
tpl_args[1]
)
elseif (tpl_args.id == nil) and (tpl_args.q_where == nil) then
error(i18n.errors.missing_id_parameter)
end
local results = m_cargo.query(
{'skill'},
{
'skill.html',
'skill.skill_screenshot',
'skill.active_skill_name',
'skill.skill_id',
'skill.stat_text',
'skill._pageName',
},
{
where=tpl_args.q_where,
}
)
-- Helpful error handling:
local err_tbl = {
{
bool = function()
return #results == 0
end,
display = function()
return i18n.errors.no_results
end,
},
{
bool = function()
return #results > 1
end,
display = function()
return string.format(
i18n.errors.multiple_results,
h.disambiguate_skill(results)
)
end,
},
{
bool = function()
return tpl_args.id == nil
end,
display = function()
return string.format(
i18n.errors.missing_id_parameter,
h.disambiguate_skill(results)
)
end,
},
}
out = {}
local cats = {}
for _,v in ipairs(err_tbl) do
if v.bool() then
cats[#cats+1] = i18n.errors.category
out[#out+1] = m_util.html.error({msg = v.display()})
break
end
end
local container = mw.html.create('span')
for _,v in ipairs(results) do
container
:attr('class', 'skill-box-page-container')
:wikitext(v['skill.html'])
if v['skill.skill_screenshot'] then
container
:wikitext(string.format(
'[[%s]]',
v['skill.skill_screenshot']
)
)
end
end
return tostring(container) .. table.concat(out, '') .. m_util.misc.add_category(cats)
end
function p.skill_link(frame)
--[[
Links a skill
Examples
--------
= p.skill_link{id="IcestormUniqueStaff12"}
= p.skill_link{
skip_query=true,
page='Skill:IcestormUniqueStaff12',
name='test',
icon='Icestorm skill icon.png',
large=1,
}
]]
-- Get args
local tpl_args = getArgs(frame, {
parentFirst = true
})
frame = m_util.misc.get_frame(frame)
tpl_args.skill_name = tpl_args.skill_name or tpl_args[1]
tpl_args.name = tpl_args.name or tpl_args[2]
-- Check if the correct parameters have been set:
if m_util.table.has_all_value(tpl_args, c.selectors) and tpl_args.skip_query == nil then
return m_util.html.error{msg=i18n.errors.invalid_args .. m_util.misc.add_category(i18n.errors.broken_skill_links)}
end
--
local skill
if m_util.table.has_one_value(tpl_args, c.selectors, nil) and tpl_args.skip_query == nil then
-- Create q_where depending on the input:
if tpl_args.skill_name then
tpl_args.q_where = string.format('skill.active_skill_name="%s"', tpl_args.skill_name)
elseif tpl_args.id then
tpl_args.q_where = string.format('skill.skill_id="%s"', tpl_args.id)
elseif tpl_args.q_where then
-- Use tpl_args.q_where.
else
return m_util.html.error{
msg=i18n.errors.invalid_args .. m_util.misc.add_category(i18n.errors.broken_skill_links)
}
end
-- Query cargo:
local results = m_cargo.query(
{'skill', 'main_pages'},
{
'skill._pageName',
'skill.stat_text',
-- 'skill.main_page',
'skill.active_skill_name',
'skill.skill_icon',
-- 'passive_skills.html',
'main_pages._pageName',
},
{
join='skill.skill_id=main_pages.id',
where=string.format(
'(%s)',
tpl_args.q_where
),
orderBy='skill.stat_text',
limit=2,
}
)
-- Check number of results, there should only be one result:
if #results > 1 then
return m_util.html.error{
msg=string.format(
i18n.errors.too_many_results,
tostring(tpl_args.q_where) .. m_util.misc.add_category(i18n.errors.broken_skill_links)
)
}
elseif #results < 1 then
return m_util.html.error{
msg=string.format(
i18n.errors.no_results_found,
tostring(tpl_args.q_where) .. m_util.misc.add_category(i18n.errors.broken_skill_links)
)
}
end
skill = results[1]
else
skill = {
['skill.main_page']=tpl_args.page or tpl_args.name
}
end
-- Add allowed parameters:
for k, prop in pairs(c.parameters) do
if tpl_args[k] ~= nil then
skill[prop] = tpl_args[k]
end
end
-- Set the link to the main page:
tpl_args.main_page = skill['skill.main_page']
or skill['main_pages._pageName']
or skill['skill._pageName']
-- Format the skill icon:
local img = h.format_skill_icon(skill, tpl_args)
---------------------------------------------------------------------------
-- Output
---------------------------------------------------------------------------
-- Normal inline link:
if tpl_args.format == nil then
local container = mw.html.create('span')
container:addClass('c-item-hoverbox')
if tpl_args.large then
container:addClass('c-item-hoverbox--large')
end
local activator = mw.html.create('span')
activator:addClass('c-item-hoverbox__activator')
if img and not tpl_args.large then
activator:wikitext(img)
end
activator:wikitext(string.format(
'[[%s|%s]]',
tpl_args.main_page,
tpl_args.name or skill['skill.active_skill_name'] or tpl_args.main_page
)
)
local display = mw.html.create('span')
display:attr('class', 'c-item-hoverbox__display')
if skill['skill.html'] ~= nil then
display:wikitext(skill['skill.html'])
if img then
display:wikitext(img)
end
end
if img and tpl_args.large then
activator:wikitext(img)
end
container
:node(activator)
:node(display)
:done()
return tostring(container)
else
return m_util.html.error{
msg=string.format(
i18n.error.invalid_format,
tpl_args.format .. m_util.misc.add_category(i18n.errors.skill_link_cats)
)
}
end
end
-- ----------------------------------------------------------------------------
-- End
-- ----------------------------------------------------------------------------
return p