Zum Inhalt springen
Das Halloween-Event (Süßes oder Saures) ist beendet. Du kannst verbleibende Kürbisse noch im Hexenhütte eintauschen.

Modul:Firestone/Util: Unterschied zwischen den Versionen

Aus Firestone Idle Rpg Wiki
Die Seite wurde neu angelegt: „-- Modul:Firestone/Util local U = {} U.DAY = 86400 -- "2025-11-05" → os.time(...) function U.parseIsoDate(s) local y,m,d = tostring(s or ""):match("^(%d%d%d%d)%-(%d%d)%-(%d%d)$") if not y then return nil end return os.time{ year = tonumber(y), month = tonumber(m), day = tonumber(d), hour = 12 } end -- Timestamp → MediaWiki-Timestamp local function tsToMw(ts) return os.date("!%Y%m%d%H%M%S", ts) end function U.formatDateDe(v) loc…“
 
Keine Bearbeitungszusammenfassung
 
Zeile 4: Zeile 4:
U.DAY = 86400
U.DAY = 86400


-- "2025-11-05" → os.time(...)
-- -------------- Datum / Format --------------
function U.parseIsoDate(s)
function U.parseIsoDate(s)
     local y,m,d = tostring(s or ""):match("^(%d%d%d%d)%-(%d%d)%-(%d%d)$")
     local y,m,d = tostring(s or ""):match("^(%d%d%d%d)%-(%d%d)%-(%d%d)$")
Zeile 11: Zeile 11:
end
end


-- Timestamp → MediaWiki-Timestamp
local function tsToMw(ts)
local function tsToMw(ts)
     return os.date("!%Y%m%d%H%M%S", ts)
     return os.date("!%Y%m%d%H%M%S", ts)
Zeile 23: Zeile 22:
end
end


-- -------------- Kleinkram --------------
function U.isEmpty(v)
function U.isEmpty(v)
     return v == nil or v == ""
     return v == nil or v == ""
Zeile 31: Zeile 31:
     s = mw.text.trim(tostring(s))
     s = mw.text.trim(tostring(s))
     return mw.ustring.lower(s):gsub("%s+"," ")
     return mw.ustring.lower(s):gsub("%s+"," ")
end
function U.hasItems(t)
    if type(t) ~= "table" then return false end
    for _ in pairs(t) do return true end
    return false
end
end


Zeile 46: Zeile 52:
end
end


function U.hasItems(t)
-- -------------- Table helpers --------------
    if type(t) ~= "table" then return false end
    for _ in pairs(t) do return true end
    return false
end
 
-- versucht "halloween", "Halloween", "HALLOWEEN" usw.
function U.pickKey(tbl, key)
function U.pickKey(tbl, key)
     if type(tbl) ~= "table" then return nil end
     if type(tbl) ~= "table" then return nil end
Zeile 67: Zeile 67:
end
end


-- tief in Tabellen gehen
function U.deepGet(tbl, path)
function U.deepGet(tbl, path)
     local cur = tbl
     local cur = tbl
Zeile 88: Zeile 87:
end
end


-- "1-3" → "1–3", "5-" → "5+"
function U.prettyRange(s)
function U.prettyRange(s)
     if not s or s == "" then return "" end
     if not s or s == "" then return "" end
Zeile 96: Zeile 94:
     end
     end
     return s:gsub("%-","–")
     return s:gsub("%-","–")
end
-- -------------- NEU: Laden & Mergen --------------
-- ein Modul laden, egal ob via loadData oder require
function U.loadTable(name)
    local ok, data = pcall(mw.loadData, name)
    if ok and type(data) == "table" then return data end
    ok, data = pcall(require, name)
    if ok and type(data) == "table" then return data end
    return {}
end
-- mehrere Datenmodule in eins kippen
function U.mergeSources(list)
    local all = {}
    for _,name in ipairs(list) do
        local t = U.loadTable(name)
        for k,v in pairs(t) do
            all[k] = v
        end
    end
    return all
end
-- -------------- NEU: i18n-Helfer für Helden --------------
-- generische Auto-Übersetzung: nimmt i18n.i18n[feld][wert]
function U.autotrFrom(i18nTable, fieldName, value)
    if type(value) ~= "string" then return value end
    if type(i18nTable) ~= "table" then return value end
    local bucket = (i18nTable.i18n or {})[U.norm(fieldName)]
    if type(bucket) == "table" then
        local hit = bucket[U.norm(value)]
        if hit then return hit end
    end
    return value
end
-- "Stage 2" → "Freischaltung bei Abschnitt: 2"
function U.heroUnlockText(raw, i18nTable)
    if not raw or raw == "" then return "" end
    local uiUnlock = (((i18nTable or {}).ui) or {}).unlock or {}
    local txt = tostring(raw)
    local num = txt:match("^[Ss]tage%s+(%d+)$")
              or txt:match("^[Aa]bschnitt%s+(%d+)$")
    if num and uiUnlock.at_stage then
        return uiUnlock.at_stage:gsub("%$1", num)
    end
    return raw
end
-- "raining gold" → "Goldregen"
function U.heroAwakeningText(raw, i18nTable)
    if not raw or raw == "" then return "" end
    local aw = (((i18nTable or {}).i18n) or {}).awakening_bonus or {}
    return aw[U.norm(raw)] or raw
end
end


return U
return U

Aktuelle Version vom 7. November 2025, 04:41 Uhr

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

-- Modul:Firestone/Util
local U = {}

U.DAY = 86400

-- -------------- Datum / Format --------------
function U.parseIsoDate(s)
    local y,m,d = tostring(s or ""):match("^(%d%d%d%d)%-(%d%d)%-(%d%d)$")
    if not y then return nil end
    return os.time{ year = tonumber(y), month = tonumber(m), day = tonumber(d), hour = 12 }
end

local function tsToMw(ts)
    return os.date("!%Y%m%d%H%M%S", ts)
end

function U.formatDateDe(v)
    local ts = (type(v) == "number") and v or U.parseIsoDate(v)
    if not ts then return "" end
    local lang = mw.getContentLanguage()
    return lang:formatDate("d.m.Y", tsToMw(ts))
end

-- -------------- Kleinkram --------------
function U.isEmpty(v)
    return v == nil or v == ""
end

function U.norm(s)
    if s == nil then return "" end
    s = mw.text.trim(tostring(s))
    return mw.ustring.lower(s):gsub("%s+"," ")
end

function U.hasItems(t)
    if type(t) ~= "table" then return false end
    for _ in pairs(t) do return true end
    return false
end

-- Parent-Args bevorzugen
function U.getArgs(frame)
    local p = frame:getParent()
    local src = (p and p.args) or frame.args or {}
    local a = {}
    for k,v in pairs(src) do
        if v ~= nil and v ~= "" then
            a[k] = mw.text.trim(tostring(v))
        end
    end
    return a
end

-- -------------- Table helpers --------------
function U.pickKey(tbl, key)
    if type(tbl) ~= "table" then return nil end
    if tbl[key] ~= nil then return key end
    local k2 = tostring(key)
    if tbl[k2] ~= nil then return k2 end
    local kn = U.norm(k2)
    for k,_ in pairs(tbl) do
        if U.norm(k) == kn then
            return k
        end
    end
    return nil
end

function U.deepGet(tbl, path)
    local cur = tbl
    for _,k in ipairs(path) do
        if type(cur) ~= "table" then return nil end
        local real = U.pickKey(cur, k)
        if not real then return nil end
        cur = cur[real]
    end
    return cur
end

-- [[Datei:...]]
function U.fileTag(file, opts)
    if U.isEmpty(file) then return "" end
    local parts = { "Datei:" .. file }
    if opts and opts.size  then table.insert(parts, opts.size)  end
    if opts and opts.param then table.insert(parts, opts.param) end
    return string.format("[[%s]]", table.concat(parts, "|"))
end

function U.prettyRange(s)
    if not s or s == "" then return "" end
    s = tostring(s)
    if s:sub(-1) == "-" then
        return s:sub(1, -2) .. "+"
    end
    return s:gsub("%-","–")
end

-- -------------- NEU: Laden & Mergen --------------
-- ein Modul laden, egal ob via loadData oder require
function U.loadTable(name)
    local ok, data = pcall(mw.loadData, name)
    if ok and type(data) == "table" then return data end
    ok, data = pcall(require, name)
    if ok and type(data) == "table" then return data end
    return {}
end

-- mehrere Datenmodule in eins kippen
function U.mergeSources(list)
    local all = {}
    for _,name in ipairs(list) do
        local t = U.loadTable(name)
        for k,v in pairs(t) do
            all[k] = v
        end
    end
    return all
end

-- -------------- NEU: i18n-Helfer für Helden --------------
-- generische Auto-Übersetzung: nimmt i18n.i18n[feld][wert]
function U.autotrFrom(i18nTable, fieldName, value)
    if type(value) ~= "string" then return value end
    if type(i18nTable) ~= "table" then return value end
    local bucket = (i18nTable.i18n or {})[U.norm(fieldName)]
    if type(bucket) == "table" then
        local hit = bucket[U.norm(value)]
        if hit then return hit end
    end
    return value
end

-- "Stage 2" → "Freischaltung bei Abschnitt: 2"
function U.heroUnlockText(raw, i18nTable)
    if not raw or raw == "" then return "" end
    local uiUnlock = (((i18nTable or {}).ui) or {}).unlock or {}
    local txt = tostring(raw)

    local num = txt:match("^[Ss]tage%s+(%d+)$")
              or txt:match("^[Aa]bschnitt%s+(%d+)$")

    if num and uiUnlock.at_stage then
        return uiUnlock.at_stage:gsub("%$1", num)
    end
    return raw
end

-- "raining gold" → "Goldregen"
function U.heroAwakeningText(raw, i18nTable)
    if not raw or raw == "" then return "" end
    local aw = (((i18nTable or {}).i18n) or {}).awakening_bonus or {}
    return aw[U.norm(raw)] or raw
end

return U