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 m_languages = require("Module:languages")
local table_module = "Module:table"
local usex_module = "Module:usex"
local yesno_module = "Module:yesno"

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

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

function export.usex_t(frame)
	-- Invocation arguments (passed in the template #invoke call).
	local iparams = {
		["quote"] = {},
		["compat"] = {type = "boolean"},
		["inline"] = {},
		["nocat"] = {type = "boolean"},
		["class"] = {},
	}

	local iargs = require("Module:parameters").process(frame.args, iparams)
	local compat = iargs.compat

	local parent_args = frame:getParent().args
	if parent_args.qualifier then
		track("qualifier")
	end

	-- Template (parent) arguments.
	local params = {
		-- Usex/quotation text parameters
		[1] = {required = true},
		[2] = {},
		["termlang"] = {},
		["tr"] = {},
		["transliteration"] = {alias_of = "tr"},
		["ts"] = {},
		["transcription"] = {alias_of = "ts"},
		["sc"] = {},
		["norm"] = {},
		["normalization"] = {alias_of = "norm"},
		["normsc"] = {},
		["subst"] = {},
		["q"] = {list = true},
		["qualifier"] = {alias_of = "q"},
		["qq"] = {list = true},
		["ref"] = {},
		
		-- Usex/quotation audio parameters,
		["audio"] = {},

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

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

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

		-- Formatting parameters
		["inline"] = {},
		["brackets"] = {type = "boolean"},

		-- Categorization parameters
		["nocat"] = {type = "boolean"},
		["sort"] = {},
	}

	if compat then
		params["lang"] = {required = true}
		params["t"].alias_of = 2
		params["translation"].alias_of = 2
		table.remove(params, 1)
	end

	local args = require("Module:parameters").process(parent_args, params)

	local langparam = compat and "lang" or 1
	local lang = m_languages.getByCode(args[langparam] or "und", langparam, "allow etym")
	local sc = args.sc
	sc = sc and require("Module:scripts").getByCode(sc, "sc") or nil
	local normsc = args.normsc
	normsc = normsc == "auto" and normsc or normsc and require("Module:scripts").getByCode(normsc, "normsc") or nil
	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
	if args.termlang then
		termlang = m_languages.getByCode(args.termlang, "termlang", "allow etym")
		table.insert(args.qq, 1, "in " .. lang:getCanonicalName())
	end

	local origlang, origsc, orignormsc
	if args.orig then
		origlang = m_languages.getByCode(args.origlang, "origlang", "allow etym")
		table.insert(args.origqq, 1, "in " .. origlang:getCanonicalName())
		origsc = args.origsc
		origsc = origsc and require("Module:scripts").getByCode(origsc, "origsc") or nil
		orignormsc = args.orignormsc
		orignormsc = orignormsc == "auto" and orignormsc or
			orignormsc and require("Module:scripts").getByCode(orignormsc, "normsc") or nil
		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,
		sc = sc,
		normsc = normsc,
		usex = args[compat and 1 or 2],
		translation = args[compat and 2 or 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