local export = {}

function export.exists(frame)
	local args = frame.args
	local lang = args[1] or error("Language code has not been specified. Please pass parameter 1 to the module invocation.")
	
	lang = require("Module:languages").getByCode(lang)
	
	if lang then
		return "1"
	else
		return ""
	end
end

-- Used by the following JS:
-- * [[WT:ACCEL]]
-- * [[WT:EDIT]]
-- * [[WT:NEC]]
function export.getByCode(frame)
	local args = frame.args
	local langcode = args[1] or error("Language code has not been specified. Please pass parameter 1 to the module invocation.")
	local itemname = args[2] or error("Type of information to look up has not been specified. Please pass parameter 2 to the module invocation.")
	
	local lang = require("Module:languages").getByCode(langcode)
	
	if not lang then
		error("The language code '" .. langcode .. "' is not valid.")
	end
	
	
	-- The item that the caller wanted to look up
	
	if itemname == "getOtherNames" then
		local index = args[3]; if index == "" then index = nil end
		index = tonumber(index) or error("Please specify the numeric index of the desired name.")
		return lang:getOtherNames()[index] or ""
	elseif itemname == "getFamily" then
		return lang:getFamily():getCode()
	elseif itemname == "getWikimediaLanguages" then
		local index = args[3]; if index == "" then index = nil end
		index = tonumber(index) or error("Please specify the numeric index of the desired language.")
		local langs = lang:getWikimediaLanguages()
		
		if langs[index] then
			return langs[index]:getCode()
		else
			return ""
		end
	elseif itemname == "getScripts" then
		local index = args[3]; if index == "" then index = nil end
		index = tonumber(index) or error("Please specify the numeric index of the desired script.")
		local scripts = lang:getScriptCodes()
		
		if scripts[index] then
			return scripts[index]
		else
			return ""
		end
	elseif itemname == "getAncestors" then
		local index = args[3]; if index == "" then index = nil end
		index = tonumber(index) or error("Please specify the numeric index of the desired ancestor.")
		local ancestors = lang:getAncestors()
		
		if ancestors[index] then
			return ancestors[index]:getCode()
		else
			return ""
		end
	elseif itemname == "transliterate" then
		local text = args[3]; if text == "" then text = nil end
		local sc = args[4]; if sc == "" then sc = nil end
		local module_override = args[5]; if module_override == "" then module_override = nil end
		sc = (sc and (require("Module:scripts").getByCode(sc) or error("The script code \"" .. sc .. "\" is not valid.")) or nil)
		return lang:transliterate(text, sc, module_override) or ""
	elseif itemname == "makeEntryName" then
		local text = args[3]; if text == "" then text = nil end
		return lang:makeEntryName(text) or ""
	elseif itemname == "makeSortKey" then
		local text = args[3]; if text == "" then text = nil end
		return lang:makeSortKey(text) or ""
	elseif lang[itemname] then
		local ret = lang[itemname](lang)
		
		if type(ret) == "string" then
			return ret
		else
			error("The function \"" .. itemname .. "\" did not return a string value.")
		end
	else
		error("Requested invalid item name \"" .. itemname .. "\".")
	end
end

function export.getByCanonicalName(frame)
	local args = frame.args
	local langname = args[1] or error("Language name has not been specified. Please pass parameter 1 to the module invocation.")
	
	local lang = require("Module:languages").getByCanonicalName(langname)
	
	if lang then
		return lang:getCode()
	else
		return ""
	end
end

function export.getByName(frame)
	local args = frame.args
	local langname = args[1] or error("Language name has not been specified. Please pass parameter 1 to the module invocation.")
	
	local lang = require("Module:languages").getByName(langname)
	
	if lang then
		return lang:getCode()
	else
		return ""
	end
end

function export.makeEntryName(frame)
	local args = frame.args
	local langname = args[1] or error("Language name has not been specified. Please pass parameter 1 to the module invocation.")
	
	local lang = require("Module:languages").getByCode(langname)
	
	if lang then
		return lang:makeEntryName(args[2])
	else
		return ""
	end
end

function export.getCanonicalName(frame)
	local langCode
	if require("Module:yesno")(frame.args.parent) then
		langCode = frame:getParent().args[1]
	else
		langCode = frame.args[1]
	end
	
	if not langCode or langCode == "" then
		error("Supply a language code in parameter 1.")
	end
	
	return mw.loadData("Module:languages/code to canonical_name")[langCode] or ""
end

return export
"https://si.wikibooks.org/w/index.php?title=Module:Languages/templates&oldid=12078" වෙතින් සම්ප්‍රවේශනය කෙරිණි