Modul:Scroll Gallery

Template-info.png Dokumentation für das Modul Scroll Gallery[Ansicht] [Bearbeiten] [Versionsgeschichte] [Aktualisieren]

Anwendung

Das Modul wird direkt von der Vorlage {{Scroll Gallery}} aufgerufen. Parameterbeschreibung siehe dort.

Versionsbezeichnung auf WikiData: 2020-10-24

Globale Funktionen

function sg.gallery( frame )
  • Vorgaben:
    • frame
      • tabelle: Parametertabelle, die vom #invoke-Aufruf übergeben wird.
  • Zurückgelieferter Wert:
    • string: MediaWiki-Quellcode der Bildergalerie (Scroll Gallery).
function sg.scrollGallery()
  • Vorgaben:
    • Keine
  • Zurückgelieferter Wert:
    • tabelle: Moduldokumentationstabelle.
function sg.failsafe( version )
  • Vorgaben:
    • version
      • nil, false: keine Versionsprüfung notwendig. Versionsnummer wird aus dem Modul selbst bezogen.
      • string: Zeichenkette der geforderten Version. Wenn version = 'wikidata' ist, wird die Versionsnummer aus Wikidata bezogen, wenn sie dort vorhanden ist. Ansonsten aus dem Modul selbst. Wenn version eine Versionsnummer enthält, wird sie mit der Version im Modul verglichen. Wenn die angeforderte Version kleiner oder gleich der Modulversion ist, wird die aktuelle Modulversion zurückgeliefert, ansonsten false.
      • table: frame-Tabelle (template, #invoke).
  • Zurückgelieferter Wert:
    • Version oder false.

Benötigte weitere Module

Dieses Modul benötigt folgende weitere Module: Failsafe • Yesno
Hinweise
-- documentation
local scrollGallery = {
	suite  = 'Scroll Gallery',
	serial = '2020-10-24',
	item   = 87862715
}

-- module import
require( 'Module:No globals' )
local fs = require( 'Module:Failsafe' )
local yn = require( 'Module:Yesno' )

-- module variable
local sg = {
	-- miscellaneous messages
	texts = {
		fileNS         = { '[Ff]ile', '[Ii]mage', '[Dd]atei', '[Bb]ild' },
		missingFile    = '<span class="error">Fehlender Dateiname</span>[[Category:Bildergalerie: fehlender Dateiname]] ',
		noImage        = '<span class="error">Kein Bild definiert</span>[[Category:Bildergalerie: kein Bild definiert]] ',
		sizeUsed       = '[[Category:Bildergalerie: Größenangaben verwendet]]',
		unknownFiles   = '<span class="error">Fehlerhafte(r) Dateiname(n)</span>[[Category:Bildergalerie: fehlerhafte Dateinamen]] ',
		unknownParams  = '<span class="error">Fehlerhafte(r) Parameter</span>[[Category:Bildergalerie: fehlerhafte Parameter]] '
	},

	-- possible argument identifiers
	params = {
		align          = { 'align', 'Ausrichtung', default = 'right' },
		background     = { 'background', 'Hintergrund' },
		border         = { 'border', 'Rahmen' },
		headerStyles   = 'headerStyles',
		height         = { 'height', 'maxHeight', 'Höhe' },
		hideUnitHeader = { 'hideUnitHeader', default = 'no' },
		imageGrStyles  = 'imageGrStyles',
		loop           = { 'loop', 'Schleife', default = 'yes' },
		styles         = 'styles',
		timeDependent  = { 'timeDependent', default = 'no' },
		title          = { 'title', 'Titel' },
		width          = { 'width', 'Breite', 'Größe' }
	},

	-- possible alignment values
	align = {
		left      = 'left',
		links     = 'left',
		right     = 'right',
		rechts    = 'right',
		center    = 'center',
		mitte     = 'center',
		zentriert = 'center'
	},

	-- graphics and video extensions excluding audio extensions
	extensions = { 'tif', 'tiff', 'png', 'gif', 'jpg', 'jpeg', 'jpe', 'webp',
		'xcf', 'ogg', 'ogv', 'svg', 'pdf', 'djvu', 'stl', 'webm', 'mpg', 'mpeg' },

	-- gallery container styles
	css = {
		center = {
			clear = 'both',
			display = 'table',
			margin = '0 auto'
		},
		left = {
			clear = 'left',
			float = 'left',
			margin = '0 1.4em 0.5em 0'
		},
		right = {
			clear = 'right',
			float = 'right',
			margin = '0 0 0.5em 1.4em'
		}
	}
}

local errorMsgs = {}

-- add error message to errorMsgs table
local function addErrorMsg( msg )
	table.insert( errorMsgs, msg )
end

-- get errorMsgs table as string
local function getErrorMsgs()
	local result = table.concat( errorMsgs, ' ' )
	if result ~= '' then
		result = result .. ' '
	end
	return result
end

-- check if param is set: not nil or empty
local function isSet( param )
	return param and param ~= '';
end

-- check for possible arguments against list table
local function checkParams( frameArgs, list )
	local complete = {}
	local args = {}

	-- named arguments
	for key, value in pairs( list ) do
		if type( value ) == 'table' then
			for key2, value2 in ipairs( value ) do
				complete[ value2 ] = key
				args[ key ] = args[ key ] or frameArgs[ value2 ]
			end
			args[ key ] = args[ key ] or ''
		elseif value ~= '' then
			complete[ value ] = key
			args[ key ] = frameArgs[ value ] or ''
		else
			complete[ key ] = key
			args[ key ] = frameArgs[ key ] or ''
		end
		if args[ key ] == '' and type( value ) == 'table' and value.default then
			args[ key ] = value.default
		end
	end

	local ok = true
	for key, value in pairs( frameArgs ) do
		-- numbered arguments
		if tonumber( key ) then
			-- frameArgs[ key ] cannot be nil
			args[ key ] = mw.text.trim( frameArgs[ key ] )
		end
		if not complete[ key ] and not tonumber( key ) then
			ok = false
		end
	end
	if not ok then
		addErrorMsg( sg.texts.unknownParams )
	end
	return args
end

-- make image-size parameter string from width and height with check
local function makeSize( width, height )
	if width ~= '' then
		width = width:gsub( 'px$', '' )
	end
	if height ~= '' then
		height = height:gsub( 'px$', '' )
	end

	local at = width:find( 'x' )
	if at then
		height = width:sub( at + 1, #width )
		width = width:sub( 1, at - 1 )
	end

	local value = tonumber( width )
	local size = ''
	if value and value > 10 and value <= 1000 then
		size = width
	end
	value = tonumber( height )
	if value and value > 10 and value <= 1000 then
		size = size .. 'x' .. height
	end
	if size ~= '' then
		return '|' .. size .. 'px'
	else
		return ''
	end
end

-- main function for Scroll Gallery template
function sg.gallery( frame )
	local args = checkParams( frame:getParent().args, sg.params )

	-- generate output: outer div and title
	local gallery = mw.html.create( 'div' )
		:addClass( 'ImageGroup' )
	if yn( args.timeDependent, false ) then
		gallery:addClass( 'timeDependent' )
	end
	if not yn( args.loop, true ) then
		gallery:addClass( 'noLoop' )
	end
	if yn( args.hideUnitHeader, false ) then
		gallery:addClass( 'hideUnitHeader' )
	end

	-- add styles
	local node
	if args.border ~= '' then
		gallery:css( 'border-color', args.border )
	end
	if args.background ~= '' then
		gallery:css( 'background-color', args.background )
	end
	local align = sg.align[ args.align:lower() ] or ''
	if align == 'left' then
		gallery:css( sg.css.left )
	elseif align == 'center' then
		gallery:css( sg.css.center )
	else -- default: right
		gallery:css( sg.css.right )
	end
	gallery:cssText( args.styles )
	if args.title ~= '' then
		node = mw.html.create( 'div' )
			:addClass( 'ImageGroupHeader' )
			:wikitext( args.title )
		if args.headerStyles ~= '' then
			node:cssText( args.headerStyles )
		end
		gallery:node( node )
	end

	-- prepare size attribute
	local size = makeSize( args.width, args.height )

	-- add image groups and images
	local i = 1
	local ok = true
	local fileOk, imNode
	while isSet( args[ i ] ) do
		-- delete namespace
		for j, ns in ipairs( sg.texts.fileNS ) do
			args[ i ] = mw.ustring.gsub( args[ i ], '^' .. ns .. ':', '' )
		end

		-- check files for possible file extensions
		fileOk = false
		if ok then
			for j, ext in ipairs( sg.extensions ) do
				if args[ i ]:lower():find( '^.+%.' .. ext .. '$' ) then
					fileOk = true
					break
				end
			end
		end
		if not fileOk then
			ok = false
		end

		-- prepare image caption
		if isSet( args[ i + 1 ] ) then
			args[ i + 1 ] = '|' .. args[ i + 1 ]
		else
			args[ i + 1 ] = ''
		end

		-- generate image syntax and create container for additional img styles
		imNode = mw.html.create( 'div' )
			:addClass( 'ImageGrUnitInner' )
			:wikitext( mw.ustring.format( '[[File:%s|thumb|center%s%s]]',
				args[ i ], size, args[ i + 1 ] ) )
		if args.imageGrStyles ~= '' then
			imNode:cssText( args.imageGrStyles )
		end
		-- create image-container div for scroll icons and image
		node = mw.html.create( 'div' )
			:addClass( 'ImageGrUnit' )
			:node( imNode )
		if i > 1 then
			node:css( 'display', 'none' )
		end
		gallery:node( node )

		i = i + 2
	end

	-- add error and hint messages
	if not isSet( args[ i ] ) and isSet( args[ i + 1 ] ) then
		addErrorMsg( sg.texts.missingFile )
	end
	if not isSet( args[ 1 ] ) then
		addErrorMsg( sg.texts.noImage )
	end
	if not ok then
		addErrorMsg( sg.texts.unknownFiles )
	end
	if args.width .. args.height ~= '' then
		addErrorMsg( sg.texts.sizeUsed )
	end
	return getErrorMsgs() .. tostring( gallery )
end

-- module administration
function sg.scrollGallery()
	return scrollGallery
end

-- check modul version against Wikidata entry
function sg.failsafe( version )
	return fs._failsafe( version, scrollGallery ) or ''
end

return sg