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

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

local export = {}

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 {}
	
	for i, cat in ipairs(topical_categories) do
		table.insert(categories, lang_code .. ":" .. cat)
		
		if script then
			table.insert(categories, lang_code .. ":" .. cat .. " in " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, lang_code .. ":" .. cat .. " in " .. script2 .. " script")
		end
	end
	
	for i, cat in ipairs(sense_categories) do
		cat = (term_mode and cat .. " terms" ) or "terms with " .. cat .. " senses"
		table.insert(categories, canonical_name .. " " .. cat)
		
		if script then
			table.insert(categories, canonical_name .. " " .. cat .. " sa " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, canonical_name .. " " .. cat .. " sa " .. script2 .. " script")
		end
	end

	for i, cat in ipairs(pos_categories) do
		table.insert(categories, canonical_name .. " " .. cat)
		
		if script then
			table.insert(categories, canonical_name .. " " .. cat .. " sa " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, canonical_name .. " " .. cat .. " sa " .. script2 .. " script")
		end
	end
	
	for i, cat in ipairs(regional_categories) do
		table.insert(categories, cat .. " " .. canonical_name)
		
		if script then
			table.insert(categories, cat .. " " .. canonical_name .. " sa " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, cat .. " " .. canonical_name .. " in " .. script2 .. " script")
		end
	end
	
	for i, cat in ipairs(plain_categories) do
		table.insert(categories, cat)
		
		if script then
			table.insert(categories, cat .. " sa " .. script .. " script")
		end
		
		if script2 then
			table.insert(categories2, cat .. " sa " .. script2 .. " script")
		end
	end
	
	return	m_utilities.format_categories(categories, lang, sort_key) ..
			m_utilities.format_categories(categories2, lang, sort_key2)
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 = {"halimbawa"}
		else
			error("Magkaag nin dawa sarong apod.")
		end
	end
	
	-- Show the labels
	local omit_preComma = false
	local omit_postComma = true
	local omit_preSpace = false
	local omit_postSpace = true
	
	local lang_code = lang:getCode()
	local canonical_name = lang:getCanonicalName()
	
	local alias
	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 tinanggal = false
		if m_labeldata.tinanggal[label] then
			tinanggal = true
		end
		if m_labeldata.alias[label] then
			alias = label
			label = m_labeldata.alias[label]
		end
		if m_labeldata.tinanggal[label] then
			tinanggal = true
		end
		
		local data = m_labeldata.apod[label] or {}
		
		if data.track then
			require("Module:debug").track("labels/label/" .. label)
		end
		
		--[=[
			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:	[[Espesyal:WhatLinksHere/Template:tracking/labels/incorrect-language]]
						[[Espesyal:WhatLinksHere/Template:tracking/labels/redirect-undone]]
		]=]
		local languages = data.languages
		if languages and not languages[lang_code] then
			require("Module:debug").track("labels/incorrect-language")
			mw.log("salang lengguwahe sa pang-apod na plantilya " .. lang_code .. ":" .. label)
			
			if alias and label ~= alias then
				require("Module:debug").track("labels/redirect-undone")
				mw.log("redirect undone in label template " .. lang_code .. ":" .. label .. " > " .. alias)
				label = alias
			end
			
			data = {}
		end
		
		if data.special_display then
			local function add_language_name(str)
				if str == "canonical_name" then
					return canonical_name
				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
		
		local omit_comma = omit_preComma or data.omit_preComma
		omit_postComma = data.omit_postComma
		local omit_space = omit_preSpace or data.omit_preSpace
		omit_postSpace = data.omit_postSpace
		
		if deprecated then
			label = '<span class="deprecated-label">' .. label .. '</span>'
			if not nocat then
				label = label .. m_utilities.format_categories({ "Mga entradang tinanggalan nin pang-apod" }, lang)
			end
		end
		
		local label_without_comma_or_space =
			(data.topical_categories or data.regional_categories
			or data.plain_categories or data.pos_categories
			or data.sense_categories) and label
			or nil
		
		label = (omit_comma and "" or '<span class="ib-comma">,</span>') ..
				(omit_space and "" or "&#32;") ..
				label
		
		-- 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_without_comma_or_space] then
			labels[i] = nocat and "" or
				show_categories(data, lang, script, sort_key, script2, sort_key2, term_mode)
		else
			labels[i] = label .. (
				nocat and "" or
				show_categories(data, lang, script, sort_key, script2, sort_key2, term_mode)
			)
		end
		
		if label_without_comma_or_space then
			already_seen[label_without_comma_or_space] = true
		end
	end
	
	return
		"<span class=\"ib-brac\">(</span><span class=\"ib-content\">" ..
		table.concat(labels, "") ..
		"</span><span class=\"ib-brac\">)</span>"
end

return export