Difference between revisions of "Module:Navbar"
From MINR.ORG WIKI
m (Changed protection level of Module:Navbar: Highly visible template or Lua module ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))) |
(handle expensive parser function limit without killing the box) |
||
Line 17: | Line 17: | ||
return tostring(span) | return tostring(span) | ||
+ | end | ||
+ | |||
+ | function getTitle( pageName ) | ||
+ | pageName = trim( pageName ); | ||
+ | if mw.ustring.sub(pageName, 1, 1) == ':' then | ||
+ | return mw.title.new( mw.ustring.sub(pageName, 2) ); | ||
+ | else | ||
+ | return mw.title.new( pageName, 'Template' ); | ||
+ | end | ||
end | end | ||
Line 24: | Line 33: | ||
end | end | ||
− | local title; | + | local good, title; |
− | + | good, title = pcall( getTitle, args[1] ); | |
− | if | + | if not good then |
− | + | return error('Expensive parser function limit exceeded'); | |
− | + | end | |
− | + | ||
− | end | ||
if not title then | if not title then | ||
return error('Page does not exist') | return error('Page does not exist') |
Revision as of 21:07, 31 March 2013
This Lua module is used on 11,200,000+ pages. To avoid large-scale disruption and unnecessary server load, any changes to this module should first be tested in its /sandbox or /testcases subpages. The tested changes can then be added to this page in a single edit. Please consider discussing any changes on the talk page before implementing them. |
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
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 ); if mw.ustring.sub(pageName, 1, 1) == ':' then return mw.title.new( mw.ustring.sub(pageName, 2) ); else return mw.title.new( pageName, 'Template' ); end end function _navbar( args ) if not args[1] then return error('No name provided') end local good, title; good, title = pcall( getTitle, args[1] ); if not good then return error('Expensive parser function limit exceeded'); end if not title then return error('Page does not exist') end local mainpage = title.fullText; local talkpage = title.talkPageTitle and title.talkPageTitle.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