[checked revision] | [checked revision] |
((via Mediawiker ST3)) |
([ST] linkkey -> idKey, linkkey wasn't actually used anywhere but I'm going to use idKey in ItemSprite now) |
||
(43 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
local util_table = require('Module:TableUtil') |
local util_table = require('Module:TableUtil') |
||
local util_text = require('Module:TextUtil') |
local util_text = require('Module:TextUtil') |
||
− | local |
+ | local util_vars = require("Module:VarsUtil") |
local h = {} |
local h = {} |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | settings.display = args.title or args.display or input |
||
⚫ | |||
+ | if args.fallback then |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
function h.castArgs(args) |
function h.castArgs(args) |
||
local ARGS_TO_CAST = { 'noimage', 'nolink', 'notext', 'dark', 'black', 'backwards' } |
local ARGS_TO_CAST = { 'noimage', 'nolink', 'notext', 'dark', 'black', 'backwards' } |
||
for _, v in ipairs(ARGS_TO_CAST) do |
for _, v in ipairs(ARGS_TO_CAST) do |
||
− | args[v] |
+ | if args[v] then |
⚫ | |||
⚫ | |||
end |
end |
||
args.width = tonumber(args.width) |
args.width = tonumber(args.width) |
||
Line 18: | Line 57: | ||
function h.addDataToArgs(input, settings, ids) |
function h.addDataToArgs(input, settings, ids) |
||
local displayKey = settings.lengthkey or settings.defaultlengthkey or 'link' |
local displayKey = settings.lengthkey or settings.defaultlengthkey or 'link' |
||
− | local idKey = settings. |
+ | local idKey = settings.idKey or settings.defaultlinkkey or 'link' |
h.getIdAndKey(input, settings, idKey, displayKey) |
h.getIdAndKey(input, settings, idKey, displayKey) |
||
settings.link = (settings.link or settings.id) .. (settings.autolinksuffix or '') |
settings.link = (settings.link or settings.id) .. (settings.autolinksuffix or '') |
||
Line 25: | Line 64: | ||
function h.getIdAndKey(input, settings, idKey, displayKey) |
function h.getIdAndKey(input, settings, idKey, displayKey) |
||
− | if not settings.lookup then |
+ | if settings.skiplookup or not settings.lookup then |
settings.id = input |
settings.id = input |
||
settings.display = input |
settings.display = input |
||
Line 40: | Line 79: | ||
return settings.display |
return settings.display |
||
elseif settings.noimage then |
elseif settings.noimage then |
||
− | return ('[[%s|%s]]'):format(settings.id, settings.display) |
+ | return ('[[%s|%s]]'):format(settings.destination or settings.id, settings.display) |
elseif settings.notext and settings.nolink then |
elseif settings.notext and settings.nolink then |
||
return h.sprite(settings) |
return h.sprite(settings) |
||
Line 81: | Line 120: | ||
function h.addLinkToSprite(sprite, settings) |
function h.addLinkToSprite(sprite, settings) |
||
− | return util_text. |
+ | return util_text.link(settings.destination or settings.link, tostring(sprite)) |
end |
end |
||
function h.sprite(settings) |
function h.sprite(settings) |
||
local sprite = mw.html.create('span') |
local sprite = mw.html.create('span') |
||
+ | :attr('title', settings.display or settings.id) |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
h.addClassesToSprite(sprite, settings) |
h.addClassesToSprite(sprite, settings) |
||
local styles = h.getStyles(settings) |
local styles = h.getStyles(settings) |
||
Line 109: | Line 151: | ||
return settings.classname |
return settings.classname |
||
else |
else |
||
− | local name = |
+ | local name = settings.name:lower() |
return name .. '-sprite' |
return name .. '-sprite' |
||
end |
end |
||
Line 124: | Line 166: | ||
local top = math.floor(math.floor(pos / tiles) * (height + spacing) + 0.5) |
local top = math.floor(math.floor(pos / tiles) * (height + spacing) + 0.5) |
||
local styles = { |
local styles = { |
||
− | 'background-image:' .. settings.url, |
||
'background-position:' .. h.getBackgroundPosition(left, top), |
'background-position:' .. h.getBackgroundPosition(left, top), |
||
'background-size:' .. h.getBackgroundSize(width, spacing, tiles), |
'background-size:' .. h.getBackgroundSize(width, spacing, tiles), |
||
util_args.nilToFalse(settings.css) |
util_args.nilToFalse(settings.css) |
||
} |
} |
||
− | if not settings. |
+ | if not settings.nosize then |
styles[#styles+1] = 'width:' .. width .. 'px' |
styles[#styles+1] = 'width:' .. width .. 'px' |
||
styles[#styles+1] = 'height:' .. height .. 'px' |
styles[#styles+1] = 'height:' .. height .. 'px' |
||
− | styles[#styles+1] = 'vertical-align:' .. settings.align |
||
end |
end |
||
⚫ | |||
end |
end |
||
Line 145: | Line 186: | ||
end |
end |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | |||
− | function p.getUrl( spritesheet, query ) |
||
− | return mw.getCurrentFrame():expandTemplate{ title = 'FileUrl', args = { spritesheet, query = query } } |
||
− | end |
||
− | |||
− | function h.getDocBody(data, sprite_type, dataPage) |
||
− | local spritesheet = data.settings.image or data.settings.name .. 'Sprite.png' |
||
− | local f = mw.getCurrentFrame() |
||
− | local body = mw.html.create('div'):attr({ |
||
− | id = 'spritedoc', |
||
− | ['data-dataprotection'] = 'edit', |
||
− | ['data-datatimestamp'] = f:callParserFunction( 'REVISIONTIMESTAMP', 'Module:' .. dataPage ), |
||
− | ['data-datapage'] = 'Module:' .. dataPage, |
||
− | ['data-spritesheet'] = spritesheet, |
||
− | ['data-spriteprotection'] = 'edit,upload,reupload', |
||
− | ['data-urlfunc'] = "require( [[Module:Sprite]] ).getUrl( '" .. spritesheet .. "', '$1' )", |
||
− | ['data-refreshtext'] = mw.text.nowiki( '{{#invoke:sprite|doc|' .. sprite_type .. '}}' ), |
||
− | ['data-settings'] = mw.text.jsonEncode( data.settings ), |
||
− | }) |
||
⚫ | |||
− | end |
||
− | |||
− | function p.doc(frame) |
||
− | local DROPDOWN_TOGGLE_OPTIONS = { 'deprecated', 'nolink', 'black', 'dark' } |
||
⚫ | |||
− | local sprite_type = args[1] |
||
− | local dataPage = sprite_type .. 'Sprite' |
||
− | local data = mw.loadData('Module:' .. dataPage) |
||
− | local body = h.getDocBody(data, sprite_type, dataPage) |
||
− | |||
− | local sections = {} |
||
− | for _, sectionData in ipairs( data.sections or { name = 'Uncategorized' } ) do |
||
− | local sectionTag = body:tag( 'div' ):addClass( 'spritedoc-section' ):attr( 'data-section-id', sectionData.id ) |
||
− | sectionTag:tag( 'h3' ):wikitext( sectionData.name ) |
||
− | sections[sectionData.id] = { boxes = sectionTag:tag( 'ul' ):addClass( 'spritedoc-boxes' ) } |
||
⚫ | |||
− | |||
− | local keyedData = {} |
||
− | local i = 1 |
||
− | for name, idData in pairs( data.ids ) do |
||
− | keyedData[i] = { |
||
− | sortKey = lang:lc( name ), |
||
− | name = name, |
||
− | data = idData |
||
− | } |
||
− | i = i + 1 |
||
⚫ | |||
− | table.sort( keyedData, function( a, b ) |
||
− | return a.sortKey < b.sortKey |
||
− | end ) |
||
− | |||
− | for _, data in ipairs( keyedData ) do |
||
− | local idData = data.data |
||
− | local pos = idData.pos |
||
− | local section = sections[idData.section] |
||
− | local names = section[pos] |
||
⚫ | |||
− | local box = section.boxes:tag( 'li' ):addClass( 'spritedoc-box' ):attr( 'data-pos', pos ) |
||
− | box:tag( 'div' ):addClass( 'spritedoc-image' ) |
||
− | :wikitext( p._main({ data.name, type = sprite_type, notext = true }) ) |
||
− | |||
− | names = box:tag( 'ul' ):addClass( 'spritedoc-names' ) |
||
− | section[pos] = names |
||
⚫ | |||
− | local nameElem = mw.html.create( 'li' ):addClass( 'spritedoc-name' ) |
||
− | local codeElem = nameElem:tag( 'code' ):wikitext( data.name ) |
||
− | |||
− | for _, v in ipairs(DROPDOWN_TOGGLE_OPTIONS) do |
||
− | if idData[v] then |
||
− | codeElem:addClass('spritedoc-' .. v) |
||
− | end |
||
− | end |
||
− | |||
− | names:wikitext( tostring( nameElem ) ) |
||
− | end |
||
− | return body |
||
− | end |
||
return p |
return p |
Latest revision as of 22:24, 22 November 2020
Edit the documentation or categories for this module.
Available Args[]
|1=
whatever you want to display|nolink=
|notext=
|noimage=
|nocat=
to suppress error categories|size=
DONT PUT PX|backwards=
swaps text & image from normal (so image is on the right)|display=
- this is different from MCW version of this module, since on esports wikis we do|2=
is a style|nosize=
- don't put the size inline, the parent class will have it (useful to decrease template inclusion size)
local util_args = require('Module:ArgsUtil')
local util_table = require('Module:TableUtil')
local util_text = require('Module:TextUtil')
local util_vars = require("Module:VarsUtil")
local h = {}
local p = {}
function p.main(frame)
local args = util_args.merge()
h.castArgs(args)
return p._main(args)
end
function p.sprite(args)
return p._main(args)
end
function p.spriteImage(args)
local sheet = mw.loadData(('Module:%sSprite'):format(args.type))
local settings = util_table.shallowClone(sheet.settings or {})
if args[1] == '' then args[1] = nil end
local input = args[1] or settings.emptyimage
settings.defaultwidth = settings.width
settings.display = args.title or args.display or input
util_table.merge(settings, args, sheet.ids[input])
if args.fallback then
util_table.mergeDontOverwrite(settings, sheet.ids[args.fallback])
end
return tostring(h.sprite(settings))
end
function p._main(args)
local sheet = mw.loadData(('Module:%sSprite'):format(args.type))
local settings = util_table.shallowClone(sheet.settings or {})
if args[1] == '' then args[1] = nil end
local input = args[1] or settings.emptyimage
if not input then return '' end
settings.defaultwidth = settings.width
util_table.merge(settings, args)
h.addDataToArgs(input, settings, sheet.ids)
local cat = (not settings.pos and args[1] and not settings.nocat) and '[[Category:Pages with missing sprites]]' or ''
return tostring(h.makeOutput(settings)), cat
end
function h.castArgs(args)
local ARGS_TO_CAST = { 'noimage', 'nolink', 'notext', 'dark', 'black', 'backwards' }
for _, v in ipairs(ARGS_TO_CAST) do
if args[v] then
args[v] = util_args.castAsBool(args[v])
end
end
args.width = tonumber(args.width)
args.height = tonumber(args.height)
args.size = tonumber(args.size)
end
function h.addDataToArgs(input, settings, ids)
local displayKey = settings.lengthkey or settings.defaultlengthkey or 'link'
local idKey = settings.idKey or settings.defaultlinkkey or 'link'
h.getIdAndKey(input, settings, idKey, displayKey)
settings.link = (settings.link or settings.id) .. (settings.autolinksuffix or '')
util_table.merge(settings, ids[settings.id])
end
function h.getIdAndKey(input, settings, idKey, displayKey)
if settings.skiplookup or not settings.lookup then
settings.id = input
settings.display = input
return
end
local lookup = mw.loadData('Module:' .. settings.lookup)
local lookupResult = util_args.lookupVars(input, lookup) or {}
settings.id = lookupResult[idKey] or input
settings.display = settings.display or lookupResult[displayKey] or input
end
function h.makeOutput(settings)
if settings.noimage and settings.nolink then
return settings.display
elseif settings.noimage then
return ('[[%s|%s]]'):format(settings.destination or settings.id, settings.display)
elseif settings.notext and settings.nolink then
return h.sprite(settings)
elseif settings.notext then
local sprite = h.sprite(settings)
return h.addLinkToSprite(sprite, settings)
elseif settings.nolink then
return tostring(h.makeSpriteAndText(settings))
else
local sprite = h.makeSpriteAndText(settings)
return h.addLinkToSprite(sprite, settings)
end
end
function h.makeSpriteAndText(settings)
local sprite = h.sprite(settings)
local spriteText = h.makeSpriteText(settings)
local root = mw.html.create('span')
:addClass('nowrap')
if settings.backwards then
root:node(spriteText)
root:node(sprite)
else
root:node(sprite)
root:node(spriteText)
end
return root
end
function h.makeSpriteText(settings)
local text = mw.html.create('span')
if settings.backwards then
text:addClass('sprite-text-backwards')
else
text:addClass('sprite-text')
end
text:wikitext(settings.display)
return text
end
function h.addLinkToSprite(sprite, settings)
return util_text.link(settings.destination or settings.link, tostring(sprite))
end
function h.sprite(settings)
local sprite = mw.html.create('span')
:attr('title', settings.display or settings.id)
if not settings.notext then
sprite:tag('br')
end
h.addClassesToSprite(sprite, settings)
local styles = h.getStyles(settings)
sprite:cssText(util_table.concat(styles,';'))
return sprite
end
function h.addClassesToSprite(sprite, settings)
sprite:addClass(settings.class)
:addClass('sprite')
:addClass(h.getTypeClass(settings))
if settings.black then
sprite:addClass('black-sprite')
end
if settings.dark then
sprite:addClass('dark-sprite')
end
end
function h.getTypeClass(settings)
if settings.classname then
return settings.classname
else
local name = settings.name:lower()
return name .. '-sprite'
end
end
function h.getStyles(settings)
local width = settings.size or settings.width
local height = settings.size or settings.height
local spacing = settings.spacing * (width / settings.defaultwidth)
local sheetWidth = settings.sheetsize
local tiles = (sheetWidth + settings.spacing) / (settings.defaultwidth + settings.spacing)
local pos = math.abs(settings.pos or 1) - 1
local left = math.floor(pos % tiles * (width + spacing) + 0.5)
local top = math.floor(math.floor(pos / tiles) * (height + spacing) + 0.5)
local styles = {
'background-position:' .. h.getBackgroundPosition(left, top),
'background-size:' .. h.getBackgroundSize(width, spacing, tiles),
util_args.nilToFalse(settings.css)
}
if not settings.nosize then
styles[#styles+1] = 'width:' .. width .. 'px'
styles[#styles+1] = 'height:' .. height .. 'px'
end
return styles
end
function h.getBackgroundPosition(left, top)
return ('-%spx -%spx'):format(left, top)
end
function h.getBackgroundSize(width, spacing, tiles)
local width = math.floor((width + spacing) * tiles - spacing + 0.5)
return width .. 'px auto'
end
return p