Difference between revisions of "Module:Navbar"
From MINR.ORG WIKI
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))) |
(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*$") | |
end | end | ||
local function htmlError(s) | 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 | end | ||
− | local function getTitle( pageName ) | + | 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 | 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 | end | ||
function p.navbar(frame) | function p.navbar(frame) | ||
− | + | if not getArgs then | |
− | + | getArgs = require('Module:Arguments').getArgs | |
− | + | end | |
− | + | return p._navbar(getArgs(frame)) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | + | ||
return p | return p |
Revision as of 22:09, 23 May 2014
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 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