Zum Inhalt springen

Modul:aewi.ZeichenEntfernen

aus AufEinWort, der freien Forschung

Die Dokumentation für dieses Modul kann unter Modul:aewi.ZeichenEntfernen/Doku erstellt werden

local p = {}

-- Sonderzeichen, die durch die Unicode-Zerlegung nicht
-- automatisch in Grundbuchstaben zerlegt werden.
local sonderzeichen = {
    ['ß'] = 'ss',
    ['ẞ'] = 'SS',
    ['Æ'] = 'AE',
    ['æ'] = 'ae',
    ['Œ'] = 'OE',
    ['œ'] = 'oe',
    ['Ø'] = 'O',
    ['ø'] = 'o',
    ['Ł'] = 'L',
    ['ł'] = 'l',
    ['Đ'] = 'D',
    ['đ'] = 'd',
    ['Ð'] = 'D',
    ['ð'] = 'd',
    ['Þ'] = 'TH',
    ['þ'] = 'th'
}

local function istKombinationszeichen(codepoint)
    return
        (codepoint >= 0x0300 and codepoint <= 0x036F) or
        (codepoint >= 0x1AB0 and codepoint <= 0x1AFF) or
        (codepoint >= 0x1DC0 and codepoint <= 0x1DFF) or
        (codepoint >= 0x20D0 and codepoint <= 0x20FF) or
        (codepoint >= 0xFE20 and codepoint <= 0xFE2F)
end

local function grundbuchstaben(text)
    text = mw.ustring.toNFD(text) or text

    local ergebnis = {}

    for codepoint in mw.ustring.gcodepoint(text) do
        if not istKombinationszeichen(codepoint) then
            local zeichen = mw.ustring.char(codepoint)
            table.insert(ergebnis, sonderzeichen[zeichen] or zeichen)
        end
    end

    return table.concat(ergebnis)
end

local function zahlOderStandardwert(wert, standardwert)
    local zahl = tonumber(mw.text.trim(wert or ''))

    if zahl == nil then
        zahl = standardwert
    end

    return math.max(0, math.floor(zahl))
end

function p.main(frame)
    local anfangEntfernen = 0
    local endeEntfernen = 0
    local sortieren = false

    -- Höchste vorhandene numerische Parameternummer ermitteln.
    local hoechsterParameter = 0

    for schluessel in pairs(frame.args) do
        if type(schluessel) == 'number'
            and schluessel > hoechsterParameter then
            hoechsterParameter = schluessel
        end
    end

    local position = 1

    while position <= hoechsterParameter do
        local modus = mw.text.trim(frame.args[position] or '')

        if modus == 'and' then
            anfangEntfernen =
                zahlOderStandardwert(frame.args[position + 1], 1)
            position = position + 2

        elseif modus == 'end' then
            endeEntfernen =
                zahlOderStandardwert(frame.args[position + 1], 1)
            position = position + 2

        elseif modus == 'sort' then
            sortieren = true
            position = position + 1

        else
            position = position + 1
        end
    end

    local name = mw.title.getCurrentTitle().text
    local laenge = mw.ustring.len(name)

    local ersterIndex = anfangEntfernen + 1
    local letzterIndex = laenge - endeEntfernen
    local ergebnis

    if ersterIndex > letzterIndex then
        ergebnis = ''
    else
        ergebnis = mw.ustring.sub(
            name,
            ersterIndex,
            letzterIndex
        )
    end

    if sortieren then
        ergebnis = grundbuchstaben(ergebnis)
    end

    return ergebnis
end

return p