Module:usex: Difference between revisions

From Linguifex
Jump to navigation Jump to search
(Undo revision 310575 by Sware (talk))
Tag: Reverted
No edit summary
Tag: Manual revert
Line 51: Line 51:


--[[
--[[
if namespace == "Reconstruction" or lang:hasType("reconstructed") then
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.")
error("Reconstructed languages and reconstructed terms cannot have usage examples, as we have no record of their use.")
end
end
Line 72: Line 72:


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


Line 92: Line 92:
end
end


transliteration = (lang:transliterate(subbed_usex, sc))
transliteration = lang:transliterate(subbed_usex, sc)
-- If the language doesn't have capitalization and is specified in [[Module:usex/data]], then capitalize any sentences.
if transliteration and mw.loadData("Module:usex/data").capitalize_sentences[lang:getCode()] then
transliteration = mw.ustring.gsub(transliteration, "%f[^%z%p%s](.)(.-[%.%?!‽])", function(m1, m2) return mw.ustring.upper(m1) .. m2 end)
end
end
end


Line 119: Line 114:
elseif lang:getCode() ~= "en" and lang:getCode() ~= "mul" and lang:getCode() ~= "und" then
elseif lang:getCode() ~= "en" and lang:getCode() ~= "mul" and lang:getCode() ~= "und" then
-- add trreq category if translation is unspecified and language is not english, translingual or undetermined
-- add trreq category if translation is unspecified and language is not english, translingual or undetermined
if quote then
table.insert(categories, "Requests for translations of " .. lang:getCanonicalName() .. " usage examples")
table.insert(categories, "Requests for translations of " .. lang:getCanonicalName() .. " quotations")
else
table.insert(categories, "Requests for translations of " .. lang:getCanonicalName() .. " usage examples")
end
translation = "<small>(please add an English translation of this " .. example_type .. ")</small>"
translation = "<small>(please add an English translation of this " .. example_type .. ")</small>"
end
end


if usex then
if usex then
usex = require("Module:links").full_link({term = usex, lang = lang, sc = sc}, false)
if usex:find("[[", 1, true) then
usex = require("Module:links").language_link({term = usex, lang = lang}, false)
end
local face
local face
Line 137: Line 130:
end
end
if not nocat and namespace == "" or namespace == "Contionary" then
if not nocat and (namespace == "" or namespace == "Reconstruction" or namespace == "Contionary") then
if quote then
if quote then
table.insert(categories, lang:getCanonicalName() .. " terms with quotations")
table.insert(categories, lang:getCanonicalName() .. " terms with quotations")
Line 266: Line 259:
class = class .. " " .. added_class
class = class .. " " .. added_class
end
end
result = (inline and span or div)(class, result)
result = div(class, result)
result = result .. require("Module:utilities").format_categories(categories, lang, sortkey)
result = result .. require("Module:utilities/format_categories")(categories, lang, sortkey)
if noenum then
if noenum then
result = "\n: " .. result
result = "\n: " .. result

Revision as of 13:11, 18 June 2023

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

local export = {}

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

-- 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',
	quotation_with_citation = 'e-quotation cited-passage',
	translation = 'e-translation',
	-- The following are added by [[Module:script utilities]], using [[Module:script utilities/data]]
--	transliteration = 'e-transliteration',	
--	transcription = 'e-transcription',
	literally = 'e-literally',
	source = 'e-source',
	footer = 'e-footer'
}

-- 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(data)
	local namespace = mw.title.getCurrentTitle().nsText

	local lang, sc, usex, translation, transliteration, transcription, noenum,
		inline, ref, quote, lit, substs, qualifiers, source, nocat, brackets, footer,
		sortkey, added_class =
			data.lang, data.sc, data.usex, data.translation, data.transliteration,
			data.transcription, data.noenum, data.inline, data.ref, data.quote,
			data.lit, data.substs, data.qualifiers, data.source, data.nocat,
			data.brackets, data.footer, data.sortkey, data.class

	--[[
	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

	if footer then
		footer = span(class.footer, footer)
	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

	-- 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
				
				local substs = mw.text.split(substs, ",")
				for _, subpair in ipairs(substs) do
					local subsplit = mw.text.split(subpair, mw.ustring.find(subpair, "//") and "//" or "/")
					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, "Requests for transliteration of " .. lang:getCanonicalName() .. " terms")
		end
	end
	if transliteration then
		transliteration = require("Module:script utilities").tag_translit(transliteration, lang:getCode(), "usex")
	end
	if transcription then
		transcription = require("Module:script utilities").tag_transcription(transcription, 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() ~= "mul" and lang:getCode() ~= "und" then
		-- add trreq category if translation is unspecified and language is not english, translingual or undetermined
		table.insert(categories, "Requests for translations of " .. lang:getCanonicalName() .. " usage examples")
		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 = "usex"
		end
		
		if not nocat and (namespace == "" or namespace == "Reconstruction" or namespace == "Contionary") then
			if quote then
				table.insert(categories, lang:getCanonicalName() .. " terms with quotations")
			else
				table.insert(categories, lang:getCanonicalName() .. " terms with usage examples")
			end
		end
		
		usex = require("Module:script utilities").tag_text(usex, lang, sc, face,
			quote == "quote-meta" and class.quotation_with_citation or
			quote and class.quotation or class.example)
	else
		if transliteration then
			table.insert(categories, "Requests for native script in " .. lang:getCanonicalName() .. " usage examples")
		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 #qualifiers > 0 then
		table.insert(result, " " .. require("Module:qualifier").format_qualifier(qualifiers))
	end
	
	table.insert(result, ref)
	
	if inline then
		if transliteration then
			table.insert(result, " ― " .. transliteration)
			if transcription then
				table.insert(result, " /" .. transcription .. "/")
			end
		elseif transcription then
			table.insert(result, " ― /" .. transcription .. "/")
		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

		if footer then
			table.insert(result, " " .. footer)
		end

		if brackets then
			table.insert(result, "]")
		end
	elseif transliteration or translation or transcription or lit or source or footer then
		table.insert(result, "<dl>")
		local closing_tag = ""

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

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

		local extra_indent, closing_extra_indent
		if transliteration or transcription or translation or lit then
			extra_indent = "<dd><dl><dd>"
			closing_extra_indent = "</dd></dl></dd>"
		else
			extra_indent = "<dd>"
			closing_extra_indent = "</dd>"
		end
		if source then
			table.insert(result, closing_tag)
			table.insert(result, extra_indent .. source)
			closing_tag = closing_extra_indent
		end

		if footer then
			table.insert(result, closing_tag)
			table.insert(result, extra_indent .. footer)
			closing_tag = closing_extra_indent
		end

		if brackets then
			table.insert(result, "]")
		end
		
		table.insert(result, closing_tag)

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

return export