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 getArgs
local title_arg = 1
local HtmlBuilder = require('Module:HtmlBuilder')
if is_collapsible then title_arg = 2 end
 
if template then title_arg = 'template' end
local function trim(s)
return title_arg
return mw.ustring.match(s, "^%s*(.-)%s*$")
end
end


local function choose_links(template, args)
local function getTitle(pageName)
-- The show table indicates the default displayed items.
pageName = trim(pageName);
-- view, talk, edit, hist, move, watch
local page_title, talk_page_title;
-- TODO: Move to configuration.
 
local show = {true, true, true, false, false, false}
if mw.ustring.sub(pageName, 1, 1) == ':' then
if template then
page_title = mw.title.new( mw.ustring.sub(pageName, 2));
show[2] = false
else
show[3] = false
page_title = mw.title.new(pageName, 'Template');
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
end


local remove_edit_link = args.noedit
if page_title then
if remove_edit_link then show[3] = false end
talk_page_title = page_title.talkPageTitle;
return show
end
 
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
else
l = {'[[', '|', ']]'}
talk_page_title = nil;
end
end
ul:tag('li')
 
:addClass('nv-' .. link_description.full)
return page_title, talk_page_title;
: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)
function p._navbar(args)
local title, talk_title;
local titleArg = 1
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if args.collapsible then
if not title then
titleArg = 2
error(cfg.invalid_title .. title_text)
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; width:6em;'
end
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
title, talk_title = getTitle(args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()));
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
{ ['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 not title then
if has_brackets then
error('Page does not exist')
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
end
 
for i, _ in ipairs(displayed_links) do
local mainpage = title.fullText;
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
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
end
return ul:done()
end


function p._navbar(args)
local div = HtmlBuilder.create().tag('div')
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
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
div
:addClass(cfg.classes.navbar)
.addClass('plainlinks')
:addClass(cfg.classes.plainlinks)
.addClass('hlist')
:addClass(cfg.classes.horizontal_list)
.addClass('navbar')
:addClass(collapsible_class) -- we made the determination earlier
.cssText(args.style)
:cssText(navbar_style)


if is_mini then div:addClass(cfg.classes.mini) end
if args.mini then div.addClass('mini') end


local box_text = (args.text or cfg.box_text) .. ' '
if not (args.mini or args.plain) then
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
div
:tag('span')
.tag('span')
:addClass(cfg.classes.box_text)
.css('word-spacing', 0)
:cssText(font_style)
.cssText(args.fontstyle)
:wikitext(box_text)
.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
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)


if is_collapsible then
if args.brackets then
local title_text_class
div
if is_mini then
.tag('span')
title_text_class = cfg.classes.collapsible_title_mini
.css('margin-left', '-0.125em')
else
.cssText( args.fontstyle or '')
title_text_class = cfg.classes.collapsible_title_full
.wikitext(']')
end
.newline();
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
end
return mw.getCurrentFrame():extensionTag{
if args.collapsible then
name = 'templatestyles', args = { src = cfg.templatestyles }
div
} .. tostring(div:done())
.done()
.tag('span')
.css('font-size', '110%')
.cssText(args.fontstyle or '')
.wikitext(args[1])
end
 
return tostring(div.allDone())
end
end


function p.navbar(frame)
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return p._navbar(getArgs(frame))
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: