Module:Box: Difference between revisions
Jump to navigation
Jump to search
Want an adless experience? Log in or Create an account.
(output content so subclasses can do what they want with it. I'll need to add content support to the base Box functions later.) |
(switch to zdw selectors) |
||
(6 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
-- This is the base module for creating boxes with common styling. | -- This is the base module for creating boxes with common styling. | ||
-- invoker args: | -- invoker args: | ||
-- | -- class | ||
-- align ('left', 'right', 'center') | -- align ('left', 'right', 'center') | ||
-- width (e.g. '250px') | -- width (e.g. '250px') | ||
Line 9: | Line 9: | ||
-- hide ('hide' or 'show') - adds a toggle button to the title bar which toggles visibility of the content, with the specified default state | -- hide ('hide' or 'show') - adds a toggle button to the title bar which toggles visibility of the content, with the specified default state | ||
local | local Box = {} | ||
Box.__index = Box | |||
function | function Box.new( boxType, args ) | ||
return | local obj = { | ||
boxType = boxType, | |||
args = args, | |||
categories = {} | |||
} | |||
return setmetatable( obj, Box ) | |||
end | end | ||
function | 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 | end | ||
function | -- 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 | end | ||
function | -- render content | ||
function Box:renderContent() | |||
local content = mw.html.create( 'div' ) | |||
:wikitext( self.args[1] ) | |||
return tostring( content ) | |||
end | end | ||
-- | -- render footer with categories if provided | ||
function | -- 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 | |||
return | -- 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 | end | ||
return p | return setmetatable( p, mt ) |
Latest revision as of 23:26, June 22, 2020
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 )