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
Advertisement
Lua logo.svg Documentation The documentation below is transcluded from Module:GameText/doc. (edit | history)

This module is intended to provide functionality to the {{gameText}} template.


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

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 string.sub(text, 2,-2)
end

-- args: tables for replacement, e.g.: { ["{0}"] = "Party Girl", ["<right>"] = "Right click" }
local getText = function(key, lang, args, fromJson)
	if not key then
		return
	end
	local str = fromJson and get(key, lang) or query(key, lang)
	-- en as fallback.
	if not str and lang ~= 'en' then
		str = fromJson and get(key, 'en') or query(key, 'en')
	end
	if not str then
		return
	end
	local str = string.gsub(str, "{%?.-}", "") -- "{?Homeless}"" -> ""
	if args then
		str = string.gsub(str, "%b{}", args)
		str = string.gsub(str, "%b<>", args)
	end
	return str
end


local replacementArgs = function(args_table)
	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 args
end


return {
	---------- for template ----------------
	get = function(frame)
		args_table = frame:getParent().args -- cache
		local str = getText(getArg(1), getArg('lang') or frame.args['lang'], replacementArgs(args_table), getArg('json'))
		if str then
			return '<span class="gameText">' .. string.gsub(str, '\n', '<br/>') .. '</span>'
		end
	end,

	getRaw = function(frame)
		return (frame.args['prefix'] or '')..(getText(frame.args[1], frame.args['lang'] or frame:expandTemplate{ title = 'lang'}, replacementArgs(frame.args), frame.args['json']) or '')..(frame.args['postfix'] or '')
	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,
	replacementArgs = replacementArgs, -- used by Module:Random_world_names

}
Advertisement