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
