Module:usex/templates

From Wiktionary, the free dictionary
Jump to navigation Jump to search

This module is used by {{ux}} to format the usage example for a definition line; by {{quote}} to format quotations; by {{quote-meta/quote}} to format quotations invoked through templates like {{quote-book}}, {{quote-journal}}, etc.; and by {{collocation}} and {{coi}} to format collocations.

It delegates the actual work to Module:usex.

Exported functions

usex_t

{{#invoke:usex/templates|usex_t}}

Format an usage example or a quotation. See {{ux}} and {{quote}} for more.

format_langs

{{#invoke:usex/templates|format_langs|LANG,LANG,...}}

Format a list of language codes into the English equivalents. Depending on the number of languages specified, the output is in one of the following formats:

English
English and French
English, French and German
English, French, German and Latin
(etc.)

If there are three or more languages, an optional serial comma is inserted before the final "and" just as with {{,}}, allowing the user to control whether the comma appears.

first_lang

{{#invoke:usex/templates|first_lang|LANG,LANG,...}}

Return the first language code in a list of one or more language codes.

See also


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

local function track(page)
	require("Module:debug/track")("usex/templates/" .. page)
	return true
end

function export.usex_t(frame)
	local alias_of_3 = {alias_of = 3}
	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
	if parent_args.qualifier then
		track("qualifier")
	end

	-- 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"},
		["ts"] = true,
		["transcription"] = {alias_of = "ts"},
		["sc"] = script,
		["norm"] = true,
		["normalization"] = {alias_of = "norm"},
		["normsc"] = script,
		["subst"] = true,
		["q"] = list,
		["qualifier"] = {alias_of = "q"},
		["qq"] = list,
		["ref"] = true,
		
		-- Usex/quotation audio parameters,
		["audio"] = true,

		-- Translation of usex text
		[3] = true,
		["t"] = alias_of_3,
		["translation"] = alias_of_3,
		["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

	if #args.qq > 0 then
		track("qq")
	end
	if #args.q > 0 then
		track("q")
	end

	local termlang = args.termlang
	if termlang then
		insert(args.qq, 1, "in " .. termlang: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