Diese Dokumentationsseite spiegelt den Inhalt der Seite Modul:Common/Doku wieder. |
Modulabhängigkeiten
Modulinfo
Das Modul Common stellt Funktionen bereit, welche allgemein in anderen Modulen weiterverwendet werden.
Öffentliche Methoden
Das Modul stellt folgende öffentliche Methoden bereit:
extractDataFromPrefix
- Extrahiert alle Argumente, die mit 'argPrefix' beginnen, aus übergebenen Vorlageparametern
- keyPrefix string: Präfix der Vorlageparametern.
- Beispiel: |vorlage_param_1=foo, |vorlage_param_2=bar PREFIX = vorlage_param_
- args tabelle: Argumente
- mode string: Betriebsmodus
- Voreinstellung %w = Zeichenketten oder ganze Zahlen
- %a = Zeichenketten
- %d = Ziffern
- Siehe https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
- keyPrefix string: Präfix der Vorlageparametern.
- Extrahiert alle Argumente, die mit 'argPrefix' beginnen, aus übergebenen Vorlageparametern
setDisplayTitle
- Setzt den Abzeigetitel der aktuellen Seite
- framm tabelle: Der zu bearbeitende Frame
- title string: Seitentitel
- flag string: Entweder 'noerror' oder 'noreplace'
- Setzt den Abzeigetitel der aktuellen Seite
removeTypeSuffix
- Entfernt
(...)
Suffixe aus einer Zeichenkette- Beispiel:
- Eingabe:
Orion (Raumschiff)
- Aufruf:
common.removeTypeSuffix( 'Orion (Raumschiff)', 'Raumschiff' )
- Ausgabe:
Orion
- Eingabe:
- Beispiel:
- Entfernt
checkSmwResult
- Prüft, ob das Setzen von SMW-Daten erfolgreich war
checkApiResponse
- Prüft, ob die Api-Anfrage erfolgreich war und ob die Antwort gültig ist
toNumber
- Konvertiert eine Eingabe zu einer Zahl
formatNum
- Formatiert eine Zahl entsprechend der Sprache des Inhalts
getImage
- Findet das erste vorhandene Bild für die aktuelle Seite oder angegebene Namen
booleanToText
- Ausgabe einer Zeichenkette basierend auf dem wahrheitsgemäßen Eingangswert
spairs
- Sortiertes
pairs
- Sortiertes
titleparts.get
mapTranslation
- Mapt
{ de_DE: '...', en_EN: '...' }
zu einem Format was Semantic Media Wiki versteht
- Mapt
getLocaleForPage
- Gibt den Sprachcode der aktuellen Seite zurück
Tests
✔ Alle Tests bestanden.
Name | Expected | Actual | |
---|---|---|---|
✔ | testBooleanToTextFalseish | ||
✔ | testBooleanToTextFalseishCustomText | ||
✔ | testBooleanToTextTrueish | ||
✔ | testExtractPrefixNumerical | ||
✔ | testExtractPrefixNumericalEmpty | ||
✔ | testFormatNum | ||
✔ | testFormatNumberString | ||
✔ | testFormatNumberStringFail | ||
✔ | testRemoveTypeSuffix | ||
✔ | testRemoveTypeSuffixNoMatch | ||
✔ | testToNumberNum | ||
✔ | testToNumberString | ||
✔ | testToNumberStringFail |
local common = {}
--- Extracts all arguments starting with 'argPrefix' form passed args
--- keyPrefix string Prefix of template parameters. Example: |template_param_1=foo, |template_param_2=bar PREFIX = template_param_
--- args table Frame arguments
--- mode string Param operation mode default %w = strings or integers. %a = strings, %d = digits. See https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
--- @param keyPrefix string
--- @param args table
--- @param mode string
--- @return table
function common.extractDataFromPrefix( keyPrefix, args, mode )
local data = {}
local operationMode = mode
if operationMode == nil then
operationMode = '%w'
end
for key, value in pairs( args ) do
if mw.ustring.match( key, keyPrefix .. operationMode ) and value ~= nil then
table.insert( data, value )
end
end
return data
end
--- Set the Displaytitle of the current page
--- frame table The frame to operate on
--- title string Page title
--- flag string Either 'noerror' or 'noreplace'
--- @param frame table
--- @param title string
--- @param flag string
function common.setDisplayTitle( frame, title, flag )
if flag ~= nil and ( flag ~= 'noerror' or flag ~= 'noreplace' ) then
flag = nil
end
return frame:callParserFunction{
name = 'DISPLAYTITLE:' .. title,
args = {
flag
}
}
end
--- Removes (...) suffixes
--- @param pageName string
--- @param suffix string|table
function common.removeTypeSuffix( pageName, suffix )
if type( suffix ) == 'table' then
for _, toRemove in pairs( suffix ) do
pageName = common.removeTypeSuffix( pageName, toRemove )
end
return pageName
end
return mw.text.trim( pageName:gsub( '%(' .. suffix .. '%)', '' ), '_ ' )
end
--- Create interwiki links for a given title
--- @param pageName string
function common.generateInterWikiLinks( pageName )
if pageName == nil or #pageName == '' then
return ''
end
local prefixes = { 'en', 'zh' }
local suffixes = { 'Raumschiff', 'Sternensystem', 'Fahrzeug' }
local out = ''
for _, prefix in pairs( prefixes ) do
local page = common.removeTypeSuffix( pageName, suffixes )
if prefix == 'zh' then
page = 'wiki/' .. page
end
out = out .. string.format( '[[%s:%s]]', prefix, page )
end
return out
end
--- Checks if Setting SMW Data was successful
--- @param result table
function common.checkSmwResult( result )
if result ~= true and result.error ~= nil then
error( 'Semantic Mediawiki Fehler ' .. result.error )
end
end
--- Checks if Api Request was successful and if the Response is valid
--- @param response table
--- @param errorOnData boolean
--- @param errorOnData boolean
function common.checkApiResponse( response, errorOnStatus, errorOnData )
if response[ 'status_code' ] ~= nil and response[ 'status_code' ] ~= 200 then
if errorOnStatus == nil or errorOnStatus == true then
error( 'API Anfrage resultierte in Fehlercode ' .. response[ 'status_code' ] .. '(' .. response[ 'message' ] .. ')', 0 )
end
end
if response[ 'data' ] == nil then
if errorOnData == nil or errorOnData == true then
error( 'API Daten entalten kein "data" Feld', 0 )
end
end
end
--- Convert an input to number
--- @param num string|integer Input
--- @param onFail string|integer Output if conversion fails
--- @param base integer Base for tonumber, defaults to 10
--- @return number
function common.toNumber( num, onFail, base )
base = base or 10
if num == nil then
return onFail
end
local numCopy = num
if type( num ) == 'string' then
numCopy = num:gsub( ',', '.' )
end
numCopy = tonumber( numCopy, base )
if numCopy == nil then
return onFail
end
return numCopy
end
--- Formats a number according to the content language
--- @param num number|string
function common.formatNum( num, onFail )
local converted = common.toNumber( num, false )
if converted == nil or converted == false then
return onFail or false
end
local converted = mw.language.getContentLanguage():formatNum( converted )
return mw.ustring.gsub( converted, '−', '-' )
end
--- https://github.com/mirven/underscore.lua/blob/master/lib/underscore.lua
--- Slices an array
--- @param array table
--- @param start_index number
--- @param length number
function common.slice( array, start_index, length )
local sliced_array = {}
start_index = math.max( start_index, 1 )
local end_index = math.min( start_index + length - 1, #array )
for i = start_index, end_index do
sliced_array[ #sliced_array + 1 ] = array[ i ]
end
return sliced_array
end
--- Find the first existing image for the current page or provided names
--- @param imageNames string|table names to check
--- @return string|boolean String if image found false if not
function common.getImage( imageNames )
local names = {
mw.title.getCurrentTitle().rootText,
mw.title.getCurrentTitle().text
}
local argNames = {}
local function checkName( image )
local title = mw.ustring.gsub( image, '.jpg', '' )
title = mw.ustring.gsub( title, '.png', '' )
title = mw.ustring.gsub( title, '.webp', '' )
local file = mw.title.new( title .. '.jpg', 6 )
if file ~= nil and file.exists then
return file.prefixedText
end
file = mw.title.new( title .. '.png', 6 )
if file ~= nil and file.exists then
return file.prefixedText
end
file = mw.title.new( title .. '.webp', 6 )
if file ~= nil and file.exists then
return file.prefixedText
end
return nil
end
if imageNames ~= nil then
if type( imageNames ) == 'string' then
imageNames = { imageNames }
end
for _, name in pairs( imageNames ) do
if name ~= nil then
table.insert( argNames, mw.uri.decode( name, 'WIKI' ) )
end
end
end
for _, image in pairs( argNames ) do
local found = checkName( image )
if found ~= nil then
return found
end
end
for _, image in pairs( names ) do
local found = checkName( image )
if found ~= nil then
return found
end
end
return false
end
--- Output a string based on the trueish input value
--- Note: Nil is considered to be false
--- @param input string|number|bolean Input to check
--- @param trueString string|number Output if true, defaults to 'Ja'
--- @param falseString string|number Output if true, defaults to 'Nein'
--- @return string|number|boolean
function common.booleanToText( input, trueString, falseString )
trueString = trueString or 'Ja'
falseString = falseString or 'Nein'
if input == nil or
input == false or
input == 'false' or
input == 0 or
input == '0' or
input == 'Nein' or
input == 'nein' then
return falseString
end
return trueString
end
--- Walks a table in order, can be used like pairs()
--- @param t table
--- @param order function - Sorting function OPTIONAL
function common.spairs( t, order )
-- collect the keys
local keys = {}
for k in pairs(t) do keys[#keys+1] = k end
-- if order function given, sort by it by passing the table and keys a, b,
-- otherwise just sort the keys
if order then
table.sort(keys, function(a,b) return order(t, a, b) end)
else
table.sort(keys)
end
-- return the iterator function
local i = 0
return function()
i = i + 1
if keys[i] then
return keys[i], t[keys[i]]
end
end
end
--- Maps an array from the api to monolingual text format
--- @param input table - Form of { "de_DE" = "...", "en_EN" = "..." } or table of tables
--- @param ucFirst boolean - Whether to uppercase the first character
--- @return table
function common.mapTranslation( input, ucFirst )
input = input or {}
ucFirst = ucFirst or false
if type( input ) ~= 'table' then
return input
end
local out = {}
local function add( msg, locale )
if ucFirst then
msg = mw.language.getContentLanguage():ucfirst( msg )
end
table.insert( out, msg .. '@' .. string.sub( locale, 1, 2 ) )
end
for locale, translation in pairs( input ) do
if type( translation ) == 'table' then
for locale, msg in pairs( translation ) do
add( msg, locale )
end
elseif type( translation ) == 'string' then
add( translation, locale )
end
end
return out
end
--- Returns the language code based on subpage name
--- Defaults to 'de'
--- @return string
function common.getLocaleForPage()
local title = mw.title.getCurrentTitle()
if not title.isSubpage then
return 'de'
end
return title.subpageText
end
-- Titleparts Lib
common.titleparts = {}
--- https://github.com/wikimedia/mediawiki-extensions-ParserFunctions/blob/master/includes/ParserFunctions.php
--- @param title string
--- @param parts number
--- @param offset number
function common.titleparts.get( title, parts, offset )
local ntitle = mw.title.new( title )
parts = tonumber( parts )
offset = tonumber( offset )
if ntitle.exists == false then
return title
end
local bits = mw.text.split( title, '/', true )
if #bits <= 0 then
return ntitle.prefixedText()
else
if parts == 0 then
return table.concat( slice( bits, offset ), '/' )
else
return table.concat( slice( bits, offset, parts ), '/' )
end
end
end
return common