Leaguepedia | League of Legends Esports Wiki
Register
[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 lang = mw.getLanguage('en')
+
local util_vars = require("Module:VarsUtil")
   
 
local h = {}
 
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)
 
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] = util_args.castAsBool(args[v])
+
if args[v] then
 
args[v] = util_args.castAsBool(args[v])
 
end
 
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.linkkey or settings.defaultlinkkey or 'link'
+
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.printLink(settings.link, tostring(sprite))
+
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)
sprite:tag('br')
 
 
if not settings.notext then
 
sprite:tag('br')
 
end
 
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 = lang:lc(settings.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.nowidth then
+
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
 
return styles
 
end
 
end
   
Line 145: Line 186:
 
end
 
end
   
local p = {}
 
function p.main(frame)
 
local args = util_args.merge(true)
 
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
 
util_table.merge(settings, args)
 
util_table.merge(settings, sheet.ids[input])
 
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 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 ),
 
})
 
return body
 
end
 
 
function p.doc(frame)
 
local DROPDOWN_TOGGLE_OPTIONS = { 'deprecated', 'nolink', 'black', 'dark' }
 
local args = util_args.merge(true)
 
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' ) }
 
end
 
 
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
 
end
 
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]
 
if not names then
 
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
 
end
 
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