Difference between revisions of "Module:Navbar"

From MINR.ORG WIKI
(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.)
m (25 revisions imported: Import Template Tlx and subtemplates)
 
(17 intermediate revisions by 9 users not shown)
Line 1: Line 1:
 
local p = {}
 
local p = {}
  
local HtmlBuilder = require('Module:HtmlBuilder')
+
local getArgs
  
function trim(s)
+
function p._navbar(args)
    return mw.ustring.match( s, "^%s*(.-)%s*$" )
+
local titleArg = 1
end
+
 
 +
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'
 +
end
 +
 
 +
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
 +
local title = mw.title.new(mw.text.trim(titleText), 'Template');
 +
 
 +
if not title then
 +
error('Invalid title ' .. titleText)
 +
end
 +
 
 +
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';
 +
 
 +
local div = mw.html.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('[ ')
 +
end
  
function error(s)
+
local ul = div:tag('ul');
    local span = HtmlBuilder.create('span')
 
  
    span
+
ul
        .addClass('error')
+
:tag('li')
        .css('float', 'left')
+
:addClass('nv-view')
        .css('white-space', 'nowrap')
+
:wikitext('[[' .. title.fullText .. '|')
        .wikitext('Error: ' .. s)
+
:tag(args.mini and 'abbr' or 'span')
 +
:attr('title', 'View this template')
 +
:cssText(args.fontstyle)
 +
:wikitext(args.mini and 'v' or 'view')
 +
:done()
 +
:wikitext(']]')
 +
:done()
 +
:tag('li')
 +
:addClass('nv-talk')
 +
:wikitext('[[' .. talkpage .. '|')
 +
:tag(args.mini and 'abbr' or 'span')
 +
:attr('title', 'Discuss this template')
 +
:cssText(args.fontstyle)
 +
:wikitext(args.mini and 't' or 'talk')
 +
:done()
 +
:wikitext(']]');
  
    return tostring(span)
+
if not args.noedit then
end
+
ul
 +
:tag('li')
 +
:addClass('nv-edit')
 +
:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
 +
:tag(args.mini and 'abbr' or 'span')
 +
:attr('title', 'Edit this template')
 +
:cssText(args.fontstyle)
 +
:wikitext(args.mini and 'e' or 'edit')
 +
:done()
 +
:wikitext(']');
 +
end
  
function getTitle( pageName )
+
if args.brackets then
    pageName = trim( pageName );
+
div
    local page_title, talk_page_title;
+
:tag('span')
   
+
:css('margin-left', '-0.125em')
    if mw.ustring.sub(pageName, 1, 1) == ':' then
+
:cssText(args.fontstyle)
        page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
+
:wikitext(' ]')
    else
+
end
        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 args.collapsible then
    if not args[1] then
+
div
        return error('No name provided')
+
:done()
    end
+
:tag('div')
+
:css('font-size', '114%')
    local good, title, talk_title;
+
:css('margin', args.mini and '0 4em' or '0 7em')
    good, title, talk_title = pcall( getTitle, args[1] );
+
:cssText(args.fontstyle)
    if not good then
+
:wikitext(args[1])
        return error(title);
+
end
    end  
 
  
    if not title then
+
return tostring(div:done())
        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
 
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.
 
    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

Latest revision as of 20:29, 11 August 2017

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


local p = {}

local getArgs

function p._navbar(args)
	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'
	end

	local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
	local title = mw.title.new(mw.text.trim(titleText), 'Template');

	if not title then
		error('Invalid title ' .. titleText)
	end

	local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '';

	local div = mw.html.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('[ ')
	end

	local ul = div:tag('ul');

	ul
		:tag('li')
			:addClass('nv-view')
			:wikitext('[[' .. title.fullText .. '|')
			:tag(args.mini and 'abbr' or 'span')
				:attr('title', 'View this template')
				:cssText(args.fontstyle)
				:wikitext(args.mini and 'v' or 'view')
				:done()
			:wikitext(']]')
			:done()
		:tag('li')
			:addClass('nv-talk')
			:wikitext('[[' .. talkpage .. '|')
			:tag(args.mini and 'abbr' or 'span')
				:attr('title', 'Discuss this template')
				:cssText(args.fontstyle)
				:wikitext(args.mini and 't' or 'talk')
				:done()
			:wikitext(']]');

	if not args.noedit then
		ul
			:tag('li')
				:addClass('nv-edit')
				:wikitext('[' .. title:fullUrl('action=edit') .. ' ')
				:tag(args.mini and 'abbr' or 'span')
					:attr('title', 'Edit this template')
					:cssText(args.fontstyle)
					:wikitext(args.mini and 'e' or 'edit')
					:done()
				:wikitext(']');
	end

	if args.brackets then
		div
			:tag('span')
				:css('margin-left', '-0.125em')
				:cssText(args.fontstyle)
				:wikitext(' ]')
	end

	if args.collapsible then
		div
			:done()
		:tag('div')
			:css('font-size', '114%')
			:css('margin', args.mini and '0 4em' or '0 7em')
			:cssText(args.fontstyle)
			:wikitext(args[1])
	end

	return tostring(div:done())
end

function p.navbar(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	return p._navbar(getArgs(frame))
end

return p