Editing Module:Navbar

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. Read the Privacy Policy to learn what information we collect about you and how we use it.

If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
local p = {}
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
local function trim(s)
if template then title_arg = 'template' end
    return mw.ustring.match( s, "^%s*(.-)%s*$" )
return title_arg
end
end


local function choose_links(template, args)
local function htmlError(s)
-- 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
end


local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local 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
end


function p._navbar(args)
local function _navbar( args )
    if not args[1] then
-- TODO: We probably don't need both fontstyle and fontcolor...
        return htmlError('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 htmlError(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


local box_text = (args.text or cfg.box_text) .. ' '
    if not title then
-- the concatenated space guarantees the box text is separated
        return htmlError('Page does not exist')
if not (is_mini or is_plain) then
    end
div
:tag('span')
    local mainpage = title.fullText;
:addClass(cfg.classes.box_text)
    local talkpage = talk_title and talk_title.fullText or ''
:cssText(font_style)
    local editurl = title:fullUrl( 'action=edit' );
:wikitext(box_text)
end
    local viewLink, talkLink, editLink = 'view', 'talk', 'edit'
    if args.mini then
local template = args.template
        viewLink, talkLink, editLink = 'v', 't', 'e'
local displayed_links = choose_links(template, args)
    end
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
    local div = HtmlBuilder.create( 'div' )
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
    div
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
        .addClass( 'plainlinks' )
div:node(list)
        .addClass( 'hlist' )
 
        .addClass( 'navbar')
if is_collapsible then
        .cssText( args.style )
local title_text_class
if is_mini then
    if args.mini then div.addClass('mini') end
title_text_class = cfg.classes.collapsible_title_mini
else
    if not (args.mini or args.plain) then
title_text_class = cfg.classes.collapsible_title_full
        div
end
            .tag( 'span' )
div:done()
                .css( 'word-spacing', 0 )
:tag('div')
                .cssText( args.fontstyle )
:addClass(title_text_class)
                .wikitext( args.text or 'This box:' )
:cssText(font_style)
                .wikitext( ' ' )
:wikitext(args[1])
    end
end
    if args.brackets then
return mw.getCurrentFrame():extensionTag{
        div
name = 'templatestyles', args = { src = cfg.templatestyles }
            .tag('span')
} .. tostring(div:done())
                .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)
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.
    local 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
Please note that all contributions to Nonbinary Wiki are considered to be released under the Creative Commons Attribution-ShareAlike (see Nonbinary Wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)

Template used on this page: