Module:Listbox: Difference between revisions

Jump to navigation Jump to search
Want an adless experience? Log in or Create an account.
support variants and preparing to implement gallery format
(parse extra as json)
(support variants and preparing to implement gallery format)
Line 15: Line 15:
end
end


function renderHList(parent, pages)
function getPageTree( categoryName, expandVariants )
  local list = parent:addClass( 'hlist' )
   -- get all pages in the category
    :tag( 'ul' )
   local pages = mw.ext.dpl.getPages{ category = categoryName, ordermethod = 'sortkey', order = 'ascending' }
  for _, page in ipairs(pages) do
    list:tag( 'li' )
      :wikitext( '[[' .. page.text .. '|' .. (page.sortkey or page.text) .. ']]' )
  end
end
 
local Navbox = Box.new()
Navbox.__index = Navbox
setmetatable( Navbox, Box )
 
function Navbox.new( format, args )
  local subject = args[1] .. ' ' .. args[2]
  args.class = 'navbox'
  args.title = subject
  args.edit = subject
  args.hide = 'show' -- TODO count number of navboxes, hide after the second or third (could relegate to the calling template)
  local obj = Box.new( 'light', args )
  obj.subject = subject
  obj.categories = { args[1], subject, args[2] }
  return setmetatable( obj, Navbox )
end
 
function Navbox:renderContent()
  local catprops = getCategoryProps( self.subject )
 
   -- get list of pages in the category
   local pages = mw.ext.dpl.getPages{ category = self.subject, ordermethod = 'sortkey', order = 'ascending' }


   -- organize them according to metadata
   -- organize them according to metadata
   local pagetree = { default = {} }
   local pageTree = { default = {} }
   for _, page in ipairs( pages ) do
   for _, page in ipairs( pages ) do
     -- get metadata
     -- get metadata
Line 58: Line 31:
         page.extra = result
         page.extra = result
       else
       else
         page.sortkey = 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' } }
         page.sortkey = 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' } }
         page.extra = {}
         page.extra = {}
       end
       end
Line 65: Line 38:


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


   -- build the table
   return pageTree
end
 
function buildGallery( categoryProps, pageTree )
  return mw.html.create( 'div ')
end
 
function renderHList( parent, pages )
  local list = parent:addClass( 'hlist' )
    :tag( 'ul' )
  for _, page in ipairs( pages ) do
    list:tag( 'li' )
      :wikitext( '[[' .. page.text .. '|' .. (page.extra.name or page.sortkey or page.text) .. ']]' )
  end
end
 
function buildTable( categoryProps, pageTree )
   local content = mw.html.create( 'table' )
   local content = mw.html.create( 'table' )
   if #pagetree.default then
   if #pageTree.default then
     local defaultcell = content:tag( 'tr' )
     local defaultCell = content:tag( 'tr' )
       :tag( 'td' )
       :tag( 'td' )
       :addClass( 'odd' )
       :addClass( 'odd' )
       :attr( 'colspan', '2' )
       :attr( 'colspan', '2' )
       :css( 'text-align', 'center' )
       :css( 'text-align', 'center' )
     renderHList( defaultcell, pagetree.default )
     renderHList( defaultCell, pageTree.default )
   end
   end
   if catprops.groups then
   if categoryProps.groups then
     -- coerce it to a table for easier processing
     -- coerce it to a table for easier processing
     local groups = type(catprops.groups) == 'table' and catprops.groups or { catprops.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( pageTree[group] ) then
         local row = content:tag( 'tr' )
         local row = content:tag( 'tr' )
         row:tag( 'th' )
         row:tag( 'th' )
Line 90: Line 85:
           :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 + (#pageTree.default and 1 or 0)) % 2 == 0 and 'even' or 'odd' )
         renderHList( cell, pagetree[group] )
         renderHList( cell, pageTree[group] )
       end
       end
     end
     end
   end
   end


   return tostring( content )
   return content
end
 
local Navbox = Box.new()
Navbox.__index = Navbox
setmetatable( Navbox, Box )
 
function Navbox.new( format, args )
  local subject = args[1] .. ' ' .. args[2]
  args.class = 'navbox'
  args.title = subject
  args.edit = subject
  args.hide = 'show' -- TODO count number of navboxes, hide after the second or third (could relegate to the calling template)
  local obj = Box.new( 'light', args )
  obj.format = format
  obj.subject = subject
  obj.categories = { args[1], subject, args[2] }
  return setmetatable( obj, Navbox )
end
 
function Navbox:renderContent()
  local categoryProps = getCategoryProps( self.subject )
  local pageTree = getPageTree( self.subject, self.format == 'gallery' )
  local build = setmetatable( {
    gallery = buildGallery
  }, {
    __index = function() return buildTable end -- default
  } )
  return build[self.format]( categoryProps, pageTree )
end
end


Navigation menu