Zum Inhalt springen


Modul:Link

Aus Firestone Idle RPG Wiki
Version vom 23. Oktober 2025, 23:30 Uhr von Webmaster (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „-- 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…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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
  • leer → Anzeigename = title aus LinkData
  • view → gibt die Tabelle aus
  • +… → Kurz-Suffix für Plural etc. (siehe unten)
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:

  1. Suffix-Kurzform im 2. Parameter:
{{Link|Bier|+e}}+e
{{Link|Bier|+en}}+en
  1. 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 daher s= / +….

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-ID anhand des Titels (Leerzeichen → Unterstrich).

Tooltip

  • Holt title / icon / desc aus Modul:LinkData.
  • Links in der Beschreibung werden im Hover-Tooltip zu normalem Text neutralisiert.
  • Zeilenumbrüche werden unterstützt; lange Texte werden nach limit Zeichen 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('"', '&quot;')
      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('"', '&quot;')
      out = out .. '<ref name="' .. safeName .. '" />'
    end
  end

  return out
end

return p