Module:Navbar: Difference between revisions

    From Nonbinary Wiki
    m>Jackmcbarn
    (autofill name, export _navbar, use Module:Arguments, and fix whitespace, from sandbox)
    m>Jackmcbarn
    (support collapsible version)
    Line 41: Line 41:
    function p._navbar(args)
    function p._navbar(args)
    local good, title, talk_title;
    local good, title, talk_title;
    good, title, talk_title = pcall(getTitle, args[1] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
    local titleArg = 1
    if args.collapsible then
    titleArg = 2
    if not args.plain then
    args.mini = 1
    end
    if args.fontcolor then
    args.fontstyle = 'color:' .. args.fontcolor .. ';'
    end
    args.style = 'float:left; text-align:left; width:6em;'
    end
    good, title, talk_title = pcall(getTitle, args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
    if not good then
    if not good then
    return htmlError(title);
    return htmlError(title);
    Line 59: Line 72:
    end
    end


    local div = HtmlBuilder.create('div')
    local div = HtmlBuilder.create().tag('div')
    div
    div
    .addClass('plainlinks')
    .addClass('plainlinks')
    Line 129: Line 142:
    .wikitext(']')
    .wikitext(']')
    .newline();
    .newline();
    end
    if args.collapsible then
    div
    .done()
    .tag('span')
    .css('font-size', '110%')
    .cssText(args.fontstyle or '')
    .wikitext(args[1])
    end
    end


    return tostring(div)
    return tostring(div.allDone())
    end
    end



    Revision as of 16:19, 24 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;
    	local titleArg = 1
    	
    	if args.collapsible then
    		titleArg = 2
    		if not args.plain then
    			args.mini = 1
    		end
    		if args.fontcolor then
    			args.fontstyle = 'color:' .. args.fontcolor .. ';'
    		end
    		args.style = 'float:left; text-align:left; width:6em;'
    	end
    	
    	good, title, talk_title = pcall(getTitle, args[titleArg] 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().tag('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
    	
    	if args.collapsible then
    		div
    			.done()
    		.tag('span')
    			.css('font-size', '110%')
    			.cssText(args.fontstyle or '')
    			.wikitext(args[1])
    	end
    
    	return tostring(div.allDone())
    end
    
    function p.navbar(frame)
    	if not getArgs then
    		getArgs = require('Module:Arguments').getArgs
    	end
    	return p._navbar(getArgs(frame))
    end
    
    return p