Module:Navbar: Difference between revisions

    From Nonbinary Wiki
    m>Ymblanter
    m (Changed protection level of Module:Navbar: RFPP request ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)))
    m>Jackmcbarn
    (autofill name, export _navbar, use Module:Arguments, and fix whitespace, from sandbox)
    Line 1: Line 1:
    local p = {}
    local p = {}


    local getArgs
    local HtmlBuilder = require('Module:HtmlBuilder')
    local HtmlBuilder = require('Module:HtmlBuilder')


    local function trim(s)
    local function trim(s)
        return mw.ustring.match( s, "^%s*(.-)%s*$" )
    return mw.ustring.match(s, "^%s*(.-)%s*$")
    end
    end


    local function htmlError(s)
    local function htmlError(s)
        local span = HtmlBuilder.create('span')
    local span = HtmlBuilder.create('span')


        span
    span
            .addClass('error')
    .addClass('error')
            .css('float', 'left')
    .css('float', 'left')
            .css('white-space', 'nowrap')
    .css('white-space', 'nowrap')
            .wikitext('Error: ' .. s)
    .wikitext('Error: ' .. s)


        return tostring(span)
    return tostring(span)
    end
    end


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


    local function _navbar( args )
    function p._navbar(args)
        if not args[1] then
    local good, title, talk_title;
            return htmlError('No name provided')
    good, title, talk_title = pcall(getTitle, args[1] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
        end
    if not good then
    return htmlError(title);
        local good, title, talk_title;
    end
        good, title, talk_title = pcall( getTitle, args[1] );
     
        if not good then
    if not title then
            return htmlError(title);
    return htmlError('Page does not exist')
        end  
    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('plainlinks')
    .addClass('hlist')
    .addClass('navbar')
    .cssText(args.style)


        if not title then
    if args.mini then div.addClass('mini') end
            return htmlError('Page does not exist')
     
        end
    if not (args.mini or args.plain) then
    div
        local mainpage = title.fullText;
    .tag('span')
        local talkpage = talk_title and talk_title.fullText or ''
    .css('word-spacing', 0)
        local editurl = title:fullUrl( 'action=edit' );
    .cssText(args.fontstyle)
    .wikitext(args.text or 'This box:')
        local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
    .wikitext(' ')
        if args.mini then
    end
            viewLink, talkLink, editLink = 'v', 't', 'e'
     
        end
    if args.brackets then
    div
        local div = HtmlBuilder.create( 'div' )
    .tag('span')
        div
    .css('margin-right', '-0.125em')
            .addClass( 'plainlinks' )
    .cssText(args.fontstyle)
            .addClass( 'hlist' )
    .wikitext('[')
            .addClass( 'navbar')
    .newline();
            .cssText( args.style )
    end
     
        if args.mini then div.addClass('mini') end
    local ul = div.tag('ul');
     
        if not (args.mini or args.plain) then
    ul
            div
    .tag('li')
                .tag( 'span' )
    .addClass('nv-view')
                    .css( 'word-spacing', 0 )
    .wikitext('[[' .. mainpage .. '|')
                    .cssText( args.fontstyle )
    .tag('span')
                    .wikitext( args.text or 'This box:' )
    .attr('title', 'View this template')
                    .wikitext( ' ' )
    .cssText(args.fontstyle or '')
        end
    .wikitext(viewLink)
    .done()
        if args.brackets then
    .wikitext(']]')
            div
    .done()
                .tag('span')
    .tag('li')
                    .css('margin-right', '-0.125em')
    .addClass('nv-talk')
                    .cssText( args.fontstyle )
    .wikitext('[[' .. talkpage .. '|')
                    .wikitext( '[' )
    .tag('span')
                    .newline();
    .attr('title', 'Discuss this template')
        end
    .cssText(args.fontstyle or '')
    .wikitext(talkLink)
        local ul = div.tag('ul');
    .done()
    .wikitext(']]');
        ul
     
            .tag( 'li' )
    if not args.noedit then
                .addClass( 'nv-view' )
    ul
                .wikitext( '[[' .. mainpage .. '|' )
    .tag('li')
                .tag( 'span ' )
    .addClass('nv-edit')
                    .attr( 'title', 'View this template' )
    .wikitext('[' .. editurl .. ' ')
                    .cssText( args.fontstyle or '' )
    .tag('span')
                    .wikitext( viewLink )
    .attr('title', 'Edit this template')
                    .done()
    .cssText(args.fontstyle or '')
                .wikitext( ']]' )
    .wikitext(editLink)
                .done()
    .done()
            .tag( 'li' )
    .wikitext(']');
                .addClass( 'nv-talk' )
    end
                .wikitext( '[[' .. talkpage .. '|' )
     
                .tag( 'span ' )
    if args.brackets then
                    .attr( 'title', 'Discuss this template' )
    div
                    .cssText( args.fontstyle or '' )
    .tag('span')
                    .wikitext( talkLink )
    .css('margin-left', '-0.125em')
                    .done()
    .cssText( args.fontstyle or '')
                .wikitext( ']]' );
    .wikitext(']')
    .newline();
        if not args.noedit then  
    end
            ul
     
                .tag( 'li' )
    return tostring(div)
                    .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
    end


    function p.navbar(frame)
    function p.navbar(frame)
        local origArgs
    if not getArgs then
        -- If called via #invoke, use the args passed into the invoking template.
    getArgs = require('Module:Arguments').getArgs
        -- Otherwise, for testing purposes, assume args are being passed directly in.
    end
        if frame == mw.getCurrentFrame() then
    return p._navbar(getArgs(frame))
            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.
        local args = {}
        for k, v in pairs(origArgs) do
            if v ~= '' then
                args[k] = v
            end
        end
        return _navbar(args)
    end
    end
     
    return p
    return p

    Revision as of 21:09, 23 May 2014

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

    local p = {}
    
    local getArgs
    local HtmlBuilder = require('Module:HtmlBuilder')
    
    local function trim(s)
    	return mw.ustring.match(s, "^%s*(.-)%s*$")
    end
    
    local function htmlError(s)
    	local span = HtmlBuilder.create('span')
    
    	span
    		.addClass('error')
    		.css('float', 'left')
    		.css('white-space', 'nowrap')
    		.wikitext('Error: ' .. s)
    
    	return tostring(span)
    end
    
    local 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 p._navbar(args)
    	local good, title, talk_title;
    	good, title, talk_title = pcall(getTitle, args[1] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
    	if not good then
    		return htmlError(title);
    	end
    
    	if not title then
    		return htmlError('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('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)
    	if not getArgs then
    		getArgs = require('Module:Arguments').getArgs
    	end
    	return p._navbar(getArgs(frame))
    end
    
    return p