Module:Navbar: Difference between revisions

    From Nonbinary Wiki
    m>Toohool
    (return an html string instead of an htmlbuilder)
    m>Dragons flight
    (If the documentation is accurate, this will use the namespace part of pageName first and fallback to Template if one isn't present, which is what we want.)
    Line 25: Line 25:
             title = mw.title.new( mw.ustring.sub(pageName, 2) );
             title = mw.title.new( mw.ustring.sub(pageName, 2) );
         else
         else
             title = mw.title.new( pageName );
             title = mw.title.new( pageName, 'Template' );
            if title.namespace == 0 then
                title = mw.title.makeTitle( 'Template', pageName );
            end   
         end       
         end       
       
       

    Revision as of 03:08, 16 March 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.gsub(s, "^%s*(.-)%s*$", "%1"))
    end
    
    function _navbar( args )
        if not args[1] then
            local span = HtmlBuilder.create('span')
     
            span
                .addClass('error')
                .css('float', 'left')
                .css('white-space', 'nowrap')
                .wikitext('Error: No name provided')
     
            return span
        end
     
        local title;
        local pageName = trim(args[1])
        if mw.ustring.sub(pageName, 1, 1) == ':' then
            title = mw.title.new( mw.ustring.sub(pageName, 2) );
        else
            title = mw.title.new( pageName, 'Template' );
        end       
     
        local mainpage = title.fullText;
        local talkpage = title.talkPageTitle and title.talkPageTitle.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