Modul:NeueArtikel

Aus Hist. Verein Herne / Wanne-Eickel

Die Dokumentation für dieses Modul kann unter Modul:NeueArtikel/Doku erstellt werden

-- Modul:NeueArtikel
-- Liefert für die Vorlage "Hauptseite/Neue Artikel/Kachel" das erste Bild
-- einer Seite sowie einen kurzen Auszug aus dem Seitentext.
--
-- Aufrufbeispiele aus Wikitext:
--   {{#invoke:NeueArtikel|bildlink|seite=Beispielseite|breite=240}}
--   {{#invoke:NeueArtikel|auszug |seite=Beispielseite|laenge=140}}
--
-- Das Modul nutzt nur Standard-Scribunto-Funktionen (mw.title, mw.text,
-- mw.ustring) und ist daher auf MediaWiki 1.43 mit Scribunto direkt
-- einsatzfähig. Es benötigt keine zusätzliche Erweiterung.

local p = {}

-- Konfiguration: Platzhalterbild, falls auf einer Seite kein Bild gefunden
-- wurde. Wird die Datei nicht gefunden, erzeugt MediaWiki einen roten
-- Datei-Link. Bitte ggf. anpassen.
local PLATZHALTER_BILD = "Vereinslogo.png"

------------------------------------------------------------
-- Hilfsfunktionen
------------------------------------------------------------

-- Entfernt iterativ verschachtelte Vorlagenaufrufe {{ ... }}.
local function strip_templates(s)
    local prev
    repeat
        prev = s
        s = s:gsub("{{[^{}]*}}", "")
    until s == prev
    return s
end

-- Entfernt iterativ verschachtelte Datei-/Bild-Wikilinks.
local function strip_files(s)
    local prev
    repeat
        prev = s
        s = s:gsub("%[%[%s*[Dd]atei%s*:[^%[%]]-%]%]", "")
        s = s:gsub("%[%[%s*[Ff]ile%s*:[^%[%]]-%]%]", "")
        s = s:gsub("%[%[%s*[Bb]ild%s*:[^%[%]]-%]%]", "")
    until s == prev
    return s
end

-- Sucht in einem Text das erste Datei-/File-/Bild-Wikilink und gibt den
-- Dateinamen ohne Präfix zurück.
local function find_first_image(content)
    if not content or content == "" then return nil end
    local patterns = {
        "%[%[%s*[Dd]atei%s*:%s*([^%|%]\n]+)",
        "%[%[%s*[Ff]ile%s*:%s*([^%|%]\n]+)",
        "%[%[%s*[Bb]ild%s*:%s*([^%|%]\n]+)",
    }
    local best_pos, best_name
    for _, pat in ipairs(patterns) do
        local s, _, name = content:find(pat)
        if s and (not best_pos or s < best_pos) then
            best_pos = s
            best_name = name
        end
    end
    if best_name then
        return mw.text.trim(best_name)
    end
    return nil
end

------------------------------------------------------------
-- Öffentliche Funktionen
------------------------------------------------------------

-- {{#invoke:NeueArtikel|bildlink|seite=...|breite=240}}
function p.bildlink(frame)
    local args = frame.args
    local seite = mw.text.trim(args.seite or args[1] or "")
    local breite = tostring(args.breite or "240")

    if seite == "" then return "" end

    local title = mw.title.new(seite)
    local bild
    if title and title.exists then
        local content = title:getContent()
        bild = find_first_image(content)
    end

    if not bild then
        bild = PLATZHALTER_BILD
    end

    -- Sicheres Encoding des Linkziels für die Pipe
    local linkZiel = seite
    return string.format(
        "[[Datei:%s|%spx|link=%s|alt=%s]]",
        bild, breite, linkZiel, linkZiel
    )
end

-- {{#invoke:NeueArtikel|auszug|seite=...|laenge=140}}
function p.auszug(frame)
    local args = frame.args
    local seite = mw.text.trim(args.seite or args[1] or "")
    local laenge = tonumber(args.laenge or "140") or 140

    if seite == "" then return "" end

    local title = mw.title.new(seite)
    if not title or not title.exists then return "" end

    local s = title:getContent() or ""

    -- HTML-Kommentare entfernen
    s = s:gsub("<!%-%-.-%-%->", "")
    -- nowiki-, ref- und sonstige Tags entfernen
    s = s:gsub("<nowiki>.-</nowiki>", "")
    s = s:gsub("<ref[^>]*>.-</ref>", "")
    s = s:gsub("<ref[^/>]*/>", "")
    -- Tabellen entfernen
    s = s:gsub("{|.-|}", "")
    -- Vorlagen entfernen
    s = strip_templates(s)
    -- Dateilinks entfernen
    s = strip_files(s)
    -- Überschriften entfernen
    s = s:gsub("==+[^=\n]*==+", "")
    -- Kategorielinks entfernen
    s = s:gsub("%[%[%s*[Kk]ategorie%s*:[^%]]+%]%]", "")
    s = s:gsub("%[%[%s*[Cc]ategory%s*:[^%]]+%]%]", "")
    -- Verbleibende HTML-Tags entfernen
    s = s:gsub("<[^>]+>", "")
    -- Wikilinks reduzieren: [[Ziel|Anzeige]] -> Anzeige
    s = s:gsub("%[%[([^%[%]%|]-)%|([^%[%]]-)%]%]", "%2")
    -- Wikilinks reduzieren: [[Ziel]] -> Ziel
    s = s:gsub("%[%[([^%[%]]-)%]%]", "%1")
    -- Externe Links: [http://... Anzeige] -> Anzeige
    s = s:gsub("%[https?://[^%s%]]+%s+([^%]]+)%]", "%1")
    s = s:gsub("%[https?://[^%]]+%]", "")
    -- Fett/Kursiv
    s = s:gsub("'''''", "")
    s = s:gsub("'''", "")
    s = s:gsub("''", "")

    -- Erste nichtleere Zeile als Auszug
    local para
    for line in mw.text.gsplit(s, "\n", true) do
        local t = mw.text.trim(line)
        if t ~= "" and not t:match("^[#%*:;]") then
            para = t
            break
        end
    end
    para = para or ""

    -- Mehrfache Leerzeichen reduzieren
    para = para:gsub("%s+", " ")
    para = mw.text.trim(para)

    if mw.ustring.len(para) > laenge then
        para = mw.ustring.sub(para, 1, laenge) .. "…"
    end

    return para
end

return p