Modul:Link
Erzeugt interne Links mit Hover-Tooltip (Icon, Titel, Kurzbeschreibung) aus Modul:LinkData. Optional kann eine „Detailansicht“ (Wikitable) ausgegeben werden.
Grundsyntax
- Tooltip-Link
{{Link|Ziel}}
- Tooltip-Link mit eigenem Anzeigenamen
{{Link|Ziel|Anzeigename}}
- Detailansicht (Tabelle) statt Link
{{Link|Ziel|view}}
Parameter
| Param | Name | Typ/Standard | Beschreibung |
|---|---|---|---|
| 1 | Ziel | Pflicht | Seitentitel oder „Titel#Abschnitt“. Wird als Linkziel verwendet. |
| 2 | Anzeigename / view / Kurz-Suffix |
optional |
|
| s | s (Suffix) |
optional | Hängt Text an den Anzeigenamen aus LinkData an (z. B. s=e → „Biere“).
|
| key | key |
optional | Erzwingt den Datensatz-Schlüssel für LinkData (falls Ziel und title nicht übereinstimmen).
|
| limit | limit |
Zahl (220) | Maximale Länge der Tooltip-Beschreibung; bei Überschreitung wird abgeschnitten (…). |
Verhalten
Anzeigename
- Standardmäßig wird als Anzeigename der deutsche Titel aus Modul:LinkData verwendet (Feld
title). - Eigener Anzeigename (2. Parameter) überschreibt den Titel.
- Groß-/Kleinschreibung bleibt genau wie im Wikitext/LinkData.
Plural / LinkTrail
MediaWikis LinkTrail funktioniert nur bei direkt geschriebenen Links, nicht bei Vorlagen. Dafür gibt es zwei Wege:
- Suffix-Kurzform im 2. Parameter:
- Expliziter Suffix über
s=:
{{Link|Bier|s=e}}→Bier
Hinweise:
- Sobald ein eigener Anzeigename gesetzt ist, wird
s=ignoriert. - Bei „unpiped“ Links (also wirklich
Biere) greift LinkTrail – das ist mit Vorlagen technisch nicht möglich. Nutze dahers=/+….
Anker/Abschnitte
- Bei Zielen mit
#(z. B.Währungen#Bier) wird immer ein gepipter Link erzeugt (kein LinkTrail / ToolTip möglich). - Die Detailansicht (
view) setzt die Tabellen-IDanhand des Titels (Leerzeichen → Unterstrich).
Tooltip
- Holt
title/icon/descaus Modul:LinkData. - Links in der Beschreibung werden im Hover-Tooltip zu normalem Text neutralisiert.
- Zeilenumbrüche werden unterstützt; lange Texte werden nach
limitZeichen abgeschnitten.
Fallbacks
- Gibt es keinen Datensatz in LinkData, wird ein normaler Link ohne Tooltip ausgegeben.
Beispiele
- Standard
{{Link|Bier}}→ Bier
- Eigener Anzeigename
{{Link|Währungen#Bier|Bier}}→ Bier
- Plural via Suffix (Kurzform)
{{Link|Bier|+e}}→ +e
- Plural via
s= {{Link|Bier|s=en}}→ Bier
- Detailansicht (Wikitable)
{{Link|Bier|view}}→ view
- Limit anpassen
{{Link|Bier|limit=50}}→ Bier
- Abweichender Datensatz (engl. key)
{{Link|Währungen|key=Beer}}→ Währungen
-- Modul:Link
local p = {}
-- Tooltip-Daten (read-only, performant)
local data = mw.loadData('Modul:LinkData')
-- Merker, welche <ref name="…"> durch DIESES Modul
-- in dieser Seiten-Expansion bereits definiert wurden
local defined = {}
local function trim(s)
if type(s) ~= 'string' then return '' end
return (s:gsub('^%s+', ''):gsub('%s+$', ''))
end
local function yes(v)
if v == nil then return false end
if type(v) == 'boolean' then return v end
v = tostring(v):lower()
return v == '1' or v == 'y' or v == 'yes' or v == 'true' or v == 'ja'
end
-- Key-Normalisierung für LinkData: kleinschreiben, Whitespace bündeln
local function normalize_key(s)
s = trim(s or '')
if s == '' then return s end
s = mw.ustring.lower(s)
-- Unterstriche und Mehrfach-Spaces vereinheitlichen
s = s:gsub('_', ' '):gsub('%s+', ' ')
return s
end
local function strip_wrapping_quotes(s)
s = trim(s or '')
if mw.ustring.match(s, '^".*"$') then
return mw.ustring.sub(s, 2, -2)
end
return s
end
local function build_link(target, display)
target = trim(target)
display = display and tostring(display) or nil
if display and trim(display) ~= '' then
-- Anzeige GENAU so ausgeben, wie übergeben
return '[[' .. target .. '|' .. display .. ']]', display
else
return '[[' .. target .. ']]', nil
end
end
local function tooltip_wrap(link_html, key_norm)
-- Daten lookup (erst "a b", dann "a_b" als Fallback)
local info = data[key_norm] or data[key_norm:gsub(' ', '_')] or {}
-- Fallback-Titel: normalisierter Key (erste Silbe groß kannst du im Data steuern)
local title = info.title or key_norm
local desc = info.desc or ''
local icon = info.icon or ''
-- Wenn gar nichts hinterlegt ist, trotzdem einen Tooltip zeigen (mit einfachem Titel)
local box = mw.html.create('span'):addClass('kr-tt__content')
local inner = mw.html.create('span'):addClass('kr-tt__box')
if icon ~= '' then
inner:wikitext('[[File:' .. icon .. '|28x28px|link=|class=kr-tt__icon]]')
else
inner:wikitext('<span class="kr-tt__icon kr-tt__icon--empty"></span>')
end
local text = mw.html.create('span'):addClass('kr-tt__text')
text:tag('span'):addClass('kr-tt__title'):wikitext(title)
if desc ~= '' then
text:tag('span'):addClass('kr-tt__desc'):wikitext(desc)
end
inner:node(text)
box:node(inner)
local wrap = mw.html.create('span'):addClass('kr-tt')
wrap:wikitext(link_html)
wrap:node(box)
return tostring(wrap)
end
function p.main(frame)
local parent = frame:getParent()
local args = parent and parent.args or frame.args
-- Params
local target = trim(args[1] or args.target or '')
local display = args[2] or args.display
local key = args.key -- optional: expliziter Tooltip-Key (beliebige Schreibweise)
local refText = args.ref
local refName = args.name or args.refname
local hasRef = args.has_refname
local tooltip = yes(args.tooltip)
or (type(args[2]) == 'string' and args[2]:lower() == 'tooltip')
or (type(args[3]) == 'string' and args[3]:lower() == 'tooltip')
or (type(args[4]) == 'string' and args[4]:lower() == 'tooltip')
if target == '' then
return ''
end
-- Link bauen (Anzeige UNVERÄNDERT)
local link, shownText = build_link(target, display)
-- Tooltip-Key ableiten und normalisieren
if not key or trim(key) == '' then
if shownText and trim(shownText) ~= '' then
key = shownText
elseif target:find('#', 1, true) then
key = target:match('#(.+)$') or target
else
key = target
end
end
local key_norm = normalize_key((key:gsub('^.+#', '')):gsub('%[.+%]', ''))
-- Tooltip ggf. anwenden
if tooltip then
link = tooltip_wrap(link, key_norm)
end
-- Referenzen
local out = link
if refText and trim(refText) ~= '' then
refText = strip_wrapping_quotes(refText)
if refName and trim(refName) ~= '' then
local safeName = trim(refName):gsub('"', '"')
out = out .. '<ref name="' .. safeName .. '">' .. refText .. '</ref>'
defined[safeName] = true
else
out = out .. '<ref>' .. refText .. '</ref>'
end
elseif hasRef and trim(hasRef) ~= '' then
local name = trim(hasRef)
if defined[name] then
local safeName = name:gsub('"', '"')
out = out .. '<ref name="' .. safeName .. '" />'
end
end
return out
end
return p