Terraria Wiki

  • Discussions are now available on the Terraria Wiki.
  • Miss the old Hydra Skin? Try out our Hydralize gadget! Visit the preferences page while logged in and turn on the gadget.

READ MORE

Terraria Wiki
mNo edit summary
No edit summary
(21 intermediate revisions by 4 users not shown)
Line 1: Line 1:
local currentFrame
+
local cargo = mw.ext.cargo
local lang
+
local db = {}
   
local data = {
+
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 function printRows(id)
+
local getArg = function(key)
local info = data[id]
+
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 nameCell
+
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))
 
row:tag("td"):wikitext(string.format("%s (%s)", id, subTileId - 1))
+
if string.find(trim(key), '.', 0, true) then
  +
for _, v in ipairs(explode('.', trim(key))) do
 
if subTileId == 1 then
+
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 {
 
go = function(frame)
+
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

Lua logo 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,

}