Path of Exile Wiki

Wiki поддерживается сообществом, поэтому подумайте над тем, чтобы внести свой вклад.

ПОДРОБНЕЕ

Path of Exile Wiki
(Fix category error.)
(не показаны 4 промежуточные версии этого же участника)
Строка 1: Строка 1:
 
-------------------------------------------------------------------------------
--
 
  +
--
-- Module for skill linking
 
  +
-- Module:Skill link
--
 
  +
--
  +
-- This module implements Template:Skill link
 
-------------------------------------------------------------------------------
   
 
local getArgs = require('Module:Arguments').getArgs
 
local m_util = require('Module:Util')
 
local m_util = require('Module:Util')
local getArgs = require('Module:Arguments').getArgs
+
local m_cargo = require('Module:Cargo')
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
 
-- ----------------------------------------------------------------------------
 
   
  +
-- Should we use the sandbox version of our submodules?
local c = {}
 
  +
local use_sandbox = m_util.misc.maybe_sandbox('Skill link')
-- 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',
 
}
 
   
  +
-- The cfg table contains all localisable strings and configuration, to make it
c.selectors = {'id', 'page', 'name'}
 
  +
-- easier to port this module to another wiki.
  +
local cfg = use_sandbox and mw.loadData('Module:Skill link/config/sandbox') or mw.loadData('Module:Skill link/config')
   
 
local i18n = cfg.i18n
   
 
-- ----------------------------------------------------------------------------
 
-- ----------------------------------------------------------------------------
-- Helper functions and globals
+
-- Helper functions
 
-- ----------------------------------------------------------------------------
 
-- ----------------------------------------------------------------------------
   
h = {}
+
local h = {}
   
 
function h.disambiguate_skill(results)
 
function h.disambiguate_skill(results)
Строка 57: Строка 30:
 
]]
 
]]
 
local str = {}
 
local str = {}
for i,v in pairs(results) do
+
for _, 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
Строка 76: Строка 49:
 
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
   
 
-- ----------------------------------------------------------------------------
 
-- ----------------------------------------------------------------------------
-- Page functions
+
-- Exported functions
 
-- ----------------------------------------------------------------------------
 
-- ----------------------------------------------------------------------------
   
Строка 113: Строка 86:
 
--[[
 
--[[
 
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, {
Строка 126: Строка 99:
 
})
 
})
 
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%%"',
 
 
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],
Строка 142: Строка 119:
 
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'},
Строка 148: Строка 125:
 
'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',
Строка 157: Строка 134:
 
}
 
}
 
)
 
)
  +
 
 
-- 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,
Строка 174: Строка 151:
 
display = function()
 
display = function()
 
return string.format(
 
return string.format(
i18n.errors.multiple_results,
+
i18n.errors.multiple_results,
  +
tpl_args.q_where,
 
h.disambiguate_skill(results)
 
h.disambiguate_skill(results)
 
)
 
)
Строка 183: Строка 161:
 
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)
 
)
 
)
Строка 193: Строка 171:
 
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
Строка 200: Строка 178:
 
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')
Строка 214: Строка 192:
 
)
 
)
 
end
 
end
  +
  +
-- Store as main page:
  +
m_cargo.store(
 
frame,
 
{
  +
_table='main_pages',
  +
id=v['skill.skill_id'],
 
}
 
)
 
end
 
end
   
Строка 219: Строка 206:
 
end
 
end
   
 
--
 
  +
-- Template:Skill link
 
--
 
function p.skill_link(frame)
 
function p.skill_link(frame)
 
--[[
 
--[[
 
Links a skill
 
Links a skill
  +
 
 
Examples
 
Examples
 
--------
 
--------
Строка 229: Строка 218:
 
= p.skill_link{
 
= p.skill_link{
 
skip_query=true,
 
skip_query=true,
page='Skill:IcestormUniqueStaff12',
+
page='Skill:IcestormUniqueStaff12',
name='test',
+
name='test',
icon='File:IcestormUniqueStaff12 skill icon.png',
+
icon='Icestorm skill icon.png',
 
large=1,
 
large=1,
 
}
 
}
 
]]
 
]]
  +
 
 
-- Get args
 
-- Get args
 
local tpl_args = getArgs(frame, {
 
local tpl_args = getArgs(frame, {
Строка 241: Строка 230:
 
})
 
})
 
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, cfg.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, cfg.selectors, nil) and tpl_args.skip_query == nil then
tpl_args.name = tpl_args.name or tpl_args[1]
 
 
 
-- Create q_where depending on the input:
 
-- Create q_where depending on the input:
if tpl_args.name then
+
if tpl_args.skill_name then
tpl_args.q_where = string.format('skill.active_skill_name="%s"', tpl_args.name)
+
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)
Строка 264: Строка 256:
 
}
 
}
 
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.skill_id',
 
'skill.stat_text',
 
'skill.stat_text',
 
-- 'skill.main_page',
 
-- 'skill.main_page',
 
'skill.active_skill_name',
 
'skill.active_skill_name',
 
'skill.skill_icon',
 
'skill.skill_icon',
-- 'passive_skills.html',
+
'skill.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
 
),
 
),
Строка 287: Строка 280:
 
}
 
}
 
)
 
)
  +
 
 
-- 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.multiple_results,
tostring(tpl_args.q_where) .. m_util.misc.add_category(i18n.errors.broken_skill_links)
+
tpl_args.q_where,
  +
h.disambiguate_skill(results) .. m_util.misc.add_category(i18n.errors.broken_skill_links)
 
)
 
)
 
}
 
}
Строка 299: Строка 293:
 
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)
 
)
 
)
Строка 311: Строка 305:
 
}
 
}
 
end
 
end
  +
 
 
-- Add allowed parameters:
 
-- Add allowed parameters:
for k, prop in pairs(c.parameters) do
+
for k, prop in pairs(cfg.parameters) do
 
if tpl_args[k] ~= nil then
 
if tpl_args[k] ~= nil then
 
skill[prop] = tpl_args[k]
 
skill[prop] = tpl_args[k]
 
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['main_pages._pageName']
or skill['skill._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')
Строка 339: Строка 333:
 
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')
Строка 346: Строка 340:
 
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')
  +
 
  +
-- TODO: Disable this until a nice solution for keeping the html table
if skill['skill.html'] ~= nil then
 
  +
-- inline has been added:
 
if false then -- 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)
Строка 373: Строка 369:
 
: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.broken_skill_links)
 
)
 
)
 
}
 
}
 
end
 
end
 
end
 
end
-- ----------------------------------------------------------------------------
 
-- End
 
-- ----------------------------------------------------------------------------
 
   
 
return p
 
return p

Версия 10:00, 6 ноября 2021

Документация модуля[просмотр] [править] [история] [очистить]

Описание

Модуль для создания ссылок на умения через cargo.

Шаблоны Skill

Модуль:Item2

Все шаблоны, определенные в Модуль:Skill:

Модуль:Skill link

Все шаблоны, определенные в Модуль:Skill link:

-------------------------------------------------------------------------------
-- 
--                              Module:Skill link
-- 
-- This module implements Template:Skill link
-------------------------------------------------------------------------------

local getArgs = require('Module:Arguments').getArgs
local m_util = require('Module:Util')
local m_cargo = require('Module:Cargo')

-- Should we use the sandbox version of our submodules?
local use_sandbox = m_util.misc.maybe_sandbox('Skill link')

-- The cfg table contains all localisable strings and configuration, to make it
-- easier to port this module to another wiki.
local cfg = use_sandbox and mw.loadData('Module:Skill link/config/sandbox') or mw.loadData('Module:Skill link/config')

local i18n = cfg.i18n

-- ----------------------------------------------------------------------------
-- Helper functions 
-- ----------------------------------------------------------------------------

local h = {}

function h.disambiguate_skill(results)
    --[[
        Disambiguates results from a skill query.
    ]]
    local str = {}
    for _, 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

-- ----------------------------------------------------------------------------
-- Exported 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,
                    tpl_args.q_where,
                    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

        -- Store as main page:
        m_cargo.store(
            frame,
            {
                _table='main_pages',
                id=v['skill.skill_id'],
            }
        )
    end

    return tostring(container) .. table.concat(out, '') .. m_util.misc.add_category(cats)
end

--
-- Template:Skill link
--
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, cfg.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, cfg.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.skill_id',
                'skill.stat_text',
                -- 'skill.main_page',
                'skill.active_skill_name',
                'skill.skill_icon',
                'skill.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.multiple_results,
                    tpl_args.q_where,
                    h.disambiguate_skill(results) .. 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(cfg.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')

        -- TODO: Disable this until a nice solution for keeping the html table
        -- inline has been added:
        if false then -- 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.broken_skill_links)
            )
        }
    end
end

return p