Module:Navbar: Difference between revisions

m
30 revisions imported from wikipedia:Module:Navbar: this is nice to have
(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 (30 revisions imported from wikipedia:Module:Navbar: this is nice to have)
 
(26 intermediate revisions by 16 users not shown)
Line 1:
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
 
local function get_title_arg(is_collapsible, template)
local HtmlBuilder = require('Module:HtmlBuilder')
local title_arg = 1
 
if is_collapsible then title_arg = 2 end
function trim(s)
if template then title_arg = 'template' end
return mw.ustring.match( s, "^%s*(.-)%s*$" )
return title_arg
end
 
local function errorchoose_links(stemplate, args)
-- The show table indicates the default displayed items.
local span = HtmlBuilder.create('span')
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = 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}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
 
local remove_edit_link = args.noedit
span
if remove_edit_link then show[3] = false end
.addClass('error')
.css('float', 'left')
return show
.css('white-space', 'nowrap')
.wikitext('Error: ' .. s)
end
 
local function add_link(link_description, ul, is_mini, font_style)
return tostring(span)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
 
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
function getTitle( pageName )
pageName = trim( pageName );
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
local page_title, talk_page_title;
if not title then
error(cfg.invalid_title .. title_text)
if mw.ustring.sub(pageName, 1, 1) == ':' then
end
page_title = mw.title.new( mw.ustring.sub(pageName, 2) );
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
else
page_title = mw.title.new( pageName, 'Template' );
-- TODO: Get link_descriptions and show into the configuration module.
end
-- link_descriptions should be easier...
local link_descriptions = {
if page_title then
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
talk_page_title = page_title.talkPageTitle;
['link'] = title.fullText, ['url'] = false },
else
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
talk_page_title = nil;
['link'] = talkpage, ['url'] = false },
end
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
return page_title, talk_page_title;
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = title:fullUrl('action=history'), ['url'] = true },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
 
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
 
function p._navbar( args )
if not args[1] then
-- TODO: We probably don't need both fontstyle and fontcolor...
return error('No name provided')
local font_style = args.fontstyle
end
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local good, title, talk_title;
local is_mini = args.mini
good, title, talk_title = pcall( getTitle, args[1] );
local is_plain = args.plain
if not good then
return error(title);
local collapsible_class = nil
end
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
 
if is_mini then div:addClass(cfg.classes.mini) end
if not title then
 
return error('Page does not exist')
local box_text = (args.text or cfg.box_text) .. ' '
end
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
local mainpage = title.fullText;
div
local talkpage = talk_title and talk_title.fullText or ''
:tag('span')
local editurl = title:fullUrl( 'action=edit' );
:addClass(cfg.classes.box_text)
:cssText(font_style)
local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
:wikitext(box_text)
if args.mini then
end
viewLink, talkLink, editLink = 'v', 't', 'e'
end
local template = args.template
local displayed_links = choose_links(template, args)
local div = HtmlBuilder.create( 'div' )
local has_brackets = args.brackets
div
local title_arg = get_title_arg(is_collapsible, template)
.addClass( 'noprint' )
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
.addClass( 'plainlinks' )
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
.addClass( 'hlist' )
div:node(list)
.addClass( 'navbar')
 
.cssText( args.style )
if is_collapsible then
local title_text_class
if args.mini then div.addClass('mini') end
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
if not (args.mini or args.plain) then
else
div
title_text_class = cfg.classes.collapsible_title_full
.tag( 'span' )
end
.css( 'word-spacing', 0 )
div:done()
.cssText( args.fontstyle )
:tag('div')
.wikitext( args.text or 'This box:' )
:addClass(title_text_class)
.wikitext( ' ' )
:cssText(font_style)
end
:wikitext(args[1])
end
if args.brackets then
div
return mw.getCurrentFrame():extensionTag{
.tag('span')
name = 'templatestyles', args = { src = cfg.templatestyles }
.css('margin-right', '-0.125em')
} .. tostring(div:done())
.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)
return p._navbar(require('Module:Arguments').getArgs(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