Module:Navbar: Difference between revisions

    From Nonbinary Wiki
    m>Dragons flight
    (also trap talk title)
    m>Anomie
    (Let's not assume the error is because of the expensive function limit, it could be something else. Especially for people who import this module into MW 1.21 installations.)
    Line 46: Line 46:
         good, title, talk_title = pcall( getTitle, args[1] );
         good, title, talk_title = pcall( getTitle, args[1] );
         if not good then
         if not good then
             return error('Expensive parser function limit exceeded');
             return error(title);
         end     
         end     



    Revision as of 13:47, 3 September 2013

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

    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(title);
        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( '[[' .. mainpage .. '|' )
                .tag( 'span ' )
                    .attr( 'title', 'View this template' )
                    .cssText( args.fontstyle or '' )
                    .wikitext( viewLink )
                    .done()
                .wikitext( ']]' )
                .done()
            .tag( 'li' )
                .addClass( 'nv-talk' )
                .wikitext( '[[' .. talkpage .. '|' )
                .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 {{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