Module:Listbox: Difference between revisions

From Zelda Dungeon Wiki
Jump to navigation Jump to search
Want an adless experience? Log in or Create an account.
(remove FSA and TFH from staging)
(set categories from listing page if using single arg)
Line 27: Line 27:
function Listbox:renderContent()
function Listbox:renderContent()
   local listing = Listing._parseListing( ((self.categories[1] == 'The Wind Waker' and self.categories[3] == 'Enemies') or (self.categories[1] == 'Hyrule Warriors' and self.categories[3] ~= 'Legend Mode Scenarios') or self.categories[1] == 'Breath of the Wild') and self.subject .. '/Staging' or self.subject )
   local listing = Listing._parseListing( ((self.categories[1] == 'The Wind Waker' and self.categories[3] == 'Enemies') or (self.categories[1] == 'Hyrule Warriors' and self.categories[3] ~= 'Legend Mode Scenarios') or self.categories[1] == 'Breath of the Wild') and self.subject .. '/Staging' or self.subject )
  -- If categories weren't set already (because caller used single arg), then use the ones parsed from the page.
  -- CODE SMELL: setting unrelated state. this only works because renderFooter is called after renderContent.
  if #self.categories == 0 then self.categories = listing.categories end


   local content = mw.html.create( 'table' )
   local content = mw.html.create( 'table' )
Line 65: Line 69:
   getParent = function() return {
   getParent = function() return {
     args = {
     args = {
       [1] = "The Legend of Zelda",
       [1] = "The Legend of Zelda Locations"
      [2] = "Locations"
     }
     }
   } end
   } end

Revision as of 19:21, August 12, 2020

Documentation for this module may be created at Module:Listbox/doc

local Args = require( 'Module:Args' )
local Listing = require( 'Module:Listing' )

function buildHList( parent, sections )
  local list = parent:addClass( 'hlist' )
    :tag( 'ul' )
  for _, section in ipairs( sections ) do
    -- !!!! This may break if Template:Main is modified !!!!
    local expandedMainTemplate = section.summary:match( 'Main article: %[%[(.-)]]' )
    local link = expandedMainTemplate and mw.text.split( expandedMainTemplate, '|' )[1]
    list:tag( 'li' )
      :wikitext( '[[' .. (link or section.name) .. '|' .. section.name .. ']]' )
  end
end

local Navbox = Listing.Navbox

local Listbox = setmetatable( {}, Navbox )
Listbox.__index = Listbox

function Listbox.new( args )
  local obj = Navbox.new( args )
  return setmetatable( obj, Listbox )
end

-- override
function Listbox:renderContent()
  local listing = Listing._parseListing( ((self.categories[1] == 'The Wind Waker' and self.categories[3] == 'Enemies') or (self.categories[1] == 'Hyrule Warriors' and self.categories[3] ~= 'Legend Mode Scenarios') or self.categories[1] == 'Breath of the Wild') and self.subject .. '/Staging' or self.subject )

  -- If categories weren't set already (because caller used single arg), then use the ones parsed from the page.
  -- CODE SMELL: setting unrelated state. this only works because renderFooter is called after renderContent.
  if #self.categories == 0 then self.categories = listing.categories end

  local content = mw.html.create( 'table' )
  if #listing.topLevelLeaves > 0 then
    local defaultCell = content:tag( 'tr' )
      :tag( 'td' )
      :addClass( 'odd' )
      :attr( 'colspan', '2' )
      :css( 'text-align', 'center' )
    buildHList( defaultCell, listing.topLevelLeaves )
  end
  if #listing.groups > 0 then
    for index, group in ipairs( listing.groups ) do
      local row = content:tag( 'tr' )
      row:tag( 'th' )
        :addClass( 'label' )
        :wikitext( group.name )
      local cell = row:tag( 'td' )
        :addClass( (index + (#listing.topLevelLeaves > 0 and 1 or 0)) % 2 == 0 and 'even' or 'odd' )
      buildHList( cell, group.sections )
    end
  end

  return content
end

local p = {}

function p.main( frame )
  local listbox = Listbox.new( Args.fromFrame( frame ) )
  return listbox:render()
end

-- for use in the debug console:
-- =p.main(p.debugframe)
p.debugframe = {
  args = {},
  getParent = function() return {
    args = {
      [1] = "The Legend of Zelda Locations"
    }
  } end
}

return p