Module:script utilities

Definition from Wiktionary, the free dictionary
Jump to: navigation, search

This module provides access to Module:scripts from templates, so that they can make use of the information stored there. It also provides a number of functions that can be used by other modules.

Exported functions


{{#invoke:script utilities|lang_t}}

This is used by {{lang}} to wrap portions of text in a language tag. See there for more information.


tag_text(text, lang, sc, face, class)

Wraps the given text in HTML tags with appropriate CSS classes (see WT:CSS) for the language and script. This is required for all non-English text on Wiktionary.

The actual tags and CSS classes that are added are determined by the face parameter. It can be one of the following:

The text is wrapped in <i class="(sc) mention" lang="(lang)">...</i>.
The text is wrapped in <strong class="(sc) headword" lang="(lang)">...</strong>.
The text is wrapped in <span class="hypothetical-star">*</span><i class="(sc) hypothetical" lang="(lang)">...</i>.
The text is wrapped in <b class="(sc)" lang="(lang)">...</b>.
The text is wrapped in <span class="(sc)" lang="(lang)">...</span>.

The optional class parameter can be used to specify an additional CSS class to be added to the tag.


request_script(lang, sc)

Generates a request to provide a term in its native script, if it is missing. This is used by the {{rfscript}} template as well as by the functions in Module:links.

The function will add entries to one of the subcategories of Category:Terms needing native script by language, and do several checks on the given language and script. In particular:

  • If the script was given, a subcategory named "needing (script) script" is added, but only if the language has more than one script. Otherwise, the main "needing native script" category is used.
  • Nothing is added at all if the language has no scripts other than Latin and its varieties.


{{#invoke:script utilities|template_rfscript}}

This is used by {{rfscript}}. See there for more information.

See also

local export = {}

-- Used by [[Template:lang]]
function export.lang_t(frame)
	params = {
		[1] = {},
		[2] = { allow_empty = true, default = "" },
		["sc"] = {},
		["face"] = {},
		["class"] = {},
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local NAMESPACE = mw.title.getCurrentTitle().nsText
	local lang = args[1] or (NAMESPACE == "Template" and "und") or error("Language code has not been specified. Please pass parameter 1 to the template.")
	lang = require("Module:languages").getByCode(lang) or require("Module:languages").err(lang, 1)
	local text = args[2]
	local sc = args["sc"]
	sc = (sc and (require("Module:scripts").getByCode(sc) or error("The script code \"" .. sc .. "\" is not valid.")) or nil)
	local face = args["face"]
	return export.tag_text(text, lang, sc, face, class)

-- Wrap text in the appropriate HTML tags with language and script class.
function export.tag_text(text, lang, sc, face, class)
	if not sc then
		sc = require("Module:scripts").findBestScript(text, lang)

	if sc:getCode() == "Imag" then
		face = nil

	local function class_attr(classes)
		table.insert(classes, 1, sc:getCode())
		if class and class ~= '' then
			table.insert(classes, class)
		return 'class="' .. table.concat(classes, ' ') .. '"'
	local function tag_attr(...)
		return class_attr({...}) .. ' ' .. 'lang="' .. lang:getCode() .. '"'

	-- Add a script wrapper
	if face == "term" then
		return '<i ' .. tag_attr('mention') .. '>' .. text .. '</i>'
	elseif face == "head" then
		return '<strong ' .. tag_attr('headword') .. '>' .. text .. '</strong>'
	elseif face == "hypothetical" then
		-- [[Special:WhatLinksHere/Template:tracking/script-utilities/face/hypothetical]]
		return '<span class="hypothetical-star">*</span><i ' .. tag_attr('hypothetical') .. '>' .. text .. '</i>'
	elseif face == "bold" then
		return '<b ' .. tag_attr() .. '>' .. text .. '</b>'
	elseif face == nil then
		return '<span ' .. tag_attr() .. '>' .. text .. '</span>'
		error("Invalid script face \"" .. face .. "\".")

-- Add a notice to request the native script of a word
function export.request_script(lang, sc)
	local scripts = lang.getScripts and lang:getScripts() or error('The language "' .. lang:getCode() .. '" does not have the method getScripts. It may be unwritten.')
	-- By default, request for "native" script
	local cat_script = "native"
	local disp_script = "script"
	-- If the script was not specified, and the language has only one script, use that.
	if not sc and #scripts == 1 then
		sc = scripts[1]
	-- Is the script known?
	if sc then
		-- If the script is Latin, return nothing.
		if is_Latin_script(sc) then
			return ""
		if sc:getCode() ~= scripts[1]:getCode() then
			disp_script = sc:getCanonicalName()
		-- The category needs to be specific to script only if there is chance
		-- of ambiguity. This occurs when lang=und, or when the language has
		-- multiple scripts.
		if lang:getCode() == "und" or scripts[2] then
			cat_script = sc:getCanonicalName()
		-- The script is not known.
		-- Does the language have at least one non-Latin script in its list?
		local has_nonlatin = false
		for i, val in ipairs(scripts) do
			if not is_Latin_script(val) then
				has_nonlatin = true
		-- If there are non-Latin scripts, return nothing.
		if not has_nonlatin then
			return ""
	local category = ""
	if mw.title.getCurrentTitle().nsText ~= "Template" then
		category = "[[Category:" .. lang:getCanonicalName() .. " terms needing " .. cat_script .. " script]]"
	return "<small>[" .. disp_script .. " needed]</small>" .. category

function export.template_rfscript(frame)
	local args = frame.args
	local lang = args[1] or error("The first parameter (language code) has not been given")
	local sc = args["sc"]; if sc == "" then sc = nil end
	lang = require("Module:languages").getByCode(lang) or error("The language code \"" .. lang .. "\" is not valid.")
	sc = (sc and (require("Module:scripts").getByCode(sc) or error("The script code \"" .. sc .. "\" is not valid.")) or nil)
	local ret = export.request_script(lang, sc)
	if ret == "" then
		error("This language is written in the Latin alphabet. It does not need a native script.")
		return ret

function is_Latin_script(sc)
	return (sc:getCode():find("Latn", nil, true)) or sc:getCode() == "Latinx"

return export