Modul:Failsafe

Aus Wikivoyage
Dokumentation für das Modul Failsafe[Ansicht] [Bearbeiten] [Versionsgeschichte] [Aktualisieren]

Verwendungszweck

Das Modul stellt eine Funktion zur Einbindung in andere Module zur Versionsprüfung bereit. Üblicherweise gelangt diese Funktion bei Modulimporten zum Einsatz, wird aber auch für Wikivoyage-Module bereitgestellt.

Versionsbezeichnung auf Wikidata: 2022-04-25 Ok!

Funktionen

function fs._failsafe( version, moduleInterface )
  • 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)
    • moduleInterface
      • Tabelle mit Angaben zum Modul.
  • Zurückgelieferter Wert:
    • Version oder false
function fs.getModuleVersion( frame )
  • Liefert das Versionsdatum aus Wikidata bzw. dem Modul selbst und markiert, ob beide Angaben identisch sind, wenn sie vorhanden sind.
  • Vorgaben:
    • Keine

Aufbau der moduleInterface-Tabelle

local Modulname = {
	suite    = 'Modulname',
	sub      = 'Untermodul',  
	serial   = '2019-07-09',
	item     = 12345678,   -- Wikidata id

	-- nachfolgende kommen vor, aber nicht bekannt, was sie bewirken sollen

	frame    = false,
	ns       = -9999,      -- number; current namespace number
	nsDocs   = -99999,     -- number; central documentation namespace number
	title    = false,      -- current page Title object
	transl   = false,
	subpages = ?,
	suffix   = ?,
	swift    = ?,
	start    = ?,          -- string; defined pageDocRoot argument
	script   = ?,          -- string; module name (main)
	say      = ?,          -- string; message key
	specific = ?,          -- string, optional; additional information
	collect  = ?,
	lazy     = ?,
	lead     = ?,
}

Mehr evtl. in Modul:Vorlage:LuaModuleDoc auf der deutschen Wikipedia.

Beispiele

  • function fs._failsafe( nil, moduleInterface )
    
  • {{#invoke: {{BASEPAGENAME}} | failsafe }}

Liefern die Version aus dem Modul selbst.


  • function fs._failsafe( 'wikidata', moduleInterface )
    
  • {{#invoke: {{BASEPAGENAME}} | failsafe | wikidata }}

Liefern die Version aus Wikidata.


  • function fs._failsafe( '2019-07-09', moduleInterface )
    
  • {{#invoke: {{BASEPAGENAME}} | failsafe | 2019-07-09 }}

Vergleichen die angeforderte Version mit der Modulversion.


  • {{#ifeq: {{#invoke:{{BASEPAGENAME}} | failsafe}} | {{#invoke:{{BASEPAGENAME}} | failsafe | wikidata }}
    | {{ombox | type = notice | image = [[Image:Blue check.svg|30px]] | text = Das Modul ist auf dem aktuellen Stand. }}
    }}
Prüft, ob die Version auf Wikidata mit der Modulversion identisch ist.
Hinweise
-- module interface
local Failsafe = {
	suite  = 'Failsafe',
	serial = '2022-04-25',
	item   = 65306115
}

local strings = {
	docPage           = 'Doku',
	ok                = '[[File:Artículo bueno.svg|16px|text-bottom|Ok!]]',
	notOk             = '[[File:Symbol oppose vote.svg|15px|text-bottom|Contra]][[Category:Andere Modulversion in Wikidata]]',
	versionText       = 'Versionsbezeichnung auf Wikidata:',
	noVersion         = 'keine Version verfügbar'
}

-- modul variable and administration
local fs = {
	moduleInterface = Failsafe
}

-- possible vaules of version
--  nil, false: no version required
--  string:     string of version required
--  table:      frame table (template, #invoke)
-- aModuleInterface
--  table

function fs._failsafe( version, aModuleInterface )
	if type( aModuleInterface ) ~= 'table' then
		return false
	end

	local i, s, v

	-- check if version is a frame table
	if type( version ) == 'table' and type( version.args ) == 'table' then
		s = version.args[ 1 ]
		if not s and type( version.getParent ) == 'function' then
			i = version:getParent()
			if i then
				s = i.args[ 1 ]
			end
		end
		version = s
	end
	-- version should be a string
	if type( version ) == 'string' then
		-- check if empty string
		version = mw.text.trim( version )
		if version == '' then
			version = nil
		end
	else
		version = nil
	end

	-- getting version from Wikidata
	if version == 'wikidata' then
		version = nil
		i = aModuleInterface.item
		if type( i ) == 'number' and i > 0 then
			s = mw.wikibase.getBestStatements( 'Q' .. i, 'P348' )
			for i = 1, #s, 1 do
				if s[ i ].mainsnak.snaktype == 'value' then
					v = s[ i ].mainsnak.datavalue.value
					if v ~= '' then
						return v:gsub( '%.', '-' )
					end
				end
			end
		end
	end

	if not aModuleInterface.serial then
		return false
	elseif not version or version <= aModuleInterface.serial then
		return aModuleInterface.serial
	else
		return false
	end
end

local function getModule( title )
	return require( 'Module:' .. title )
end

function fs.getModuleVersion( frame )
	local result = strings.versionText .. ' ' .. strings.noVersion
	local fromModule, fromWikidata, m, success

	local title = mw.ustring.gsub( mw.title.getCurrentTitle().text, '/' .. strings.docPage, '' )
	if title == 'Failsafe' then -- the module itself
		success = true
		m = fs
	else
		success, m = pcall( getModule, title )
	end
	if success then
		if m.moduleInterface then
			fromModule = m.moduleInterface.serial
			fromWikidata = fs._failsafe( 'wikidata', m.moduleInterface )
		end
		if fromWikidata or fromModule then
			result = strings.versionText .. ' <code>'
				.. ( fromWikidata or fromModule ) .. '</code>'
			if fromWikidata and fromModule then
				result = result .. ' ' ..
					( fromWikidata == fromModule and strings.ok or strings.notOk )
			end
		end
	end

	return result
end

return fs