Module:Box

From Zelda Dungeon Wiki
Jump to navigation Jump to search
Want an adless experience? Log in or Create an account.
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

-- This is the base module for creating boxes with common styling.
-- invoker args:
--   class
--   align ('left', 'right', 'center')
--   width (e.g. '250px')
--   title
--   titlealign ('left', 'right', 'center')
--   edit (e.g. 'Template:SomeNavbox') - adds an edit link to this page to the title bar
--   hide ('hide' or 'show') - adds a toggle button to the title bar which toggles visibility of the content, with the specified default state

local Box = {}
Box.__index = Box

function Box.new( boxType, args )
  local obj = {
    boxType = boxType,
    args = args,
    categories = {}
  }

  return setmetatable( obj, Box )
end

function Box:render()
  local root = mw.html.create( 'div' )
    :addClass( self.boxType == 'dark' and 'zdw-box--dark' or 'zdw-box' )
    :addClass( self.args.class )

    -- box styles
    if self.args.align == 'right'
      or self.args.align == 'left'
      or self.args.align == 'center'
      then root:addClass( self.args.align )
    end
    if self.args.width then root:css( 'width', self.args.width ) end

    if self.args.title then
      root:node( self:renderHeader() )
    end

    root:tag( 'div' )
      :addClass( self.args.hide and '_toggle_init' .. self.args.hide .. ' _toggle' )
      :node( self:renderContent() )

    if #self.categories > 0 then
      root:node( self:renderFooter() )
    end

  return tostring( root )
end

-- render title, with edit and toggle links if supplied
function Box:renderHeader()
  local header = mw.html.create( 'div' )
    :addClass( 'zdw-box__title' )
    :css( 'text-align', 'center' )
    :wikitext( self.args.title )

  if self.args.edit then
    header:tag( 'span' )
      :addClass( 'edit plainlinks' )
      :wikitext( '[' .. tostring( mw.uri.fullUrl( self.args.edit, { action = 'edit' } ) ) .. ' [edit]]' )
  end

  if self.args.hide then
    header:wikitext( mw.getCurrentFrame():expandTemplate{ title = 'Toggler', args = { default = self.args.hide } } )
  end

  return header
end

-- render content
function Box:renderContent()
  local content = mw.html.create( 'div' )
    :wikitext( self.args[1] )

  return tostring( content )
end

-- render footer with categories if provided
-- so far Module:Navigation is the only thing that uses a footer,
--   so this implementation is specific to that scenario.
--   If other scenarios come up, this should be moved to Module:Navigation
function Box:renderFooter()
  local footer = mw.html.create( 'div' )
    :addClass( 'zdw-box__title zdw-hlist' )
    :css( 'text-align', 'center' )

  local catlist = footer:tag( 'ul' )
  for i, v in ipairs( self.categories ) do
    catlist:tag( 'li' )
      :wikitext( mw.getCurrentFrame():expandTemplate{ title = 'Catlink', args = { [1] = v } } )
  end

  return tostring( footer )
end

local p, mt = {}, {}

p.Box = Box

function p._main( boxType, args )
  local box = Box.new( boxType, args )
  return box:render()
end

-- translates p.function( frame ) to p._main( function, args )
function mt.__index( table, key )
  return function ( frame )
    return table._main( key, frame.args )
  end
end

return setmetatable( p, mt )