Module:Labels

--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 local submodule

-- 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[label] then -- prefer per-language label in order to pick subvariety labels over regional ones data = langlabels[label] submodule = langlabels elseif mw.loadData("Module:labels/data")[label] then submodule = mw.loadData("Module:labels/data") data = submodule[label] elseif mw.loadData("Module:labels/data/regional")[label] then submodule = mw.loadData("Module:labels/data/regional") data = submodule[label] elseif mw.loadData("Module:labels/data/topical")[label] then submodule = mw.loadData("Module:labels/data/topical") data = submodule[label] 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 data = submodule[label] or {} end if data.deprecated then deprecated = true end

if data.track then require("Module:debug").track("labels/label/" .. label) 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 = "" .. ( data.display or label ) .. "" elseif data.Wikipedia then Wikipedia_entry = type(data.Wikipedia) == "string" and data.Wikipedia or label label = "" .. ( data.display or label ) .. "" else label = data.display or label end end if deprecated then label = ' ' .. label .. ' '		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 if label:find("{") then label = mw.getCurrentFrame:preprocess(label) end 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 ', ') .. (omit_space and "" or "&#32;") .. ret.label end labels[i] = label .. ret.categories end return "( " ..		table.concat(labels, "") ..		" ) " end

return export