Module:Item link: Difference between revisions
Jump to navigation
Jump to search
(If name is empty, do not display text link; icon link only) |
m (46 revisions imported) |
||
(19 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
-- | ------------------------------------------------------------------------------- | ||
-- | -- | ||
-- | -- Module:Item link | ||
-- | -- | ||
-- | -- This module implements Template:Item link. | ||
-- | ------------------------------------------------------------------------------- | ||
require('Module:No globals') | |||
local m_util = require('Module:Util') | local m_util = require('Module:Util') | ||
local | local m_item_util = require('Module:Item util') | ||
-- | -- Should we use the sandbox version of our submodules? | ||
local use_sandbox = m_util.misc.maybe_sandbox('Item link') | |||
local | |||
-- 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:Item link/config/sandbox') or mw.loadData('Module:Item link/config') | |||
local i18n = cfg.i18n | |||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
-- | -- Main functions | ||
-- ---------------------------------------------------------------------------- | -- ---------------------------------------------------------------------------- | ||
local function _main(args) | |||
local | |||
function | |||
--[[ | --[[ | ||
Creates a link to the item and displays the item info box on hover | Creates a link to the item and displays the item info box on hover | ||
Line 71: | Line 32: | ||
= p.item_link{'Multistrike'} | = p.item_link{'Multistrike'} | ||
= p.item_link{'Multistrike Support'} | = p.item_link{'Multistrike Support'} | ||
--]] | |||
args.item_name = args.item_name or args[1] | |||
args.name = args.name or args[2] | |||
args.large = m_util.cast.boolean(args.large) | |||
local img | local img | ||
local result | local result | ||
local linked_page | |||
if m_util. | if m_util.cast.boolean(args.skip_query) then | ||
result = { | |||
_pageName = args.page or args.name | |||
} | |||
linked_page = args.link or result._pageName | |||
else | |||
local qargs = {} | |||
qargs.tables = {'main_pages'} | |||
qargs.join = 'items._pageName = main_pages.data_page' | |||
qargs.fields = { | |||
'items.name=name', | |||
'items.inventory_icon=inventory_icon', | |||
'items.html=html', | |||
'items.alternate_art_inventory_icons=alternate_art_inventory_icons', | |||
'items.size_x=size_x', | |||
'items.size_y=size_y', | |||
'main_pages._pageName=main_page', | |||
} | } | ||
result = m_item_util.query_item(args, qargs) | |||
if result.error then | |||
if not m_util.cast.boolean(args.nocat) then | |||
return result.error:get_html() .. m_util.misc.add_category({i18n.categories.broken_item_links}) | |||
end | end | ||
return result.error:get_html() | |||
end | end | ||
-- If specifying an item by name, link to the main page; otherwise, link to where the item data lives. | |||
if result.main_page and m_util.table.has_any_key(args, {'item_name', 'item_name_exact'}) then | |||
linked_page = result.main_page | |||
else | |||
linked_page = result._pageName | |||
end | end | ||
end | end | ||
for k, prop in pairs( | -- Overrides from template parameters | ||
if | for k, prop in pairs(cfg.parameters) do | ||
result[prop] = | if args[k] ~= nil then | ||
result[prop] = args[k] | |||
end | end | ||
end | end | ||
if | if args.image ~= nil then | ||
if result | if result.alternate_art_inventory_icons == nil then | ||
local err = m_util.Error{ | |||
message = string.format( | |||
i18n.errors.alt_art_undefined, | i18n.errors.alt_art_undefined, | ||
result | result._pageName | ||
), | |||
code = 'alt_art_undefined', | |||
issue = args.issue_all_errors or false, | |||
category = i18n.categories.broken_item_links, | |||
}:throw() | |||
return err:get_html() .. err:get_category() | |||
end | end | ||
result | result.alternate_art_inventory_icons = m_util.string.split( | ||
result | result.alternate_art_inventory_icons, | ||
',%s*' | ',%s*' | ||
) | ) | ||
local index = tonumber( | local index = tonumber(args.image) | ||
if index ~= nil then | if index ~= nil then | ||
img = result | img = result.alternate_art_inventory_icons[index] | ||
else | else | ||
-- offset 1 is needed | -- offset 1 is needed | ||
local suffix = string.len(' inventory icon.png') + 1 | local suffix = string.len(' inventory icon.png') + 1 | ||
-- add an extra offset by 1 to account for the space | -- add an extra offset by 1 to account for the space | ||
local prefix = string.len(string.sub(result | local prefix = string.len(string.sub(result.inventory_icon, 1, -suffix)) + 2 | ||
for _, filename in ipairs(result | for _, filename in ipairs(result.alternate_art_inventory_icons) do | ||
if string.sub(filename, prefix, -suffix) == | if string.sub(filename, prefix, -suffix) == args.image then | ||
img = filename | img = filename | ||
break | break | ||
Line 235: | Line 119: | ||
if img == nil then | if img == nil then | ||
local err = m_util.Error{ | |||
message = string.format( | |||
i18n.errors.alt_art_invalid_index, | i18n.errors.alt_art_invalid_index, | ||
args.image, | |||
result._pageName | |||
), | |||
code = 'alt_art_invalid_index', | |||
issue = args.issue_all_errors or false, | |||
category = i18n.categories.broken_item_links, | |||
}:throw() | |||
return err:get_html() .. err:get_category() | |||
end | end | ||
elseif result | elseif result.inventory_icon ~= nil then | ||
img = result | img = result.inventory_icon | ||
end | end | ||
Line 251: | Line 138: | ||
-- output | -- output | ||
-- | -- | ||
local container = mw.html.create('span') | local container = mw.html.create('span') | ||
container:addClass('c-item-hoverbox') | container:addClass('c-item-hoverbox') | ||
if | if args.large then | ||
container:addClass('c-item-hoverbox--large') | container:addClass('c-item-hoverbox--large') | ||
end | end | ||
Line 271: | Line 149: | ||
activator:addClass('c-item-hoverbox__activator') | activator:addClass('c-item-hoverbox__activator') | ||
if img and not | if img and not args.large then | ||
activator:wikitext(string.format('[[%s|16x16px|link=|alt=]]', img)) | activator:wikitext(string.format('[[%s|16x16px|link=|alt=]]', img)) | ||
end | end | ||
if #result | if #result.name > 0 then | ||
activator:wikitext(string.format( | activator:wikitext(string.format( | ||
'[[%s|%s]]', | '[[%s|%s]]', | ||
linked_page, | linked_page, | ||
result | result.name or result._pageName | ||
) | ) | ||
) | ) | ||
Line 287: | Line 165: | ||
display:attr('class', 'c-item-hoverbox__display') | display:attr('class', 'c-item-hoverbox__display') | ||
if result | if result.html ~= nil then | ||
display:wikitext(result | display:wikitext(result.html) | ||
if img then | if img then | ||
Line 295: | Line 173: | ||
end | end | ||
if img and | if img and args.large then | ||
local width = tonumber(result | local width = tonumber(result.size_x) or tonumber(args.width) | ||
local height = tonumber(result | local height = tonumber(result.size_y) or tonumber(args.height) | ||
if width and height then | if width and height then | ||
img = string.format( | img = string.format( | ||
'[[%s|%sx%spx|link=%s|alt=]]', | '[[%s|%sx%spx|link=%s|alt=]]', | ||
img, | img, | ||
width* | width*cfg.image_size, | ||
height* | height*cfg.image_size, | ||
linked_page | linked_page | ||
) | ) | ||
Line 310: | Line 188: | ||
'[[%s|%spx|link=%s|alt=]]', | '[[%s|%spx|link=%s|alt=]]', | ||
img, | img, | ||
width* | width*cfg.image_size, | ||
linked_page | linked_page | ||
) | ) | ||
Line 317: | Line 195: | ||
'[[%s|x%spx|link=%s|alt=]]', | '[[%s|x%spx|link=%s|alt=]]', | ||
img, | img, | ||
height* | height*cfg.image_size, | ||
linked_page | linked_page | ||
) | ) | ||
Line 337: | Line 215: | ||
return tostring(container) | return tostring(container) | ||
end | end | ||
-- ---------------------------------------------------------------------------- | |||
-- Exported functions | |||
-- ---------------------------------------------------------------------------- | |||
local p = {} | |||
-- | |||
-- Template:Item link | |||
-- | |||
p.main = m_util.misc.invoker_factory(_main, { | |||
parentFirst = true, | |||
removeBlanks = false, | |||
}) | |||
p.item_link = p.main | |||
return p | return p |
Latest revision as of 16:46, 25 September 2024
This module implements {{item link}} and facilitates the creation of item links.
The above documentation is transcluded from Module:Item 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:Item link
--
-- This module implements Template:Item link.
-------------------------------------------------------------------------------
require('Module:No globals')
local m_util = require('Module:Util')
local m_item_util = require('Module:Item util')
-- Should we use the sandbox version of our submodules?
local use_sandbox = m_util.misc.maybe_sandbox('Item 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:Item link/config/sandbox') or mw.loadData('Module:Item link/config')
local i18n = cfg.i18n
-- ----------------------------------------------------------------------------
-- Main functions
-- ----------------------------------------------------------------------------
local function _main(args)
--[[
Creates a link to the item and displays the item info box on hover
on the link.
Examples
--------
= p.item_link{'Multistrike'}
= p.item_link{'Multistrike Support'}
--]]
args.item_name = args.item_name or args[1]
args.name = args.name or args[2]
args.large = m_util.cast.boolean(args.large)
local img
local result
local linked_page
if m_util.cast.boolean(args.skip_query) then
result = {
_pageName = args.page or args.name
}
linked_page = args.link or result._pageName
else
local qargs = {}
qargs.tables = {'main_pages'}
qargs.join = 'items._pageName = main_pages.data_page'
qargs.fields = {
'items.name=name',
'items.inventory_icon=inventory_icon',
'items.html=html',
'items.alternate_art_inventory_icons=alternate_art_inventory_icons',
'items.size_x=size_x',
'items.size_y=size_y',
'main_pages._pageName=main_page',
}
result = m_item_util.query_item(args, qargs)
if result.error then
if not m_util.cast.boolean(args.nocat) then
return result.error:get_html() .. m_util.misc.add_category({i18n.categories.broken_item_links})
end
return result.error:get_html()
end
-- If specifying an item by name, link to the main page; otherwise, link to where the item data lives.
if result.main_page and m_util.table.has_any_key(args, {'item_name', 'item_name_exact'}) then
linked_page = result.main_page
else
linked_page = result._pageName
end
end
-- Overrides from template parameters
for k, prop in pairs(cfg.parameters) do
if args[k] ~= nil then
result[prop] = args[k]
end
end
if args.image ~= nil then
if result.alternate_art_inventory_icons == nil then
local err = m_util.Error{
message = string.format(
i18n.errors.alt_art_undefined,
result._pageName
),
code = 'alt_art_undefined',
issue = args.issue_all_errors or false,
category = i18n.categories.broken_item_links,
}:throw()
return err:get_html() .. err:get_category()
end
result.alternate_art_inventory_icons = m_util.string.split(
result.alternate_art_inventory_icons,
',%s*'
)
local index = tonumber(args.image)
if index ~= nil then
img = result.alternate_art_inventory_icons[index]
else
-- offset 1 is needed
local suffix = string.len(' inventory icon.png') + 1
-- add an extra offset by 1 to account for the space
local prefix = string.len(string.sub(result.inventory_icon, 1, -suffix)) + 2
for _, filename in ipairs(result.alternate_art_inventory_icons) do
if string.sub(filename, prefix, -suffix) == args.image then
img = filename
break
end
end
end
if img == nil then
local err = m_util.Error{
message = string.format(
i18n.errors.alt_art_invalid_index,
args.image,
result._pageName
),
code = 'alt_art_invalid_index',
issue = args.issue_all_errors or false,
category = i18n.categories.broken_item_links,
}:throw()
return err:get_html() .. err:get_category()
end
elseif result.inventory_icon ~= nil then
img = result.inventory_icon
end
--
-- output
--
local container = mw.html.create('span')
container:addClass('c-item-hoverbox')
if 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 args.large then
activator:wikitext(string.format('[[%s|16x16px|link=|alt=]]', img))
end
if #result.name > 0 then
activator:wikitext(string.format(
'[[%s|%s]]',
linked_page,
result.name or result._pageName
)
)
end
local display = mw.html.create('span')
display:attr('class', 'c-item-hoverbox__display')
if result.html ~= nil then
display:wikitext(result.html)
if img then
display:wikitext(string.format('[[%s|link=|alt=]]', img))
end
end
if img and args.large then
local width = tonumber(result.size_x) or tonumber(args.width)
local height = tonumber(result.size_y) or tonumber(args.height)
if width and height then
img = string.format(
'[[%s|%sx%spx|link=%s|alt=]]',
img,
width*cfg.image_size,
height*cfg.image_size,
linked_page
)
elseif width then
img = string.format(
'[[%s|%spx|link=%s|alt=]]',
img,
width*cfg.image_size,
linked_page
)
elseif height then
img = string.format(
'[[%s|x%spx|link=%s|alt=]]',
img,
height*cfg.image_size,
linked_page
)
else
img = string.format(
'[[%s|link=%s|alt=]]',
img,
linked_page
)
end
activator:wikitext(img)
end
container
:node(activator)
:node(display)
:done()
return tostring(container)
end
-- ----------------------------------------------------------------------------
-- Exported functions
-- ----------------------------------------------------------------------------
local p = {}
--
-- Template:Item link
--
p.main = m_util.misc.invoker_factory(_main, {
parentFirst = true,
removeBlanks = false,
})
p.item_link = p.main
return p