Module:Navbar

From Wayne County, Ohio Online Resource Center
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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


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