Modul:Firestone/Util: Unterschied zwischen den Versionen
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 | ||
-- | -- -------------- 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 | ||
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 | ||
-- -------------- Table helpers -------------- | |||
-- | |||
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 | ||
function U.deepGet(tbl, path) | function U.deepGet(tbl, path) | ||
local cur = tbl | local cur = tbl | ||
| Zeile 88: | Zeile 87: | ||
end | end | ||
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