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 links entsprechen.
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 auch
inline: Fließtext „→ Siehe auch: Link1, Link2, …“
h2 bis h6: Wikitext-Überschrift auf gewählter Ebene
heading
Steuert die Ausgabe der Überschrift.
default (Standard): Automatische Überschrift gemäß format
no / none: Keine Überschrift anzeigen
Eigener Text: Benutzerdefinierte Überschrift (z. B. heading=Verwandte Themen)
typ
Steuert die Darstellung der Liste.
bulleted (Standard): Punkteliste
unbulleted: Liste ohne Punkte (mit <div class="plainlist">)
ordered: Nummerierte Liste
horizontal: Inline-Liste mit Aufzählungspunkten
separator: Horizontale Liste mit frei wählbarem Trennzeichen
separator
Nur relevant bei typ=separator oder format=inline.
Definiert das Trennzeichen zwischen den Links. Standard: |
Beispiel: separator= • ergibt „Link1 • Link2 • Link3“.
layout
Steuert die tabellarische Ausgabe.
default (Standard): keine Tabelle
table-vertical: Tabelle mit Link / Beschreibung untereinander
table-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-block erzeugt <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


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