Jump to content

Module:PortalPeopleIndex

From No Subject

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

-- Module:PortalPeopleIndex
-- Generates a deduplicated A–Z index from Module:PortalPeople

local p = {}

----------------------------------------------------------------------
-- Helpers
----------------------------------------------------------------------

local function getSortKey(item)
	if type(item) ~= "table" then
		return nil
	end
	return item.sort or item.last or item.page
end

local function getLabel(item)
	if type(item) ~= "table" then
		return nil
	end
	return item.label or item.page
end

----------------------------------------------------------------------
-- Main render function
----------------------------------------------------------------------

function p.render(frame)
	local ok, data = pcall(require, "Module:PortalPeople")
	if not ok or type(data) ~= "table" then
		return "<!-- PortalPeopleIndex error: Module:PortalPeople not found -->"
	end

	-- A–Z buckets
	local buckets = {}
	for i = 65, 90 do
		buckets[string.char(i)] = {}
	end

	-- Global deduplication registry
	local seen = {}

	-- Collect items from all sections
	for _, section in pairs(data) do
		if type(section) == "table" then
			for _, item in ipairs(section) do
				local page = item.page
				local sortKey = getSortKey(item)

				if page and sortKey and not seen[page] then
					seen[page] = true

					local letter = mw.ustring.upper(
						mw.ustring.sub(sortKey, 1, 1)
					)

					if buckets[letter] then
						table.insert(buckets[letter], item)
					end
				end
			end
		end
	end

	local out = {}

	-- Render A–Z
	for i = 65, 90 do
		local letter = string.char(i)
		local list = buckets[letter]

		if #list > 0 then
			table.insert(out, "== " .. letter .. " ==")

			table.sort(list, function(a, b)
				return getSortKey(a) < getSortKey(b)
			end)

			for _, item in ipairs(list) do
				table.insert(
					out,
					"* [[" .. item.page .. "|" .. getLabel(item) .. "]]"
				)
			end
		end
	end

	return table.concat(out, "\n")
end

return p