Module:Navbar: Difference between revisions

From Zoophilia Wiki
Jump to navigationJump to search
meta>Dragons flight
also trap talk title
meta>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

This is a Lua implementation of {{Navbar}}. It is used in Module:Navbox.


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