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

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.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 = "[[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