Module:Listbox: Difference between revisions

Jump to navigation Jump to search
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


Navigation menu