Module:Listbox: Difference between revisions

Want an adless experience? Log in or Create an account.
extra is limited to 255 chars, so grabbing metadata from the page content instead
m (add result to json error message, hopefully it's helpful)
(extra is limited to 255 chars, so grabbing metadata from the page content instead)
Line 1: Line 1:
local Box = require( 'Module:Box' ).Box
local Box = require( 'Module:Box' ).Box
local Lazy = require( 'Module:Lazy' ) -- may load: Tabs, Gallery
local Lazy = require( 'Module:Lazy' ) -- may load: Tabs, Gallery, Args


function getCategoryProps( categoryName )
function getCategoryProps( categoryName )
Line 16: Line 16:
end
end


function getPageTree( categoryName, expandVariants )
function getPageGroups( categoryName, getPageProps )
   -- get all pages in the category
   -- get all pages in the category
   local pages = mw.ext.dpl.getPages{ category = categoryName, ordermethod = 'sortkey', order = 'ascending' }
   local pages = mw.ext.dpl.getPages{ category = categoryName, ordermethod = 'sortkey', order = 'ascending' }


   -- organize them according to metadata
   -- organize them by group
   local pageTree = { default = {} }
   local groups = { default = {} }
   for _, page in ipairs( pages ) do
   for _, page in ipairs( pages ) do
     -- get metadata
     page.group = page.extra or 'default'
    if page.extra then
    -- remove extra from sortkey
      -- remove extra from sortkey
    if page.extra then page.sortkey = string.sub( page.sortkey, 1, -string.len( page.extra ) - 2 ) end
      page.sortkey = string.sub( page.sortkey, 1, -string.len( page.extra ) - 2 )


       local success, result = pcall( mw.text.jsonDecode, page.extra )
    if getPageProps then
       if success then
       local pageContent = mw.title.new( page.text ):getContent()
        page.extra = result
       page.args = Lazy.Load( 'Module:Args' ).Args.fromPageContent( pageContent, 'Cat%s*|%s*' .. categoryName )
      else
    else
        page.extra = {
       page.args = {}
          name = page.text .. mw.getCurrentFrame():expandTemplate{ title = 'Tt', args = { 'PARSING ERROR: Please ensure the argument to \'extra\' in this page\'s invocation of \'Cat\' is valid JSON. Error: ' .. result } }
        }
       end
    else page.extra = {}
     end
     end


     -- add page to group
     -- add page to group
     page.__index = page -- allow variants to fall back to page
     page.__index = page -- allow variants to fall back to page
     page.extra.__index = page.extra -- allow variants' extra to fall back to page's extra
     page.args.__index = page.args -- allow variants' args to fall back to page's args
     local variants = expandVariants and page.extra.variants or {{}} -- that's a table containing a single table (variant) with no properties (overrides)
     local variants = page.args.variant or {{}} -- that's a table containing a single table (variant) with no properties (overrides)
     for _, variant in ipairs( variants ) do
     for _, variant in ipairs( variants ) do
       setmetatable( variant, page.extra )
       setmetatable( variant, page.args )
       if not variant.exclude then
       if not variant.exclude then
         if not variant.group then variant.group = 'default' end
         groups[variant.group] = groups[variant.group] or {}
        if not pageTree[variant.group] then pageTree[variant.group] = {} end
         groups[variant.group][#groups[variant.group] + 1] = setmetatable( { args = variant }, page )
         pageTree[variant.group][#pageTree[variant.group] + 1] = setmetatable( { extra = variant }, page )
       end
       end
     end
     end
   end
   end


   return pageTree
   return groups
end
end


Line 73: Line 67:




function buildGalleries( categoryProps, pageTree )
function buildGalleries( categoryProps, pageGroups )
   local Gallery = Lazy.load( 'Module:Gallery' ).Gallery
   local Gallery = Lazy.load( 'Module:Gallery' ).Gallery


   local defaultGallery = nil
   local defaultGallery = nil
   if pageTree.default then
   if pageGroups.default then
     defaultGallery = buildGallery( pageTree.default )
     defaultGallery = buildGallery( pageGroups.default )
   end
   end


Line 96: Line 90:
     local groups = type( categoryProps.groups ) == 'table' and categoryProps.groups or { categoryProps.groups }
     local groups = type( categoryProps.groups ) == 'table' and categoryProps.groups or { categoryProps.groups }
     for index, group in ipairs( groups ) do
     for index, group in ipairs( groups ) do
       if pageTree[group] then
       if pageGroups[group] then
         tabs:addTabTopWithContent{
         tabs:addTabTopWithContent{
           contentId = group,
           contentId = group,
           content = buildGallery( pageTree[group] )
           content = buildGallery( pagegroups[group] )
         }
         }
       end
       end
Line 119: Line 113:
end
end


function buildTable( categoryProps, pageTree )
function buildTable( categoryProps, pageGroups )
   local content = mw.html.create( 'table' )
   local content = mw.html.create( 'table' )
   if #pageTree.default then
   if #pageGroups.default then
     local defaultCell = content:tag( 'tr' )
     local defaultCell = content:tag( 'tr' )
       :tag( 'td' )
       :tag( 'td' )
Line 127: Line 121:
       :attr( 'colspan', '2' )
       :attr( 'colspan', '2' )
       :css( 'text-align', 'center' )
       :css( 'text-align', 'center' )
     renderHList( defaultCell, pageTree.default )
     renderHList( defaultCell, pageGroups.default )
   end
   end
   if categoryProps.groups then
   if categoryProps.groups then
Line 133: Line 127:
     local groups = type( categoryProps.groups ) == 'table' and categoryProps.groups or { categoryProps.groups }
     local groups = type( categoryProps.groups ) == 'table' and categoryProps.groups or { categoryProps.groups }
     for index, group in ipairs( groups ) do
     for index, group in ipairs( groups ) do
       if pageTree[group] then
       if pageGroups[group] then
         local row = content:tag( 'tr' )
         local row = content:tag( 'tr' )
         row:tag( 'th' )
         row:tag( 'th' )
Line 139: Line 133:
           :wikitext( group )
           :wikitext( group )
         local cell = row:tag( 'td' )
         local cell = row:tag( 'td' )
           :addClass( (index + (#pageTree.default and 1 or 0)) % 2 == 0 and 'even' or 'odd' )
           :addClass( (index + (#pageGroups.default and 1 or 0)) % 2 == 0 and 'even' or 'odd' )
         renderHList( cell, pageTree[group] )
         renderHList( cell, pageGroups[group] )
       end
       end
     end
     end
Line 167: Line 161:
function Navbox:renderContent()
function Navbox:renderContent()
   local categoryProps = getCategoryProps( self.subject )
   local categoryProps = getCategoryProps( self.subject )
   local pageTree = getPageTree( self.subject, self.format == 'gallery' )
   local pageGroups = getPageGroups( self.subject, self.format == 'gallery' )
   local build = setmetatable( {
   local build = setmetatable( {
     gallery = buildGalleries
     gallery = buildGalleries
Line 173: Line 167:
     __index = function() return buildTable end -- default
     __index = function() return buildTable end -- default
   } )
   } )
   return build[self.format]( categoryProps, pageTree )
   return build[self.format]( categoryProps, pageGroups )
end
end