匿名
未登录
创建账号
登录
The Land of StarLight
搜索
查看“模块:Inventory slot”的源代码
来自The Land of StarLight
命名空间
模块
讨论
更多
更多
页面操作
阅读
查看源代码
历史
←
模块:Inventory slot
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
local p = {} local i18n = { filename = 'Invicon $1', legacyFilename = 'Grid $1.png', modLink = 'Mods/$1/$2', moduleAliases = [[Module:Inventory slot/Aliases]], moduleInvData = [[Module:InvSprite]], moduleModData = 'Module:InvSprite/Mods/$1', moduleRandom = [[Module:Random]], moduleSprite = [[Module:Sprite]], -- List of special prefixes which should be handled by -- other modules (such as being moved outside links) prefixes = { 'Any', 'Matching', 'Damaged', 'Applicable', any = '任意', matching = '对应', damaged = '损坏的', applicable= '可用的', }, templateFileUrl = 'FileUrl', } p.i18n = i18n local random = require( i18n.moduleRandom ).random local sprite = require( i18n.moduleSprite ).sprite local aliases = mw.loadData( i18n.moduleAliases ) local ids = mw.loadData( i18n.moduleInvData ).ids local modIds = {} local pageName = mw.title.getCurrentTitle().text -- zh addition! local Autolink = require( [[Module:Autolink]] ) -- Performs a simple recursive clone of a table's values local function cloneTable( origTable ) local newTable = {} for k, v in pairs( origTable ) do if type( v ) == 'table' then v = cloneTable( v ) end newTable[k] = v end return newTable end --[[Merges a list, or inserts a string or table into a table --]] local function mergeList( parentTable, content ) local i = #parentTable + 1 if content[1] then -- Merge list into table for _, v in ipairs( content ) do parentTable[i] = v i = i + 1 end else -- Add strings or tables to table parentTable[i] = content end end -- Creates the HTML for an item local function makeItem( frame, i, args ) local item = mw.html.create( 'span' ):addClass( 'invslot-item' ) if args.imgclass then item:addClass( args.imgclass ) end if frame.name == '' then return item end local category local title = frame.title or mw.text.trim( args.title or '' ) local mod = frame.mod local name = frame.name or '' local num = frame.num local description = frame.text local img, idData if mod then local modData = modIds[mod] if not modData and mw.title.new( i18n.moduleModData:gsub( '%$1', mod ) ).exists then modData = mw.loadData( i18n.moduleModData:gsub( '%$1', mod ) ) modIds[mod] = modData end if modData and modData[name] then idData = modData[name] else img = i18n.legacyFilename:gsub( '%$1', name .. ' (' .. mod .. ')' ) end elseif ids[name] then idData = ids[name] elseif name:match( '\.gif$' ) or name:match( '\.png$' ) then img = i18n.filename:gsub( '%$1', name ) -- Remove file extension from name name = name:sub( 0, -5 ) else img = i18n.legacyFilename:gsub( '%$1', name ) end local link = args.link or '' if link == '' then if mod then link = i18n.modLink:gsub( '%$1', mod ):gsub( '%$2', name ) else link = Autolink.invlink(name:gsub( '^Damaged ', '' ), 'linkonly') end elseif link:lower() == 'none' then link = nil end if link == pageName then link = nil end local formattedTitle local plainTitle if title == '' then plainTitle = Autolink.invlink( name, 'nolink' ) elseif title:lower() ~= 'none' then plainTitle = title:gsub( '\\\\', '\' ):gsub( '\\&', '&' ) local formatPattern = '&[0-9a-fk-or]' if plainTitle:match( formatPattern ) then formattedTitle = title plainTitle = plainTitle:gsub( formatPattern, '' ) end if plainTitle == '' then plainTitle = name else plainTitle = plainTitle:gsub( '\', '\\' ):gsub( '&', '&' ) end elseif link then if img then formattedTitle = '' else plainTitle = '' end end item:attr{ ['data-minetip-title'] = formattedTitle, ['data-minetip-text'] = description } if img then -- & is re-escaped because mw.html treats attributes -- as plain text, but MediaWiki doesn't local escapedTitle = ( plainTitle or '' ):gsub( '&', '&' ) item:addClass( 'invslot-item-image' ) :wikitext( '[[File:', img, '|32x32px|link=', link or '', '|', Autolink.invlink( escapedTitle, 'nolink' ), ']]' ) else local image if mod then image = args.spritesheet or mod .. 'Sprite.png' end if link then item:wikitext( '[[', link, '|' ) end local image, spriteCat = sprite{ iddata = idData, title = plainTitle, image = image, data = 'InvSprite', nourl = args.nourl } item:node( image ) category = spriteCat 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 = plainTitle } :wikitext( num ) if numStyle then number:cssText( numStyle ) end if img and link then item:wikitext( ']]' ) end end if idData and link then item:wikitext( ']]' ) end item:wikitext( category ) return item end -- Main entry point function p.slot( f ) local args = f.args or f if f == mw.getCurrentFrame() and args[1] == nil then args = f:getParent().args end if not args.parsed then args[1] = mw.text.trim( args[1] or '' ) end local modData = { aliases = args.modaliases or '', default = args.mod } if modData.aliases ~= '' then modData.aliases = mw.loadData( 'Module:' .. modData.aliases ) else modData.aliases = nil end if args.mod == '' then modData.default = nil end local frames if args.parsed then frames = args[1] elseif args[1] ~= '' then local randomise = args.class == 'invslot-large' and 'never' or nil frames = p.parseFrameText( args[1], randomise, false, modData ) end local animated = frames and #frames > 1 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', f:expandTemplate{ title = i18n.templateFileUrl, args = { args.default .. '.png' } } ) end --mw.logObject( frames ) if not frames then return tostring( body ) end local activeFrame = frames.randomise == true and random( #frames ) or 1 for i, frame in ipairs( frames ) do local item -- Table is a list, must contain subframes if frame[1] then item = body:tag( 'span' ):addClass( 'animated-subframe' ) local subActiveFrame = frame.randomise and random( #frame ) or 1 for sI, sFrame in ipairs( frame ) do local sItem = makeItem( sFrame, sI, args ) item:node( sItem ) if sI == subActiveFrame then sItem:addClass( 'animated-active' ) end end else item = makeItem( frame, i, args ) body:node( item ) end if i == activeFrame and animated then item:addClass( 'animated-active' ) end end return tostring( body ) end --[[Parses the frame text into a table of frames and subframes, expanding aliases (and optionally retaining a reference), and deciding if the slot can be randomised --]] function p.parseFrameText( framesText, randomise, aliasReference, modData ) local frames = { randomise = randomise } local subframes = {} local subframe local expandedAliases local splitFrames = mw.text.split( mw.text.trim( framesText ), '%s*;%s*' ) for _, frameText in ipairs( splitFrames ) do frameText = frameText:gsub( '^%s*{%s*', function() subframe = true return '' end ) if subframe then frameText = frameText:gsub( '%s*}%s*$', function() subframe = 'last' return '' end ) end local frame = p.makeFrame( frameText, modData and modData.default ) local newFrame = frame if aliases or modData.aliases then local id = frame.name if frame.mod then id = frame.mod .. ':' .. id end local alias = modData and modData.aliases and modData.aliases[id] or aliases and aliases[id] if alias then newFrame = p.getAlias( alias, frame ) if aliasReference then local curFrame = #frames + 1 local aliasData = { frame = frame, length = #newFrame } if subframe then if not subframes.aliasReference then subframes.aliasReference = {} end subframes.aliasReference[#subframes + 1] = aliasData else if not expandedAliases then expandedAliases = {} end expandedAliases[curFrame] = aliasData end end end end if subframe then mergeList( subframes, newFrame ) -- Randomise starting frame for "Any *" aliases, as long as the alias is the only subframe if frames.randomise ~= 'never' and subframes.randomise == nil and frame.name:match( '^Any ' ) then subframes.randomise = true else subframes.randomise = false end if frames.randomise ~= 'never' then frames.randomise = false end if subframe == 'last' then -- No point having a subframe containing a single frame, -- or the subframe being the only frame if #subframes == 1 or #splitFrames == i and #frames == 0 then mergeList( frames, subframes ) else table.insert( frames, subframes ) end subframes = {} subframe = nil end else -- Randomise starting frame for "Any *" aliases, as long as the alias is the only frame if frames.randomise == nil and frame.name:match( '^Any ' ) then frames.randomise = true elseif frames.randomise ~= 'never' then frames.randomise = false end mergeList( frames, newFrame ) end end frames.aliasReference = expandedAliases return frames end --[[Returns a new table with the parts of the parent frame added to the alias --]] function p.getAlias( aliasFrames, parentFrame ) -- If alias is just a name, return the parent frame with the new name if type( aliasFrames ) == 'string' then local expandedFrame = mw.clone( parentFrame ) expandedFrame.name = aliasFrames return { expandedFrame } end -- Single frame alias, put in list if aliasFrames.name then aliasFrames = { aliasFrames } end local expandedFrames = {} for i, aliasFrame in ipairs( aliasFrames ) do local expandedFrame if type( aliasFrame ) == 'string' then expandedFrame = { name = aliasFrame } else expandedFrame = cloneTable( aliasFrame ) end expandedFrame.title = parentFrame.title or expandedFrame.title expandedFrame.mod = parentFrame.mod or expandedFrame.mod expandedFrame.num = parentFrame.num or expandedFrame.num expandedFrame.text = parentFrame.text or expandedFrame.text expandedFrames[i] = expandedFrame end return expandedFrames end function p.expandAlias( parentFrame, alias ) return p.getAlias( alias, parentFrame ) end function p.stringifyFrame( frame ) if not frame.name then return '' end return string.format( '[%s]%s:%s,%s[%s]', frame.title or '', frame.mod or 'Minecraft', frame.name, frame.num or '', frame.text or '' ) end function p.stringifyFrames( frames ) for i, frame in ipairs( frames ) do frames[i] = p.stringifyFrame( frame ) end return table.concat( frames, ';' ) end -- Splits up the frame text into its parts function p.makeFrame( frameText, mod ) -- Simple frame with no parts if not frameText:match( '[%[:,]' ) then return { mod = mod, name = mw.text.trim( frameText ), } end frameText = frameText:gsub( '%s*([%[%]:,;])%s*', '%1' ) local frame = {} frame.title = frameText:match( '^%[([^%]]+)%]' ) frame.mod = frameText:match( '([^:%]]+):' ) or mod local vanilla = { v = 1, vanilla = 1, mc = 1, minecraft = 1 } if frame.mod and vanilla[mw.ustring.lower( frame.mod )] or frame.mod == '' then frame.mod = nil end local nameStart = ( frameText:find( ':' ) or frameText:find( '%]' ) or 0 ) + 1 if nameStart - 1 == #frameText then nameStart = 1 end frame.name = frameText:sub( nameStart, ( frameText:find( '[,%[]', nameStart ) or 0 ) - 1 ) frame.num = math.floor( frameText:match( ',(%d+)' ) or 0 ) if frame.num == 0 then frame.num = nil end frame.text = frameText:match( '%[([^%]]+)%]$' ) return frame end function p.getParts( frameText, mod ) return p.makeFrame( frameText, mod ) end return p
该页面使用的模板:
模板:Documentation header
(
查看源代码
)
模板:Template link
(
查看源代码
)
模板:Tl
(
查看源代码
)
模板:Transclude
(
查看源代码
)
模块:Documentation
(
查看源代码
)
模块:Inventory slot/doc
(
查看源代码
)
模块:ProcessArgs
(
查看源代码
)
返回
模块:Inventory slot
。
导航
快速跳转
TLSL(wiki首页)
- StarLight-Server
奇怪的折跃门
活跃玩家
重要领地合集
小黑屋
SLS官网
wiki工具
wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志