Difference between revisions of "Module:Navbar"
(→top: Restoring revision 5007839 by User:Dinoguy1000 on 2022-06-26 11:10:40. 1 revision imported: reimport Template:Citation needed & co. from Wikipedia) (Tag: New user edit) |
Dinoguy1000 (talk | contribs) (use latest version) |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local cfg = mw.loadData('Module:Navbar/configuration') | local cfg = mw.loadData('Module:Navbar/configuration') | ||
+ | |||
local function get_title_arg(is_collapsible, template) | local function get_title_arg(is_collapsible, template) | ||
local title_arg = 1 | local title_arg = 1 | ||
Line 7: | Line 8: | ||
return title_arg | return title_arg | ||
end | end | ||
+ | |||
local function choose_links(template, args) | local function choose_links(template, args) | ||
-- The show table indicates the default displayed items. | -- The show table indicates the default displayed items. | ||
Line 23: | Line 25: | ||
end | end | ||
end | end | ||
+ | |||
local remove_edit_link = args.noedit | local remove_edit_link = args.noedit | ||
if remove_edit_link then show[3] = false end | if remove_edit_link then show[3] = false end | ||
+ | |||
return show | return show | ||
+ | |||
end | end | ||
+ | |||
local function add_link(link_description, ul, is_mini, font_style) | local function add_link(link_description, ul, is_mini, font_style) | ||
local l | local l | ||
Line 45: | Line 51: | ||
:done() | :done() | ||
end | end | ||
+ | |||
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) | local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) | ||
+ | |||
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) | local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) | ||
if not title then | if not title then | ||
Line 51: | Line 59: | ||
end | end | ||
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' | local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' | ||
+ | |||
-- TODO: Get link_descriptions and show into the configuration module. | -- TODO: Get link_descriptions and show into the configuration module. | ||
-- link_descriptions should be easier... | -- link_descriptions should be easier... | ||
Line 67: | Line 76: | ||
['link'] = title:fullUrl('action=watch'), ['url'] = true } | ['link'] = title:fullUrl('action=watch'), ['url'] = true } | ||
} | } | ||
+ | |||
local ul = mw.html.create('ul') | local ul = mw.html.create('ul') | ||
if has_brackets then | if has_brackets then | ||
Line 72: | Line 82: | ||
:cssText(font_style) | :cssText(font_style) | ||
end | end | ||
+ | |||
for i, _ in ipairs(displayed_links) do | for i, _ in ipairs(displayed_links) do | ||
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end | if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end | ||
end | end | ||
return ul:done() | return ul:done() | ||
+ | |||
end | end | ||
+ | |||
function p._navbar(args) | function p._navbar(args) | ||
+ | |||
-- TODO: We probably don't need both fontstyle and fontcolor... | -- TODO: We probably don't need both fontstyle and fontcolor... | ||
local font_style = args.fontstyle | local font_style = args.fontstyle | ||
Line 84: | Line 98: | ||
local is_mini = args.mini | local is_mini = args.mini | ||
local is_plain = args.plain | local is_plain = args.plain | ||
+ | |||
local collapsible_class = nil | local collapsible_class = nil | ||
if is_collapsible then | if is_collapsible then | ||
Line 92: | Line 107: | ||
end | end | ||
end | end | ||
+ | |||
local navbar_style = args.style | local navbar_style = args.style | ||
local div = mw.html.create():tag('div') | local div = mw.html.create():tag('div') | ||
Line 100: | Line 116: | ||
:addClass(collapsible_class) -- we made the determination earlier | :addClass(collapsible_class) -- we made the determination earlier | ||
:cssText(navbar_style) | :cssText(navbar_style) | ||
+ | |||
if is_mini then div:addClass(cfg.classes.mini) end | if is_mini then div:addClass(cfg.classes.mini) end | ||
+ | |||
local box_text = (args.text or cfg.box_text) .. ' ' | local box_text = (args.text or cfg.box_text) .. ' ' | ||
-- the concatenated space guarantees the box text is separated | -- the concatenated space guarantees the box text is separated | ||
Line 110: | Line 128: | ||
:wikitext(box_text) | :wikitext(box_text) | ||
end | end | ||
+ | |||
local template = args.template | local template = args.template | ||
local displayed_links = choose_links(template, args) | local displayed_links = choose_links(template, args) | ||
Line 117: | Line 136: | ||
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) | local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) | ||
div:node(list) | div:node(list) | ||
+ | |||
if is_collapsible then | if is_collapsible then | ||
local title_text_class | local title_text_class | ||
Line 130: | Line 150: | ||
:wikitext(args[1]) | :wikitext(args[1]) | ||
end | end | ||
− | + | ||
+ | local frame = mw.getCurrentFrame() | ||
+ | -- hlist -> navbar is best-effort to preserve old Common.css ordering. | ||
+ | return frame:extensionTag{ | ||
+ | name = 'templatestyles', args = { src = cfg.hlist_templatestyles } | ||
+ | } .. frame:extensionTag{ | ||
name = 'templatestyles', args = { src = cfg.templatestyles } | name = 'templatestyles', args = { src = cfg.templatestyles } | ||
} .. tostring(div:done()) | } .. tostring(div:done()) | ||
end | end | ||
+ | |||
function p.navbar(frame) | function p.navbar(frame) | ||
return p._navbar(require('Module:Arguments').getArgs(frame)) | return p._navbar(require('Module:Arguments').getArgs(frame)) | ||
end | end | ||
+ | |||
return p | return p |
Latest revision as of 13:17, 15 August 2023
This Lua module is used in system messages, and on approximately 5,390,000 pages, or roughly 598% of all pages. Changes to it can cause immediate changes to the Wikipedia user interface. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Please discuss changes on the talk page before implementing them. |
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This module depends on the following other modules: |
Lua error in Module:TNT at line 159: Missing JsonConfig extension; Cannot load https://commons.wikimedia.org/wiki/Data:I18n/Uses TemplateStyles.tab. This is a Lua implementation of {{Navbar}}. It is used in Module:Navbox.
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
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 choose_links(template, args)
-- The show table indicates the default displayed items.
-- 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)
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)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- 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 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)
-- 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
: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) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
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
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
local frame = mw.getCurrentFrame()
-- hlist -> navbar is best-effort to preserve old Common.css ordering.
return frame:extensionTag{
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
} .. frame:extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p