Zum Inhalt springen

Modul:Item: Unterschied zwischen den Versionen

Aus Firestone Idle Rpg Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
-- Modul:Item – Firestone-Version (Daten + Tooltip)
-- Modul:Item – Firestone-Version
--
-- Bietet (für andere Vorlagen):
--  #invoke:Item|title|key      -> "Gold"
--  #invoke:Item|short|key      -> Kurzname oder Titel
--  #invoke:Item|desc|key        -> Beschreibung (describe/description)
--  #invoke:Item|type|key        -> Deutscher Typ (z.B. "Währung")
--  #invoke:Item|img|key        -> Bild-Basename ohne "Datei:" / ".png"
--  #invoke:Item|link|key        -> Seitentitel, z.B. "Währung#Gold"
--  #invoke:Item|tooltip|key|... -> fertige Tooltip-Ausgabe (Label über |label=)
--
-- Datengrundlage: [[Modul:Item/Data]]
-- Typgruppen:    [[Modul:Item/Types]] + [[Modul:Item/Type]]


local p        = {}
local p        = {}
Zeile 5: Zeile 17:
local ItemType = require('Modul:Item/Type')
local ItemType = require('Modul:Item/Type')


local ustr     = mw.ustring
local ustr = mw.ustring
local text     = mw.text
local text = mw.text


-- =========================
-- =========================
Zeile 12: Zeile 24:
-- =========================
-- =========================


local DEFAULT_404_IMG     = '404'
local DEFAULT_404_IMG     = '404'
local DEFAULT_404_LINK     = 'Modul:Item/Data'
local DEFAULT_404_LINK   = 'Modul:Item/Data'
local DEFAULT_404_TYPE     = 'unknown'
local DEFAULT_404_TYPE   = 'unknown'
local DEFAULT_TOOLTIP_MAX = 140
local DEFAULT_TOOLTIP_MAX = 140


-- interne Typ-Namen → deutsche Labels
-- interne Typen -> deutsche Labels
local TYPE_LABELS = {
local TYPE_LABELS = {
     currencies = 'Währung',
     currencies = 'Währung',
Zeile 26: Zeile 38:
-- Helpers
-- Helpers
-- =========================
-- =========================
local function trim(s)
    if s == nil then
        return ''
    end
    s = tostring(s)
    if text and text.trim then
        return text.trim(s)
    end
    return s:gsub('^%s+', ''):gsub('%s+$', '')
end


local function normalizeKey(name)
local function normalizeKey(name)
Zeile 100: Zeile 101:
     end
     end
     return capitalize(item.key)
     return capitalize(item.key)
end
local function getShort(item)
    if item.short and item.short ~= '' then
        return item.short
    end
    return getTitle(item)
end
end


Zeile 130: Zeile 138:
end
end


local function getTypeRaw(item)
local function getType(item)
     local group = ItemType.typenameForKey(item.key)
     local group = ItemType.typenameForKey(item.key)
    return group or DEFAULT_404_TYPE
end
local function getTypeLabel(item)
    local group = getTypeRaw(item)
     local label = TYPE_LABELS[group]
     local label = TYPE_LABELS[group]
     if label and label ~= '' then
     if label and label ~= '' then
         return label
         return label
     end
     end
     return group
     return group or DEFAULT_404_TYPE
end
end


Zeile 194: Zeile 197:
end
end


-- ---------- Tooltip-Aufbau ----------
-- ---------- Tooltip ----------


local function buildTooltip(item, opts)
local function buildTooltip(item, opts)
     opts = opts or {}
     opts = opts or {}
     local max  = opts.max or DEFAULT_TOOLTIP_MAX
     local max  = opts.max or DEFAULT_TOOLTIP_MAX
     local label = opts.label or ''
     local label = opts.label


     local title    = getTitle(item)
     local title    = getTitle(item)
Zeile 205: Zeile 208:
     local shortDesc = shorten(desc, max)
     local shortDesc = shorten(desc, max)
     local img      = getImage(item)
     local img      = getImage(item)
    local target    = getLinkTarget(item)


     local parts = {}
     local out = {}


    -- Wrapper (fs-item) – Tooltip nur per CSS, wenn .tooltip vorhanden
     table.insert(out, '<span class="fs-item">')
     table.insert(parts, '<span class="fs-item fs-item--has-tooltip">')


     -- Sichtbares Label (z.B. {{Icon}} oder {{Amount}}-HTML)
     -- sichtbares Label
     if label ~= '' then
     if label and label ~= '' then
         table.insert(parts, label)
         table.insert(out, label)
     else
     else
         table.insert(parts, '[[' .. target .. '|' .. title .. ']]')
        local target = getLinkTarget(item)
         table.insert(out, '[[' .. target .. '|' .. title .. ']]')
     end
     end


    -- Tooltip-Box
     table.insert(out, '<span class="tooltip">')
     table.insert(parts, '<span class="tooltip">')


    -- Header: Icon + Titel
     table.insert(out, '<span class="header">')
     table.insert(parts, '<span class="header">')
     if img and img ~= '' then
     if img and img ~= '' then
         table.insert(parts, '[[Datei:' .. img .. '.png|24x24px|class=icon]] ')
         table.insert(out, '[[Datei:' .. img .. '.png|24x24px|class=icon]] ')
     end
     end
     table.insert(parts, '<span class="title">')
     table.insert(out, '<span class="title">')
     table.insert(parts, title)
     table.insert(out, title)
     table.insert(parts, '</span></span>') -- title + header
     table.insert(out, '</span></span>') -- title + header


    -- Body
     if shortDesc ~= '' then
     if shortDesc ~= '' then
         table.insert(parts, '<span class="body">')
         table.insert(out, '<span class="body">')
         table.insert(parts, shortDesc)
         table.insert(out, shortDesc)
         table.insert(parts, '</span>')
         table.insert(out, '</span>')
     end
     end


     table.insert(parts, '</span>') -- tooltip
     table.insert(out, '</span>') -- tooltip
     table.insert(parts, '</span>') -- fs-item
     table.insert(out, '</span>') -- fs-item


     return table.concat(parts)
     return table.concat(out)
end
end


-- ---------- Frame-Key ----------
-- ---------- Frame-Args ----------
 
local function extractKey(args)
    if not args then
        return nil
    end
    return args[1] or args.name or args.key or args.id or args.nameid
end


local function getKey(frame)
local function getArgKey(frame)
     if not frame then
     if not frame then
         return ''
         return nil, {}
     end
     end


     local args = frame.args or {}
     local args = frame.args or {}
     local key  = args[1] or args.key or args.name or args.id or args.nameid
     local key  = extractKey(args)
    if key and key ~= '' then
        return key, args
    end


     if (not key or key == '') and frame.getParent then
     if frame.getParent then
         local parent = frame:getParent()
         local parent = frame:getParent()
         if parent and parent.args then
         if parent and parent.args then
             args = parent.args
             args = parent.args
             key  = args[1] or args.key or args.name or args.id or args.nameid
             key  = extractKey(args)
            if key and key ~= '' then
                return key, args
            end
         end
         end
     end
     end


     return trim(key)
     return nil, args
end
end


-- =========================
-- =========================
-- Öffentliche Funktionen (Daten)
-- Öffentliche Funktionen
-- =========================
-- =========================


function p.title(frame)
function p.title(frame)
     local key = getKey(frame)
     local key = select(1, getArgKey(frame))
     local item = getItem(key)
     local item = getItem(key)
     return getTitle(item)
     return getTitle(item)
Zeile 276: Zeile 288:


function p.short(frame)
function p.short(frame)
     local key = getKey(frame)
     local key = select(1, getArgKey(frame))
     local item = getItem(key)
     local item = getItem(key)
     return item.short or getTitle(item)
     return getShort(item)
end
end


function p.description(frame)
function p.desc(frame)
     local key = getKey(frame)
     local key = select(1, getArgKey(frame))
     local item = getItem(key)
     local item = getItem(key)
     return item.describe or item.description or '-'
     return item.describe or item.description or '-'
end
end


p.desc = p.description
function p.type(frame)
 
     local key = select(1, getArgKey(frame))
function p.link(frame)
     local key = getKey(frame)
     local item = getItem(key)
     local item = getItem(key)
     return getLinkTarget(item)
     return getType(item)
end
end


function p.img(frame)
function p.img(frame)
     local key = getKey(frame)
     local key = select(1, getArgKey(frame))
     local item = getItem(key)
     local item = getItem(key)
    -- Nur der Basename; .png + Datei: kommen in der Vorlage
     return getImage(item)
     return getImage(item)
end
end


function p.type(frame)
function p.link(frame)
     local key = getKey(frame)
     local key = select(1, getArgKey(frame))
     local item = getItem(key)
     local item = getItem(key)
     return getTypeLabel(item)
    -- Nur das Seitentarget, z.B. "Währung#Gold"
     return getLinkTarget(item)
end
end


function p.type_raw(frame)
function p.tooltip(frame)
     local key = getKey(frame)
     local key, args = getArgKey(frame)
     local item = getItem(key)
     local item = getItem(key)
    return getTypeRaw(item)
end
-- =========================
-- Tooltip-Wrapper
-- =========================
-- Verwendung:
--  {{#invoke:Item|tooltip|gold|label=<…Markup…>|max=200}}
function p.tooltip(frame)
    local args  = frame.args or {}
    local key  = getKey(frame)
    local item  = getItem(key)
    local label = args.label or ''
     local max  = tonumber(args.max or args.len or args.limit) or DEFAULT_TOOLTIP_MAX
     local max  = tonumber(args.max or args.len or args.limit) or DEFAULT_TOOLTIP_MAX
 
    local label = args.label
     return buildTooltip(item, { label = label, max = max })
     return buildTooltip(item, { max = max, label = label })
end
end


return p
return p

Version vom 30. November 2025, 20:42 Uhr

Die Dokumentation für dieses Modul kann unter Modul:Item/Doku erstellt werden

-- Modul:Item – Firestone-Version
--
-- Bietet (für andere Vorlagen):
--   #invoke:Item|title|key       -> "Gold"
--   #invoke:Item|short|key       -> Kurzname oder Titel
--   #invoke:Item|desc|key        -> Beschreibung (describe/description)
--   #invoke:Item|type|key        -> Deutscher Typ (z.B. "Währung")
--   #invoke:Item|img|key         -> Bild-Basename ohne "Datei:" / ".png"
--   #invoke:Item|link|key        -> Seitentitel, z.B. "Währung#Gold"
--   #invoke:Item|tooltip|key|... -> fertige Tooltip-Ausgabe (Label über |label=)
--
-- Datengrundlage: [[Modul:Item/Data]]
-- Typgruppen:     [[Modul:Item/Types]] + [[Modul:Item/Type]]

local p        = {}
local DATA     = mw.loadData('Modul:Item/Data')
local ItemType = require('Modul:Item/Type')

local ustr = mw.ustring
local text = mw.text

-- =========================
-- Konfiguration
-- =========================

local DEFAULT_404_IMG     = '404'
local DEFAULT_404_LINK    = 'Modul:Item/Data'
local DEFAULT_404_TYPE    = 'unknown'
local DEFAULT_TOOLTIP_MAX = 140

-- interne Typen -> deutsche Labels
local TYPE_LABELS = {
    currencies = 'Währung',
    unknown    = 'Unbekannt',
}

-- =========================
-- Helpers
-- =========================

local function normalizeKey(name)
    if not name then
        return nil
    end
    local s = ustr.lower(tostring(name))
    s = s:gsub('%s+', '')
    return s
end

local function clone(tbl)
    local copy = {}
    for k, v in pairs(tbl or {}) do
        copy[k] = v
    end
    return copy
end

local function object404(name)
    name = tostring(name or '?')
    return {
        key      = '404',
        title    = 'ERROR: ' .. name,
        link     = DEFAULT_404_LINK,
        img      = DEFAULT_404_IMG,
        type     = DEFAULT_404_TYPE,
        describe = '',
    }
end

local function getItem(raw)
    local key = normalizeKey(raw or '')
    if not key or key == '' then
        return object404(raw)
    end

    local base = DATA[key]
    if not base then
        return object404(key)
    end

    local item = clone(base)
    item.key   = key
    return item
end

local function capitalize(str)
    if not str then
        return ''
    end
    local s = string.lower(tostring(str))
    return string.gsub(' ' .. s, '%W%l', string.upper):sub(2)
end

local function title2link(title)
    return (tostring(title or '')):gsub('%s', '_')
end

local function getTitle(item)
    if item.title and item.title ~= '' then
        return item.title
    end
    return capitalize(item.key)
end

local function getShort(item)
    if item.short and item.short ~= '' then
        return item.short
    end
    return getTitle(item)
end

local function imgPngExists(imgname)
    if type(imgname) == 'string' and #imgname ~= 0 then
        local t = mw.title.new('Datei:' .. imgname .. '.png')
        return t and t.file and t.file.exists or false
    end
    return false
end

local function getImage(item)
    if item.img and imgPngExists(item.img) then
        return item.img
    end

    local guess = title2link(getTitle(item))
    if imgPngExists(guess) then
        return guess
    end

    return object404(item.key).img
end

local function getLinkTarget(item)
    if item.link and item.link ~= '' then
        return item.link
    end
    return title2link(getTitle(item))
end

local function getType(item)
    local group = ItemType.typenameForKey(item.key)
    local label = TYPE_LABELS[group]
    if label and label ~= '' then
        return label
    end
    return group or DEFAULT_404_TYPE
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
    str = str:gsub('%s+', ' ')
    if text and text.trim then
        str = text.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

-- ---------- Tooltip ----------

local function buildTooltip(item, opts)
    opts = opts or {}
    local max   = opts.max or DEFAULT_TOOLTIP_MAX
    local label = opts.label

    local title     = getTitle(item)
    local desc      = item.describe or item.description or ''
    local shortDesc = shorten(desc, max)
    local img       = getImage(item)

    local out = {}

    table.insert(out, '<span class="fs-item">')

    -- sichtbares Label
    if label and label ~= '' then
        table.insert(out, label)
    else
        local target = getLinkTarget(item)
        table.insert(out, '[[' .. target .. '|' .. title .. ']]')
    end

    table.insert(out, '<span class="tooltip">')

    table.insert(out, '<span class="header">')
    if img and img ~= '' then
        table.insert(out, '[[Datei:' .. img .. '.png|24x24px|class=icon]] ')
    end
    table.insert(out, '<span class="title">')
    table.insert(out, title)
    table.insert(out, '</span></span>') -- title + header

    if shortDesc ~= '' then
        table.insert(out, '<span class="body">')
        table.insert(out, shortDesc)
        table.insert(out, '</span>')
    end

    table.insert(out, '</span>') -- tooltip
    table.insert(out, '</span>') -- fs-item

    return table.concat(out)
end

-- ---------- Frame-Args ----------

local function extractKey(args)
    if not args then
        return nil
    end
    return args[1] or args.name or args.key or args.id or args.nameid
end

local function getArgKey(frame)
    if not frame then
        return nil, {}
    end

    local args = frame.args or {}
    local key  = extractKey(args)
    if key and key ~= '' then
        return key, args
    end

    if frame.getParent then
        local parent = frame:getParent()
        if parent and parent.args then
            args = parent.args
            key  = extractKey(args)
            if key and key ~= '' then
                return key, args
            end
        end
    end

    return nil, args
end

-- =========================
-- Öffentliche Funktionen
-- =========================

function p.title(frame)
    local key = select(1, getArgKey(frame))
    local item = getItem(key)
    return getTitle(item)
end

function p.short(frame)
    local key = select(1, getArgKey(frame))
    local item = getItem(key)
    return getShort(item)
end

function p.desc(frame)
    local key = select(1, getArgKey(frame))
    local item = getItem(key)
    return item.describe or item.description or '-'
end

function p.type(frame)
    local key = select(1, getArgKey(frame))
    local item = getItem(key)
    return getType(item)
end

function p.img(frame)
    local key = select(1, getArgKey(frame))
    local item = getItem(key)
    -- Nur der Basename; .png + Datei: kommen in der Vorlage
    return getImage(item)
end

function p.link(frame)
    local key = select(1, getArgKey(frame))
    local item = getItem(key)
    -- Nur das Seitentarget, z.B. "Währung#Gold"
    return getLinkTarget(item)
end

function p.tooltip(frame)
    local key, args = getArgKey(frame)
    local item = getItem(key)
    local max   = tonumber(args.max or args.len or args.limit) or DEFAULT_TOOLTIP_MAX
    local label = args.label
    return buildTooltip(item, { max = max, label = label })
end

return p