mNo edit summary |
No edit summary |
||
(21 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
− | local |
+ | local cargo = mw.ext.cargo |
− | local |
+ | local db = {} |
− | local |
+ | local trim = mw.text.trim |
+ | -- credit: http://richard.warburton.it |
||
− | [0] = { |
||
+ | -- this version is without trim. |
||
− | internalName = "Dirt", |
||
+ | local function explode(div,str) |
||
− | tiles = { |
||
+ | if (div=='') then return false end |
||
− | "Dirt Block" |
||
+ | local pos,arr = 0,{} |
||
− | } |
||
+ | -- for each divider found |
||
− | }, |
||
+ | for st,sp in function() return string.find(str,div,pos,true) end do |
||
− | [1] = { |
||
+ | table.insert(arr,string.sub(str,pos,st-1)) -- Attach chars left of current divider |
||
− | internalName = "Stone", |
||
+ | pos = sp + 1 -- Jump past current divider |
||
− | tiles = { |
||
+ | end |
||
− | "Stone Block" |
||
+ | table.insert(arr, string.sub(str,pos)) -- Attach chars right of last divider |
||
− | } |
||
+ | return arr |
||
− | }, |
||
+ | end |
||
− | [2] = { |
||
− | internalName = "Grass", |
||
− | tiles = { |
||
− | "Grass" |
||
− | } |
||
− | }, |
||
− | [3] = { |
||
− | internalName = "Plants", |
||
− | tiles = { |
||
− | "Plants" |
||
− | } |
||
− | }, |
||
− | [4] = { |
||
− | internalName = "Torches", |
||
− | tiles = { |
||
− | "Torch", |
||
− | "Blue Torch", |
||
− | "Red Torch", |
||
− | "Green Torch", |
||
− | "Purple Torch", |
||
− | "White Torch", |
||
− | "Yellow Torch", |
||
− | "Demon Torch", |
||
− | "Cursed Torch", |
||
− | "Ice Torch", |
||
− | "Orange Torch", |
||
− | "Ichor Torch", |
||
− | "Ultrabright Torch", |
||
− | "Bone Torch", |
||
− | "Rainbow Torch", |
||
− | "Pink Torch", |
||
− | "Desert Torch", |
||
− | "Coral Torch", |
||
− | "Corrupt Torch", |
||
− | "Crimson Torch", |
||
− | "Hallowed Torch", |
||
− | "Jungle Torch" |
||
− | } |
||
− | }, |
||
− | [5] = { |
||
− | internalName = "Trees", |
||
− | tiles = { |
||
− | "Tree", |
||
− | "Corrupt tree", |
||
− | "Jungle tree", |
||
− | "Hallow tree", |
||
− | "Boreal tree", |
||
− | "Crimson tree", |
||
− | "Living Mahogany tree", |
||
− | "Giant Glowing Mushroom" |
||
− | } |
||
− | }, |
||
− | [6] = { |
||
− | internalName = "Iron", |
||
− | tiles = { |
||
− | "Iron Ore" |
||
− | } |
||
− | }, |
||
− | [7] = { |
||
− | internalName = "Copper", |
||
− | tiles = { |
||
− | "Copper Ore" |
||
− | } |
||
− | }, |
||
− | [8] = { |
||
− | internalName = "Gold", |
||
− | tiles = { |
||
− | "Gold Ore" |
||
− | } |
||
− | }, |
||
− | [9] = { |
||
− | internalName = "Silver", |
||
− | tiles = { |
||
− | "Silver Ore" |
||
− | } |
||
− | } |
||
− | } |
||
+ | local args_table -- cache |
||
− | local output = mw.html.create("table"):addClass("terraria sortable") |
||
+ | -- helper function |
||
− | |||
− | local |
+ | local getArg = function(key) |
− | local |
+ | local value = trim(args_table[key] or '') |
+ | return (value ~= '') and value or nil |
||
− | local internalName = info["internalName"] |
||
+ | end |
||
− | local subTiles = info["tiles"] |
||
+ | -- key: e.g. "BuffName.ManaRegeneration". |
||
− | for subTileId, tile in ipairs(subTiles) do |
||
+ | -- return string or table, nil when key is invalid. |
||
− | local row = output:tag("tr") |
||
− | + | local get -- for recursion |
|
+ | get = function(key, lang) |
||
− | |||
+ | lang = lang or 'en' |
||
− | if subTileId > 1 then |
||
+ | if not db[lang] then |
||
− | nameCell = row:tag("dd"):tag("td") |
||
+ | if lang == 'es' or lang == 'it' or lang =='zh' or lang == 'de' or lang == 'ru' or lang == 'fr' or lang == 'pl' or lang == 'pt' then |
||
+ | db[lang] = mw.loadData("Module:GameText/db-"..lang) |
||
else |
else |
||
+ | db[lang] = mw.loadData("Module:GameText/db-en") |
||
− | nameCell = row:tag("td") |
||
end |
end |
||
+ | end |
||
− | |||
+ | local data, result = db[lang], nil |
||
− | nameCell:wikitext(string.format("[[%s]]", tile)) |
||
− | + | if string.find(trim(key), '.', 0, true) then |
|
+ | for _, v in ipairs(explode('.', trim(key))) do |
||
− | |||
− | if |
+ | if type(data) == 'table' then |
+ | v = tonumber(v) or v -- convert to number for pure number index. |
||
− | row:tag("td"):tag("code"):wikitext(internalName) |
||
+ | result = data[v] |
||
+ | data = result |
||
+ | else |
||
+ | break |
||
+ | end |
||
end |
end |
||
+ | else |
||
+ | result = data[trim(key)] |
||
end |
end |
||
+ | if result then |
||
+ | if type(result) == 'table' then |
||
+ | arr = {} |
||
+ | for _, v in pairs(result) do |
||
+ | arr[#arr+1] = v |
||
+ | end |
||
+ | result = table.concat(arr, '₪') -- we must use a separator that is guaranteed not to be contained in any string. We can easily replace it in wikitext with any that we like |
||
+ | else |
||
+ | -- for such as {$CommonItemTooltip.RightClickToOpen} |
||
+ | result = string.gsub(result, "({%$(.-)})", function(s, ref) return get(ref, lang) end) |
||
+ | end |
||
+ | end |
||
+ | return result |
||
end |
end |
||
+ | -- args: tables for replacement, e.g.: { ["{0}"] = "Party Girl", ["<right>"] = "Right click" } |
||
− | return { |
||
− | + | local getText = function(key, lang, args) |
|
+ | if not key then |
||
− | -- init cache |
||
+ | return |
||
− | currentFrame = frame |
||
+ | end |
||
− | lang = frame.args["lang"] or frame:expandTemplate{ title = "lang" } |
||
+ | local str = get(key, lang) |
||
+ | -- en as fallback. |
||
+ | if not str and lang ~= 'en' then |
||
+ | str = get(key, 'en') |
||
+ | end |
||
+ | if not str then |
||
+ | return '' |
||
+ | end |
||
+ | local str = string.gsub(str, "{%?.-}", "") -- "{?Homeless}"" -> "" |
||
+ | if str and args then |
||
+ | str = string.gsub(str, "%b{}", args) |
||
+ | str = string.gsub(str, "%b<>", args) |
||
+ | end |
||
+ | |||
+ | return str |
||
− | -- add header |
||
+ | end |
||
− | local header = output:tag("tr") |
||
− | header:tag("th"):wikitext("Name") |
||
− | header:tag("th"):wikitext("ID") |
||
− | header:tag("th"):wikitext("Internal Name") |
||
+ | local query |
||
− | for id = 0, #data do |
||
+ | query = function(key, lang) |
||
− | printRows(id) |
||
+ | lang = lang or 'en' |
||
+ | local result = mw.ext.cargo.query('GameText', 'content', { |
||
+ | where = 'lang='.. "'"..lang.."' AND name='"..key.."'", |
||
+ | limit = 1, |
||
+ | }) |
||
+ | local text |
||
+ | for _, row in ipairs(result) do |
||
+ | text = row['content'] |
||
+ | end |
||
+ | if not text then |
||
+ | return |
||
+ | end |
||
+ | return text |
||
+ | end |
||
+ | |||
+ | local queryText = function(key, lang, args) |
||
+ | if not key then |
||
+ | return |
||
+ | end |
||
+ | local str = query(key, lang) |
||
+ | -- en as fallback. |
||
+ | if not str and lang ~= 'en' then |
||
+ | str = query(key, 'en') |
||
+ | end |
||
+ | if not str then |
||
+ | return '' |
||
+ | end |
||
+ | if str and args then |
||
+ | str = string.gsub(str, "%b{}", args) |
||
+ | str = string.gsub(str, "%b<>", args) |
||
+ | end |
||
+ | return str |
||
+ | end |
||
+ | |||
+ | |||
+ | return { |
||
+ | ---------- for template ---------------- |
||
+ | get = function(frame) |
||
+ | args_table = frame:getParent().args -- cache |
||
+ | local args |
||
+ | for k, v in pairs(args_table) do |
||
+ | string.gsub(k, '^x_(.+)', function(n) |
||
+ | if not args then args = {} end |
||
+ | args['{'..n..'}'] = v |
||
+ | end) |
||
+ | string.gsub(k, '^y_(.+)', function(n) |
||
+ | if not args then args = {} end |
||
+ | args['<'..n..'>'] = v |
||
+ | end) |
||
end |
end |
||
+ | return getText(getArg(1), getArg('lang') or frame.args['lang'], args) |
||
+ | end, |
||
+ | get1 = function(frame) |
||
− | return output |
||
+ | args_table = frame.args -- cache |
||
− | end |
||
+ | return getText(getArg(1), 'en',{}) |
||
+ | end, |
||
+ | query1 = function(frame) |
||
+ | args_table = frame.args -- cache |
||
+ | return queryText(getArg(1), 'en', {}) |
||
+ | end, |
||
+ | |||
+ | getRaw = function(frame) |
||
+ | return getText(frame.args['key'], frame.args['lang']) |
||
+ | end, |
||
+ | |||
+ | query = function(frame) |
||
+ | args_table = frame:getParent().args -- cache |
||
+ | local args |
||
+ | for k, v in pairs(args_table) do |
||
+ | string.gsub(k, '^x_(.+)', function(n) |
||
+ | if not args then args = {} end |
||
+ | args['{'..n..'}'] = v |
||
+ | end) |
||
+ | string.gsub(k, '^y_(.+)', function(n) |
||
+ | if not args then args = {} end |
||
+ | args['<'..n..'>'] = v |
||
+ | end) |
||
+ | end |
||
+ | return queryText(getArg(1), getArg('lang') or frame.args['lang'], args) |
||
+ | end, |
||
+ | |||
+ | listAll = function(frame) |
||
+ | local lang = frame.args['lang'] or 'en' |
||
+ | if not db[lang] then |
||
+ | if lang == 'es' or lang == 'it' or lang =='zh' or lang == 'de' or lang == 'ru' or lang == 'fr' or lang == 'pl' or lang == 'pt' then |
||
+ | db[lang] = require("Module:GameText/db-"..lang) |
||
+ | else |
||
+ | db[lang] = require("Module:GameText/db-en") |
||
+ | end |
||
+ | end |
||
+ | |||
+ | if frame.args[1] then |
||
+ | local output |
||
+ | if not db[lang][frame.args[1]] then |
||
+ | return |
||
+ | end |
||
+ | for k, v in pairs(db[lang][frame.args[1]]) do |
||
+ | if output then |
||
+ | output = output .. '¦' .. k .. '₪' .. v |
||
+ | else |
||
+ | output = k .. '₪' .. v |
||
+ | end |
||
+ | |||
+ | end |
||
+ | return output |
||
+ | else |
||
+ | local output |
||
+ | for k, v in pairs(db[lang]) do |
||
+ | if output then |
||
+ | output = output .. '¦' .. k |
||
+ | else |
||
+ | output = k |
||
+ | end |
||
+ | end |
||
+ | return output |
||
+ | end |
||
+ | end, |
||
+ | |||
+ | listKeys = function(frame) |
||
+ | local lang = frame.args['lang'] or 'en' |
||
+ | if not db[lang] then |
||
+ | if lang == 'es' or lang == 'it' or lang =='zh' or lang == 'de' or lang == 'ru' or lang == 'fr' or lang == 'pl' or lang == 'pt' then |
||
+ | db[lang] = mw.loadData("Module:GameText/db-"..lang) |
||
+ | else |
||
+ | db[lang] = mw.loadData("Module:GameText/db-en") |
||
+ | end |
||
+ | end |
||
+ | |||
+ | if frame.args[1] then |
||
+ | local output |
||
+ | if not db[lang][frame.args[1]] then |
||
+ | return |
||
+ | end |
||
+ | for k, v in pairs(db[lang][frame.args[1]]) do |
||
+ | if output then |
||
+ | output = output .. '¦' .. k |
||
+ | else |
||
+ | output = k |
||
+ | end |
||
+ | end |
||
+ | return output |
||
+ | else |
||
+ | local output |
||
+ | for k, v in pairs(db[lang]) do |
||
+ | if output then |
||
+ | output = output .. '¦' .. k |
||
+ | else |
||
+ | output = k |
||
+ | end |
||
+ | end |
||
+ | return output |
||
+ | end |
||
+ | end, |
||
+ | |||
+ | ---------- for module ---------------- |
||
+ | getText = getText, |
||
+ | |||
} |
} |
Revision as of 08:38, 9 June 2021
Documentation The documentation below is transcluded from Module:Test/doc. (edit | history)
A test module to avoid disturbing "real" pages.
See Terraria Wiki:Lua for more information about Lua and links to other help resources.
Feel free to test this module at Terraria Wiki:Sandbox.
local cargo = mw.ext.cargo
local db = {}
local trim = mw.text.trim
-- credit: http://richard.warburton.it
-- this version is without trim.
local function explode(div,str)
if (div=='') then return false end
local pos,arr = 0,{}
-- for each divider found
for st,sp in function() return string.find(str,div,pos,true) end do
table.insert(arr,string.sub(str,pos,st-1)) -- Attach chars left of current divider
pos = sp + 1 -- Jump past current divider
end
table.insert(arr, string.sub(str,pos)) -- Attach chars right of last divider
return arr
end
local args_table -- cache
-- helper function
local getArg = function(key)
local value = trim(args_table[key] or '')
return (value ~= '') and value or nil
end
-- key: e.g. "BuffName.ManaRegeneration".
-- return string or table, nil when key is invalid.
local get -- for recursion
get = function(key, lang)
lang = lang or 'en'
if not db[lang] then
if lang == 'es' or lang == 'it' or lang =='zh' or lang == 'de' or lang == 'ru' or lang == 'fr' or lang == 'pl' or lang == 'pt' then
db[lang] = mw.loadData("Module:GameText/db-"..lang)
else
db[lang] = mw.loadData("Module:GameText/db-en")
end
end
local data, result = db[lang], nil
if string.find(trim(key), '.', 0, true) then
for _, v in ipairs(explode('.', trim(key))) do
if type(data) == 'table' then
v = tonumber(v) or v -- convert to number for pure number index.
result = data[v]
data = result
else
break
end
end
else
result = data[trim(key)]
end
if result then
if type(result) == 'table' then
arr = {}
for _, v in pairs(result) do
arr[#arr+1] = v
end
result = table.concat(arr, '₪') -- we must use a separator that is guaranteed not to be contained in any string. We can easily replace it in wikitext with any that we like
else
-- for such as {$CommonItemTooltip.RightClickToOpen}
result = string.gsub(result, "({%$(.-)})", function(s, ref) return get(ref, lang) end)
end
end
return result
end
-- args: tables for replacement, e.g.: { ["{0}"] = "Party Girl", ["<right>"] = "Right click" }
local getText = function(key, lang, args)
if not key then
return
end
local str = get(key, lang)
-- en as fallback.
if not str and lang ~= 'en' then
str = get(key, 'en')
end
if not str then
return ''
end
local str = string.gsub(str, "{%?.-}", "") -- "{?Homeless}"" -> ""
if str and args then
str = string.gsub(str, "%b{}", args)
str = string.gsub(str, "%b<>", args)
end
return str
end
local query
query = function(key, lang)
lang = lang or 'en'
local result = mw.ext.cargo.query('GameText', 'content', {
where = 'lang='.. "'"..lang.."' AND name='"..key.."'",
limit = 1,
})
local text
for _, row in ipairs(result) do
text = row['content']
end
if not text then
return
end
return text
end
local queryText = function(key, lang, args)
if not key then
return
end
local str = query(key, lang)
-- en as fallback.
if not str and lang ~= 'en' then
str = query(key, 'en')
end
if not str then
return ''
end
if str and args then
str = string.gsub(str, "%b{}", args)
str = string.gsub(str, "%b<>", args)
end
return str
end
return {
---------- for template ----------------
get = function(frame)
args_table = frame:getParent().args -- cache
local args
for k, v in pairs(args_table) do
string.gsub(k, '^x_(.+)', function(n)
if not args then args = {} end
args['{'..n..'}'] = v
end)
string.gsub(k, '^y_(.+)', function(n)
if not args then args = {} end
args['<'..n..'>'] = v
end)
end
return getText(getArg(1), getArg('lang') or frame.args['lang'], args)
end,
get1 = function(frame)
args_table = frame.args -- cache
return getText(getArg(1), 'en',{})
end,
query1 = function(frame)
args_table = frame.args -- cache
return queryText(getArg(1), 'en', {})
end,
getRaw = function(frame)
return getText(frame.args['key'], frame.args['lang'])
end,
query = function(frame)
args_table = frame:getParent().args -- cache
local args
for k, v in pairs(args_table) do
string.gsub(k, '^x_(.+)', function(n)
if not args then args = {} end
args['{'..n..'}'] = v
end)
string.gsub(k, '^y_(.+)', function(n)
if not args then args = {} end
args['<'..n..'>'] = v
end)
end
return queryText(getArg(1), getArg('lang') or frame.args['lang'], args)
end,
listAll = function(frame)
local lang = frame.args['lang'] or 'en'
if not db[lang] then
if lang == 'es' or lang == 'it' or lang =='zh' or lang == 'de' or lang == 'ru' or lang == 'fr' or lang == 'pl' or lang == 'pt' then
db[lang] = require("Module:GameText/db-"..lang)
else
db[lang] = require("Module:GameText/db-en")
end
end
if frame.args[1] then
local output
if not db[lang][frame.args[1]] then
return
end
for k, v in pairs(db[lang][frame.args[1]]) do
if output then
output = output .. '¦' .. k .. '₪' .. v
else
output = k .. '₪' .. v
end
end
return output
else
local output
for k, v in pairs(db[lang]) do
if output then
output = output .. '¦' .. k
else
output = k
end
end
return output
end
end,
listKeys = function(frame)
local lang = frame.args['lang'] or 'en'
if not db[lang] then
if lang == 'es' or lang == 'it' or lang =='zh' or lang == 'de' or lang == 'ru' or lang == 'fr' or lang == 'pl' or lang == 'pt' then
db[lang] = mw.loadData("Module:GameText/db-"..lang)
else
db[lang] = mw.loadData("Module:GameText/db-en")
end
end
if frame.args[1] then
local output
if not db[lang][frame.args[1]] then
return
end
for k, v in pairs(db[lang][frame.args[1]]) do
if output then
output = output .. '¦' .. k
else
output = k
end
end
return output
else
local output
for k, v in pairs(db[lang]) do
if output then
output = output .. '¦' .. k
else
output = k
end
end
return output
end
end,
---------- for module ----------------
getText = getText,
}