Minecraft Wiki
k (Versie 81259 van DarkShadowTNT (overleg) ongedaan gemaakt)
kGeen bewerkingssamenvatting
 
(4 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 6: Regel 6:
 
modLink = 'Mods/$1/$2',
 
modLink = 'Mods/$1/$2',
 
moduleAliases = [[Module:Inventory slot/Aliases]],
 
moduleAliases = [[Module:Inventory slot/Aliases]],
moduleInvIds = [[Module:InvSprite/IDs]],
+
moduleInvData = [[Module:InvSprite]],
moduleModIds = 'Module:InvSprite/Mods/$1/IDs',
+
moduleModData = 'Module:InvSprite/Mods/$1',
 
moduleRandom = [[Module:Random]],
 
moduleRandom = [[Module:Random]],
 
moduleSprite = [[Module:Sprite]],
 
moduleSprite = [[Module:Sprite]],
Regel 34: Regel 34:
 
local sprite = require( i18n.moduleSprite ).sprite
 
local sprite = require( i18n.moduleSprite ).sprite
 
local aliases = mw.loadData( 'Module:Inventory slot/Aliases' )
 
local aliases = mw.loadData( 'Module:Inventory slot/Aliases' )
local ids = mw.loadData( i18n.moduleInvIds ).ids
+
local ids = mw.loadData( i18n.moduleInvData ).ids
 
local modIds = {}
 
local modIds = {}
 
local pageName = mw.title.getCurrentTitle().text
 
local pageName = mw.title.getCurrentTitle().text
Regel 87: Regel 87:
 
if mod then
 
if mod then
 
local modData = modIds[mod]
 
local modData = modIds[mod]
if not modData and mw.title.new( i18n.moduleModIds:gsub( '%$1', mod ) ).exists then
+
if not modData and mw.title.new( i18n.moduleModData :gsub( '%$1', mod ) ).exists then
modData = mw.loadData( i18n.moduleModIds:gsub( '%$1', mod ) )
+
modData = mw.loadData( i18n.moduleModData :gsub( '%$1', mod ) )
 
modIds[mod] = modData
 
modIds[mod] = modData
 
end
 
end
Regel 106: Regel 106:
 
end
 
end
 
 
  +
-- Do some text trimming, as well as capitalising 'ij' if the string starts with that
 
local link = args.link or ''
 
local link = args.link or ''
  +
local normalLink
 
if link == '' then
 
if link == '' then
 
if mod then
 
if mod then
 
link = i18n.modLink:gsub( '%$1', mod ):gsub( '%$2', name )
 
link = i18n.modLink:gsub( '%$1', mod ):gsub( '%$2', name )
  +
elseif name:match( '^Beschadigde' ) then
else
 
 
normalLink = name:gsub( '^' .. i18n.prefixes.damaged2 .. ' ', '' )
local links = {
 
'Beschadigd dekschild',
+
if normalLink:match( '^ij' ) then
'Beschadigd diamanten zwaard',
+
link = normalLink:gsub('%l', string.upper, 2)
'Beschadigd gouden zwaard',
+
else
'Beschadigd houten zwaard',
+
link = normalLink
'Beschadigd ijzeren zwaard',
 
'Beschadigd schild',
 
'Beschadigd stenen zwaard',
 
'Beschadigd vuursteen en staal',
 
}
 
 
local linksNv = {
 
'Beschadigde boog',
 
'Beschadigde diamanten beenstukken',
 
'Beschadigde diamanten bijl',
 
'Beschadigde diamanten borstplaat',
 
'Beschadigde diamanten helm',
 
'Beschadigde diamanten houweel',
 
'Beschadigde diamanten laarzen',
 
'Beschadigde diamanten schep',
 
'Beschadigde diamanten schoffel',
 
'Beschadigde gouden beenstukken',
 
'Beschadigde gouden bijl',
 
'Beschadigde gouden borstplaat',
 
'Beschadigde gouden helm',
 
'Beschadigde gouden houweel',
 
'Beschadigde gouden laarzen',
 
'Beschadigde gouden schep',
 
'Beschadigde gouden schoffel',
 
'Beschadigde houten bijl',
 
'Beschadigde houten houweel',
 
'Beschadigde houten schep',
 
'Beschadigde houten schoffel',
 
'Beschadigde ijzeren beenstukken',
 
'Beschadigde ijzeren bijl',
 
'Beschadigde ijzeren borstplaat',
 
'Beschadigde ijzeren helm',
 
'Beschadigde ijzeren houweel',
 
'Beschadigde ijzeren laarzen',
 
'Beschadigde ijzeren schep',
 
'Beschadigde ijzeren schoffel',
 
'Beschadigde leren broek',
 
'Beschadigde leren kap',
 
'Beschadigde leren laarzen',
 
'Beschadigde leren tuniek',
 
'Beschadigde maliënbroek',
 
'Beschadigde maliënkap',
 
'Beschadigde maliënkolder',
 
'Beschadigde maliënlaarzen',
 
'Beschadigde schaar',
 
'Beschadigde stenen bijl',
 
'Beschadigde stenen houweel',
 
'Beschadigde stenen schep',
 
'Beschadigde stenen schoffel',
 
'Beschadigde vishengel',
 
'Beschadigde wortel aan een stok',
 
}
 
for _, linkNormaal in ipairs( links ) do
 
name = linkNormaal:gsub( '^' .. i18n.prefixes.damaged .. ' ', '' )
 
link = name
 
 
end
 
end
 
else
 
for _, linkNv in ipairs( linksNv ) do
+
normalLink = name:gsub( '^' .. i18n.prefixes.damaged .. ' ', '' )
name = linkNv:gsub( '^' .. i18n.prefixes.damaged2 .. ' ', '' )
+
if normalLink:match( '^ij' ) then
link = name
+
link = normalLink:gsub('%l', string.upper, 2)
 
else
 
link = normalLink
 
end
 
end
 
end
 
end
Regel 232: Regel 181:
 
local image, spriteCat = sprite{
 
local image, spriteCat = sprite{
 
iddata = idData, title = plainTitle,
 
iddata = idData, title = plainTitle,
image = image, settings = 'InvSprite'
+
image = image, data = 'InvSprite'
 
}
 
}
 
item:node( image )
 
item:node( image )

Huidige versie van 9 jun 2018 om 00:15

Deze pagina heeft nog geen documentatie. Als je weet hoe het werkt, maak het dan alsjeblieft.
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 = {
		'Elk',
        'Elke',
		'Overeenkomend',
        'Overeenkomende',
		'Beschadigd',
        'Beschadigde',
		any = 'Elk',
        any2 = 'Elke',
		matching = 'Overeenkomend',
		matching2 = 'Overeenkomende',
		damaged = 'Beschadigd',
		damaged2 = 'Beschadigde',
	},
	templateFileUrl = 'FileUrl',
}
p.i18n = i18n
p.prefixes = i18n.prefixes

local random = require( i18n.moduleRandom ).random
local sprite = require( i18n.moduleSprite ).sprite
local aliases = mw.loadData( 'Module:Inventory slot/Aliases' )
local ids = mw.loadData( i18n.moduleInvData ).ids
local modIds = {}
local pageName = mw.title.getCurrentTitle().text

-- 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
		item:tag( 'br' )
		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
	
    -- Do some text trimming, as well as capitalising 'ij' if the string starts with that
	local link = args.link or ''
    local normalLink
	if link == '' then
		if mod then
			link = i18n.modLink:gsub( '%$1', mod ):gsub( '%$2', name )
		elseif name:match( '^Beschadigde' ) then
			normalLink = name:gsub( '^' .. i18n.prefixes.damaged2 .. ' ', '' )
            if normalLink:match( '^ij' ) then
                link = normalLink:gsub('%l', string.upper, 2)
            else
                link = normalLink
            end
        else
            normalLink = name:gsub( '^' .. i18n.prefixes.damaged .. ' ', '' )
            if normalLink:match( '^ij' ) then
                link = normalLink:gsub('%l', string.upper, 2)
            else
                link = normalLink
            end
		end
	elseif link:lower() == 'none' then
		link = nil
	end
	if link == pageName then
		link = nil
	end
	
	local formattedTitle
	local plainTitle
	if title == '' then
		plainTitle = name
	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 '', '|', escapedTitle, ']]' )
	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'
		}
		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
		body:tag( 'br' )
		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 "Elk *" or "Elke *" aliases, as long as the alias is the only subframe
			if frames.randomise ~= 'never' and subframes.randomise == nil and
				frame.name:match( '^' .. i18n.prefixes.any .. ' ' ) then
				subframes.randomise = true
			elseif
				frame.name:match( '^' .. i18n.prefixes.any2 .. ' ' ) 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( '^' .. i18n.prefixes.any .. ' ' ) or frame.name:match( '^' .. i18n.prefixes.any2 .. ' ' ) 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