Module:Navbar: Difference between revisions

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