Module:Inventory slot: Difference between revisions
Jump to navigation
Jump to search
Allow skipping aliases |
Created page with "local p = {} function p.slot( f ) local args = f.args or f if f == mw.getCurrentFrame() and args[1] == nil then args = f:getParent().args end args[1] = mw.text.trim(..." |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
function p. | function p.slot( f ) | ||
local args = f.args or f | local args = f.args or f | ||
if f == mw.getCurrentFrame() and args[1] == nil then | if f == mw.getCurrentFrame() and args[1] == nil then | ||
Line 9: | Line 9: | ||
args[1] = mw.text.trim( args[1] or '' ) | args[1] = mw.text.trim( args[1] or '' ) | ||
-- Comment this next line out if you're not using aliases | |||
local aliases = mw.loadData( 'Module:Inventory slot/Aliases' ) | |||
local modAliases = args.modaliases or '' | |||
if modAliases ~= '' then | |||
modAliases = mw.loadData( 'Module:' .. modAliases ) | |||
else | |||
modAliases = nil | |||
end | |||
if aliases or modAliases then | |||
local frames = {} | |||
for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do | |||
local frameParts = p.getParts( frame, args.mod ) | |||
local id = frameParts.name | |||
if frameParts.mod then | |||
id = frameParts.mod .. ':' .. id | |||
end | |||
local alias | |||
if modAliases and modAliases[id] then | |||
alias = modAliases[id] | |||
elseif aliases and aliases[id] then | |||
alias = aliases[id] | |||
end | end | ||
if alias then | |||
table.insert( frames, p.expandAlias( frameParts, alias ) ) | |||
else | |||
table.insert( frames, frame ) | |||
end | |||
end | end | ||
args[1] = table.concat( frames, ';' ) | |||
end | end | ||
local sprite | |||
local ids = mw.loadData( [[Module:InvSprite/IDs]] ).ids | |||
local modIds = {} | |||
local animated = args[1]:find( ';' ) | local animated = args[1]:find( ';' ) | ||
local pageName = mw.title.getCurrentTitle().subpageText | local pageName = mw.title.getCurrentTitle().subpageText | ||
local | local imgClass = args.imgclass | ||
local | local numStyle = args.numstyle | ||
local | local body = mw.html.create( 'span' ):addClass( 'invslot' ):css{ ['vertical-align'] = args.align } | ||
if animated then | |||
body:addClass( 'animated' ) | |||
end | |||
if args.class then | |||
body:addClass( args.class ) | |||
end | |||
if args.style then | |||
body:cssText( args.style ) | |||
end | |||
if ( args.default or '' ) ~= '' then | |||
body:css( 'background-image', '{{FileUrl|' .. args.default .. '.png}}' ) | |||
end | |||
local first = true | |||
for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do | for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do | ||
local item | |||
if frame ~= '' or frame == '' and animated then | |||
item = body:tag( 'span' ):addClass( 'invslot-item' ) | |||
if imgClass then | |||
item:addClass( imgClass ) | |||
end | |||
end | |||
if frame == '' then | if frame == '' then | ||
( item or body ):tag( 'br' ) | |||
else | else | ||
local parts = p.getParts( frame, args.mod ) | local parts = p.getParts( frame, args.mod ) | ||
Line 72: | Line 88: | ||
local tooltipDesc = parts.text | local tooltipDesc = parts.text | ||
local img | local img, spriteImg | ||
if mod then | if mod then | ||
img = name .. ' (' .. mod .. ')' | if not modIds[mod] and mw.title.new( 'Module:InvSprite/Mods/' .. mod .. '/IDs' ).exists then | ||
modIds[mod] = mw.loadData( 'Module:InvSprite/Mods/' .. mod .. '/IDs' ) | |||
end | |||
if modIds[mod] and modIds[mod][name] then | |||
spriteImg = modIds[mod][name].pos | |||
else | |||
img = name .. ' (' .. mod .. ')' | |||
end | |||
elseif ids[name] then | |||
spriteImg = ids[name].pos | |||
else | else | ||
img = name | img = name | ||
Line 95: | Line 120: | ||
title = tooltipTitle:gsub( '&[0-9a-fk-or]', '' ) | title = tooltipTitle:gsub( '&[0-9a-fk-or]', '' ) | ||
end | end | ||
if mw.text.trim( title ) == '' | if mw.text.trim( title ) == '' and ( link:lower() == 'none' or link ~= name ) then | ||
title = name | title = name | ||
end | end | ||
end | end | ||
if link:lower() == 'none' then | if link:lower() == 'none' then | ||
link = | link = nil | ||
end | end | ||
if title:lower() == 'none' then | if title == '' then | ||
title = '' | title = nil | ||
elseif title:lower() == 'none' then | |||
if link then | |||
title = '' | |||
else | |||
title = nil | |||
end | |||
end | end | ||
if img and ( title == '' or not link ) then | |||
item:attr{ title = title } | |||
end | end | ||
item:attr{ | |||
['data-minetip-title'] = tooltipTitle, | |||
['data-minetip-text'] = tooltipDesc | |||
} | |||
if | if img then | ||
item:addClass( 'invslot-item-image' ) | |||
:wikitext( '[[File:Grid ', img, '.png|32x32px|link=', link or '', '|', title or '', ']]' ) | |||
else | |||
if not sprite then | |||
sprite = require( [[Module:Sprite]] ).base | |||
end | |||
local image | |||
if mod then | |||
image = args.spritesheet or mod .. 'Sprite.png' | |||
end | |||
if link then | |||
item:wikitext( '[[', link, '|' ) | |||
end | |||
item:wikitext( sprite{ | |||
pos = spriteImg, title = title, | |||
image = image, settings = 'InvSprite' | |||
} ) | |||
end | end | ||
if num and num > 1 and num < 1000 then | if num and num > 1 and num < 1000 then | ||
if link | if img and link then | ||
item:wikitext( '[[', link, '|' ) | |||
end | end | ||
local number = item | |||
numStyle | :tag( 'span' ) | ||
:addClass( 'invslot-stacksize' ) | |||
:attr{ title = title } | |||
:wikitext( num ) | |||
if numStyle then | |||
number:cssText( numStyle ) | |||
end | |||
if img and link then | |||
item:wikitext( ']]' ) | |||
end | end | ||
end | end | ||
if spriteImg and link then | |||
item:wikitext( ']]' ) | |||
end | |||
end | end | ||
if first then | |||
if animated and item then | |||
item:addClass( 'active' ) | |||
end | |||
first = false | |||
end | end | ||
end | end | ||
return body | |||
return | |||
end | end | ||
Line 197: | Line 213: | ||
aliasParts.text = frameParts.text or aliasParts.text or '' | aliasParts.text = frameParts.text or aliasParts.text or '' | ||
table.insert( expandedFrames, string.format( '[%s]%s:%s,%s[%s]', aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.text ) ) | table.insert( expandedFrames, string.format( | ||
'[%s]%s:%s,%s[%s]', | |||
aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.text | |||
) ) | |||
end | end | ||
Line 228: | Line 247: | ||
return parts | return parts | ||
end | end | ||
return p | return p |
Revision as of 17:18, 8 August 2015
This module implements {{inventory slot}}
.
Dependencies
de:Modul:Slot es:Módulo:Inventory slot fr:Module:Case inventaire ja:モジュール:Inventory slot ko:모듈:Inventory slot pl:Moduł:Inventory slot ru:Модуль:Инвентарный слот pt:Módulo:Inventory slot uk:Модуль:Інвентарний слот zh:模块:Inventory slot
local p = {}
function p.slot( f )
local args = f.args or f
if f == mw.getCurrentFrame() and args[1] == nil then
args = f:getParent().args
end
args[1] = mw.text.trim( args[1] or '' )
-- Comment this next line out if you're not using aliases
local aliases = mw.loadData( 'Module:Inventory slot/Aliases' )
local modAliases = args.modaliases or ''
if modAliases ~= '' then
modAliases = mw.loadData( 'Module:' .. modAliases )
else
modAliases = nil
end
if aliases or modAliases then
local frames = {}
for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do
local frameParts = p.getParts( frame, args.mod )
local id = frameParts.name
if frameParts.mod then
id = frameParts.mod .. ':' .. id
end
local alias
if modAliases and modAliases[id] then
alias = modAliases[id]
elseif aliases and aliases[id] then
alias = aliases[id]
end
if alias then
table.insert( frames, p.expandAlias( frameParts, alias ) )
else
table.insert( frames, frame )
end
end
args[1] = table.concat( frames, ';' )
end
local sprite
local ids = mw.loadData( [[Module:InvSprite/IDs]] ).ids
local modIds = {}
local animated = args[1]:find( ';' )
local pageName = mw.title.getCurrentTitle().subpageText
local imgClass = args.imgclass
local numStyle = args.numstyle
local body = mw.html.create( 'span' ):addClass( 'invslot' ):css{ ['vertical-align'] = args.align }
if animated then
body:addClass( 'animated' )
end
if args.class then
body:addClass( args.class )
end
if args.style then
body:cssText( args.style )
end
if ( args.default or '' ) ~= '' then
body:css( 'background-image', '{{FileUrl|' .. args.default .. '.png}}' )
end
local first = true
for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do
local item
if frame ~= '' or frame == '' and animated then
item = body:tag( 'span' ):addClass( 'invslot-item' )
if imgClass then
item:addClass( imgClass )
end
end
if frame == '' then
( item or body ):tag( 'br' )
else
local parts = p.getParts( frame, args.mod )
local tooltipTitle = parts.title
local mod = parts.mod
local name = parts.name
local num = parts.num
local tooltipDesc = parts.text
local img, spriteImg
if mod then
if not modIds[mod] and mw.title.new( 'Module:InvSprite/Mods/' .. mod .. '/IDs' ).exists then
modIds[mod] = mw.loadData( 'Module:InvSprite/Mods/' .. mod .. '/IDs' )
end
if modIds[mod] and modIds[mod][name] then
spriteImg = modIds[mod][name].pos
else
img = name .. ' (' .. mod .. ')'
end
elseif ids[name] then
spriteImg = ids[name].pos
else
img = name
end
local link = args.link or ''
if link == '' then
if name == pageName then
link = 'none'
elseif mod then
link = 'Mods/' .. mod .. '/' .. name
else
link = name
end
end
local title = args.title or ''
if title == '' then
if tooltipTitle then
title = tooltipTitle:gsub( '&[0-9a-fk-or]', '' )
end
if mw.text.trim( title ) == '' and ( link:lower() == 'none' or link ~= name ) then
title = name
end
end
if link:lower() == 'none' then
link = nil
end
if title == '' then
title = nil
elseif title:lower() == 'none' then
if link then
title = ''
else
title = nil
end
end
if img and ( title == '' or not link ) then
item:attr{ title = title }
end
item:attr{
['data-minetip-title'] = tooltipTitle,
['data-minetip-text'] = tooltipDesc
}
if img then
item:addClass( 'invslot-item-image' )
:wikitext( '[[File:Grid ', img, '.png|32x32px|link=', link or '', '|', title or '', ']]' )
else
if not sprite then
sprite = require( [[Module:Sprite]] ).base
end
local image
if mod then
image = args.spritesheet or mod .. 'Sprite.png'
end
if link then
item:wikitext( '[[', link, '|' )
end
item:wikitext( sprite{
pos = spriteImg, title = title,
image = image, settings = 'InvSprite'
} )
end
if num and num > 1 and num < 1000 then
if img and link then
item:wikitext( '[[', link, '|' )
end
local number = item
:tag( 'span' )
:addClass( 'invslot-stacksize' )
:attr{ title = title }
:wikitext( num )
if numStyle then
number:cssText( numStyle )
end
if img and link then
item:wikitext( ']]' )
end
end
if spriteImg and link then
item:wikitext( ']]' )
end
end
if first then
if animated and item then
item:addClass( 'active' )
end
first = false
end
end
return body
end
function p.expandAlias( frameParts, alias )
-- If the frame has no parts, we can just return the alias as-is
if not frameParts.title and not frameParts.mod and not frameParts.num and not frameParts.text then
return alias
end
local expandedFrames = {}
for aliasFrame in mw.text.gsplit( alias, '%s*;%s*' ) do
local aliasParts = p.getParts( aliasFrame )
aliasParts.title = frameParts.title or aliasParts.title or ''
aliasParts.mod = frameParts.mod or aliasParts.mod or 'Minecraft'
aliasParts.num = frameParts.num or aliasParts.num or ''
aliasParts.text = frameParts.text or aliasParts.text or ''
table.insert( expandedFrames, string.format(
'[%s]%s:%s,%s[%s]',
aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.text
) )
end
return table.concat( expandedFrames, ';' )
end
function p.getParts( frame, mod )
local parts = {}
parts.title = frame:match( '^%[%s*([^%]]+)%s*%]' )
parts.mod = mw.text.trim( frame:match( '([^:%]]+):' ) or mod or '' )
local vanilla = { v = 1, vanilla = 1, mc = 1, minecraft = 1 }
if parts.mod == '' or vanilla[mw.ustring.lower( parts.mod )] then
parts.mod = nil
end
local nameStart = ( frame:find( ':' ) or frame:find( '%]' ) or 0 ) + 1
if nameStart - 1 == #frame then
nameStart = 1
end
parts.name = mw.text.trim( frame:sub( nameStart, ( frame:find( '[,%[]', nameStart ) or 0 ) - 1 ) )
parts.num = math.floor( frame:match( ',%s*(%d+)' ) or 0 )
if parts.num == 0 then
parts.num = nil
end
parts.text = frame:match( '%[%s*([^%]]+)%s*%]$' )
return parts
end
return p