<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https://wiki.nuwm.edu.ua/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ANavbox</id>
	<title>Модуль:Navbox - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.nuwm.edu.ua/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ANavbox"/>
	<link rel="alternate" type="text/html" href="https://wiki.nuwm.edu.ua/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox&amp;action=history"/>
	<updated>2026-05-04T01:38:56Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.36.0</generator>
	<entry>
		<id>https://wiki.nuwm.edu.ua/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox&amp;diff=1853&amp;oldid=prev</id>
		<title>Олександр Юрійович Старовєров: 1 версія</title>
		<link rel="alternate" type="text/html" href="https://wiki.nuwm.edu.ua/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox&amp;diff=1853&amp;oldid=prev"/>
		<updated>2015-09-17T08:03:37Z</updated>

		<summary type="html">&lt;p&gt;1 версія&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--&lt;br /&gt;
-- This module will implement {{Navbox}}&lt;br /&gt;
--&lt;br /&gt;
 &lt;br /&gt;
local p = {}&lt;br /&gt;
 &lt;br /&gt;
local Navbar = require('Модуль:Navbar')&lt;br /&gt;
&lt;br /&gt;
local args&lt;br /&gt;
local frame&lt;br /&gt;
local tableRowAdded = false&lt;br /&gt;
local border&lt;br /&gt;
local listnums = {}&lt;br /&gt;
 &lt;br /&gt;
function trim(s)&lt;br /&gt;
    return (mw.ustring.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addTableRow(tbl)&lt;br /&gt;
    -- If any other rows have already been added, then we add a 2px gutter row.&lt;br /&gt;
    if tableRowAdded then&lt;br /&gt;
        tbl&lt;br /&gt;
            :tag('tr')&lt;br /&gt;
                :css('height', '2px')&lt;br /&gt;
                :tag('td')&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    tableRowAdded = true&lt;br /&gt;
    &lt;br /&gt;
    return tbl:tag('tr')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Title row&lt;br /&gt;
--&lt;br /&gt;
function renderTitleRow(tbl)&lt;br /&gt;
    if not args.title then return end&lt;br /&gt;
 &lt;br /&gt;
    local titleRow = addTableRow(tbl)&lt;br /&gt;
     &lt;br /&gt;
    if args.titlegroup then&lt;br /&gt;
        titleRow&lt;br /&gt;
            :tag('th')&lt;br /&gt;
                :attr('scope', 'row')&lt;br /&gt;
                :addClass('navbox-group')&lt;br /&gt;
                :addClass(args.titlegroupclass)&lt;br /&gt;
                :cssText(args.basestyle)&lt;br /&gt;
                :cssText(args.groupstyle)&lt;br /&gt;
                :cssText(args.titlegroupstyle)&lt;br /&gt;
                :wikitext(args.titlegroup)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local titleCell = titleRow:tag('th'):attr('scope', 'col')&lt;br /&gt;
            &lt;br /&gt;
    if args.titlegroup then&lt;br /&gt;
        titleCell&lt;br /&gt;
            :css('border-left', '2px solid #fdfdfd')&lt;br /&gt;
            :css('width', '100%')&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local titleColspan = 2&lt;br /&gt;
    if args.imageleft then titleColspan = titleColspan + 1 end&lt;br /&gt;
    if args.image then titleColspan = titleColspan + 1 end&lt;br /&gt;
    if args.titlegroup then titleColspan = titleColspan - 1 end&lt;br /&gt;
    &lt;br /&gt;
    titleCell&lt;br /&gt;
        :cssText(args.basestyle)&lt;br /&gt;
        :cssText(args.titlestyle)&lt;br /&gt;
        :addClass('navbox-title')&lt;br /&gt;
        :attr('colspan', titleColspan)&lt;br /&gt;
 &lt;br /&gt;
     renderNavBar(titleCell)&lt;br /&gt;
 &lt;br /&gt;
     titleCell&lt;br /&gt;
         :tag('div')&lt;br /&gt;
             :addClass(args.titleclass)&lt;br /&gt;
             :css('font-size', '110%')&lt;br /&gt;
             :newline()&lt;br /&gt;
             :wikitext(args.title)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderNavBar(titleCell)&lt;br /&gt;
    -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left&lt;br /&gt;
    -- or right to keep the title centered.&lt;br /&gt;
    local spacerSide = nil&lt;br /&gt;
&lt;br /&gt;
    if args.navbar == 'off' then&lt;br /&gt;
        -- No navbar, and client wants no spacer, i.e. wants the title to be shifted to the left. If there's&lt;br /&gt;
        -- also no show/hide link, then we need a spacer on the right to achieve the left shift.&lt;br /&gt;
        if args.state == 'plain' then spacerSide = 'right' end&lt;br /&gt;
    elseif args.navbar == 'plain' or args.navbar == 'off' or (not args.name and (border == 'subgroup' or border == 'child' or border == 'none')) then&lt;br /&gt;
        -- No navbar. Need a spacer on the left to balance out the width of the show/hide link.&lt;br /&gt;
        if args.state ~= 'plain' then spacerSide = 'left' end&lt;br /&gt;
    else&lt;br /&gt;
        -- Will render navbar (or error message). If there's no show/hide link, need a spacer on the right&lt;br /&gt;
        -- to balance out the width of the navbar.&lt;br /&gt;
        if args.state == 'plain' then spacerSide = 'right' end&lt;br /&gt;
&lt;br /&gt;
        titleCell:wikitext(Navbar.navbar({ &lt;br /&gt;
            args.name, &lt;br /&gt;
            mini = 1, &lt;br /&gt;
            fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') ..  ';background:none transparent;border:none;'&lt;br /&gt;
        }))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Render the spacer div.&lt;br /&gt;
    if spacerSide then&lt;br /&gt;
        titleCell&lt;br /&gt;
            :tag('span')&lt;br /&gt;
                :css('float', spacerSide)&lt;br /&gt;
                :css('width', '6em')&lt;br /&gt;
                :wikitext('&amp;amp;nbsp;')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Above/Below rows&lt;br /&gt;
--&lt;br /&gt;
function renderAboveRow(tbl)&lt;br /&gt;
    if not args.above then return end&lt;br /&gt;
 &lt;br /&gt;
    addTableRow(tbl)&lt;br /&gt;
        :tag('td')&lt;br /&gt;
            :addClass('navbox-abovebelow')&lt;br /&gt;
            :addClass(args.aboveclass)&lt;br /&gt;
            :cssText(args.basestyle)&lt;br /&gt;
            :cssText(args.abovestyle)&lt;br /&gt;
            :attr('colspan', getAboveBelowColspan())&lt;br /&gt;
            :tag('div')&lt;br /&gt;
                :newline()&lt;br /&gt;
                :wikitext(args.above)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderBelowRow(tbl)&lt;br /&gt;
    if not args.below then return end&lt;br /&gt;
    &lt;br /&gt;
    addTableRow(tbl)&lt;br /&gt;
        :tag('td')&lt;br /&gt;
            :addClass('navbox-abovebelow')&lt;br /&gt;
            :addClass(args.belowclass)&lt;br /&gt;
            :cssText(args.basestyle)&lt;br /&gt;
            :cssText(args.belowstyle)&lt;br /&gt;
            :attr('colspan', getAboveBelowColspan())&lt;br /&gt;
            :tag('div')&lt;br /&gt;
                :newline()&lt;br /&gt;
                :wikitext(args.below)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getAboveBelowColspan()&lt;br /&gt;
    local ret = 2&lt;br /&gt;
    if args.imageleft then ret = ret + 1 end&lt;br /&gt;
    if args.image then ret = ret + 1 end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
--&lt;br /&gt;
--   List rows&lt;br /&gt;
--&lt;br /&gt;
function renderListRow(tbl, listnum)&lt;br /&gt;
    local row = addTableRow(tbl)&lt;br /&gt;
    &lt;br /&gt;
    if listnum == 1 and args.imageleft then&lt;br /&gt;
        row&lt;br /&gt;
            :tag('td')&lt;br /&gt;
                :addClass('navbox-image')&lt;br /&gt;
                :addClass(args.imageclass)&lt;br /&gt;
                :css('width', '0%')&lt;br /&gt;
                :css('padding', '0px 2px 0px 0px')&lt;br /&gt;
                :cssText(args.imageleftstyle)&lt;br /&gt;
                :attr('rowspan', 2 * #listnums - 1)&lt;br /&gt;
                :tag('div')&lt;br /&gt;
                    :newline()&lt;br /&gt;
                    :wikitext(args.imageleft)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    if args['group' .. listnum] then&lt;br /&gt;
        local groupCell = row:tag('th')&lt;br /&gt;
        &lt;br /&gt;
        groupCell&lt;br /&gt;
               :attr('scope', 'row')&lt;br /&gt;
               :addClass('navbox-group')&lt;br /&gt;
               :addClass(args.groupclass)&lt;br /&gt;
               :cssText(args.basestyle)&lt;br /&gt;
               &lt;br /&gt;
        if args.groupwidth then&lt;br /&gt;
            groupCell:css('width', args.groupwidth)&lt;br /&gt;
        end&lt;br /&gt;
           &lt;br /&gt;
        groupCell&lt;br /&gt;
            :cssText(args.groupstyle)&lt;br /&gt;
            :cssText(args['group' .. listnum .. 'style'])&lt;br /&gt;
            :wikitext(args['group' .. listnum])&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local listCell = row:tag('td')&lt;br /&gt;
&lt;br /&gt;
    if args['group' .. listnum] then&lt;br /&gt;
        listCell&lt;br /&gt;
            :css('text-align', 'left')&lt;br /&gt;
            :css('border-left-width', '2px')&lt;br /&gt;
            :css('border-left-style', 'solid')&lt;br /&gt;
    else&lt;br /&gt;
        listCell:attr('colspan', 2)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not args.groupwidth then &lt;br /&gt;
        listCell:css('width', '100%')&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local isOdd = (listnum % 2) == 1&lt;br /&gt;
    local rowstyle = args.evenstyle&lt;br /&gt;
    if isOdd then rowstyle = args.oddstyle end&lt;br /&gt;
 &lt;br /&gt;
    local evenOdd&lt;br /&gt;
    if args.evenodd == 'swap' then&lt;br /&gt;
        if isOdd then evenOdd = 'even' else evenOdd = 'odd' end&lt;br /&gt;
    else&lt;br /&gt;
        if isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    listCell&lt;br /&gt;
        :css('padding', '0px')&lt;br /&gt;
        :cssText(args.liststyle)&lt;br /&gt;
        :cssText(rowstyle)&lt;br /&gt;
        :cssText(args['list' .. listnum .. 'style'])&lt;br /&gt;
        :addClass('navbox-list')&lt;br /&gt;
        :addClass('navbox-' .. evenOdd)&lt;br /&gt;
        :addClass(args.listclass)&lt;br /&gt;
        :tag('div')&lt;br /&gt;
            :css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em')&lt;br /&gt;
            :newline()&lt;br /&gt;
            :wikitext(args['list' .. listnum])&lt;br /&gt;
&lt;br /&gt;
    if listnum == 1 and args.image then&lt;br /&gt;
        row&lt;br /&gt;
            :tag('td')&lt;br /&gt;
                :addClass('navbox-image')&lt;br /&gt;
                :addClass(args.imageclass)&lt;br /&gt;
                :css('width', '0%')&lt;br /&gt;
                :css('padding', '0px 0px 0px 2px')&lt;br /&gt;
                :cssText(args.imagestyle)&lt;br /&gt;
                :attr('rowspan', 2 * #listnums - 1)&lt;br /&gt;
                :tag('div')&lt;br /&gt;
                    :newline()&lt;br /&gt;
                    :wikitext(args.image)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Tracking categories&lt;br /&gt;
--&lt;br /&gt;
function renderTrackingCategories(builder)&lt;br /&gt;
    local frame = mw.getCurrentFrame()&lt;br /&gt;
    &lt;br /&gt;
    if not frame then return end&lt;br /&gt;
    &lt;br /&gt;
    local s = frame:preprocess('{{#ifeq:{{NAMESPACE}}|{{ns:10}}|1|0}}{{SUBPAGENAME}}')&lt;br /&gt;
    if mw.ustring.sub(s, 1, 1) == '0' then return end -- not in template space&lt;br /&gt;
    local subpage = mw.ustring.lower(mw.ustring.sub(s, 2))&lt;br /&gt;
    if subpage == 'документація' or subpage == 'Документація' or subpage == 'пісочниця' or subpage == 'тести' then return end&lt;br /&gt;
    &lt;br /&gt;
    for i, cat in ipairs(getTrackingCategories()) do&lt;br /&gt;
        builder:wikitext('[[Категорія:' .. cat .. ']]') &lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getTrackingCategories()&lt;br /&gt;
    local cats = {}&lt;br /&gt;
    --if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end&lt;br /&gt;
    --if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end&lt;br /&gt;
    return cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function needsHorizontalLists()&lt;br /&gt;
    if border == 'child' or border == 'subgroup'  or args.tracking == 'no' then return false end&lt;br /&gt;
    &lt;br /&gt;
    local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist vcard', 'vcard hlist'}&lt;br /&gt;
    for i, cls in ipairs(listClasses) do&lt;br /&gt;
        if args.listclass == cls or args.bodyclass == cls then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function hasBackgroundColors()&lt;br /&gt;
    return args.titlestyle or args.groupstyle&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Main navbox tables&lt;br /&gt;
--&lt;br /&gt;
function renderMainTable()&lt;br /&gt;
    local tbl = mw.html.create('table')&lt;br /&gt;
        :attr('cellspacing', 0)&lt;br /&gt;
        :addClass('nowraplinks')&lt;br /&gt;
        :addClass(args.bodyclass)&lt;br /&gt;
             &lt;br /&gt;
    if args.title and (args.state ~= 'plain' and args.state ~= 'off') then&lt;br /&gt;
        tbl&lt;br /&gt;
            :addClass('collapsible')&lt;br /&gt;
            :addClass(args.state or 'autocollapse')&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    tbl:css('border-spacing', 0)&lt;br /&gt;
    if border == 'subgroup' or border == 'child' or border == 'none' then&lt;br /&gt;
        tbl&lt;br /&gt;
            :addClass('navbox-subgroup')&lt;br /&gt;
            :cssText(args.bodystyle)&lt;br /&gt;
            :cssText(args.style)&lt;br /&gt;
    else -- regular navobx - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
        tbl&lt;br /&gt;
            :addClass('navbox-inner')&lt;br /&gt;
            :css('background', 'transparent')&lt;br /&gt;
            :css('color', 'inherit')&lt;br /&gt;
    end&lt;br /&gt;
    tbl:cssText(args.innerstyle)&lt;br /&gt;
 &lt;br /&gt;
    renderTitleRow(tbl)&lt;br /&gt;
    renderAboveRow(tbl)&lt;br /&gt;
    for i, listnum in ipairs(listnums) do&lt;br /&gt;
        renderListRow(tbl, listnum) &lt;br /&gt;
    end&lt;br /&gt;
    renderBelowRow(tbl)&lt;br /&gt;
    &lt;br /&gt;
    return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbox(navboxArgs)&lt;br /&gt;
    args = navboxArgs&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs(args) do&lt;br /&gt;
        local listnum = ('' .. k):match('^list(%d+)$')&lt;br /&gt;
        if listnum then table.insert(listnums, tonumber(listnum)) end&lt;br /&gt;
    end&lt;br /&gt;
    table.sort(listnums)&lt;br /&gt;
 &lt;br /&gt;
    border = trim(args.border or args[1] or '')&lt;br /&gt;
&lt;br /&gt;
    -- render the main body of the navbox&lt;br /&gt;
    local tbl = renderMainTable()&lt;br /&gt;
&lt;br /&gt;
    -- render the appropriate wrapper around the navbox, depending on the border param&lt;br /&gt;
    local res = mw.html.create()&lt;br /&gt;
    if border == 'none' then&lt;br /&gt;
        res:node(tbl)&lt;br /&gt;
    elseif border == 'subgroup' or border == 'child' then&lt;br /&gt;
        -- We assume that this navbox is being rendered in a list cell of a parent navbox, and is&lt;br /&gt;
        -- therefore inside a div with padding:0em 0.25em. We start with a &amp;lt;/div&amp;gt; to avoid the&lt;br /&gt;
        -- padding being applied, and at the end add a &amp;lt;div&amp;gt; to balance out the parent's &amp;lt;/div&amp;gt;&lt;br /&gt;
        res&lt;br /&gt;
            :tag('div', {unclosed = true})&lt;br /&gt;
                :done()&lt;br /&gt;
            :node(tbl)&lt;br /&gt;
            :tag('div', {unclosed = true})&lt;br /&gt;
    else&lt;br /&gt;
        res&lt;br /&gt;
            :tag('table')&lt;br /&gt;
                :attr('cellspacing', 0)&lt;br /&gt;
                :addClass('navbox')&lt;br /&gt;
                :css('border-spacing', 0)&lt;br /&gt;
                :cssText(args.bodystyle)&lt;br /&gt;
                :cssText(args.style)&lt;br /&gt;
                :tag('tr')&lt;br /&gt;
                    :tag('td')&lt;br /&gt;
                        :css('padding', '2px')&lt;br /&gt;
                        :node(tbl)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    renderTrackingCategories(res)&lt;br /&gt;
 &lt;br /&gt;
    return tostring(res)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function p.navbox(frame)&lt;br /&gt;
    -- ParserFunctions considers the empty string to be false, so to preserve the previous &lt;br /&gt;
    -- behavior of {{navbox}}, change any empty arguments to nil, so Lua will consider&lt;br /&gt;
    -- them false too.&lt;br /&gt;
    local args = {}&lt;br /&gt;
    local parent_args = frame:getParent().args;&lt;br /&gt;
&lt;br /&gt;
    -- Out of order parsing bug.&lt;br /&gt;
    local temp;&lt;br /&gt;
    temp = parent_args.title;&lt;br /&gt;
    temp = parent_args.above;&lt;br /&gt;
    for i = 1, 20 do&lt;br /&gt;
        temp = parent_args[&amp;quot;group&amp;quot; .. tostring(i)];&lt;br /&gt;
        temp = parent_args[&amp;quot;list&amp;quot; .. tostring(i)];&lt;br /&gt;
    end    &lt;br /&gt;
    temp = parent_args.below;&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs(parent_args) do&lt;br /&gt;
        if v ~= '' then&lt;br /&gt;
            args[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return p._navbox(args)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Олександр Юрійович Старовєров</name></author>
	</entry>
</feed>