Модуль:Navbar/пісочниця
Зовнішній вигляд
| Ця сторінка — пісочниця для модуля Модуль:Navbar (різн.). Див. також супутню сторінку для тестів. |
| Цей модуль Lua використовується в системних повідомленнях і на близько 728 000 сторінках або близько 14% всіх сторінок. Його зміни можуть призвести до миттєвих змін у користувацькому інтерфейсі Вікіпедії. Для уникнення великомасштабних збоїв та непотрібного навантаження на сервер, будь-які зміни спочатку потрібно перевірити на підсторінках /пісочниці та /тестів цього модуля, або у вашій пісочниці модуля. Потім перевірені зміни можуть бути впроваджені на цій сторінці єдиним редагуванням. Будь ласка, обговорюйте будь-які зміни на сторінці обговорення перед їхнім впровадженням. |
| Цей модуль позначений як К:реліз, готовий до загального вжитку (262). Він досягнув стадії готовності й вважається, що вільний від помилок і може використовуватись всюди, де знадобиться. Його можна згадувати на довідкових сторінках та інших сторінках Вікіпедії як можливість для навчання новачків. Аби зменшити навантаження на сервери та некоректний показ сторінок, його потрібно вдосконалювати через тестування у пісочниці[en], а не через застосування спроб і помилок. |
| Цей модуль залежить від наступних модулів: |
| Цей модуль використовує TemplateStyles: |
Це реалізація {{Navbar}} у Lua. Вона використовується у Модуль:Navbox.
Документація вище включена з Модуль:Navbar/документація. (ред. | історія)
Дописувачі можуть експериментувати на підсторінках пісочниці (ред. | різн.) та протестувати зміни (ред.) цього модуля.
Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки.
Дописувачі можуть експериментувати на підсторінках пісочниці (ред. | різн.) та протестувати зміни (ред.) цього модуля.
Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки.
local p = {}
local cfg = mw.loadData('Модуль: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,
['о'] = 2, ['р'] = 3, ['і'] = 4, ['⇨'] = 5, ['>'] = 5, ['с'] = 6,
['обговорити'] = 2, ['редагувати'] = 3, ['історія'] = 4, ['перейменувати'] = 5, ['спостерігати'] = 6
}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Модуль: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'] = 'п', ['full'] = 'переглянути', ['html_title'] = 'Переглянути цей шаблон',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 'о', ['full'] = 'обговорити', ['html_title'] = 'Обговорити цей шаблон',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'р', ['full'] = 'редагувати', ['html_title'] = 'Редагувати цей шаблон',
['link'] = 'Спеціальна:EditPage/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'і', ['full'] = 'історія', ['html_title'] = 'Історія цього шаблону',
['link'] = 'Спеціальна:PageHistory/' .. title.fullText, ['url'] = false },
{ ['mini'] = '⇨', ['full'] = 'перейменувати', ['html_title'] = 'Перейменувати цей шаблон',
['link'] = mw.title.new('Спеціальна:Перейменувати'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'с', ['full'] = 'спостерігати', ['html_title'] = 'Спостерігати за цим шаблоном',
['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 or args['стиль_шрифту']
local font_color = args.fontcolor or args['колір_шрифту']
local is_collapsible = args.collapsible or args['згортувальний']
local is_mini = args.mini or args['міні']
local is_plain = args.plain or args['простий']
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 or args['стиль']
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 args['текст'] 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 or args['шаблон']
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets or args['дужки']
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg[1]] or (title_arg[2] and args[title_arg[2]]) 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('Модуль:Arguments').getArgs(frame))
end
return p