Module:Passive skill link: Difference between revisions
Jump to navigation
Jump to search
>Illviljan mNo edit summary |
>Illviljan m (wip) |
||
Line 32: | Line 32: | ||
name = 'passive_skills.name', | name = 'passive_skills.name', | ||
icon = 'passive_skills.icon', | icon = 'passive_skills.icon', | ||
is_keystone = 'passive_skills.is_keystone', | |||
is_notable = 'passive_skills.is_notable', | |||
ascendancy_class = 'passive_skills.ascendancy_class', | |||
html = 'passive_skills.html', | html = 'passive_skills.html', | ||
} | } | ||
Line 73: | Line 76: | ||
local cls = string.format('passive-icon-type__%s', passive_type) | local cls = string.format('passive-icon-type__%s', passive_type) | ||
local main_page = passive['passive_skills.main_page'] or passive['main_pages._pageName'] or passive['passive_skills.name'] or passive['passive_skills.icon'] | local main_page = passive['passive_skills.main_page'] | ||
or passive['main_pages._pageName'] | |||
or passive['passive_skills.name'] | |||
or passive['passive_skills.icon'] | |||
div = mw.html.create('div') | div = mw.html.create('div') | ||
Line 170: | Line 176: | ||
{ | { | ||
join='passive_skills.id=main_pages.id', | join='passive_skills.id=main_pages.id', | ||
where=string.format('(%s) AND passive_skills.stat_text IS NOT NULL', tpl_args.q_where), | where=string.format( | ||
'(%s) AND passive_skills.stat_text IS NOT NULL', | |||
tpl_args.q_where | |||
), | |||
orderBy='passive_skills.stat_text', | orderBy='passive_skills.stat_text', | ||
limit=2, | limit=2, | ||
Line 185: | Line 194: | ||
else | else | ||
passive = { | passive = { | ||
['passive_skills. | ['passive_skills.main_page']=tpl_args.page or tpl_args.name | ||
} | } | ||
end | end | ||
Line 200: | Line 209: | ||
local img = h.format_passive_icon(passive, h.get_type(passive), tpl_args.large) | local img = h.format_passive_icon(passive, h.get_type(passive), tpl_args.large) | ||
local main_page = passive['passive_skills.main_page'] or passive['main_pages._pageName'] or passive['passive_skills.name'] | local main_page = passive['passive_skills.main_page'] | ||
or passive['main_pages._pageName'] | |||
or passive['passive_skills.name'] | |||
--------- | --------- | ||
Line 235: | Line 246: | ||
'[[%s|%s]]', | '[[%s|%s]]', | ||
main_page, | main_page, | ||
passive['passive_skills.name'] or | passive['passive_skills.name'] or main_page | ||
) | ) | ||
) | ) |
Revision as of 17:50, 10 September 2019
You might want to create a documentation page for this module.
Editors can experiment in this module's sandbox and testcases pages.
Please add categories to the /doc subpage. Subpages of this module.
Editors can experiment in this module's sandbox and testcases pages.
Please add categories to the /doc subpage. Subpages of this module.
--
-- Module for passive skill links
--
local m_util = require('Module:Util')
local m_cargo = require('Module:Cargo')
local getArgs = require('Module:Arguments').getArgs
local p = {}
-- ----------------------------------------------------------------------------
-- Strings
-- ----------------------------------------------------------------------------
local i18n = {
icon_name = 'File:%s passive skill icon.png',
errors = {
invalid_args = 'Passive skill link: id, int_id, page or name must be specified',
no_passives_found = 'No passive skills with the given name found',
},
}
-- ----------------------------------------------------------------------------
-- Constants & Data
-- ----------------------------------------------------------------------------
local c = {}
c.image_size = 39
c.image_size_full = c.image_size * 2
c.parameters = {
name = 'passive_skills.name',
icon = 'passive_skills.icon',
is_keystone = 'passive_skills.is_keystone',
is_notable = 'passive_skills.is_notable',
ascendancy_class = 'passive_skills.ascendancy_class',
html = 'passive_skills.html',
}
c.selectors = {'id', 'int_id', 'page', 'name'}
-- ----------------------------------------------------------------------------
-- Helper functions
-- ----------------------------------------------------------------------------
local h = {}
h.type_order = {'basic', 'notable', 'keystone', 'ascendancy_basic', 'ascendancy_notable'}
function h.get_type(passive)
local key
if tonumber(passive['passive_skills.is_keystone']) == 1 then
key = 'keystone'
elseif tonumber(passive['passive_skills.is_notable']) == 1 then
key = 'notable'
else
key = 'basic'
end
if passive['passive_skills.ascendancy_class'] ~= nil then
key = 'ascendancy_' .. key
end
return key
end
function h.format_passive_icon(passive, passive_type, large)
--[[
Add a frame to passive image.
TODO: Add a inline size.
]]
if passive['passive_skills.icon'] == nil then
return ''
end
local cls = string.format('passive-icon-type__%s', passive_type)
local main_page = passive['passive_skills.main_page']
or passive['main_pages._pageName']
or passive['passive_skills.name']
or passive['passive_skills.icon']
div = mw.html.create('div')
div:addClass('passive-icon-container')
div:addClass(cls)
if large then
div:tag('div')
:addClass('passive-icon-frame')
:done()
div:wikitext(
string.format(
'[[%s|link=%s]]',
passive['passive_skills.icon'],
main_page
)
)
else
-- Inline size
div:tag('div')
:addClass('passive-icon-frame')
-- :attr('style', 'height:16px;width:16px')
:done()
div:wikitext(
string.format(
'[[%s|link=%s]]',
passive['passive_skills.icon'],
main_page
)
)
end
return tostring(div)
end
-- ----------------------------------------------------------------------------
-- Page functions
-- ----------------------------------------------------------------------------
local p = {}
function p.passive_skill_link(frame)
--[[
Links a passive skill.
TODO:
* Use own CSS.
Examples
--------
= p.passive_skill_link{id='AscendancyAscendant45'}
= p.passive_skill_link{
skip_query=true,
page='Passive Skill:AscendancyAscendant45',
name='test',
icon='File:GLADSpeedAoE (Gladiator) passive skill icon.png',
large=1,
}
= p.passive_skill_link{id='AscendancyAscendant45', format='tablerow'}
]]
-- Get args
tpl_args = getArgs(frame, {
parentFirst = true
})
frame = m_util.misc.get_frame(frame)
if m_util.table.has_all_value(tpl_args, c.selectors) and tpl_args.skip_query == nil then
error(i18n.errors.invalid_args)
end
local passive
if m_util.table.has_one_value(tpl_args, c.selectors, nil) and tpl_args.skip_query == nil then
tpl_args.name = tpl_args.name or tpl_args[1]
if tpl_args.name then
tpl_args.q_where = string.format('passive_skills.name="%s"', tpl_args.name)
elseif tpl_args.id then
tpl_args.q_where = string.format('passive_skills.id="%s"', tpl_args.id)
elseif tpl_args.q_where then
else
error('Either name, id or q_where must be specified')
end
local results = m_cargo.query(
{'passive_skills', 'main_pages'},
{
'passive_skills._pageName',
'passive_skills.stat_text',
'passive_skills.main_page',
'passive_skills.name',
'passive_skills.icon',
'passive_skills.is_keystone',
'passive_skills.is_notable',
'passive_skills.ascendancy_class',
'main_pages._pageName',
},
{
join='passive_skills.id=main_pages.id',
where=string.format(
'(%s) AND passive_skills.stat_text IS NOT NULL',
tpl_args.q_where
),
orderBy='passive_skills.stat_text',
limit=2,
}
)
if #results > 1 then
error('Too many passives found!')
elseif #results < 1 then
error('No passives found')
end
passive = results[1]
else
passive = {
['passive_skills.main_page']=tpl_args.page or tpl_args.name
}
end
for k, prop in pairs(c.parameters) do
if tpl_args[k] ~= nil then
passive[prop] = tpl_args[k]
end
end
if tpl_args.image ~= nil then
passive['passive_skills.icon'] = 'File:' .. tpl_args.image
end
local img = h.format_passive_icon(passive, h.get_type(passive), tpl_args.large)
local main_page = passive['passive_skills.main_page']
or passive['main_pages._pageName']
or passive['passive_skills.name']
---------
-- Output
---------
-- Display in a table:
if tpl_args.format == 'tablerow' then
return string.format(
'| [[%s|%s]]%s\n| %s',
main_page,
passive['passive_skills.name'],
h.format_passive_icon(passive, h.get_type(passive)),
passive['passive_skills.stat_text']
)
-- Normal inline link:
elseif 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]]',
main_page,
passive['passive_skills.name'] or main_page
)
)
local display = mw.html.create('span')
display:attr('class', 'c-item-hoverbox__display')
if passive['passive_skills.html'] ~= nil then
display:wikitext(passive['passive_skills.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
error(string.format('Invalid return format specified: %s', tpl_args.format))
end
end
-- ----------------------------------------------------------------------------
-- End
-- ----------------------------------------------------------------------------
return p