Модул:Navbar — разлика између измена
Изглед
Садржај обрисан Садржај додат
м према рачунарској терминологији |
Нема описа измене |
||
(Није приказано 6 међуизмена 2 корисника) | |||
Ред 1: | Ред 1: | ||
local p = {} |
local p = {} |
||
local cfg = mw.loadData('Модул:Navbar/configuration') |
|||
local function get_title_arg(is_collapsible, template) |
|||
local getArgs |
|||
local |
local title_arg = 1 |
||
if is_collapsible then title_arg = 2 end |
|||
if template then title_arg = 'шаблон' 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 ('Модул: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 |
|||
function |
local function add_link(link_description, ul, is_mini, font_style) |
||
local l |
local l |
||
if url then |
if link_description.url then |
||
l = {'[', '', ']'} |
l = {'[', '', ']'} |
||
else |
else |
||
Ред 12: | Ред 41: | ||
end |
end |
||
ul:tag('li') |
ul:tag('li') |
||
:addClass('nv-'..full) |
:addClass('nv-' .. link_description.full) |
||
:wikitext(l[1] .. link .. l[2]) |
:wikitext(l[1] .. link_description.link .. l[2]) |
||
:tag( |
:tag(is_mini and 'abbr' or 'span') |
||
:attr('title', |
:attr('title', link_description.html_title) |
||
:cssText( |
:cssText(font_style) |
||
:wikitext( |
:wikitext(is_mini and link_description.mini or link_description.full) |
||
:done() |
:done() |
||
:wikitext(l[3]) |
:wikitext(l[3]) |
||
:done() |
|||
end |
end |
||
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style) |
|||
function p.brackets (position, c, args, div) |
|||
if args.brackets then |
|||
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace) |
|||
div |
|||
if not title then |
|||
:tag('span') |
|||
error(cfg.invalid_title .. title_text) |
|||
:css('margin-'..position, '-0.125em') |
|||
:cssText(args.fontstyle) |
|||
:wikitext(c) |
|||
end |
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'] = 'Special:EditPage/' .. title.fullText, ['url'] = false }, |
|||
{ ['mini'] = 'и', ['full'] = 'историја', ['html_title'] = 'Историја измена шаблона', |
|||
['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false }, |
|||
{ ['mini'] = 'п', ['full'] = 'премести', ['html_title'] = 'Преместите шаблон', |
|||
['link'] = mw.title.new('Special:Movepage'):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 |
end |
||
function p._navbar(args) |
function p._navbar(args) |
||
local show = {true, true, true, false, false, false} |
|||
local titleArg = 1 |
|||
-- TODO: We probably don't need both fontstyle and fontcolor... |
|||
if args.collapsible then |
|||
local font_style = args.fontstyle |
|||
titleArg = 2 |
|||
local font_color = args.fontcolor |
|||
if not args.plain then args.mini = 1 end |
|||
local is_collapsible = args.collapsible |
|||
if args.fontcolor then |
|||
local is_mini = args.mini |
|||
args.fontstyle = 'color:' .. args.fontcolor .. ';' |
|||
local is_plain = args.plain |
|||
end |
|||
args.style = 'float:left; text-align:left' |
|||
end |
|||
local collapsible_class = nil |
|||
if args.template then |
|||
if is_collapsible then |
|||
titleArg = 'шаблон' |
|||
collapsible_class = cfg.classes.collapsible |
|||
show = {true, false, false, false, false, false} |
|||
if not is_plain then is_mini = 1 end |
|||
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6} |
|||
if font_color then |
|||
for k,v in ipairs(require ('Модул:TableTools').compressSparseArray(args)) do |
|||
font_style = (font_style or '') .. '; color: ' .. font_color .. ';' |
|||
local num = index[v] |
|||
if num then show[num] = true end |
|||
end |
end |
||
end |
end |
||
local navbar_style = args.style |
|||
if args.noedit then show[3] = false end |
|||
local titleText = args[titleArg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) |
|||
local title = mw.title.new(mw.text.trim(titleText), 'Шаблон') |
|||
if not title then |
|||
error('Неважећи наслов ' .. titleText) |
|||
end |
|||
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or '' |
|||
local div = mw.html.create():tag('div') |
local div = mw.html.create():tag('div') |
||
div |
div |
||
:addClass( |
:addClass(cfg.classes.navbar) |
||
:addClass( |
:addClass(cfg.classes.plainlinks) |
||
:addClass( |
:addClass(cfg.classes.horizontal_list) |
||
:addClass(collapsible_class) -- we made the determination earlier |
|||
:cssText(args.style) |
|||
:cssText(navbar_style) |
|||
if |
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 |
div |
||
:tag('span') |
:tag('span') |
||
:addClass(cfg.classes.box_text) |
|||
:css('word-spacing', 0) |
|||
:cssText( |
:cssText(font_style) |
||
:wikitext( |
:wikitext(box_text) |
||
:wikitext(' ') |
|||
end |
end |
||
local template = args.template |
|||
p.brackets('right', '[ ', args, div) |
|||
local displayed_links = choose_links(template, args) |
|||
local has_brackets = args.brackets |
|||
ul = div:tag('ul') |
|||
local title_arg = get_title_arg(is_collapsible, template) |
|||
if show[1] then p.addItem('п', 'прикажи', title.fullText, 'Прикажи', args) end |
|||
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle()) |
|||
if show[2] then p.addItem('р', 'разговор', talkpage, 'Разговор за', args) end |
|||
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style) |
|||
if show[3] then p.addItem('у', 'уреди', title:fullUrl('action=edit'), 'Уреди', args, true) end |
|||
div:node(list) |
|||
if show[4] then p.addItem('и', 'историја', title:fullUrl('action=history'), 'Историја за', args, true) end |
|||
if show[5] then |
|||
if is_collapsible then |
|||
local move = mw.title.new ('Special:Movepage') |
|||
local title_text_class |
|||
p.addItem('п', 'премести', move:fullUrl('target='..title.fullText), 'Премести', args, true) end |
|||
if is_mini then |
|||
if show[6] then p.addItem('н', 'надгледај', title:fullUrl('action=watch'), 'Надгледај', args, true) end |
|||
title_text_class = cfg.classes.collapsible_title_mini |
|||
else |
|||
p.brackets('left', ' ]', args, div) |
|||
title_text_class = cfg.classes.collapsible_title_full |
|||
end |
|||
if args.collapsible then |
|||
div |
div:done() |
||
: |
:tag('div') |
||
:addClass(title_text_class) |
|||
:tag('div') |
|||
:cssText(font_style) |
|||
:css('font-size', '114%') |
|||
:css('margin', args.mini and '0 4em' or '0 7em') |
|||
:cssText(args.fontstyle) |
|||
:wikitext(args[1]) |
:wikitext(args[1]) |
||
end |
end |
||
local frame = mw.getCurrentFrame() |
|||
return tostring(div:done()) |
|||
-- 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 |
end |
||
function p.navbar(frame) |
function p.navbar(frame) |
||
return p._navbar(require('Модул:Arguments').getArgs(frame)) |
|||
if not getArgs then |
|||
getArgs = require('Модул:Arguments').getArgs |
|||
end |
|||
return p._navbar(getArgs(frame)) |
|||
end |
end |
||
Тренутна верзија на датум 13. октобар 2023. у 21:29
Овај Луа модул се користи на > 235,000 странице, тако да ће промене на њему бити широко примећене. Молимо да било какве измене тестирате на подстраницама модула /песак или /тестови. Размислите и о покретању расправе о изменама које намеравате да унесете на страници за разговор пре њиховог примењивања. |
Овај модул је предмет заштите страница. То је веома коришћен модул у употреби огромног броја страница или се супституише веома често. Због вандализма или грешака које би утицале на много страница или тривијалног уређивања које би могло да изазове проблеме на серверима, модул је заштићен од уређивања. |
This is a Lua implementation of {{navbar}}. It is used in Module:Navbox.
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 = 'шаблон' 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 ('Модул: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'] = 'Special:EditPage/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'и', ['full'] = 'историја', ['html_title'] = 'Историја измена шаблона',
['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'п', ['full'] = 'премести', ['html_title'] = 'Преместите шаблон',
['link'] = mw.title.new('Special:Movepage'):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
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('Модул:Arguments').getArgs(frame))
end
return p