Menü aufrufen
Persönliches Menü aufrufen
Nicht angemeldet
Ihre IP-Adresse wird öffentlich sichtbar sein, wenn Sie Änderungen vornehmen.
⚠️ Wir suchen Nutzer, die das Wiki regelmäßig aktualisieren und pflegen können. Siehe wie man Seiten bearbeitet ⚠️
Modul Dokumentation[view][edit][history][purge]
Diese Dokumentation wird von Modul:Common/doc aus übernommen. Änderungen können auf der Diskussionsseite vorgeschlagen werden.
Function list
L 11 — common.extractDataFromPrefix
L 35 — common.setDisplayTitle
L 51 — common.removeTypeSuffix
L 65 — common.generateInterWikiLinks
L 85 — common.checkSmwResult
L 95 — common.checkApiResponse
L 114 — common.toNumber
L 137 — common.formatNum
L 154 — common.slice
L 169 — common.getImage
L 180 — checkName
L 232 — common.findImage
L 248 — common.booleanToText
L 270 — common.spairs
L 298 — common.mapTranslation
L 308 — add
L 333 — common.getLocaleForPage
L 355 — common.titleparts.get
✔ Alle Tests bestanden.
Unit tests
Name Expected Actual
✔ testBooleanToTextFalseish
✔ testBooleanToTextFalseishCustomText
✔ testBooleanToTextTrueish
✔ testExtractPrefixNumerical
✔ testExtractPrefixNumericalEmpty
✔ testFormatNum
✔ testFormatNumberString
✔ testFormatNumberStringFail
✔ testRemoveTypeSuffix
✔ testRemoveTypeSuffixNoMatch
✔ testToNumberNum
✔ testToNumberString
✔ testToNumberStringFail

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
  • setDisplayTitle
    • Setzt den Abzeigetitel der aktuellen Seite
      • framm tabelle: Der zu bearbeitende Frame
      • title string: Seitentitel
      • flag string: Entweder 'noerror' oder 'noreplace'
  • removeTypeSuffix
    • Entfernt (...) Suffixe aus einer Zeichenkette
      • Beispiel:
        • Eingabe: Orion (Raumschiff)
        • Aufruf: common.removeTypeSuffix( 'Orion (Raumschiff)', 'Raumschiff' )
        • Ausgabe: Orion
  • 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
  • mapTranslation
    • Mapt { de_DE: '...', en_EN: '...' } zu einem Format was Semantic Media Wiki versteht
  • getLocaleForPage
    • Gibt den Sprachcode der aktuellen Seite zurück

Tests

✔ Alle Tests bestanden.

Unit tests
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 )
		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,
        mw.ustring.gsub(mw.title.getCurrentTitle().text, '/', '-'), --Armor Pages
        mw.ustring.gsub(mw.title.getCurrentTitle().text, '\'', ''), -- Pages with ' in name
        mw.ustring.gsub(mw.title.getCurrentTitle().text, '"', ''), -- Pages with "" in name
    }

	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

function common.findImage()
	local image = common.getImage()
	
	if type( image ) == 'string' then
		return image
	end
	
	return ''
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

    local translation = require( 'Module:Template translation' )
    if translation.checkLanguage( title.subpageText, false ) ~= false then
        return title.subpageText
    end

    return 'de'
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
Cookies helfen uns bei der Bereitstellung dieses Wikis. Durch die Nutzung des Star Citizen Wiki erklärst du dich damit einverstanden, dass wir Cookies speichern.