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
Module for creating links to skills via cargo.
Implemented templates
- {{Skill link}}
 - {{Query skill infobox}}
 
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