Module:usex/templates: Difference between revisions

No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
local export = {}
local export = {}


local m_languages = require("Module:languages")
local table_module = "Module:table"
local usex_module = "Module:usex"
local yesno_module = "Module:yesno"
 
local insert = table.insert
local rfind = mw.ustring.find
local rsplit = mw.text.split
local rsplit = mw.text.split
local rfind = mw.ustring.find


function export.usex_t(frame)
function export.usex_t(frame)
local params = {
local boolean = {type = "boolean"}
[1] = {required = true},
local list = {list = true}
[2] = {},
local language = {type = "language"}
[3] = {},
local script = {type = "script"}
-- Invocation arguments (passed in the template #invoke call).
local iargs = require("Module:parameters").process(frame.args, {
["quote"] = true,
["inline"] = true,
["nocat"] = boolean,
["class"] = true,
})
 
local parent_args = frame:getParent().args
 
-- Template (parent) arguments.
local args = require("Module:parameters").process(parent_args, {
-- Usex/quotation text parameters
[1] = {required = true, type = "language"},
[2] = true,
["termlang"] = language,
["tr"] = true,
["transliteration"] = {alias_of = "tr", deprecated = true},
["ts"] = true,
["transcription"] = {alias_of = "ts", deprecated = true},
["sc"] = script,
["norm"] = true,
["normalization"] = {alias_of = "norm", deprecated = true},
["normsc"] = script,
["subst"] = true,
["q"] = list,
["qualifier"] = {alias_of = "q", list = false, deprecated = true},
["qq"] = list,
["ref"] = true,
["inline"] = {type = "boolean"},
-- Usex/quotation audio parameters,
["noenum"] = {type = "boolean"},
["audio"] = true,
["ref"] = {},
 
["lit"] = {},
-- Translation of usex text
["q"] = {list = true},
[3] = true,
["sc"] = {},
["source"] = {},
["footer"] = {},
["subst"] = {},
["t"] = {alias_of = 3},
["t"] = {alias_of = 3},
["translation"] = {alias_of = 3},
["translation"] = {alias_of = 3, deprecated = true},
["tr"] = {},
["lit"] = true,
["transliteration"] = {alias_of = "tr"},
 
["ts"] = {},
-- Original text, if the usex/quotation is a translation
["transcription"] = {alias_of = "ts"},
["orig"] = true,
["nocat"] = {type = "boolean"},
["origlang"] = language,
["brackets"] = {type = "boolean"},
["origtr"] = true,
["sort"] = {},
["origts"] = true,
}
["origsc"] = script,
["orignorm"] = true,
local quote = (frame.args["quote"] or "") ~= ""
["orignormsc"] = script,
local compat = (frame.args["compat"] or "") ~= ""
["origsubst"] = true,
local template_inline = (frame.args["inline"] or "") ~= ""
["origq"] = list,
local template_nocat = (frame.args["nocat"] or "") ~= ""
["origqq"] = list,
local class = frame.args["class"]
["origref"] = true,
 
if compat then
-- Citation-related parameters; for anything more complex, usex {{quote-*}}
params["lang"] = {required = true}
["source"] = true,
params["t"].alias_of = 2
["footer"] = true,
params["translation"].alias_of = 2
 
table.remove(params, 1)
-- Formatting parameters
["inline"] = true,
["brackets"] = boolean,
 
-- Categorization parameters
["nocat"] = boolean,
["sort"] = true,
})
 
local lang = args[1]
local sc = args.sc
local normsc = args.normsc
if normsc and not args.norm then
error("Cannot specify normsc= without norm=")
end
end
local args = require("Module:parameters").process(frame:getParent().args, params)
local lang = args[compat and "lang" or 1] or "und"
local sc = args["sc"]
local data = {
lang = m_languages.getByCode(lang, compat and "lang" or 1),
sc = (sc and require("Module:scripts").getByCode(sc, true) or nil),
usex = args[compat and 1 or 2],
translation = args[compat and 2 or 3],
transliteration = args["tr"],
transcription = args["ts"],
noenum = args["noenum"],
inline = args["inline"] or template_inline,
ref = args["ref"],
quote = quote,
lit = args["lit"],
substs = args["subst"],
qualifiers = args["q"],
source = args["source"],
footer = args["footer"],
nocat = args["nocat"] or template_nocat,
brackets = args["brackets"],
sortkey = args["sort"],
class = class,
}
return require("Module:usex").format_usex(data)
end


-- Given a comma-separated list of language codes, return the English equivalent.
local termlang = args.termlang
function export.format_langs(frame)
if termlang then
local langcodes = rsplit(frame.args[1], ",")
insert(args.qq, 1, "in " .. lang:getCanonicalName())
local langnames = {}
for _, langcode in ipairs(langcodes) do
local lang = m_languages.getByCode(langcode) or m_languages.err(langcode, 1)
table.insert(langnames, lang:getCanonicalName())
end
end
if #langnames == 1 then
 
return langnames[1]
local origlang, origsc, orignormsc
elseif #langnames == 2 then
if args.orig then
return langnames[1] .. " and " .. langnames[2]
origlang = args.origlang
insert(args.origqq, 1, "in " .. origlang:getCanonicalName())
origsc = args.origsc
orignormsc = args.orignormsc
if orignormsc and not args.orignorm then
error("Cannot specify orignormsc= without orignorm=")
end
else
else
local retval = {}
for _, noparam in ipairs { "origlang", "origtr", "origts", "origsc", "orignorm", "orignormsc", "origsubst",
for i, langname in ipairs(langnames) do
"origref" } do
table.insert(retval, langname)
if args[noparam] then
if i <= #langnames - 2 then
error(("Cannot specify %s= without orig="):format(noparam))
table.insert(retval, ", ")
elseif i == #langnames - 1 then
table.insert(retval, "<span class=\"serial-comma\">,</span><span class=\"serial-and\"> and</span> ")
end
end
end
end
return table.concat(retval, "")
if #args.origq > 0 then
error("Cannot specify origq= without orig=")
end
if #args.origqq > 0 then
error("Cannot specify origqq= without orig=")
end
end
 
local inline = args.inline or iargs.inline
if inline ~= "auto" then
inline = require(yesno_module)(inline)
end
end
end


-- Given a comma-separated list of language codes, return the first one.
local data = {
function export.first_lang(frame)
lang = lang,
local langcodes = rsplit(frame.args[1], ",")
termlang = termlang,
return langcodes[1]
sc = sc,
normsc = normsc,
usex = args[2],
translation = args[3],
transliteration = args.tr,
transcription = args.ts,
normalization = args.norm,
inline = inline,
ref = args.ref,
quote = iargs.quote,
lit = args.lit,
subst = args.subst,
-- FIXME, change to left and right qualifiers
qq = #args.qq > 0 and args.qq or args.q,
audio = args.audio,
source = args.source,
footer = args.footer,
nocat = args.nocat or iargs.nocat,
brackets = args.brackets,
sortkey = args.sort,
class = iargs.class,
 
-- Original text, if the usex/quotation is a translation
orig = args.orig,
origlang = origlang,
origtr = args.origtr,
origts = args.origts,
origsc = origsc,
orignorm = args.orignorm,
orignormsc = orignormsc,
origsubst = args.origsubst,
origq = args.origq,
origqq = args.origqq,
origref = args.origref,
}
 
return require(usex_module).format_usex(data)
end
end



Latest revision as of 12:49, 24 September 2025

Documentation for this module may be created at Module:usex/templates/doc

local export = {}

local table_module = "Module:table"
local usex_module = "Module:usex"
local yesno_module = "Module:yesno"

local insert = table.insert
local rfind = mw.ustring.find
local rsplit = mw.text.split

function export.usex_t(frame)
	local boolean = {type = "boolean"}
	local list = {list = true}
	local language = {type = "language"}
	local script = {type = "script"}
	
	-- Invocation arguments (passed in the template #invoke call).
	local iargs = require("Module:parameters").process(frame.args, {
		["quote"] = true,
		["inline"] = true,
		["nocat"] = boolean,
		["class"] = true,
	})

	local parent_args = frame:getParent().args

	-- Template (parent) arguments.
	local args = require("Module:parameters").process(parent_args, {
		-- Usex/quotation text parameters
		[1] = {required = true, type = "language"},
		[2] = true,
		["termlang"] = language,
		["tr"] = true,
		["transliteration"] = {alias_of = "tr", deprecated = true},
		["ts"] = true,
		["transcription"] = {alias_of = "ts", deprecated = true},
		["sc"] = script,
		["norm"] = true,
		["normalization"] = {alias_of = "norm", deprecated = true},
		["normsc"] = script,
		["subst"] = true,
		["q"] = list,
		["qualifier"] = {alias_of = "q", list = false, deprecated = true},
		["qq"] = list,
		["ref"] = true,
		
		-- Usex/quotation audio parameters,
		["audio"] = true,

		-- Translation of usex text
		[3] = true,
		["t"] = {alias_of = 3},
		["translation"] = {alias_of = 3, deprecated = true},
		["lit"] = true,

		-- Original text, if the usex/quotation is a translation
		["orig"] = true,
		["origlang"] = language,
		["origtr"] = true,
		["origts"] = true,
		["origsc"] = script,
		["orignorm"] = true,
		["orignormsc"] = script,
		["origsubst"] = true,
		["origq"] = list,
		["origqq"] = list,
		["origref"] = true,

		-- Citation-related parameters; for anything more complex, usex {{quote-*}}
		["source"] = true,
		["footer"] = true,

		-- Formatting parameters
		["inline"] = true,
		["brackets"] = boolean,

		-- Categorization parameters
		["nocat"] = boolean,
		["sort"] = true,
	})

	local lang = args[1]
	local sc = args.sc
	local normsc = args.normsc
	if normsc and not args.norm then
		error("Cannot specify normsc= without norm=")
	end

	local termlang = args.termlang
	if termlang then
		insert(args.qq, 1, "in " .. lang:getCanonicalName())
	end

	local origlang, origsc, orignormsc
	if args.orig then
		origlang = args.origlang
		insert(args.origqq, 1, "in " .. origlang:getCanonicalName())
		origsc = args.origsc
		orignormsc = args.orignormsc
		if orignormsc and not args.orignorm then
			error("Cannot specify orignormsc= without orignorm=")
		end
	else
		for _, noparam in ipairs { "origlang", "origtr", "origts", "origsc", "orignorm", "orignormsc", "origsubst",
			"origref" } do
			if args[noparam] then
				error(("Cannot specify %s= without orig="):format(noparam))
			end
		end
		if #args.origq > 0 then
			error("Cannot specify origq= without orig=")
		end
		if #args.origqq > 0 then
			error("Cannot specify origqq= without orig=")
		end
	end

	local inline = args.inline or iargs.inline
	if inline ~= "auto" then
		inline = require(yesno_module)(inline)
	end

	local data = {
		lang = lang,
		termlang = termlang,
		sc = sc,
		normsc = normsc,
		usex = args[2],
		translation = args[3],
		transliteration = args.tr,
		transcription = args.ts,
		normalization = args.norm,
		inline = inline,
		ref = args.ref,
		quote = iargs.quote,
		lit = args.lit,
		subst = args.subst,
		-- FIXME, change to left and right qualifiers
		qq = #args.qq > 0 and args.qq or args.q,
		audio = args.audio,
		source = args.source,
		footer = args.footer,
		nocat = args.nocat or iargs.nocat,
		brackets = args.brackets,
		sortkey = args.sort,
		class = iargs.class,

		-- Original text, if the usex/quotation is a translation
		orig = args.orig,
		origlang = origlang,
		origtr = args.origtr,
		origts = args.origts,
		origsc = origsc,
		orignorm = args.orignorm,
		orignormsc = orignormsc,
		origsubst = args.origsubst,
		origq = args.origq,
		origqq = args.origqq,
		origref = args.origref,
	}

	return require(usex_module).format_usex(data)
end

local ignore_prefixes = {"User:", "Talk:",
	"Wiktionary:Beer parlour", "Wiktionary:Translation requests",
	"Wiktionary:Grease pit", "Wiktionary:Etymology scriptorium",
	"Wiktionary:Information desk", "Wiktionary:Tea room",
	"Wiktionary:Requests for", "Wiktionary:Votes"
}

function export.page_should_be_ignored(page)
	-- Ignore user pages, talk pages and certain Wiktionary pages
	for _, ip in ipairs(ignore_prefixes) do
		if rfind(page, "^" .. ip) then
			return true
		end
	end
	if rfind(page, " talk:") then
		return true
	end
	return false
end

function export.page_should_be_ignored_t(frame)
	return export.page_should_be_ignored(frame.args[1]) and "true" or ""
end

return export