Vorlagenprogrammierung Diskussionen Lua Unterseiten
Modul Deutsch English

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


--[[
 invoke images from keys controlled by config page
]]

local ImageCollection = {
	config = {},
	groups = {},
	data   = {},
	serial = "2024-10-16",
	item   = 0
}

-- failsafe option 
local Failsafe = ImageCollection

-- export table
local p = {}

ImageCollection.formatError = function ( message, errtype )
	-- format error message
	-- parameters:
	--   errtype: (string) error type
	-- returns:
	--   (string) formatted error message

	local html       -- html error object
	local err        -- error type info
	local text = ""  -- message text

	-- default error type
	errtype = errtype or "default"

	-- get error message
	err = ImageCollection.config.error[ errtype ] or ImageCollection.config.error.default
	
	-- get error text
	if type( err.text ) == "string" then
		text = text .. string.format( err.text, "[[" .. ImageCollection.config.source .. "]]", message )
	end
	if type( err.category ) == "string" then
		text = text .. "[[Category:" .. err.category .. "]]"
	end
	
	-- return nothing if no text set
	if text == "" then
		return ""
	end

	-- create and format error message wrapper
	html = mw.html.create( "span" )
		:wikitext( text )
		:addClass( "error" )
	if type( err.class ) == "string" then
		html:addClass( err.class )
	end
	if type( err.style ) == "string" then
		html:cssText( err.style )
	end
	
	-- return
	return tostring( html )
end

ImageCollection.loadConfigJson = function ( page )
	-- load config from json page
	-- parameters:
	--   page: (string) path to config json page
	-- returns:
	--   (bool) true or false by success/fault
	
	local success, c = pcall( mw.loadJsonData, page )
	if type( c ) == "table" then
		if type( c.config ) == "table" then
			ImageCollection.config = c.config
		end
		if type( c.groups ) == "table" then
			ImageCollection.groups = c.groups
		end
		if type( c.data ) == "table" then
			ImageCollection.data = c.data
		end
	end
	
	return success
end

ImageCollection.loadConfigFromTemplate = function ( frame )
	-- load configuration
	-- parameters:
	--   frame: (table) wiki environment frame
	-- returns:
	--   (bool, string) loading successful, error message if needed

	local args    -- arguments of template call
	local cnf     -- configuration page name
	local html    -- html error object
	local r1, r2  -- return values
	
	-- get module parameters
	args = frame.args
	cnf  = args[1]
	if cnf then
		cnf = mw.text.trim( cnf )
		if cnf == "" then
			cnf = false
		end
	end
	if cnf then
		-- load config
		r1 = ImageCollection.loadConfigJson( cnf )
		if r1 then
			r2 = ""
		else
			html = mw.html.create( "span" )
				:addClass( "error" )
				:wikitext( "data call failed" )
			r2 = tostring( html )
		end
	else
		html = mw.html.create( "span" )
			:addClass( "error" )
			:wikitext( "config page missing" )
		r1 = false
		r2 = tostring( html )
	end
	
	return r1, r2
end

ImageCollection.getImageInfo = function ( key )
	-- get the data element for the given key
	-- parameters:
	--   key:  (string) image key
	-- returns:
	--   (bool, table, string) element found, element, key
	
	local img -- image table
	
	img = ImageCollection.data[ key ]
	
	-- invalid key
	if type( img ) ~= "table" then
		return false, {}, key
	end
	
	-- follow alias
	if type( img.alias ) == "string" then
		key = img.alias
		return ImageCollection.getImageInfo( key )
	end
	
	-- valid key
	return true, img, key
end

ImageCollection.invokeImage = function ( key, img, size )
	-- get invocation string for image
	-- parameters:
	--   key:  (string) image key
	--   img:  (string) image info
	--   size: (string) image size
	-- returns:
	--   (string) image invocation wikisytax string
	
	local r      -- return string
	local opt    -- image options
	local alt    -- image alt text
	local link   -- image link
	local invert -- invert image for dark mode
	local class  -- image class
	local desc   -- image description
	
	-- file
	r = "[[File:" .. img.file
	
	-- options
	opt = img.options or ImageCollection.config.defaults.options or nil
	if type( opt ) == "string" and opt ~= "" then
		r = r .. "|" .. opt
	end

	-- size
	if size == "" then
		if type( img.size ) == "string" then
			size = img.size
		else
			size = ImageCollection.config.defaults.size
		end
	end
	r = r .. "|" .. size

	-- alt text
	alt = img.alt or ImageCollection.config.defaults.alt or nil
	if type( alt ) == "string" then
		r = r .. "|alt=" .. alt
	end
	
	-- link
	link = img.link or ImageCollection.config.defaults.link or img.name or key
	if link ~= "@DEFAULT" then
		r = r .. "|link=" .. link
	end
	
	-- invert
	if type( img.invert ) == "boolean" then
		invert = img.invert
	else
		invert = ImageCollection.config.defaults.invert or false
	end
	if invert == true then
		class = "skin-invert-image "
	else
		class = ""
	end
	
	-- class
	class = mw.text.trim( class .. ( img.class or ImageCollection.config.defaults.class or "" ) )
	if class ~= "" then
		r = r .. "|class=" .. class
	end

	-- description
	desc = img.name or ImageCollection.config.defaults.name or key
	r = r .. "|" .. desc
	
	-- finish and return invocation
	r = r .. "]]"
	return r
end

ImageCollection.getImage = function ( key, size )
	-- get image for key in given size
	-- parameters:
	--   key:  (string) image key
	--   size: (string) image size
	-- returns:
	--   (string) image invocation wikisytax string
	
	local found -- key found
	local img   -- image table

	-- get image data and resolve alias
	found, img, key = ImageCollection.getImageInfo( key )
	if found == false then
		return ImageCollection.formatError( string.format( ImageCollection.config.i18n.errorKeyNotFound or "", key ), "keynotfound" )
	end
	
	-- error
	if type( img.error ) == "string" then
		return ImageCollection.formatError( img.error, "manual" )
	end
	
	-- create image invocation
	return ImageCollection.invokeImage( key, img, size )

end

p.f = function ( frame )
	-- return image, access from templates
	-- parameters:
	--   frame: (table) wiki environment frame
	-- returns:
	--   (string) image invocation wikisytax string
	
	local success -- success in config load
	local error   -- error message from config load
	local args    -- arguments of template call
	local key     -- image key
	local size    -- image size
	
	-- load config
	success, error = ImageCollection.loadConfigFromTemplate( frame )
	if success == false then
		return error
	end
	
	-- get template parameters
	args = frame:getParent().args
	key  = mw.text.trim( args[1] or "" )
	size = mw.text.trim( args[2] or "" )
	
	-- call main and return
	return ImageCollection.getImage( key, size )
end

setmetatable( p,  { __call = function ( func, ... )
                                 setmetatable( p, nil );
                                 return Failsafe;
                             end } );

return p
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy