Module:NarratorListModule
From The Seven Sages of Rome
Documentation for this module may be created at Module:NarratorListModule/doc
local p = {}
-- Main function to query pages and narrators
-- @param frame The frame object from Scribunto
-- @return HTML table with narrator-to-pages mapping
function p.getNarratorsForShortTitle(frame)
-- Get parameters from the function call
local shortTitle = frame.args[1] or frame:getParent().args[1]
if not shortTitle or shortTitle == '' then
return 'Error: Please provide a short title as parameter'
end
-- Create the semantic query
local query = mw.smw.ask({
-- Query for pages with a subobject having the specified 'Has Short Title'
'[[Has Short Title::' .. shortTitle .. ']]',
-- Return the page name and narrator of the subobject
'?Has Narrator',
-- Return the page name
'mainlabel=Page'
})
if not query or #query == 0 then
return 'No results found for short title: ' .. shortTitle
end
-- Organize results by narrator
local narratorToPages = {}
for _, row in ipairs(query) do
local page = row.Page
local narrators = row['Has Narrator']
-- Handle the case where a subobject has multiple narrators
if type(narrators) == 'table' then
for _, narrator in ipairs(narrators) do
if not narratorToPages[narrator] then
narratorToPages[narrator] = {}
end
table.insert(narratorToPages[narrator], page)
end
elseif narrators and narrators ~= '' then
if not narratorToPages[narrators] then
narratorToPages[narrators] = {}
end
table.insert(narratorToPages[narrators], page)
end
end
if rawequal(next(narratorToPages), nil) then
return "No recorded narrations available."
end
-- Now build the HTML table
return p.buildTable(narratorToPages)
end
-- Helper function to build the HTML table
-- @param narratorToPages Table mapping narrators to pages
-- @return HTML table as string
function p.buildTable(narratorToPages)
local html = '{| class="dataTable sortable"\n'
html = html .. '! Narrator !! Pages\n'
-- Sort narrators alphabetically
local sortedNarrators = {}
for narrator, _ in pairs(narratorToPages) do
table.insert(sortedNarrators, narrator)
end
table.sort(sortedNarrators)
-- Add each narrator and its pages to the table
for _, narrator in ipairs(sortedNarrators) do
local pages = narratorToPages[narrator]
-- Sort pages alphabetically
table.sort(pages)
-- Create comma-separated list of pages with links but WITHOUT brackets
local pageLinks = {}
for _, page in ipairs(pages) do
-- Use direct page name without wiki link syntax
table.insert(pageLinks, page)
end
local pageList = table.concat(pageLinks, ', ')
html = html .. '|-\n'
html = html .. '| ' .. narrator .. ' || ' .. pageList .. '\n'
end
html = html .. '|}'
return html
end
return p