Module:languages/templates: Difference between revisions

From Linguifex
Jump to navigation Jump to search
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
local export = {}
local export = {}
local concat = table.concat
local insert = table.insert
local sort = table.sort
local scripts_module = "Module:scripts"
local function get_script_by_code(...)
    get_script_by_code = require(scripts_module).getByCode
    return get_script_by_code(...)
end


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


-- Used by the following JS:
do
-- * [[WT:ACCEL]]
local function getByCode(frame, allow_etym)
-- * [[WT:EDIT]]
local plain = true
-- * [[WT:NEC]]
local args = require("Module:parameters").process(frame.args, {
function export.getByCode(frame)
[1] = {required = true, type = allow_etym and "language" or "full language"},
local iparams = {
[2] = {required = true},
[1] = {required = true},
[3] = plain,
[2] = {required = true},
[4] = plain,
[3] = {},
[5] = plain,
[4] = {},
})
[5] = {},
 
}
local function check_empty(...)
local varargs = {...}
local iargs = require("Module:parameters").process(frame.args, iparams)
for i = 1, select("#", ...) do
local langcode = iargs[1]
if args[varargs[i]] then
error(("Cannot specify a value for argument %s= when using subfunction '%s' of getByCode()"):format(
local lang = require("Module:languages").getByCode(langcode, true)
varargs[i], args[2]))
end
return require("Module:language-like").templateGetByCode(lang, iargs,
function(itemname)
local list
if itemname == "getWikimediaLanguages" then
list = lang:getWikimediaLanguages()
elseif itemname == "getScripts" then
list = lang:getScriptCodes()
elseif itemname == "getAncestors" then
list = lang:getAncestors()
end
end
if list then
end
local index = iargs[3]
index = tonumber(index) or error("Please specify the numeric index of the desired item.")
return require("Module:language-like").templateGetByCode(args,
local retval = list[index]
function(itemname)
if retval then
local list
if type(retval) == "string" then
if itemname == "getWikimediaLanguages" then
return retval
list = args[1]:getWikimediaLanguages()
elseif itemname == "getScripts" then
list = args[1]:getScriptCodes()
elseif itemname == "getAncestors" then
list = args[1]:getAncestors()
end
if list then
check_empty(4, 5)
local retval = list[tonumber(args[3]) or error("Please specify the numeric index of the desired item in 3=.")]
if retval then
if type(retval) == "string" then
return retval
else
return retval:getCode()
end
else
else
return retval:getCode()
return ""
end
end
else
end
return ""
if itemname == "transliterate" then
local sc = get_script_by_code(args[4])
return (args[1]:transliterate(args[3], sc, args[5])) or ""
elseif itemname == "makeDisplayText" then
local sc = get_script_by_code(args[4])
check_empty(5)
return (args[1]:makeDisplayText(args[3], sc)) or ""
elseif itemname == "makeEntryName" then
-- FIXME, find places that use makeEntryName and convert to stripDiacritics
local sc = get_script_by_code(args[4])
check_empty(5)
return args[1]:makeEntryName(args[3], sc) or ""
elseif itemname == "stripDiacritics" then
local sc = get_script_by_code(args[4])
check_empty(5)
return args[1]:stripDiacritics(args[3], sc) or ""
elseif itemname == "makeSortKey" then
local sc = get_script_by_code(args[4])
check_empty(5)
return (args[1]:makeSortKey(args[3], sc)) or ""
elseif itemname == "logicalToPhysical" then
check_empty(4, 5)
return args[1]:logicalToPhysical(args[3]) or ""
elseif itemname == "countCharacters" then
local sc = get_script_by_code(args[4])
check_empty(5)
return sc:countCharacters(args[3] or "")
elseif itemname == "findBestScript" then
check_empty(5)
return args[1]:findBestScript(args[3] or "", args[4]):getCode()
end
end
end
end
if itemname == "transliterate" then
)
local text = iargs[3]
end
local sc = iargs[4]
local module_override = iargs[5]
-- Used by the following JS:
sc = require("Module:scripts").getByCode(sc, 4)
-- * [[WT:ACCEL]]
return lang:transliterate(text, sc, module_override) or ""
-- * [[WT:EDIT]]
elseif itemname == "makeEntryName" then
-- * [[WT:NEC]]
local text = iargs[3]
function export.getByCode(frame)
return lang:makeEntryName(text) or ""
return getByCode(frame, false)
elseif itemname == "makeSortKey" then
end
local text = iargs[3]
return lang:makeSortKey(text) or ""
function export.getByCodeAllowEtym(frame)
elseif itemname == "countCharacters" then
return getByCode(frame, true)
local text = args[3] or ""
end
local sc = require("Module:scripts").getByCode(iargs[4], 4, "disallow nil")
return sc:countCharacters(text)
end
end
)
end
end


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


function export.getByName(frame)
function export.getCanonicalName(frame)
local args = frame.args
local args = require("Module:parameters").process(
local langname = args[1] or error("Language name has not been specified. Please pass parameter 1 to the module invocation.")
require("Module:yesno")(frame.args.parent) and frame:getParent().args or frame.args,
{
local lang = require("Module:languages").getByName(langname)
[1] = {required = true},
["return_if_invalid"] = {type = "boolean"},
if lang then
}
return lang:getCode()
)
else
local lang = require("Module:languages").getByCode(args[1], nil, true)
return ""
return lang and lang:getCanonicalName() or not args.return_if_invalid and "" or args[1]
end
end
end


function export.makeEntryName(frame)
function export.getFull(frame)
local args = frame.args
local args = require("Module:parameters").process(
local langname = args[1] or error("Language name has not been specified. Please pass parameter 1 to the module invocation.")
require("Module:yesno")(frame.args.parent) and frame:getParent().args or frame.args,
{
local lang = require("Module:languages").getByCode(langname)
[1] = {required = true, type = "language"},
}
if lang then
)
return lang:makeEntryName(args[2])
return args[1]:getFullCode()
else
return ""
end
end
end


function export.getCanonicalName(frame)
function export.getChildren(frame)
local langCode, args
local args = require("Module:parameters").process(
if require("Module:yesno")(frame.args.parent) then
require("Module:yesno")(frame.args.parent) and frame:getParent().args or frame.args,
args = frame:getParent().args
{
else
[1] = {required = true, type = "language"},
args = frame.args
}
end
)
langCode = args[1]
local children = args[1]:getChildren()
sort(children, function(a, b)
return a:getCanonicalName() < b:getCanonicalName()
end)
if not langCode or langCode == "" then
local list = {}
error("Supply a language code in parameter 1.")
for _, child in ipairs(children) do
insert(list, "* " .. child:makeWikipediaLink() .. ": " .. "<code>" .. child:getCode() .. "</code>")
end
end
local lang = require("Module:languages").getByCode(langCode)
return concat(list, "\n")
return lang:getCanonicalName() or not args.return_if_invalid and "" or langCode
end
end


return export
return export

Latest revision as of 15:39, 11 May 2026



local export = {}

local concat = table.concat
local insert = table.insert
local sort = table.sort
local scripts_module = "Module:scripts"

local function get_script_by_code(...)
    get_script_by_code = require(scripts_module).getByCode
    return get_script_by_code(...)
end

function export.exists(frame)
	return require("Module:languages").getByCode(
		require("Module:parameters").process(frame.args, {
			[1] = {required = true}
		})[1]
	) and "1" or ""
end

do
	local function getByCode(frame, allow_etym)
		local plain = true
		local args = require("Module:parameters").process(frame.args, {
			[1] = {required = true, type = allow_etym and "language" or "full language"},
			[2] = {required = true},
			[3] = plain,
			[4] = plain,
			[5] = plain,
		})

		local function check_empty(...)
			local varargs = {...}
			for i = 1, select("#", ...) do
				if args[varargs[i]] then
					error(("Cannot specify a value for argument %s= when using subfunction '%s' of getByCode()"):format(
						varargs[i], args[2]))
				end
			end
		end
		
		return require("Module:language-like").templateGetByCode(args,
			function(itemname)
				local list
				if itemname == "getWikimediaLanguages" then
					list = args[1]:getWikimediaLanguages()
				elseif itemname == "getScripts" then
					list = args[1]:getScriptCodes()
				elseif itemname == "getAncestors" then
					list = args[1]:getAncestors()
				end
				if list then
					check_empty(4, 5)
					local retval = list[tonumber(args[3]) or error("Please specify the numeric index of the desired item in 3=.")]
					if retval then
						if type(retval) == "string" then
							return retval
						else
							return retval:getCode()
						end
					else
						return ""
					end
				end
				if itemname == "transliterate" then
					local sc = get_script_by_code(args[4])
					return (args[1]:transliterate(args[3], sc, args[5])) or ""
				elseif itemname == "makeDisplayText" then
					local sc = get_script_by_code(args[4])
					check_empty(5)
					return (args[1]:makeDisplayText(args[3], sc)) or ""
				elseif itemname == "makeEntryName" then
					-- FIXME, find places that use makeEntryName and convert to stripDiacritics
					local sc = get_script_by_code(args[4])
					check_empty(5)
					return args[1]:makeEntryName(args[3], sc) or ""
				elseif itemname == "stripDiacritics" then
					local sc = get_script_by_code(args[4])
					check_empty(5)
					return args[1]:stripDiacritics(args[3], sc) or ""
				elseif itemname == "makeSortKey" then
					local sc = get_script_by_code(args[4])
					check_empty(5)
					return (args[1]:makeSortKey(args[3], sc)) or ""
				elseif itemname == "logicalToPhysical" then
					check_empty(4, 5)
					return args[1]:logicalToPhysical(args[3]) or ""
				elseif itemname == "countCharacters" then
					local sc = get_script_by_code(args[4])
					check_empty(5)
					return sc:countCharacters(args[3] or "")
				elseif itemname == "findBestScript" then
					check_empty(5)
					return args[1]:findBestScript(args[3] or "", args[4]):getCode()
				end
			end
		)
	end
	
	-- Used by the following JS:
	-- * [[WT:ACCEL]]
	-- * [[WT:EDIT]]
	-- * [[WT:NEC]]
	function export.getByCode(frame)
		return getByCode(frame, false)
	end
	
	function export.getByCodeAllowEtym(frame)
		return getByCode(frame, true)
	end
end

function export.getByCanonicalName(frame)
	return require("Module:parameters").process(frame.args, {
		[1] = {required = true, type = "language", method = "name"}
	})[1]:getCode() or ""
end

function export.getCanonicalName(frame)
	local args = require("Module:parameters").process(
		require("Module:yesno")(frame.args.parent) and frame:getParent().args or frame.args,
		{
			[1] = {required = true},
			["return_if_invalid"] = {type = "boolean"},
		}
	)
	local lang = require("Module:languages").getByCode(args[1], nil, true)
	return lang and lang:getCanonicalName() or not args.return_if_invalid and "" or args[1]
end

function export.getFull(frame)
	local args = require("Module:parameters").process(
		require("Module:yesno")(frame.args.parent) and frame:getParent().args or frame.args,
		{
			[1] = {required = true, type = "language"},
		}
	)
	return args[1]:getFullCode()
end

function export.getChildren(frame)
	local args = require("Module:parameters").process(
		require("Module:yesno")(frame.args.parent) and frame:getParent().args or frame.args,
		{
			[1] = {required = true, type = "language"},
		}
	)
	local children = args[1]:getChildren()
	
	sort(children, function(a, b)
		return a:getCanonicalName() < b:getCanonicalName()
	end)
	
	local list = {}
	for _, child in ipairs(children) do
		insert(list, "* " .. child:makeWikipediaLink() .. ": " .. "<code>" .. child:getCode() .. "</code>")
	end
	
	return concat(list, "\n")
end

return export