Modul:Get: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| Zeile 7: | Zeile 7: | ||
local data = require(DATA_MODULE) | local data = require(DATA_MODULE) | ||
-- Datei-Existenz prüfen | local ustr = mw.ustring | ||
local textlib = mw.text | |||
local DEFAULT_TOOLTIP_MAX = 140 | |||
-- -------------------------------------------------------- | |||
-- Datei-Existenz prüfen → Dateiname (mit Endung) oder nil | |||
-- -------------------------------------------------------- | |||
local function fileExists(name) | local function fileExists(name) | ||
if not name or name == '' then | if not name or name == '' then | ||
| Zeile 41: | Zeile 49: | ||
return nil | return nil | ||
end | end | ||
-- -------------------------------------------------------- | |||
-- Platzhalter / Basics | |||
-- -------------------------------------------------------- | |||
-- $1 → title | -- $1 → title | ||
| Zeile 48: | Zeile 60: | ||
end | end | ||
return text:gsub('%$1', function() | return text:gsub('%$1', function() | ||
return title or '' | return title or '' | ||
| Zeile 54: | Zeile 65: | ||
end | end | ||
-- Tooltip | -- Nur Link bauen, KEIN Tooltip | ||
local function | local function buildLabel(labelText, linkTarget) | ||
if not labelText or labelText == '' then | if not labelText or labelText == '' then | ||
return '' | return '' | ||
end | end | ||
if linkTarget and linkTarget ~= '' then | if linkTarget and linkTarget ~= '' then | ||
if linkTarget:match('^%[%[') or linkTarget:match('^%[') then | if linkTarget:match('^%[%[') or linkTarget:match('^%[') then | ||
-- bereits fertiger Wiki-/Externer Link | -- bereits fertiger Wiki-/Externer Link | ||
return linkTarget | |||
else | else | ||
return '[[' .. linkTarget .. '|' .. labelText .. ']]' | |||
end | end | ||
end | end | ||
return labelText | |||
return | |||
end | end | ||
| Zeile 88: | Zeile 89: | ||
end | end | ||
key = | key = textlib.trim(tostring(key)) | ||
if key == '' then | if key == '' then | ||
return nil | return nil | ||
end | end | ||
key = | key = ustr.lower(key) | ||
key = key:gsub('[%s_]+', '_') | key = key:gsub('[%s_]+', '_') | ||
return key | return key | ||
| Zeile 116: | Zeile 117: | ||
return datasetKey | return datasetKey | ||
end | |||
-- -------------------------------------------------------- | |||
-- Markup → Plaintext (für Tooltip) | |||
-- -------------------------------------------------------- | |||
local function stripMarkup(str) | |||
if not str or str == '' then | |||
return '' | |||
end | |||
str = tostring(str) | |||
-- interne Links [[Seite|Label]] / [[Seite]] | |||
str = str:gsub('%[%[([^%]|]+)|([^%]]+)%]%]', '%2') | |||
str = str:gsub('%[%[([^%]]+)%]%]', '%1') | |||
-- externe Links [url Label] | |||
str = str:gsub('%[[^%s%]]+%s+([^%]]+)%]', '%1') | |||
-- Hervorhebungen | |||
str = str:gsub("''+", '') | |||
-- Templates {{...}} | |||
str = str:gsub('{{.-}}', '') | |||
-- HTML-Tags | |||
str = str:gsub('<.->', '') | |||
-- Whitespace normalisieren | |||
str = str:gsub('%s+', ' ') | |||
if textlib and textlib.trim then | |||
str = textlib.trim(str) | |||
end | |||
return str | |||
end | |||
local function shorten(str, max) | |||
str = stripMarkup(str) | |||
max = tonumber(max) or 0 | |||
if max <= 0 or ustr.len(str) <= max then | |||
return str | |||
end | |||
local cut = ustr.sub(str, 1, max) | |||
local lastSpace = ustr.find(cut, ' [^ ]*$') | |||
if lastSpace and lastSpace > max * 0.6 then | |||
cut = ustr.sub(cut, 1, lastSpace - 1) | |||
end | |||
return cut .. '…' | |||
end | |||
-- -------------------------------------------------------- | |||
-- Bildauflösung | |||
-- -------------------------------------------------------- | |||
local function getImageName(raw, title) | |||
local imgName | |||
if raw.img then | |||
imgName = fileExists(raw.img) | |||
end | |||
if not imgName and title then | |||
imgName = fileExists(title) | |||
end | |||
return imgName | |||
end | |||
-- -------------------------------------------------------- | |||
-- fs-tip Tooltip (wie früher in Modul:Item) | |||
-- -------------------------------------------------------- | |||
local function buildTooltip(label, title, desc, imgName, linkTarget, max) | |||
max = tonumber(max) or DEFAULT_TOOLTIP_MAX | |||
desc = desc or '' | |||
local shortDesc = shorten(desc, max) | |||
local hasImg = imgName and imgName ~= '' | |||
local out = {} | |||
-- Wrapper | |||
table.insert(out, '<span class="fs-tip">') | |||
-- sichtbares Label | |||
if label and label ~= '' then | |||
table.insert(out, label) | |||
else | |||
if linkTarget and linkTarget ~= '' then | |||
table.insert(out, '[[' .. linkTarget .. '|' .. (title or '') .. ']]') | |||
else | |||
table.insert(out, title or '') | |||
end | |||
end | |||
-- Tooltip-Content | |||
table.insert(out, '<span class="content">') | |||
if hasImg then | |||
table.insert(out, '<span class="box">') | |||
table.insert(out, '[[Datei:' .. imgName .. '|48x48px]]') | |||
table.insert(out, '<span class="text">') | |||
else | |||
table.insert(out, '<span class="text">') | |||
end | |||
-- Titel | |||
table.insert(out, '<span class="title">') | |||
table.insert(out, title or '') | |||
table.insert(out, '</span>') | |||
-- Beschreibung | |||
if shortDesc ~= '' then | |||
table.insert(out, '<span class="desc">') | |||
table.insert(out, shortDesc) | |||
table.insert(out, '</span>') | |||
end | |||
-- Close .text | |||
table.insert(out, '</span>') | |||
-- Close .box, falls Icon | |||
if hasImg then | |||
table.insert(out, '</span>') | |||
end | |||
-- Close .content + .fs-tip | |||
table.insert(out, '</span>') | |||
table.insert(out, '</span>') | |||
return table.concat(out) | |||
end | end | ||
| Zeile 127: | Zeile 262: | ||
local method = args.method or args[2] or 'link' | local method = args.method or args[2] or 'link' | ||
local keyRaw = args.key or args[3] | local keyRaw = args.key or args[3] | ||
local | |||
-- neue Steuerung: Tooltip nur, wenn tip=1 (oder yes/true) | |||
local tipFlag = (args.tip == '1' or args.tip == 'yes' or args.tip == 'true' or args.tooltip == '1') | |||
local tipMax = tonumber(args.max or args.len or args.limit) or DEFAULT_TOOLTIP_MAX | |||
local datasetKey = normalizeDatasetKey(datasetRaw) | local datasetKey = normalizeDatasetKey(datasetRaw) | ||
| Zeile 138: | Zeile 276: | ||
local group = data[datasetKey] | local group = data[datasetKey] | ||
if not group then | if not group then | ||
return keyRaw or '' | return keyRaw or '' | ||
end | end | ||
| Zeile 156: | Zeile 293: | ||
method = tostring(method):lower() | method = tostring(method):lower() | ||
-- kleines Lazy-Getter für Bildname, damit wir nicht doppelt suchen | |||
local resolvedImgName | |||
local function imgName() | |||
if resolvedImgName == nil then | |||
resolvedImgName = getImageName(raw, title) | |||
end | |||
return resolvedImgName | |||
end | |||
-- -------------- Methoden -------------- | |||
if method == 'title' then | if method == 'title' then | ||
return | if tipFlag then | ||
return buildTooltip(nil, title, desc, imgName(), link, tipMax) | |||
end | |||
return buildLabel(title, nil) | |||
elseif method == 'short' then | elseif method == 'short' then | ||
return | if tipFlag then | ||
-- Label: Kurzname, Inhaltstitel: voller Titel | |||
return buildTooltip(short, title, desc, imgName(), link, tipMax) | |||
end | |||
return buildLabel(short, nil) | |||
elseif method == 'link' then | elseif method == 'link' then | ||
return | if tipFlag then | ||
return buildTooltip(short, title, desc, imgName(), link, tipMax) | |||
end | |||
return buildLabel(short, link) | |||
elseif method == 'tooltip' then | |||
-- explizit nur Tooltip | |||
return buildTooltip(short, title, desc, imgName(), link, tipMax) | |||
elseif method == 'img' then | |||
local name = imgName() | |||
if not name then | |||
return '' | |||
end | |||
return name | |||
elseif method == 'desc' then | elseif method == 'desc' then | ||
| Zeile 188: | Zeile 340: | ||
else | else | ||
-- Fallback: wie "link" | -- Fallback: wie "link" | ||
return | if tipFlag then | ||
return buildTooltip(short, title, desc, imgName(), link, tipMax) | |||
end | |||
return buildLabel(short, link) | |||
end | end | ||
end | end | ||
return p | return p | ||
Version vom 10. Dezember 2025, 04:02 Uhr
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)
local ustr = mw.ustring
local textlib = mw.text
local DEFAULT_TOOLTIP_MAX = 140
-- --------------------------------------------------------
-- Datei-Existenz prüfen → Dateiname (mit Endung) oder nil
-- --------------------------------------------------------
local function fileExists(name)
if not name or name == '' then
return nil
end
local function check(n)
local titleObj = mw.title.makeTitle('File', n)
if not titleObj then
return nil
end
local fileObj = titleObj.file
if fileObj and fileObj.exists then
return titleObj.text -- z.B. "CurrencyGold.png"
end
return nil
end
-- 1. Versuch: Name wie er übergeben wird
local found = check(name)
if found then
return found
end
-- 2. Versuch: wenn keine Endung angegeben → .png anhängen
if not name:match('%.') then
found = check(name .. '.png')
if found then
return found
end
end
return nil
end
-- --------------------------------------------------------
-- Platzhalter / Basics
-- --------------------------------------------------------
-- $1 → title
local function applyPlaceholder(text, title)
if not text or text == '' then
return nil
end
return text:gsub('%$1', function()
return title or ''
end)
end
-- Nur Link bauen, KEIN Tooltip
local function buildLabel(labelText, linkTarget)
if not labelText or labelText == '' then
return ''
end
if linkTarget and linkTarget ~= '' then
if linkTarget:match('^%[%[') or linkTarget:match('^%[') then
-- bereits fertiger Wiki-/Externer Link
return linkTarget
else
return '[[' .. linkTarget .. '|' .. labelText .. ']]'
end
end
return labelText
end
-- Keys normalisieren: trim, lower, Leerzeichen → _
local function normalizeKey(key)
if not key then
return nil
end
key = textlib.trim(tostring(key))
if key == '' then
return nil
end
key = ustr.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
-- --------------------------------------------------------
-- Markup → Plaintext (für Tooltip)
-- --------------------------------------------------------
local function stripMarkup(str)
if not str or str == '' then
return ''
end
str = tostring(str)
-- interne Links [[Seite|Label]] / [[Seite]]
str = str:gsub('%[%[([^%]|]+)|([^%]]+)%]%]', '%2')
str = str:gsub('%[%[([^%]]+)%]%]', '%1')
-- externe Links [url Label]
str = str:gsub('%[[^%s%]]+%s+([^%]]+)%]', '%1')
-- Hervorhebungen
str = str:gsub("''+", '')
-- Templates {{...}}
str = str:gsub('{{.-}}', '')
-- HTML-Tags
str = str:gsub('<.->', '')
-- Whitespace normalisieren
str = str:gsub('%s+', ' ')
if textlib and textlib.trim then
str = textlib.trim(str)
end
return str
end
local function shorten(str, max)
str = stripMarkup(str)
max = tonumber(max) or 0
if max <= 0 or ustr.len(str) <= max then
return str
end
local cut = ustr.sub(str, 1, max)
local lastSpace = ustr.find(cut, ' [^ ]*$')
if lastSpace and lastSpace > max * 0.6 then
cut = ustr.sub(cut, 1, lastSpace - 1)
end
return cut .. '…'
end
-- --------------------------------------------------------
-- Bildauflösung
-- --------------------------------------------------------
local function getImageName(raw, title)
local imgName
if raw.img then
imgName = fileExists(raw.img)
end
if not imgName and title then
imgName = fileExists(title)
end
return imgName
end
-- --------------------------------------------------------
-- fs-tip Tooltip (wie früher in Modul:Item)
-- --------------------------------------------------------
local function buildTooltip(label, title, desc, imgName, linkTarget, max)
max = tonumber(max) or DEFAULT_TOOLTIP_MAX
desc = desc or ''
local shortDesc = shorten(desc, max)
local hasImg = imgName and imgName ~= ''
local out = {}
-- Wrapper
table.insert(out, '<span class="fs-tip">')
-- sichtbares Label
if label and label ~= '' then
table.insert(out, label)
else
if linkTarget and linkTarget ~= '' then
table.insert(out, '[[' .. linkTarget .. '|' .. (title or '') .. ']]')
else
table.insert(out, title or '')
end
end
-- Tooltip-Content
table.insert(out, '<span class="content">')
if hasImg then
table.insert(out, '<span class="box">')
table.insert(out, '[[Datei:' .. imgName .. '|48x48px]]')
table.insert(out, '<span class="text">')
else
table.insert(out, '<span class="text">')
end
-- Titel
table.insert(out, '<span class="title">')
table.insert(out, title or '')
table.insert(out, '</span>')
-- Beschreibung
if shortDesc ~= '' then
table.insert(out, '<span class="desc">')
table.insert(out, shortDesc)
table.insert(out, '</span>')
end
-- Close .text
table.insert(out, '</span>')
-- Close .box, falls Icon
if hasImg then
table.insert(out, '</span>')
end
-- Close .content + .fs-tip
table.insert(out, '</span>')
table.insert(out, '</span>')
return table.concat(out)
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]
-- neue Steuerung: Tooltip nur, wenn tip=1 (oder yes/true)
local tipFlag = (args.tip == '1' or args.tip == 'yes' or args.tip == 'true' or args.tooltip == '1')
local tipMax = tonumber(args.max or args.len or args.limit) or DEFAULT_TOOLTIP_MAX
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
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)
method = tostring(method):lower()
-- kleines Lazy-Getter für Bildname, damit wir nicht doppelt suchen
local resolvedImgName
local function imgName()
if resolvedImgName == nil then
resolvedImgName = getImageName(raw, title)
end
return resolvedImgName
end
-- -------------- Methoden --------------
if method == 'title' then
if tipFlag then
return buildTooltip(nil, title, desc, imgName(), link, tipMax)
end
return buildLabel(title, nil)
elseif method == 'short' then
if tipFlag then
-- Label: Kurzname, Inhaltstitel: voller Titel
return buildTooltip(short, title, desc, imgName(), link, tipMax)
end
return buildLabel(short, nil)
elseif method == 'link' then
if tipFlag then
return buildTooltip(short, title, desc, imgName(), link, tipMax)
end
return buildLabel(short, link)
elseif method == 'tooltip' then
-- explizit nur Tooltip
return buildTooltip(short, title, desc, imgName(), link, tipMax)
elseif method == 'img' then
local name = imgName()
if not name then
return ''
end
return name
elseif method == 'desc' then
return desc or ''
else
-- Fallback: wie "link"
if tipFlag then
return buildTooltip(short, title, desc, imgName(), link, tipMax)
end
return buildLabel(short, link)
end
end
return p