Module:NarratorListModule: Difference between revisions

From The Seven Sages of Rome
No edit summary
No edit summary
 
(19 intermediate revisions by the same user not shown)
Line 1: Line 1:
local p = {}
local p = {}


local function getSubobjects(shortTitle)
-- Main function to query pages and narrators
  local query = "[[Has subobject::+]][[Has Short Title::" .. shortTitle .. "]]|?Has Narrator"
-- @param frame The frame object from Scribunto
  local results = mw.smw.ask(query)
-- @return HTML table with narrator-to-pages mapping
  return results
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
end


function p.getNarratorList(frame)
-- Helper function to build the HTML table
  local shortTitle = frame.args.shortTitle
-- @param narratorToPages Table mapping narrators to pages
  if not shortTitle then
-- @return HTML table as string
     return "Error: shortTitle parameter is missing."
function p.buildTable(narratorToPages)
  end
    local html = '{| class="dataTable sortable"\n'
 
    html = html .. '! Narrator !! Pages\n'
  local results = getSubobjects(shortTitle)
   
 
     -- Sort narrators alphabetically
  if not results then
    local sortedNarrators = {}
     return "* No matching subobjects found."
    for narrator, _ in pairs(narratorToPages) do
  end
        table.insert(sortedNarrators, narrator)
 
    end
  local groupedResults = {}
     table.sort(sortedNarrators)
 
   
  for _, result in ipairs(results) do
    -- Add each narrator and its pages to the table
    local narrator = result["Has Narrator"] and result["Has Narrator"][1]
    for _, narrator in ipairs(sortedNarrators) do
    if narrator then
        local pages = narratorToPages[narrator]
      local pageName = result.fulltext:match("\[\[(.-)\]\]") -- Extract page name from fulltext
       
      if pageName then
        -- Sort pages alphabetically
         if not groupedResults[narrator] then
        table.sort(pages)
          groupedResults[narrator] = {}
       
        -- 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
         end
         groupedResults[narrator][#groupedResults[narrator] + 1] = "[[" .. pageName .. "]]"
         local pageList = table.concat(pageLinks, ', ')
      end
       
        html = html .. '|-\n'
        html = html .. '| ' .. narrator .. ' || ' .. pageList .. '\n'
     end
     end
  end
   
 
     html = html .. '|}'
  local output = {}
    return html
  for narrator, pages in pairs(groupedResults) do
     output[#output + 1] = "* " .. narrator .. ": " .. table.concat(pages, ", ")
  end
 
  return table.concat(output, "\n")
end
end


return p
return p

Latest revision as of 14:30, 26 March 2025

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