Module:Wt/sco/usex

From Wikimedia Incubator

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

local export = {}

local translit_data = mw.loadData("Module:Wt/sco/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:Wt/sco/script utilities]], using [[Module:Wt/sco/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 '<' .. 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"
	local categories = {}

	if not sc then
		sc = require("Module:Wt/sco/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:Wt/sco/links").remove_links(usex)

			if substs then
				--[=[
				[[Special:WhatLinksHere/Template:tracking/quote/substs]]
				[[Special:WhatLinksHere/Template:tracking/usex/substs]]
				]=]
				
				if quote then
					require("Module:Wt/sco/debug").track("quote/substs")
				else
					require("Module:Wt/sco/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:Wt/sco/script utilities").tag_translit(transliteration, lang:getCode(), "usex")
	end

	if 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 mw.ustring.find(usex, "[[", nil, true) then
			usex = require("Module:Wt/sco/links").language_link({term = usex, lang = lang}, false)
		end
		
		local face
		if quote then
			face = nil
		else
			face = "term"
		end
		
--		table.insert(categories, lang:getCanonicalName() .. " terms with usage examples")
		
		local class = quote and class.quotation or class.example
		usex = require("Module:Wt/sco/script utilities").tag_text(usex, lang, sc, face, class)
	else
		-- 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
		table.insert(result, "&rlm;")
	end
	
	table.insert(result, usex)
	
	if sc:getDirection() == "rtl" then
		table.insert(result, "&lrm;")
	end
	
	if qualifier then
		table.insert(result, " " .. require("Module:Wt/sco/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
	local class = quote and class.container_quotation or class.container_ux
	
	result = table.concat(result)
	result = div(class, result)
	result = result .. require("Module:Wt/sco/utilities").format_categories(categories, lang)
	if noenum then
		result = "\n: " .. result
	end
	return result
end

return export