Module:usex

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

This modules generates usage examples (usexes) and quotations for senses. It is used by {{ux}}, {{uxi}} and {{quote}} via Module:usex/templates.

Exported functions

format_usex

format_usex(lang, sc, usex, translation, transliteration, noenum, inline, ref, quote, lit, substs, qualifier, source)

  • quote=nil: format an usage example
  • quote=true: format a quotation

local export = {}

local translit_data = mw.loadData("Module:translations/data")
local needs_translit = translit_data[2]

-- microformat2 classes, see https://phabricator.wikimedia.org/T138709
local class = {
	container_ux = 'h-usage-example',
	container_quotation = 'h-quotation',
	example = 'e-example',
	quotation = 'e-quotation',
	translation = 'e-translation',
	-- The following is added by [[Module:script utilities]], using [[Module:script utilities/data]]
--	transliteration = 'e-transliteration',	
	literally = 'e-literally',
	source = 'e-source'
}

-- helper functions

local function wrap(tag, class, text, lang)
	if lang then
		lang = ' lang="' .. lang .. '"'
	else
		lang = ""
	end
	
	if text and class then
		return table.concat{'<', tag, ' class="', class, '"', lang, '>', text, '</', tag, '>'}
	else
		return nil
	end
end

local function span(class, text) return wrap('span', class, text) end
local function div(class, text) return wrap('div', class, text) end

function export.format_usex(lang, sc, usex, translation, transliteration, noenum, inline, ref, quote, lit, substs, qualifier, source)
	--[[
	local namespace = mw.title.getCurrentTitle().nsText
	
	if lang:getType() == "reconstructed" or namespace == "Reconstruction" then
		error("Reconstructed languages and reconstructed terms cannot have usage examples, as we have no record of their use.")
	end
	]]
	
	if lit then
		lit = "(literally, “" .. span(class.literally, lit) .. "”)"
	end

	if source then
		source = "(" .. span(class.source, source) .. ")"
	end

	local example_type = quote and "quote" or "usage example" -- used in error messages
	local categories = {}

	if not sc then
		sc = require("Module:scripts").findBestScript(usex, lang)
	end

	-- temporary category for japanese
	if transliteration and (string.find(transliteration, "<br/>") or string.find(transliteration, "<br>")) then
		table.insert(categories, "usex with multiple transliterations")
	end

	-- tr=- means omit transliteration altogether
	if transliteration == "-" then
		transliteration = nil
	else
		-- Try to auto-transliterate
		if not transliteration and usex then
			local subbed_usex = require("Module:links").remove_links(usex)

			if substs then
				--[=[
				[[Special:WhatLinksHere/Template:tracking/quote/substs]]
				[[Special:WhatLinksHere/Template:tracking/usex/substs]]
				]=]
				
				if quote then
					require("Module:debug").track("quote/substs")
				else
					require("Module:debug").track("usex/substs")
				end
				
				local substs = mw.text.split(substs, ",")
				for _, subpair in ipairs(substs) do
					local subsplit = mw.text.split(subpair, "/")
					subbed_usex = mw.ustring.gsub(subbed_usex, subsplit[1], subsplit[2])
				end
			end

			transliteration = lang:transliterate(subbed_usex, sc)
		end

		-- If there is still no transliteration, then add a cleanup category
		if not transliteration and needs_translit[lang] then
			table.insert(categories, lang:getCanonicalName() .. " terms needing transliteration")
		end
	end
	if transliteration then
		local tag = lang:getCode() == "ja" and "span" or "i"
		transliteration = require("Module:script utilities").tag_translit(transliteration, lang:getCode(), "usex")
	end

	if translation == "-" then
		translation = nil
		table.insert(categories, "Omitted translation in the main namespace")
	elseif translation then
		translation = span(class.translation, translation)
	elseif lang:getCode() ~= "en" and lang:getCode() ~= "und" then
		-- add trreq category if translation is unspecified and language is not english or undetermined
		table.insert(categories, lang:getCanonicalName() .. " usage examples with the translation missing")
		translation = "<small>(please add an English translation of this " .. example_type .. ")</small>"
	end

	if usex then
		if usex:find("[[", 1, true) then
			usex = require("Module:links").language_link({term = usex, lang = lang}, false)
		end
		
		local face
		if quote then
			face = nil
		else
			face = "term"
		end
		
		if quote then
			table.insert(categories, lang:getCanonicalName() .. " terms with quotations")
		else
			table.insert(categories, lang:getCanonicalName() .. " terms with usage examples")
		end
		
		usex = require("Module:script utilities").tag_text(usex, lang, sc, face, quote and class.quotation or class.example)
	else
		if transliteration then
			table.insert(categories, lang:getCanonicalName() .. " usage examples lacking native script")
		end
		
		-- TODO: Trigger some kind of error here
		usex = "<small>(please add the primary text of this " .. example_type .. ")</small>"
	end

	local result = {}
	
	if sc:getDirection() == "rtl" then
		usex = "&rlm;" .. usex .. "&lrm;"
	end
	
	table.insert(result, usex)
	
	if qualifier then
		table.insert(result, " " .. require("Module:qualifier").format_qualifier(qualifier))
	end
	
	table.insert(result, ref)
	
	if inline then
		if transliteration then
			table.insert(result, " ― " .. transliteration)
		end

		if translation then
			table.insert(result, " ― " .. translation)
		end

		if lit then
			table.insert(result, " " .. lit)
		end
		
		if source then
			table.insert(result, " " .. source)
		end
	elseif transliteration or translation or lit then
		table.insert(result, "<dl>")

		if transliteration then
			table.insert(result, "<dd>" .. transliteration .. "</dd>")
		end

		if translation then
			table.insert(result, "<dd>" .. translation .. "</dd>")
		end

		if lit then
			table.insert(result, "<dd>" .. lit .. "</dd>")
		end

		if source then
			table.insert(result, "<dl><dd>" .. source .. "</dd></dl>")
		end

		table.insert(result, "</dl>")
	end
	
	result = table.concat(result)
	result = div(quote and class.container_quotation or class.container_ux, result)
	result = result .. require("Module:utilities").format_categories(categories, lang)
	if noenum then
		result = "\n: " .. result
	end
	return result
end

return export