Minecraft Wiki
Registrieren
Advertisement
[Lesen | Bearbeiten | Versionen | Aktualisieren]Buch und Feder DokumentationSpringe zum Quelltext ↴Lua logo Zum Gebrauch von Lua-Modulen siehe die Modul-Hilfe.

Das Modul Sprite stellt Funktionen zur Verfügung, die zur Darstellung von Sprites dienen:

  • base: Basis, auf der alle weiteren Funktionen aufbauen
  • sprite: Anzeige des richtigen Sprite
  • link: Anzeige und Verlinkung des nachfolgenden Text
  • doc: Automatische Erstellung einer ID-Tabelle mit Bild, ID und Name(n) aus dem angegebenen Sprite-Untermodul

Sprites mit falscher ID oder gelöschte Sprites aufgrund von Änderungen der Spritedatei werden in der Kategorie:Fehlender Sprite gemeldet.

Seiten, die als veraltet gekennzeichnete Sprites verwenden, werden in der Kategorie:Veralteter Sprite gemeldet.

Aufruf

Die Parameter des Aufrufers werden automatisch übergeben. Das sind:

Parameter Funktion Standard
{{#invoke: Sprite | base }}
settings Legt das verwendete Spritesheet fest. Keine
scale Die Skalierung des Sprites. Wenn nicht angegeben, wird dieser Parameter von den durch settings angegebenen Einstellungen festgelegt. 1
sheetsize Die Größe des Spritesheets. Wenn nicht angegeben, wird dieser Parameter von den durch settings angegebenen Einstellungen festgelegt. 256
size Die Größe eines einzelnen Sprites. Wenn nicht angegeben, wird dieser Parameter von den durch settings angegebenen Einstellungen festgelegt. 16
pos Die Position des Standard-Sprites. Wenn nicht angegeben, wird dieser Parameter von den durch settings angegebenen Einstellungen festgelegt. 1
align Die vertikale Ausrichtung des Bildes zum Text. Wenn nicht angegeben, wird dieser Parameter von den durch settings angegebenen Einstellungen festgelegt. 1
{{#invoke: Sprite | sprite }}
(Zusätzlich zu den Parametern von base)
ID Die ID des anzuzeigenden Sprites. ?
nocat Wenn dieser Parameter gesetzt wird, wird die Seite keiner Kategorie zugeordnet, wenn ein Sprite fehlt oder veraltet ist. ?
{{#invoke: Sprite | link }}
(Zusätzlich zu den Parametern von base und sprite)
ID Die ID des anzuzeigenden Sprites. ?
Link Die Seite, auf die der Sprite verlinken soll. Wenn dieser Parameter nicht angegeben wird, wird auf die Seite, die durch ID angegeben wird, verlinkt. ?
Text Der Text, der hinter dem Sprite angezeigt werden soll. Wenn dieser Parameter nicht angegeben wird, wird als Text der Link angezeigt. ?
{{#invoke: Sprite | doc }}
Einstellungen Legt das zu dokumentierende Spritesheet fest. Keine
refresh Wenn dieser Parameter gesetzt wurde, wird die Dokumentation neu generiert. ?

Anwendung


local p = {}
function p.base( f )
	local args = f
	if f == mw.getCurrentFrame() then 
		args = require( 'Modul:ParameterUmwandeln' ).merge( true )
	else
		f = mw.getCurrentFrame()
	end
	
	local data = args.data and mw.loadData( 'Modul:' .. args.data ) or {}
	local settings = data.settings
	
	-- Default settings
	local default = {
		scale = 1,
		sheetsize = 256,
		size = 16,
		pos = 1,
		align = 'text-top'
	}
	
	local defaultStyle = default
	if settings then
		if not settings.stylesheet then
			-- Make a separate clone of the current default settings
			defaultStyle = mw.clone( default )
		end
		for k, v in pairs( settings ) do
			default[k] = v
		end
	end
	
	local setting = function( arg )
		return args[arg] or default[arg]
	end
	
	local sprite = mw.html.create( 'span' ):addClass( 'sprite' )
	
	-- mw.html's css method performs very slow escaping, which doubles the time it takes
	-- to run, so we'll construct the styles manually, and put them in the cssText
	-- method, which only does html escaping (which isn't slow)
	local styles = {}
	
	if not setting( 'nourl' ) and setting( 'url' ) then
		styles[#styles + 1] = 'background-image:' .. ( setting( 'url' ).url or setting( 'url' ) )
	end
	if setting( 'stylesheet' ) then
		sprite:addClass(
			setting( 'classname' ) or
			mw.ustring.lower( setting( 'name' ):gsub( ' ', '-' ) ) .. '-sprite'
		)
	elseif not setting( 'url' ) then
		styles[#styles + 1] = 'background-image:' .. p.getUrl(
			setting( 'image' ) or setting( 'name' ) .. 'Sprite.png'
		).url
	end
	local class = setting( 'class' )
	if class then
		sprite:addClass( class )
	end
	
	local size = setting( 'size' )
	local sheetWidth = setting( 'sheetsize' )
	local tiles = sheetWidth / size
	local pos = setting( 'pos' ) - 1
	local scale = setting( 'scale' )
	local autoScale = setting( 'autoscale' )
	
	if pos then
		local left = pos % tiles * size * scale
		local top = math.floor( pos / tiles ) * size * scale
		styles[#styles + 1] = 'background-position:-' .. left .. 'px -' .. top .. 'px'
	end
	
	if not autoScale and scale ~= defaultStyle.scale then
		styles[#styles + 1] = 'background-size:' .. sheetWidth * scale .. 'px auto'
	end
	if size ~= defaultStyle.size or ( not autoScale and scale ~= defaultStyle.scale ) then
		styles[#styles + 1] = 'height:' .. size * scale .. 'px'
		styles[#styles + 1] = 'width:' .. size * scale .. 'px'
	end
	
	local align = setting( 'align' )
	if align ~= defaultStyle.align then
		styles[#styles + 1] = 'vertical-align:' .. align
	end
	styles[#styles + 1] = setting( 'css' )
	
	sprite:cssText( table.concat( styles, ';' ) )
	
	local text = setting( 'text' )
	local root
	local spriteText
	if text then
		if not args['wrap'] then
			root = mw.html.create( 'span' ):addClass( 'nowrap' )
		end
		spriteText = mw.html.create( 'span' ):addClass( 'sprite-text' ):wikitext( text )
	end
	
	local title = setting( 'title' )
	if title then
		( root or sprite ):attr( 'title', title )
	end
	
	if not root then
		root = mw.html.create( '' )
	end
	root:node( sprite )
	if spriteText then
		root:node( spriteText )
	end
	
	local link = setting( 'link' ) or ''
	if link ~= '' and mw.ustring.lower( link ) ~= 'none' then
		-- External link
		if link:find( '//' ) then
			return '[' .. link .. ' ' .. tostring( root ) .. ']'
		end
		
		-- Internal link
		local linkPrefix = setting( 'linkprefix' ) or ''
		return '[[' .. linkPrefix .. link .. '|' .. tostring( root ) .. ']]'
	end
	
	return tostring( root )
end

function p.sprite( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = require( 'Modul:ParameterUmwandeln' ).merge( true )
	else
		f = mw.getCurrentFrame()
	end
	
	local data = args.data and mw.loadData( 'Modul:' .. args.data ) or {}
	local categories = {}
	local idData = args.iddata
	if not idData then
		local name = args.name or data.settings.name
		local id = mw.text.trim( tostring( args[1] or '' ) )
		idData = data.ids[id] or data.ids[mw.ustring.lower( id ):gsub( '[%s%+]', '-' )]
	end
	
	local title = mw.title.getCurrentTitle()
	-- Remove categories on language pages, talk pages, and in User/UserWiki/UserProfile namespaces
	local disallowCats = args.nocat or title.isTalkPage or title.nsText:find( '^User' ) or title.nsText:find( '^Benutzer' )
	if idData then
		if idData.deprecated then
			args.class = ( args.class or '' ) .. ' sprite-deprecated'
			if not disallowCats then
				categories[#categories + 1] = '[[Kategorie:Veralteter Sprite]]'
			end
		end
		
		args.pos = idData.pos
	elseif not disallowCats then
		categories[#categories + 1] = '[[Kategorie:Fehlender Sprite]]'
	end
	
	return p.base( args ), table.concat( categories )
end

function p.link( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = require( 'Modul:ParameterUmwandeln' ).merge( true )
	end
	
	local link = args[1]
	if args[1] and not args.id then
		link = args[1]:match( '^(.-)%+' ) or args[1]
	end
	local text
	if not args.notext then
		text = args.text or args[3] or args[2] or link
	end
	
	args[1] = args.id or args[1]
	args.link = args.link or args[2] or link
	args.text = text
	
	return p.sprite( args )
end

function p.getUrl( image, query, classname )
	local f = mw.getCurrentFrame()
	local t = {
		url = f:expandTemplate{
			title = 'DateiUrl',
			args = { image, query = query }
		},
	}
	if classname and classname ~= '' then
		t.style = f:expandTemplate{
			title = 'DateiUrlStyle',
			args = { classname, image, query = query }
		}
	end
	return t
end

function p.getParsedUrlStyle( f )
	local args = f:getParent().args
	local module = args[1]
	return require( 'Modul:' .. module ).settings.url.style
end

function p.doc( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f.args
	else
		f = mw.getCurrentFrame()
	end
	local dataPage = mw.text.trim( args[1] )
	local data = mw.loadData( 'Modul:' .. dataPage )
	
	local getProtection = function( title, action, extra )
		local protections = { 'edit' }
		if extra then
			protections[#protections + 1] = extra
		end
		
		local addProtection = function( protection )
			if protection == 'autoconfirmed' then
				protection = 'editsemiprotected'
			elseif protection == 'sysop' then
				protection = 'editprotected'
			end
			
			protections[#protections + 1] = protection
		end
		
		local direct = title.protectionLevels[action] or {}
		for _, protection in ipairs( direct ) do
			addProtection( protection )
		end
		local cascading = title.cascadingProtection.restrictions[action] or {}
		if #cascading > 0 then
			protections[#protections + 1] = 'protect'
		end
		for _, protection in ipairs( cascading ) do
			addProtection( protection )
		end
		
		return table.concat( protections, ',' )
	end
	
	local spriteStyle = ''
	if data.settings.url and data.settings.url.style then
		spriteStyle = data.settings.url.style
	end
	
	local dataTitle = mw.title.new( 'Modul:' .. dataPage )
	-- Temporary until this is updated
	local classname = ''
	if data.settings.stylesheet then
		classname = data.settings.classname or
			mw.ustring.lower( data.settings.name:gsub( ' ', '-' ) ) .. '-sprite'
	end
	local spritesheet = data.settings.image or data.settings.name .. 'Sprite.png'
	local spriteTitle = mw.title.new( 'Datei:' .. spritesheet )
	local dataProtection = getProtection( dataTitle, 'edit' )
	local spriteProtection = getProtection( spriteTitle, 'upload', 'upload,reupload' )
	local body = mw.html.create( 'div' ):attr( {
		id = 'spritedoc',
		['data-dataprotection'] = dataProtection,
		['data-datatimestamp'] = f:callParserFunction( 'REVISIONTIMESTAMP', 'Modul:' .. dataPage ),
		['data-datapage'] = 'Modul:' .. dataPage,
		['data-spritesheet'] = spritesheet,
		['data-spriteprotection'] = spriteProtection,
		['data-urlfunc'] = "require( [[Modul:Sprite]] ).getUrl( '" .. spritesheet .. "', '$1', '" .. classname .. "' )",
		['data-refreshtext'] = mw.text.nowiki( '{{#invoke:sprite|doc|' .. dataPage .. '|refresh=1}}' ),
		['data-settings'] = mw.text.jsonEncode( data.settings ),
	} )
	
	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 = mw.ustring.lower( 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.base{ pos = pos, data = dataPage, nourl = spriteStyle ~= '' } )
			
			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 )
		
		if idData.deprecated then
			codeElem:addClass( 'spritedoc-deprecated' )
		end
		names:wikitext( tostring( nameElem ) )
	end
	
	if args.refresh then
		return '', '', tostring( body )
	end
	local styles = f:callParserFunction( '#widget:SpriteDoc.css' )
	return styles, spriteStyle, tostring( body )
end
return p
Advertisement