Modul:SieheAuch
Dieses Modul dient der Erzeugung von »Siehe auch«-Abschnitten mit einer oder mehreren weiterführenden Verlinkungen. Es verarbeitet benutzerfreundlich strukturierte Eingaben und übergibt sie an Modul:List zur Darstellung.
Verwendung Bearbeiten
Das Modul wird ausschließlich über die Vorlage Vorlage:Siehe auch eingebunden. Ein direkter Aufruf per `#invoke` ist nicht vorgesehen, aber technisch möglich.
Syntax (über Vorlage) Bearbeiten
{{Siehe auch
| links=Seite1,Seite2,Seite 3
| titel=Text1,Text2,Externer Titel
| beschreibung=Anmelrkung, Hinweis, Ergänzung
| format=h2
| typ=unbulleted
}}
Parameter Bearbeiten
links(Pflichtfeld)- Kommagetrennte Liste von Wikiseiten oder externen URLs.
titel- Kommagetrennte Liste von Linktexten. Reihenfolge muss der von
linksentsprechen.
beschreibung- Kommagetrennte Liste mit kurzen Erläuterungen zu den jeweiligen Links.
- Wird hinter dem Link angezeigt (z. B. „
[[Hilfe:Irgendwas|Titel]] – Beschreibung“). - Optional, aber sinnvoll bei Listen mit thematisch verwandten Einträgen.
format- Steuert die Überschrift bzw. Einleitung.
block(Standard): Kursivschrift Siehe auchinline: Fließtext „→ Siehe auch: Link1, Link2, …“h2bish6: Wikitext-Überschrift auf gewählter Ebene
heading- Steuert die Ausgabe der Überschrift.
default(Standard): Automatische Überschrift gemäßformatno/none: Keine Überschrift anzeigen- Eigener Text: Benutzerdefinierte Überschrift (z. B.
heading=Verwandte Themen)
typ- Steuert die Darstellung der Liste.
bulleted(Standard): Punktelisteunbulleted: Liste ohne Punkte (mit<div class="plainlist">)ordered: Nummerierte Listehorizontal: Inline-Liste mit Aufzählungspunktenseparator: Horizontale Liste mit frei wählbarem Trennzeichen
separator- Nur relevant bei
typ=separatoroderformat=inline. - Definiert das Trennzeichen zwischen den Links. Standard:
| - Beispiel:
separator= •ergibt „Link1 • Link2 • Link3“.
layout- Steuert die tabellarische Ausgabe.
default(Standard): keine Tabelletable-vertical: Tabelle mit Link / Beschreibung untereinandertable-horizontal: Tabelle mit Linkzeile und separater Beschreibungszeile
border- Nur relevant bei Tabellenlayout.
normal(Standard): Rahmen wie bei.wikitable)none: Rahmenlose Tabelle (Klasse.borderless)
class- Fügt eine eigene CSS-Klasse um den gesamten Block (Überschrift + Inhalt) hinzu.
- Beispiel:
class=seealso-blockerzeugt<div class="seealso-block">…</div>
Beispiele Bearbeiten
Einfache Anwendung Bearbeiten
| Eingabe | Ergebnis | ||
|---|---|---|---|
{{Siehe auch|links=Hauptseite}}
|
Siehe auch | ||
Mit Linktexten und Beschreibungen Bearbeiten
| Eingabe | Ergebnis | ||
|---|---|---|---|
{{Siehe auch
| links=Hauptseite,Portal:Hilfe
| titel=Startseite,Hilfeportal
| format=h4
| typ=bulleted
| beschreibung= Startseite des Wikis, für weitere Informationen
}}
|
Siehe auch
|
||
Siehe auch
- Vorlage:Siehe auch – Zugehörige Wrapper-Vorlage
- Modul:List
local p = {}
-- Hilfsfunktionen
local function split(str)
if type(str) ~= 'string' then return {} end
local result = {}
for item in mw.text.gsplit(str, ',', true) do
table.insert(result, mw.text.trim(item))
end
return result
end
local function isURL(s)
return type(s) == 'string' and s:match('^https?://')
end
-- Heading-Renderer: liefert fertigen Wikitext oder nil
local function renderHeading(format, headingArg)
-- 1) explizit ausgeschaltet
if headingArg == 'no' or headingArg == 'none' or headingArg == '' then
return nil
end
local formatStr = tostring(format or '')
-- Hilfsfunktion: konkrete Ausgabe für einen Text + Level
local function makeHeadingText(txt)
if formatStr:match('^h[2-6]$') then
local level = tonumber(formatStr:sub(2))
return string.rep('=', level) .. ' ' .. txt .. ' ' .. string.rep('=', level)
elseif formatStr == 'inline' then
return txt .. ':' -- für Inline sinnvoll ein Doppelpunkt
else
return "''" .. txt .. "''"
end
end
-- 2) benutzerdefinierter Text
if headingArg and headingArg ~= 'default' then
return makeHeadingText(tostring(headingArg))
end
-- 3) Standard-Heading (nicht gesetzt oder 'default')
if formatStr == 'inline' then
return '→ Siehe auch:'
elseif formatStr:match('^h[2-6]$') then
local level = tonumber(formatStr:sub(2))
return string.rep('=', level) .. ' Siehe auch ' .. string.rep('=', level)
else
return "''Siehe auch''"
end
end
-- Zentrale Renderfunktion
local function renderList(entries, opts)
local typ = opts.typ
local layout = opts.layout or 'default'
local separator = opts.separator or ' | '
local border = opts.border or 'normal'
-- Tabellenlayout
if layout:match('^table') then
local html = mw.html.create('table')
html:addClass('seealso-table')
if border == 'none' then
html:addClass('borderless')
else
html:addClass('wikitable')
end
if layout == 'table-vertical' then
for _, e in ipairs(entries) do
local row = html:tag('tr')
row:tag('td'):wikitext(e.link)
if e.desc and e.desc ~= '' then
row:tag('td'):wikitext(e.desc)
end
end
else -- table-horizontal
local rowLinks = html:tag('tr')
local rowDescs = html:tag('tr')
for _, e in ipairs(entries) do
rowLinks:tag('td'):wikitext(e.link)
if e.desc and e.desc ~= '' then
rowDescs:tag('td'):wikitext(e.desc)
end
end
end
return tostring(html)
end
-- Horizontale Separator-Liste
if typ == 'separator' then
local list = {}
for _, e in ipairs(entries) do
if e.desc and e.desc ~= '' then
table.insert(list, e.link .. ' – ' .. e.desc)
else
table.insert(list, e.link)
end
end
return table.concat(list, separator)
end
-- Klassische Listenformate
local listStart, listEnd, itemPrefix = '', '', ''
if typ == 'bulleted' then
itemPrefix = '* '
elseif typ == 'unbulleted' then
itemPrefix = '* '
listStart = '<div class="plainlist">\n'
listEnd = '</div>'
elseif typ == 'ordered' then
itemPrefix = '# '
elseif typ == 'horizontal' then
-- Bugfix: wir brauchen Wikitext-Strings, nicht die Entry-Objekte
local items = {}
for _, e in ipairs(entries) do
if e.desc and e.desc ~= '' then
table.insert(items, e.link .. ' – ' .. e.desc)
else
table.insert(items, e.link)
end
end
return '<div class="hlist">\n* ' .. table.concat(items, '\n* ') .. '\n</div>'
else
itemPrefix = '* '
end
local out = {}
for _, e in ipairs(entries) do
if e.desc and e.desc ~= '' then
table.insert(out, itemPrefix .. e.link .. ' – ' .. e.desc)
else
table.insert(out, itemPrefix .. e.link)
end
end
return listStart .. table.concat(out, '\n') .. '\n' .. listEnd
end
-- Hauptfunktion
function p.main(frame)
local args = frame:getParent().args
local links = split(args.links)
local titel = split(args.titel)
local beschr = split(args.beschreibung or args.desc or '')
local format = tostring(args.format or 'block')
local typ = tostring(args.typ or 'bulleted')
local layout = tostring(args.layout or 'default')
local separator = args.separator or ' | '
local border = tostring(args.border or 'normal')
local headingArg = args.heading -- bewusst nil zulassen
local cssClass = args.class or ''
-- Einträge aufbauen
local entries = {}
for i, target in ipairs(links) do
local text = titel[i] or target
local desc = beschr[i] or ''
local link
if isURL(target) then
link = string.format('[%s %s]', target, text)
else
link = string.format('[[%s|%s]]', target, text)
end
table.insert(entries, { link = link, desc = desc })
end
-- Inhalt rendern
local content = renderList(entries, {
typ = typ,
layout = layout,
separator = separator,
border = border
})
-- Überschrift rendern (einmal, ohne späteres „Überschreiben“)
local headingText = renderHeading(format, headingArg)
-- Inline: wenn Heading fehlt/aus ist, dann nur Liste
if format == 'inline' then
if headingText then
content = headingText .. ' ' .. content
end
else
-- Block-/Heading-Formate: Heading in eigene Zeile, falls vorhanden
if headingText then
content = headingText .. '\n' .. content
end
end
-- Gesamten Block optional mit Klasse umschließen
if cssClass ~= '' then
return string.format('<div class="%s">\n%s\n</div>', cssClass, content)
else
return content
end
end
return p

