Module:labels: Difference between revisions

From Linguifex
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
local m_labeldata = mw.loadData("Module:labels/data")
local m_labeldata = mw.loadData("Module:labels/data")
local m_utilities = require("Module:utilities")
--local m_links = require("Module:links") unused
local m_links = require("Module:links")
 
local m_utilities_format_categories = require("Module:utilities/format_categories")


local export = {}
local export = {}
Line 54: Line 55:
end
end
return m_utilities.format_categories(categories, lang, sort_key, nil, force_cat) ..
return m_utilities_format_categories(categories, lang, sort_key, nil, force_cat) ..
m_utilities.format_categories(categories2, lang, sort_key2, nil, force_cat)
m_utilities_format_categories(categories2, lang, sort_key2, nil, force_cat)
end
end


Line 63: Line 64:
local categories = ""
local categories = ""
local alias
local alias
if m_labeldata.deprecated[label] then
local data = m_labeldata[label]
 
-- get language-specific labels from data module
local langcode = lang:getCode()
local langlabels_ok, langlabels = pcall(function() return mw.loadData("Module:labels/data/lang/" .. langcode) end)
if langlabels_ok then
-- prefer per-language label in order to pick subvariety labels over regional ones
data = langlabels[label] or data
end
data = data or {}
 
if data.deprecated then
deprecated = true
deprecated = true
end
end
if m_labeldata.aliases[label] then
if type(data) == "string" or data.alias_of then
alias = label
alias = label
label = m_labeldata.aliases[label]
label = data.alias_of or data
if langlabels_ok then
data = langlabels[label] or m_labeldata[label]
else
data = m_labeldata[label]
end
data = data or {}
end
end
if m_labeldata.deprecated[label] then
if data.deprecated then
deprecated = true
deprecated = true
end
local data = m_labeldata.labels[label] or {}
--[=[
Do not use the data in the table if the current language
is not in the "languages" list.
If the original label was an alias, and was redirected to a label
with a data file, go back to the original label.
For example, suppose the label "Rome" is used with the language code "en" (English).
"Rome" redirects to "Romanesco" in [[Module:labels/data/regional]].
The only language in the "languages" list is "it" (Italian).
Because the language code provided to the template was not "it",
the label's data file will not be used,
and the label will display as "Rome".
tracking: [[Special:WhatLinksHere/Template:tracking/labels/incorrect-language]]
[[Special:WhatLinksHere/Template:tracking/labels/redirect-undone]]
]=]
if data.languages then
local lang_code = lang:getCode()
if not data.languages[lang_code] then
mw.log("incorrect language in label template " .. lang_code .. ":" .. label)
if alias and label ~= alias then
mw.log("redirect undone in label template " .. lang_code .. ":" .. label .. " > " .. alias)
label = alias
end
data = {}
end
end
end
Line 133: Line 119:
if data.glossary then
if data.glossary then
local glossary_entry = type(data.glossary) == "string" and data.glossary or label
local glossary_entry = type(data.glossary) == "string" and data.glossary or label
label = "[[wikt:Appendix:Glossary#" .. glossary_entry .. "|" .. ( data.display or label ) .. "]]"
label = "[[Appendix:Glossary#" .. glossary_entry .. "|" .. ( data.display or label ) .. "]]"
elseif data.Wikipedia then
elseif data.Wikipedia then
Wikipedia_entry = type(data.Wikipedia) == "string" and data.Wikipedia or label
Wikipedia_entry = type(data.Wikipedia) == "string" and data.Wikipedia or label
Line 145: Line 131:
label = '<span class="deprecated-label">' .. label .. '</span>'
label = '<span class="deprecated-label">' .. label .. '</span>'
if not nocat then
if not nocat then
categories = categories .. m_utilities.format_categories({ "Entries with deprecated labels" }, lang, sort_key, nil, force_cat)
categories = categories .. m_utilities_format_categories({ "Entries with deprecated labels" }, lang, sort_key, nil, force_cat)
end
end
end
end
Line 213: Line 199:
label = ""
label = ""
else
else
label = (omit_comma and "" or '<span class="ib-comma" style="font-style: normal;">,</span>') ..
label = (omit_comma and "" or '<span class="ib-comma">,</span>') ..
(omit_space and "" or "&#32;") ..
(omit_space and "" or "&#32;") ..
ret.label
ret.label
Line 221: Line 207:
return
return
"<span class=\"ib-brac\">(</span><span class=\"ib-content\" style=\"font-style: italic;\">" ..
"<span class=\"ib-brac\">(</span><span class=\"ib-content\">" ..
table.concat(labels, "") ..
table.concat(labels, "") ..
"</span><span class=\"ib-brac\">)</span>"
"</span><span class=\"ib-brac\">)</span>"

Revision as of 18:03, 10 July 2022



local m_labeldata = mw.loadData("Module:labels/data")
--local m_links = require("Module:links") unused

local m_utilities_format_categories = require("Module:utilities/format_categories")

local export = {}

-- for testing
local force_cat = false

local function show_categories(data, lang, script, sort_key, script2, sort_key2, term_mode)
	local categories = {}
	local categories2 = {}
	
	local lang_code = lang:getCode()
	local canonical_name = lang:getCanonicalName()
	
	local topical_categories = data.topical_categories or {}
	local sense_categories = data.sense_categories or {}
	local pos_categories = data.pos_categories or {}
	local regional_categories = data.regional_categories or {}
	local plain_categories = data.plain_categories or {}

	local function insert_cat(cat)
		table.insert(categories, cat)
		
		if script then
			table.insert(categories, cat .. " in " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, cat .. " in " .. script2 .. " script")
		end
	end

	for i, cat in ipairs(topical_categories) do
		insert_cat(lang_code .. ":" .. cat)
	end
	
	for i, cat in ipairs(sense_categories) do
		cat = (term_mode and cat .. " terms" ) or "terms with " .. cat .. " senses"
		insert_cat(canonical_name .. " " .. cat)
	end

	for i, cat in ipairs(pos_categories) do
		insert_cat(canonical_name .. " " .. cat)
	end
	
	for i, cat in ipairs(regional_categories) do
		insert_cat(cat .. " " .. canonical_name)
	end
	
	for i, cat in ipairs(plain_categories) do
		insert_cat(cat)
	end
	
	return	m_utilities_format_categories(categories, lang, sort_key, nil, force_cat) ..
			m_utilities_format_categories(categories2, lang, sort_key2, nil, force_cat)
end

function export.get_label_info(label, lang, already_seen, script, script2, sort_key, sort_key2, nocat, term_mode)
	local ret = {}
	local deprecated = false
	local categories = ""
	local alias
	local data = m_labeldata[label]

	-- get language-specific labels from data module
	local langcode = lang:getCode()
	local langlabels_ok, langlabels = pcall(function() return mw.loadData("Module:labels/data/lang/" .. langcode) end)
	if langlabels_ok then
		-- prefer per-language label in order to pick subvariety labels over regional ones
		data = langlabels[label] or data
	end
	
	data = data or {}

	if data.deprecated then
		deprecated = true
	end
	if type(data) == "string" or data.alias_of then
		alias = label
		label = data.alias_of or data
		if langlabels_ok then
			data = langlabels[label] or m_labeldata[label]
		else
			data = m_labeldata[label]
		end
		data = data or {}
	end
	if data.deprecated then
		deprecated = true
	end
	
	if data.special_display then
		local function add_language_name(str)
			if str == "canonical_name" then
				return lang:getCanonicalName()
			else
				return ""
			end
		end
		
		label = mw.ustring.gsub(data.special_display, "<([^>]+)>", add_language_name)
	else
		--[[
			If data.glossary or data.Wikipedia are set to true, there is a glossary definition
			with an anchor identical to the label, or a Wikipedia article with a title
			identical to the label.
				For example, the code
					labels["formal"] = {
						glossary = true,
					}
				indicates that there is a glossary entry for "formal".
				
			
			Otherwise, data.glossary and data.Wikipedia specify the title or the anchor.
		]]
		if data.glossary then
			local glossary_entry = type(data.glossary) == "string" and data.glossary or label
			label = "[[Appendix:Glossary#" .. glossary_entry .. "|" .. ( data.display or label ) .. "]]"
		elseif data.Wikipedia then
			Wikipedia_entry = type(data.Wikipedia) == "string" and data.Wikipedia or label
			label = "[[w:" .. Wikipedia_entry .. "|" .. ( data.display or label ) .. "]]"
		else
			label = data.display or label
		end
	end
	
	if deprecated then
		label = '<span class="deprecated-label">' .. label .. '</span>'
		if not nocat then
			categories = categories .. m_utilities_format_categories({ "Entries with deprecated labels" }, lang, sort_key, nil, force_cat)
		end
	end
	
	local label_for_already_seen =
		(data.topical_categories or data.regional_categories
		or data.plain_categories or data.pos_categories
		or data.sense_categories) and label
		or nil
	
	-- Track label text. If label text was previously used, don't show it,
	-- but include the categories.
	-- For an example, see [[hypocretin]].
	if already_seen[label_for_already_seen] then
		ret.label = ""
	else
		ret.label = label
	end
	
	if nocat then
		ret.categories = ""
	else
		ret.categories = categories .. show_categories(data, lang, script, sort_key, script2, sort_key2, term_mode)
	end

	ret.data = data

	if label_for_already_seen then
		already_seen[label_for_already_seen] = true
	end

	return ret
end
	

function export.show_labels(labels, lang, script, script2, sort_key, sort_key2, nocat, term_mode)
	if not labels[1] then
		if mw.title.getCurrentTitle().nsText == "Template" then
			labels = {"example"}
		else
			error("You must specify at least one label.")
		end
	end
	
	-- Show the labels
	local omit_preComma = false
	local omit_postComma = true
	local omit_preSpace = false
	local omit_postSpace = true
	
	local already_seen = {}
	
	for i, label in ipairs(labels) do
		omit_preComma = omit_postComma
		omit_postComma = false
		omit_preSpace = omit_postSpace
		omit_postSpace = false

		local ret = export.get_label_info(label, lang, already_seen, script, script2, sort_key, sort_key2, nocat, term_mode)
		
		local omit_comma = omit_preComma or ret.data.omit_preComma
		omit_postComma = ret.data.omit_postComma
		local omit_space = omit_preSpace or ret.data.omit_preSpace
		omit_postSpace = ret.data.omit_postSpace
		
		if ret.label == "" then
			label = ""
		else
			label = (omit_comma and "" or '<span class="ib-comma">,</span>') ..
					(omit_space and "" or "&#32;") ..
					ret.label
		end
		labels[i] = label .. ret.categories
	end
	
	return
		"<span class=\"ib-brac\">(</span><span class=\"ib-content\">" ..
		table.concat(labels, "") ..
		"</span><span class=\"ib-brac\">)</span>"
end

return export