Zum Inhalt springen

Modul:Lautsortierung

aus AufEinWort, der freien Forschung

Modul:Lautsortierung/Doku

Zweck des Moduls

Dieses Modul erzeugt automatisch einen Sortierschlüssel für deutschsprachige Begriffe auf Basis einer vordefinierten Lauttrennung.

Das Modul dient zur Unterstützung von MediaWiki-Seiten, bei denen eine lautliche Sortierung sinnvoll oder notwendig ist, insbesondere bei der Arbeit mit Semantic MediaWiki (SMW).


Anwendung

1. Lauttrennung angeben

In die Wiki-Seite ist die Lauttrennung manuell einzutragen:

wiki
<button class="flex gap-1 items-center select-none px-4 py-1" aria-label="Kopieren">Kopieren</button><button class="flex items-center gap-1 px-4 py-1 select-none">Bearbeiten</button>
sch-u-l-e

Die Lauttrennung erfolgt durch - getrennte Lautbestandteile.


2. Sortierschlüssel anzeigen lassen

Für die visuelle Kontrolle:

wiki
<button class="flex gap-1 items-center select-none px-4 py-1" aria-label="Kopieren">Kopieren</button><button class="flex items-center gap-1 px-4 py-1 select-none">Bearbeiten</button>
\{\{#invoke:Lautsortierung|anzeigen}}

Beispielausgabe:

makefile
<button class="flex gap-1 items-center select-none px-4 py-1" aria-label="Kopieren">Kopieren</button><button class="flex items-center gap-1 px-4 py-1 select-none">Bearbeiten</button>
Lautsortierung: šule

3. Sortierschlüssel für SMW ausgeben

Zur Verwendung in SMW-Properties oder Vorlagen:

wiki
<button class="flex gap-1 items-center select-none px-4 py-1" aria-label="Kopieren">Kopieren</button><button class="flex items-center gap-1 px-4 py-1 select-none">Bearbeiten</button>
\{\{#invoke:Lautsortierung|roh}}

Beispielausgabe:


<button class="flex gap-1 items-center select-none px-4 py-1" aria-label="Kopieren">Kopieren</button><button class="flex items-center gap-1 px-4 py-1 select-none">Bearbeiten</button>
šule

Funktionsweise

Das Modul arbeitet zweistufig:

Schritt Quelle Beschreibung</thead>
1 SMW-Abfrage Die Lauttrennung wird über #show aus SMW ausgelesen.
2 Fallback Falls SMW kein Ergebnis liefert, wird der Seitentext (getContent()) direkt durchsucht.

Lautersetzung

Die Zuordnung der Lautfolgen zu Sortierzeichen erfolgt über die Seite:

makefile
<button class="flex gap-1 items-center select-none px-4 py-1" aria-label="Kopieren">Kopieren</button><button class="flex items-center gap-1 px-4 py-1 select-none">Bearbeiten</button>
MediaWiki:Sortierzeichentabelle

Format:

ini
<button class="flex gap-1 items-center select-none px-4 py-1" aria-label="Kopieren">Kopieren</button><button class="flex items-center gap-1 px-4 py-1 select-none">Bearbeiten</button>
sch = š

eu = ø aa = ā


Debug-Modus

Im Modul kann der Debug-Modus aktiviert werden:

lua
<button class="flex gap-1 items-center select-none px-4 py-1" aria-label="Kopieren">Kopieren</button><button class="flex items-center gap-1 px-4 py-1 select-none">Bearbeiten</button>
local debugMode = true

Dann gibt das Modul zusätzlich technische Statusmeldungen aus, um die Verarbeitung sichtbar zu machen.


-- Modul:Lautsortierung (mehrsprachig, mit Sprachstufe)

local p = {}

-- Debug Modus: true = Debug-Ausgabe aktiv, false = keine Debug-Ausgabe
local debugMode = true

-- Hilfsfunktion: Laden der Lautersetzungstabelle aus MediaWiki-Seite
local function ladeSortierzeichentabelle(name)
    local seite = mw.title.new(name, "MediaWiki")
    if not seite then
        return nil, "Seitentitel konnte nicht erstellt werden."
    end

    local content = seite:getContent() or ""
    if content == "" then
        return nil, "Seite existiert, aber ist leer."
    end

    local map = {}
    for zeile in content:gmatch("[^\n]+") do
        local key, value = zeile:match("^%s*(.-)%s*=%s*(.-)%s*$")
        if key and value then
            map[key] = value
        end
    end

    return map, nil
end

-- Hilfsfunktion: Sprachcode aus Sprachstufe extrahieren (letztes Element)
local function getSprachcode()
    local title = mw.title.getCurrentTitle()
    local query = "#show:" .. title.prefixedText .. "|?Sprachstufe="
    local result = mw.smw and mw.smw.ask and mw.smw.ask(query)

    local stufe = nil
    if result and result[1] and result[1]["Sprachstufe"] then
        stufe = result[1]["Sprachstufe"]
    else
        local content = title:getContent() or ""
        stufe = content:match("%[%[Sprachstufe::(.-)%]%]")
    end

    if not stufe then
        return nil, "Keine Sprachstufe gefunden."
    end

    local teile = mw.text.split(stufe, "%-")
    return mw.text.trim(teile[#teile]), nil
end

-- Hilfsfunktion: Lauttrennung holen (erst SMW, dann Fallback auf Quelltext)
local function getLauttrennung()
    local title = mw.title.getCurrentTitle()
    local query = '#show:' .. title.prefixedText .. '|?Lauttrennung='
    local result = mw.smw and mw.smw.ask and mw.smw.ask(query)

    if result and result[1] and result[1]["Lauttrennung"] then
        return result[1]["Lauttrennung"]
    end

    -- Fallback: Aus Seitentext
    local content = title:getContent() or ""
    return content:match("%[%[Lauttrennung::(.-)%]%]")
end

-- Funktion: Anzeige des Sortierschlüssels nach Lauttrennung
function p.anzeigen(frame)
    local lauttrennung = getLauttrennung()
    local sprachcode, fehler = getSprachcode()

    if not lauttrennung then
        return debugMode and "Keine Lauttrennung gefunden in Seite " .. mw.title.getCurrentTitle().text or "Keine Lauttrennung gefunden"
    end

    if not sprachcode then
        return debugMode and "Fehler beim Ermitteln der Sprachstufe: " .. (fehler or "") or "Sprachstufe fehlt"
    end

    local tabelle, ladefehler = ladeSortierzeichentabelle("LautSortierTabelle-" .. sprachcode)
    if not tabelle then
        return debugMode and "LautSortierTabelle zu '" .. sprachcode .. "' konnte nicht geladen werden: " .. (ladefehler or "") or "Lautsortiertabelle fehlt"
    end

    local sortkey = p.verarbeiteLauttrennung(lauttrennung, tabelle)
    return debugMode and "[" .. sprachcode .. "] → " .. sortkey or sortkey
end

-- Funktion: Rohwert-Ausgabe für SMW-Property
function p.roh(frame)
    local lauttrennung = getLauttrennung()
    local sprachcode, _ = getSprachcode()
    local tabelle, _ = ladeSortierzeichentabelle("LautSortierTabelle-" .. sprachcode)

    if lauttrennung and tabelle then
        return p.verarbeiteLauttrennung(lauttrennung, tabelle)
    else
        return ""
    end
end

-- Kernfunktion: Verarbeitung der Lauttrennung in Sortierzeichen
function p.verarbeiteLauttrennung(lauttrennung, lautmap)
    local sortiername = ""

    for laut in mw.text.gsplit(lauttrennung, "-", true) do
        laut = mw.text.trim(laut)
        sortiername = sortiername .. (lautmap[laut] or laut)
    end

    return sortiername
end

return p