Module:PortalPeopleIndex
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