Modul:Navbar
Halaman ini punya modul Lua digunakan pada anggaran 13,600,000 laman, atau lebih kurang 1221% dari semua laman. Untuk mengelakkan gangguan besar-besaran dan muatan pelayan , sebarang perubahan sepatutnya diuji pada modul punya subhalaman kotak pasir atau laman uji kaji, atau pada module sandbox anda. Perubahan yang sudah diuji boleh ditambah pada laman ini dalam suntingan tunggal. Pertimbang untuk membincang perubahan pada laman perbincangan sebelum melaksanakannya. |
Halaman ini punya modul Lua digunakan in system messages. Perubahan ke atasnya mungkin akan menyebabkan perubahan serta merta kepada antara muka pengguna Wikipedia. Untuk mengelakkan gangguan besar-besaran, sebarang perubahan sepatutnya diuji pada modul punya subhalaman kotak pasir atau laman uji kaji, atau pada module sandbox anda. Perubahan yang sudah diuji boleh ditambah pada laman ini dalam suntingan tunggal. Sila bincangkan perubahan pada laman perbincangan sebelum melaksanakannya. |
Modul ini tertakluk kepada perlindungan laman. Ia merupakan sebuah modul yang sangat terlihat dengan penggunaan pada bilangan laman yang sangat tinggi, atau kerap ditukar ganti. Disebabkan sebarang laku musnah atau kesilapan pada laman ini akan memberi kesan besar pada banyak laman, serta suntingan yang sedikit pun boleh menyebabkan bebanan besar pada pelayan, ia telah dilindungi daripada sebarang suntingan. |
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'] = 'l', ['full'] = 'lihat', ['html_title'] = 'Lihat templat ini',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 'b', ['full'] = 'bincang', ['html_title'] = 'Bincang templat ini',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 's', ['full'] = 'sunting', ['html_title'] = 'Sunting templat ini',
['link'] = title:fullUrl('action=edit'), ['url'] = true },
{ ['mini'] = 'sj', ['full'] = 'sejarah', ['html_title'] = 'Sejarah templat ini',
['link'] = title:fullUrl('action=history'), ['url'] = true },
{ ['mini'] = 'pd', ['full'] = 'pindah', ['html_title'] = 'Pindah templat ini',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'pt', ['full'] = 'pantau', ['html_title'] = 'Pantau templat ini',
['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
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))
end
return p