Module:Navbar: Difference between revisions
Content added Content deleted
(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 (36 revisions imported from templatewiki:Module:Navbar) |
||
(26 intermediate revisions by 17 users not shown) | |||
Line 1: | Line 1: | ||
local p = {} |
local p = {} |
||
local getArgs |
|||
local HtmlBuilder = require('Module:HtmlBuilder') |
|||
local ul |
|||
function p.addItem (mini, full, link, descrip, args, url) |
|||
function trim(s) |
|||
local l |
|||
return mw.ustring.match( s, "^%s*(.-)%s*$" ) |
|||
if url then |
|||
l = {'[', '', ']'} |
|||
else |
|||
l = {'[[', '|', ']]'} |
|||
end |
|||
ul:tag('li') |
|||
:addClass('nv-'..full) |
|||
:wikitext(l[1] .. link .. l[2]) |
|||
:tag(args.mini and 'abbr' or 'span') |
|||
:attr('title', descrip..' this template') |
|||
:cssText(args.fontstyle) |
|||
:wikitext(args.mini and mini or full) |
|||
:done() |
|||
:wikitext(l[3]) |
|||
end |
end |
||
function |
function p.brackets (position, c, args, div) |
||
if args.brackets then |
|||
local span = HtmlBuilder.create('span') |
|||
div |
|||
:tag('span') |
|||
:css('margin-'..position, '-0.125em') |
|||
:cssText(args.fontstyle) |
|||
:wikitext(c) |
|||
end |
|||
end |
|||
function p._navbar(args) |
|||
span |
|||
local show = {true, true, true, false, false, false} |
|||
.addClass('error') |
|||
local titleArg = 1 |
|||
.css('float', 'left') |
|||
.css('white-space', 'nowrap') |
|||
if args.collapsible then |
|||
.wikitext('Error: ' .. s) |
|||
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 |
|||
if args.template then |
|||
titleArg = 'template' |
|||
show = {true, false, false, false, false, false} |
|||
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} |
|||
for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do |
|||
local num = index[v] |
|||
if num then show[num] = true end |
|||
end |
|||
end |
|||
if args.noedit then show[3] = false 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 |
|||
return tostring(span) |
|||
end |
|||
if not (args.mini or args.plain) then |
|||
function getTitle( pageName ) |
|||
div |
|||
pageName = trim( pageName ); |
|||
:tag('span') |
|||
local page_title, talk_page_title; |
|||
:css('word-spacing', 0) |
|||
:cssText(args.fontstyle) |
|||
if mw.ustring.sub(pageName, 1, 1) == ':' then |
|||
:wikitext(args.text or 'This box:') |
|||
page_title = mw.title.new( mw.ustring.sub(pageName, 2) ); |
|||
:wikitext(' ') |
|||
else |
|||
end |
|||
page_title = mw.title.new( pageName, 'Template' ); |
|||
end |
|||
p.brackets('right', '[ ', args, div) |
|||
if page_title then |
|||
ul = div:tag('ul') |
|||
talk_page_title = page_title.talkPageTitle; |
|||
if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end |
|||
else |
|||
if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end |
|||
talk_page_title = nil; |
|||
if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end |
|||
end |
|||
if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end |
|||
if show[5] then |
|||
return page_title, talk_page_title; |
|||
local move = mw.title.new ('Special:Movepage') |
|||
end |
|||
p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end |
|||
if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end |
|||
p.brackets('left', ' ]', args, div) |
|||
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()) |
|||
function _navbar( args ) |
|||
if not args[1] then |
|||
return error('No name provided') |
|||
end |
|||
local good, title, talk_title; |
|||
good, title, talk_title = pcall( getTitle, args[1] ); |
|||
if not good then |
|||
return error(title); |
|||
end |
|||
if not title then |
|||
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) |
||
if not getArgs then |
|||
local origArgs |
|||
getArgs = require('Module:Arguments').getArgs |
|||
-- If called via #invoke, use the args passed into the invoking template. |
|||
end |
|||
-- Otherwise, for testing purposes, assume args are being passed directly in. |
|||
return p._navbar(getArgs(frame)) |
|||
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 |
end |
||
return p |
return p |
Latest revision as of 16:55, 30 March 2021
Documentation for this module may be created at Module:Navbar/doc
local p = {}
local getArgs
local ul
function p.addItem (mini, full, link, descrip, args, url)
local l
if url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-'..full)
:wikitext(l[1] .. link .. l[2])
:tag(args.mini and 'abbr' or 'span')
:attr('title', descrip..' this template')
:cssText(args.fontstyle)
:wikitext(args.mini and mini or full)
:done()
:wikitext(l[3])
end
function p.brackets (position, c, args, div)
if args.brackets then
div
:tag('span')
:css('margin-'..position, '-0.125em')
:cssText(args.fontstyle)
:wikitext(c)
end
end
function p._navbar(args)
local show = {true, true, true, false, false, false}
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
if args.template then
titleArg = 'template'
show = {true, false, false, false, false, false}
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
for k,v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
if args.noedit then show[3] = false 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
p.brackets('right', '[ ', args, div)
ul = div:tag('ul')
if show[1] then p.addItem('v', 'view', title.fullText, 'View', args) end
if show[2] then p.addItem('t', 'talk', talkpage, 'Discuss', args) end
if show[3] then p.addItem('e', 'edit', title:fullUrl('action=edit'), 'Edit', args, true) end
if show[4] then p.addItem('h', 'hist', title:fullUrl('action=history'), 'History of', args, true) end
if show[5] then
local move = mw.title.new ('Special:Movepage')
p.addItem('m', 'move', move:fullUrl('target='..title.fullText), 'Move', args, true) end
if show[6] then p.addItem('w', 'watch', title:fullUrl('action=watch'), 'Watch', args, true) end
p.brackets('left', ' ]', args, div)
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