Modul:Get
Die Dokumentation für dieses Modul kann unter Modul:Get/Doku erstellt werden
-- Modul:Get
-- Allgemeiner Zugriff auf strukturierte Daten (Item/Event/Hero/Guardian/…)
local p = {}
local DATA_MODULE = 'Modul:Get/Data'
local data = require(DATA_MODULE)
-- Datei-Existenz prüfen
local function fileExists(name)
if not name or name == '' then
return false
end
local titleObj = mw.title.makeTitle('File', name)
if not titleObj then
return false
end
local fileObj = titleObj.file
if not fileObj or not fileObj.exists then
return false
end
return true
end
-- $1 → title
local function applyPlaceholder(text, title)
if not text or text == '' then
return nil
end
-- %$1 = literal "$1"
return text:gsub('%$1', function()
return title or ''
end)
end
-- Tooltip + optional Link
local function wrapWithTooltip(labelText, linkTarget, desc, noTooltip)
if not labelText or labelText == '' then
return ''
end
local out = labelText
-- Link bauen, falls vorhanden
if linkTarget and linkTarget ~= '' then
if linkTarget:match('^%[%[') or linkTarget:match('^%[') then
-- bereits fertiger Wiki-/Externer Link
out = linkTarget
else
-- interner Link: [[Seite|Label]]
out = '[[' .. linkTarget .. '|' .. labelText .. ']]'
end
end
-- Tooltip über title-Attribut
if desc and desc ~= '' and not noTooltip then
local escDesc = desc:gsub('"', '"')
out = '<span class="kr-get" title="' .. escDesc .. '">' .. out .. '</span>'
end
return out
end
-- Keys normalisieren: trim, lower, Leerzeichen → _
local function normalizeKey(key)
if not key then
return nil
end
key = mw.text.trim(tostring(key))
if key == '' then
return nil
end
key = mw.ustring.lower(key)
key = key:gsub('[%s_]+', '_')
return key
end
-- Datensatz-Namen (Item/Items, Hero/Heroes…) normalisieren
local function normalizeDatasetKey(datasetRaw)
local datasetKey = normalizeKey(datasetRaw)
if not datasetKey then
return nil
end
if datasetKey == 'items' then
datasetKey = 'item'
elseif datasetKey == 'events' then
datasetKey = 'event'
elseif datasetKey == 'heroes' then
datasetKey = 'hero'
elseif datasetKey == 'guardians' then
datasetKey = 'guardian'
end
return datasetKey
end
-- --------------------------------------------------------
-- Hauptfunktion
-- --------------------------------------------------------
function p.main(frame)
local args = frame.args
local datasetRaw = args.dataset or args[1]
local method = args.method or args[2] or 'link'
local keyRaw = args.key or args[3]
local noTooltip = args.noTooltip == '1' or args.notooltip == '1'
local datasetKey = normalizeDatasetKey(datasetRaw)
local key = normalizeKey(keyRaw)
if not datasetKey or not key then
return ''
end
local group = data[datasetKey]
if not group then
-- unbekannter Datensatz → gib originalen Key zurück (zerstört Seite nicht)
return keyRaw or ''
end
local raw = group[key]
if not raw then
return keyRaw or ''
end
local displayKey = keyRaw or key
local title = raw.title or displayKey
local short = raw.short or title
-- Platzhalter anwenden
local desc = applyPlaceholder(raw.desc, title)
local link = applyPlaceholder(raw.link, title)
-- Bild bestimmen
local chosenImg
if raw.img and fileExists(raw.img) then
chosenImg = raw.img
elseif fileExists(title) then
-- Fallback: Datei mit gleichem Namen wie der Titel
chosenImg = title
end
method = tostring(method):lower()
if method == 'title' then
return wrapWithTooltip(title, nil, desc, noTooltip)
elseif method == 'short' then
return wrapWithTooltip(short, nil, desc, noTooltip)
elseif method == 'link' then
return wrapWithTooltip(short, link, desc, noTooltip)
elseif method == 'img' then
if not chosenImg then
return ''
end
local alt = title or ''
if link and link ~= '' and not link:match('^%[') then
-- internes Linkziel
return '[[Datei:' .. chosenImg .. '|link=' .. link .. '|alt=' .. alt .. ']]'
else
return '[[Datei:' .. chosenImg .. '|alt=' .. alt .. ']]'
end
elseif method == 'desc' then
return desc or ''
else
-- Fallback: wie "link"
return wrapWithTooltip(short, link, desc, noTooltip)
end
end
return p