Template:Module:Navbar

From InCircuit
Jump to: navigation, search

local p = {}

local HtmlBuilder = require('Module:HtmlBuilder')

function trim(s)

   return mw.ustring.match( s, "^%s*(.-)%s*$" )

end

function error(s)

   local span = HtmlBuilder.create('span')
   span
       .addClass('error')
       .css('float', 'left')
       .css('white-space', 'nowrap')
       .wikitext('Error: ' .. s)
   return tostring(span)

end

function getTitle( pageName )

   pageName = trim( pageName );
   local page_title, talk_page_title;
   
   if mw.ustring.sub(pageName, 1, 1) == ':' then
       page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
   else
       page_title = mw.title.new( pageName, 'Template' );
   end    
   
   if page_title then 
       talk_page_title = page_title.talkPageTitle;
   else
       talk_page_title = nil;
   end
   
   return page_title, talk_page_title;    

end

function _navbar( args )

   if not args[1] then
       return error('No name provided')
   end

   local good, title, talk_title;
   good, title, talk_title = pcall( getTitle, args[1] );
   if not good then
       return error('Expensive parser function limit exceeded');
   end    
   if not title then
       return error('Page does not exist')
   end

   local mainpage = title.fullText;
   local talkpage = talk_title and talk_title.fullText or 
   local editurl = title:fullUrl( 'action=edit' ); 

   local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
   if args.mini then
       viewLink, talkLink, editLink = 'v', 't', 'e'
   end

   local div = HtmlBuilder.create( 'div' )
   div
       .addClass( 'noprint' )
       .addClass( 'plainlinks' )
       .addClass( 'hlist' )
       .addClass( 'navbar')
       .cssText( args.style )

   if args.mini then div.addClass('mini') end

   if not (args.mini or args.plain) then
       div
           .tag( 'span' )
               .css( 'word-spacing', 0 )
               .cssText( args.fontstyle )
               .wikitext( args.text or 'This box:' )
               .wikitext( ' ' )
   end

   if args.brackets then
       div
           .tag('span')
               .css('margin-right', '-0.125em')
               .cssText( args.fontstyle )
               .wikitext( '[' )
               .newline();
   end

   local ul = div.tag('ul');

   ul
       .tag( 'li' )
           .addClass( 'nv-view' )
           .wikitext( '' )
            .tag( 'span ' )
                .attr( 'title', 'View this template' )
                .cssText( args.fontstyle or  )
                .wikitext( viewLink )
                .done()
            .wikitext( '' )
           .done()
       .tag( 'li' )
           .addClass( 'nv-talk' )
           .wikitext( '' )
            .tag( 'span ' )
                .attr( 'title', 'Discuss this template' )
                .cssText( args.fontstyle or  )
                .wikitext( talkLink )
                .done()
            .wikitext( '' );

   if not args.noedit then 
       ul
           .tag( 'li' )
               .addClass( 'nv-edit' )
               .wikitext( '[' .. editurl .. ' ' )
               .tag( 'span ' )
                   .attr( 'title', 'Edit this template' )
                   .cssText( args.fontstyle or  )
                   .wikitext( editLink )
                   .done()
               .wikitext( ']' );
   end

   if args.brackets then
       div
           .tag('span')
               .css('margin-left', '-0.125em')
               .cssText( args.fontstyle or  )
               .wikitext( ']' )
               .newline();
   end

   return tostring(div)

end

function p.navbar(frame)

   local origArgs
   -- If called via #invoke, use the args passed into the invoking template.
   -- Otherwise, for testing purposes, assume args are being passed directly in.
   if frame == mw.getCurrentFrame() then
       origArgs = frame:getParent().args
   else
       origArgs = frame
   end

   -- ParserFunctions considers the empty string to be false, so to preserve the previous 
   -- behavior of Template:navbar, change any empty arguments to nil, so Lua will consider
   -- them false too.
   args = {}
   for k, v in pairs(origArgs) do
       if v ~=  then
           args[k] = v
       end
   end

   return _navbar(args)

end

return p

Personal tools