Modul:Navbox: Redaktələr arasındakı fərq

Silinən məzmun Əlavə edilmiş məzmun
Səhifəni '-- -- Bu modul {{Navbox}} şablonunu yerinə yetirir. -- local p = {} local navbar = require('Module:Navbar')._navbar local getArgs -- lazily initialized local args loc...' ilə yarat
 
Redaktənin izahı yoxdur
Sətir 1:
--
-- Реализует {{Навигационная таблица}} и {{Подqrupы навигационной таблицы}}.
-- Bu modul {{Navbox}} şablonunu yerinə yetirir.
-- Основной объём кода заимствован из английского Module:Navbox.
--
 
local p = {}
 
local navbar = require('Module:Navbar')._navbar
local getArgs -- lazily initialized
 
local args
local tableRowAdded = false
local border
local listnums = {}
local ODD_EVEN_MARKER = '\127_ODDEVEN_\127'
local RESTART_MARKER = '\127_ODDEVEN0_\127'
local REGEX_MARKER = '\127_ODDEVEN(%d?)_\127'
 
local function trim(s)maintitle
local name
return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
local navbar
end
local above
local image
local below
 
local function addNewline(s)titlestyle
local groupstyle
if s:match('^[*:;#]') or s:match('^{|') then
local bodystyle
return '\n' .. s ..'\n'
local basestyle
else
local liststyle
return s
local evenodd_VARIABLE
end
local abovestyle
end
local belowstyle
local imageleft
local imageleftstyle
local style
 
local groupwidth
local function addTableRow(tbl)
local listpadding
-- If any other rows have already been added, then we add a 2px gutter row.
if tableRowAdded then
tbl
:tag('tr')
:css('height', '2px')
:tag('td')
:attr('colspan',2)
end
 
local bodyclass
tableRowAdded = true
local titleclass
local aboveclass
local belowclass
local groupclass
local listclass
local imageclass
 
local function striped(wikitext)
return tbl:tag('tr')
-- Return wikitext with markers replaced for odd/even striping.
-- Child (subgroup) navboxes are flagged with a category that is removed
-- by parent navboxes. The result is that the category shows all pages
-- where a child navbox is not contained in a parent navbox.
local orphanCat = ''
if border == 'subgroup' and args.orphan ~= 'yes' then
-- No change; striping occurs in outermost navbox.
return wikitext .. orphanCat
end
local first, second = 'odd', 'even'
if evenodd_VARIABLE then
if evenodd_VARIABLE == 'swap' then
first, second = second, first
else
first = evenodd_VARIABLE
second = first
end
end
local changer
if first == second then
changer = first
else
local index = 0
changer = function (code)
if code == '0' then
-- Current occurrence is for a group before a nested table.
-- Set it to first as a valid although pointless class.
-- The next occurrence will be the first row after a title
-- in a subgroup and will also be first.
index = 0
return first
end
index = index + 1
return index % 2 == 1 and first or second
end
end
local regex = orphanCat:gsub('([%[%]])', '%%%1')
return (wikitext:gsub(regex, ''):gsub(REGEX_MARKER, changer)) -- () omits gsub count
end
 
local function addNewline(s)
if s:match('^[*:;#]') or s:match('^{|') then
return '\n' .. s ..'\n'
else
return s
end
end
 
local function renderNavBar(titleCell)
-- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left
-- or right to keep the title centered.
local spacerSide = nil
 
if args.navbar == 'off' then
-- No navbar, and client wants no spacer, i.e. wants the title to be shifted to the left. If there's
-- also no show/hide link, then we need a spacer on the right to achieve the left shift.
if args.state == 'plain' then spacerSide = 'right' end
elseif args.navbar == 'plain' or (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', '') == 'Template:Navbox') then
-- No navbar. Need a spacer on the left to balance out the width of the show/hide link.
if args.state ~= 'plain' then spacerSide = 'left' end
else
-- Will render navbar (or error message). If there's no show/hide link, need a spacer on the right
-- to balance out the width of the navbar.
if args.state == 'plain' then spacerSide = 'right' end
 
if navbar ~= 'off' and navbar ~= 'plain' and not (not name and mw.getCurrentFrame():getParent():getTitle():gsub('/песочница$', '') == 'Şablon:Навигационная таблица') then
titleCell:wikitext(navbar{
args.name,
-- Check color contrast of the gear icon
mini = 1,
local styleratio = require('Module:Color contrast')._styleratio
fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;'
local gearColor = ''
})
local contrastStyle = titlestyle or basestyle
end
local gearStyleBlack = (contrastStyle and mw.text.unstripNoWiki(contrastStyle) .. '; color:#666;' or '')
local gearStyleWhite = (contrastStyle and mw.text.unstripNoWiki(contrastStyle) .. '; color:#fff;' or '')
if styleratio{gearStyleBlack} < styleratio{gearStyleWhite} then
gearColor = ' white'
end
--- Gear creation
titleCell
:tag('span')
:css('float', 'left')
:css('text-align', 'left')
:css('width', '5em')
:css('margin-right', '0.5em')
:wikitext('[[Şəkil:Wikipedia interwiki section gear icon' .. gearColor .. '.svg|14px|Bu şablona bax:|link=Şablon:' .. name .. '|alt=⛭]]')
end
 
-- Render the spacer div.
if spacerSide then
titleCell
:tag('span')
:css('float', spacerSide)
:css('width', '6em')
:wikitext('&nbsp;')
end
end
 
Sətir 78 ⟶ 124:
--
local function renderTitleRow(tbl)
if not args.titlemaintitle then return end
 
local titleRow = addTableRowtbl:tag(tbl'tr')
 
if args.titlegroup then
titleRow
:tag('th')
:attr('scope', 'row')
:addClass('navbox-group')
:addClass(args.titlegroupclass)
:cssText(args.basestyle)
:cssText(args.groupstyle)
:cssText(args.titlegroupstyle)
:wikitext(args.titlegroup)
end
 
local titleCell = titleRow:tag('th'):attr('scope', 'col')
 
if args.titlegroup then
titleCell
:css('border-left', '2px solid #fdfdfd')
:css('width', '100%')
end
 
local titleColspan = 2
if args.imageleft then titleColspan = titleColspan + 1 end
if args.image then titleColspan = titleColspan + 1 end
if args.titlegroup then titleColspan = titleColspan - 1 end
 
titleCell
:cssText(args.basestyle)
:cssText(args.titlestyle)
:addClass('navbox-title')
:attr('colspan', titleColspan)
 
renderNavBar(titleCell)
 
titleCell
:tag('div')
:attr('id', mw.uri.anchorEncode(maintitle))
:addClass(args.titleclass)
:addClass(titleclass)
:css('font-size', '110%')
:css('font-size', '114%')
:wikitext(addNewline(args.title))
:css('margin', '0 5em')
:wikitext(addNewline(maintitle))
end
 
Sətir 127 ⟶ 175:
 
local function getAboveBelowColspan()
local ret = 2
if args.imageleft then ret = ret + 1 end
if args.image then ret = ret + 1 end
return ret
end
 
local function renderAboveRow(tbl)
if not args.above then return end
 
tbl:tag('tr')
addTableRow(tbl)
:tag('td')
:addClass('navbox-abovebelow')
:addClass(args.aboveclass)
:cssText(args.basestyle)
:cssText(args.abovestyle)
:attr('colspan', getAboveBelowColspan())
:tag('div')
:wikitext(addNewline(args.above))
end
 
local function renderBelowRow(tbl)
if not args.below then return end
 
tbl:tag('tr')
addTableRow(tbl)
:tag('td')
:addClass('navbox-abovebelow')
:addClass(args.belowclass)
:cssText(args.basestyle)
:cssText(args.belowstyle)
:attr('colspan', getAboveBelowColspan())
:tag('div')
:wikitext(addNewline(args.below))
end
 
Sətir 164 ⟶ 212:
-- List rows
--
local function renderListRow(tbl, listnum)
local row = addTableRow(tbl)
 
local function haveSubgroups()
if listnum == 1 and args.imageleft then
for i = 1, 23 rowdo
if (args['group' .. i] or args['başlıq' .. i] or args['qrup' .. i]) and (args['list' .. i] or args['siyahı' .. i]) then
:tag('td')
return true
:addClass('navbox-image')
end
:addClass(args.imageclass)
end
:css('width', '0%')
return false
:css('padding', '0px 2px 0px 0px')
end
:cssText(args.imageleftstyle)
:attr('rowspan', 2 * #listnums - 1)
:tag('div')
:wikitext(addNewline(args.imageleft))
end
 
local function renderListRow(tbl, index, listnum)
if args['group' .. listnum] then
local groupCellrow = rowtbl:tag('thtr')
 
if index == 1 and imageleft then
groupCell
row
:attr('scope', 'row')
:tag('td')
:addClass('navbox-group')
:addClass(args.groupclass'navbox-image')
:addClass(imageclass)
:cssText(args.basestyle)
:css('width', '1px')
:css('padding', '0px 7px 0px 0px')
:cssText(imageleftstyle)
:attr('rowspan', #listnums)
:tag('div')
:wikitext(addNewline(imageleft))
end
 
if (args['group' .. listnum] or args['başlıq' .. listnum] ifor args['qrup' .groupwidth. listnum]) then
local groupCell = row:tag('th')
groupCell:css('width', args.groupwidth)
end
 
groupCell
:attr('scope', 'row')
:cssText(args.groupstyle)
:addClass('navbox-group')
:cssText(args['group' .. listnum .. 'style'])
:addClass(groupclass)
:wikitext(args['group' .. listnum])
:cssText(basestyle)
end
:css('width', groupwidth or '1px') -- If groupwidth not specified, minimize width
 
groupCell
local listCell = row:tag('td')
:cssText(groupstyle)
:cssText(args['group' .. listnum .. 'style'] or args['qrup stili' .. listnum] or args['başlıq stili' .. listnum])
:wikitext(args['group' .. listnum] or args['başlıq' .. listnum] or args['qrup' .. listnum])
end
 
local listCell = row:tag('td')
if args['group' .. listnum] then
listCell
:css('text-align', 'left')
:css('border-left-width', '2px')
:css('border-left-style', 'solid')
else
listCell:attr('colspan', 2)
end
 
if (args['group' .. listnum] or args['başlıq' .. listnum] or args['qrup' .. listnum]) then
if not args.groupwidth then
listCell:css('width', '100%')
:css('text-align', 'left')
end
:css('border-left-width', '2px')
:css('border-left-style', 'solid')
else
if haveSubgroups() then
listCell
:attr('colspan', 2)
end
end
 
if not groupwidth then
local isOdd = (listnum % 2) == 1
listCell:css('width', '100%')
local rowstyle = args.evenstyle
end
if isOdd then rowstyle = args.oddstyle end
 
local listText = args['list' .. listnum] or args['siyahı' .. listnum]
local evenOdd
local oddEven = ODD_EVEN_MARKER
if args.evenodd == 'swap' then
if listText:sub(1, 12) == '</div><table' then
if isOdd then evenOdd = 'even' else evenOdd = 'odd' end
-- Assume list text is for a subgroup navbox so no automatic striping for this row.
else
oddEven = listText:find('<th[^>]*"navbox%-title"') and RESTART_MARKER or 'odd'
if isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end
end
listCell
:css('padding', '0px')
:cssText(liststyle)
:cssText(args['list' .. listnum .. 'style'] or args['siyahı stili' .. listnum])
:addClass('navbox-list')
:addClass('navbox-' .. oddEven)
:addClass(listclass)
:tag('div')
:css('padding', args['list' .. listnum .. 'padding'] or listpadding or '0em 0.25em')
:wikitext(addNewline(listText))
 
if index == 1 and image then
listCell
row
:css('padding', '0px')
:tag('td')
:cssText(args.liststyle)
:addClass('navbox-image')
:cssText(rowstyle)
:addClass(imageclass)
:cssText(args['list' .. listnum .. 'style'])
:css('width', '1px')
:addClass('navbox-list')
:css('padding', '0px 0px 0px 7px')
:addClass('navbox-' .. evenOdd)
:cssText(imagestyle)
:addClass(args.listclass)
:attr('rowspan', #listnums)
:tag('div')
:tag('div')
:css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em')
:wikitext(addNewline(args['list' .. listnum]image))
end
 
if listnum == 1 and args.image then
row
:tag('td')
:addClass('navbox-image')
:addClass(args.imageclass)
:css('width', '0%')
:css('padding', '0px 0px 0px 2px')
:cssText(args.imagestyle)
:attr('rowspan', 2 * #listnums - 1)
:tag('div')
:wikitext(addNewline(args.image))
end
end
 
 
--
-- Tracking categories
--
local function needsChangetoSubgroups()
for i = 1, 23 do
if (args['group' .. i] or args['başlıq' .. i] or args['qrup' .. i]) and not (args['list' .. i] or args['siyahı' .. i]) then
return true
end
end
return false
end
 
local function needsHorizontalLists()
if border == 'child' or border == 'subgroup' or args.tracking == 'no' then
return false
end
local listClasses = {
['plainlist'] = true, ['hlist'] = true, ['hlist hnum'] = true,
['hlist hwrap'] = true, ['hlist vcard'] = true, ['vcard hlist'] = true,
['hlist vevent'] = true, ['hlist hlist-items-nowrap'] = true, ['hlist-items-nowrap'] = true,
}
return not (listClasses[listclass] or listClasses[bodyclass])
end
 
-- local function hasBackgroundColors()
local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist hwrap', 'hlist vcard', 'vcard hlist', 'hlist vevent'}
-- return mw.ustring.match(titlestyle or '','background') or mw.ustring.match(groupstyle or '','background') or mw.ustring.match(basestyle or '','background')
for i, cls in ipairs(listClasses) do
-- end
if args.listclass == cls or args.bodyclass == cls then
return false
end
end
 
local function isIllegible()
return true
local styleratio = require('Module:Color contrast')._styleratio
end
 
for key, style in pairs(args) do
local function hasBackgroundColors()
if tostring(key):match("style$") or tostring(key):match("^stil") then
return mw.ustring.match(args.titlestyle or '','background') or mw.ustring.match(args.groupstyle or '','background') or mw.ustring.match(args.basestyle or '','background')
if styleratio{mw.text.unstripNoWiki(style)} < 4.5 then
return true
end
end
end
return false
end
 
local function getTrackingCategories()
local cats = {}
if needsHorizontalListsneedsChangetoSubgroups() then table.insert(cats, 'Üfüqi siyahılarsız naviqasiya qutuları') end
if hasBackgroundColorsneedsHorizontalLists() then table.insert(cats, 'Fon rəngləri istifadə edən şablonlar') end
if isIllegible() then table.insert(cats, '') end
return cats
return cats
end
 
local function renderTrackingCategories(builder)
local title = mw.title.getCurrentTitle()
if title.namespace ~= 10 then return end -- not in template space
local subpage = title.subpageText
if subpage == 'doc' or subpage == 'sandboxпесочница' or subpage == 'testcasesтесты' then return end
 
for i, cat in ipairs(getTrackingCategories()) do
builder:wikitext('[[CategoryKateqoriya:' .. cat .. ']]')
end
end
 
Sətir 295 ⟶ 367:
--
local function renderMainTable()
local tbl = mw.html.create('table')
:addClass('nowraplinks')
:addClass(args.bodyclass)
 
if args.titlemaintitle and (args.state ~= 'plain' and args.state ~= 'off') then
tbl
:addClass('collapsible')
:addClass(args.state or 'autocollapse')
end
 
tbl:css('border-spacing', 0)
if border == 'subgroup' or border == 'child' or border == 'none' then
tbl
:addClass('navbox-subgroup')
:cssText(args.bodystyle)
:cssText(args.style)
else -- regular navobxnavbox - bodystyle and style will be applied to the wrapper table
tbl
:addClass('navbox-inner')
:css('background', 'transparent')
:css('color', 'inherit')
end
tbl:cssText(args.innerstyle)
 
renderTitleRow(tbl)
renderAboveRow(tbl)
for i, listnum in ipairs(listnums) do
renderListRow(tbl, i, listnum)
end
renderBelowRow(tbl)
 
return tbl
end
 
function p._navbox(navboxArgs)
args = navboxArgs
 
for k, v in pairs(args) do
local listnum = ('' .. k):match('^list(%d+)$') or ('' .. k):match('^siyahı(%d+)$')
if listnum then table.insert(listnums, tonumber(listnum)) end
end
table.sort(listnums)
table.sort(listnums)
 
border = mw.text.trim(args.border or args[1] or '')
if border == 'child' then
border = 'subgroup'
end
maintitle = args.title or args['başlıq']
navbar = args.navbar or args['baxmaq_üçün_keçid']
name = args.name or args['adı']
above = args.above or args['yuxarı']
image = args.image or args['şəkil']
imagestyle = args.imagestyle or args['şəklin stili']
imageleft = args.imageleft or args['şəkil2'] or args['şəkil_sol']
imageleftstyle = args.imageleftstyle or args.imagestyle2 or args['şəklin stili_sol']
below = args.below or args['внизу']
titlestyle = args.titlestyle or args['əsas_başlığın_stili'] or args['başlıq stili']
groupstyle = args.groupstyle or args['başlıqlar stili'] or args['qrup stili']
bodystyle = args.bodystyle or args['gövdənin stili']
basestyle = args.basestyle or args['stil_baza'] or args['stil']
style = args.style
liststyle = args.liststyle or args['siyahı stili']
abovestyle = args.abovestyle or args['yuxarının stili']
belowstyle = args.belowstyle or args['aşağı stili']
evenodd_VARIABLE = args.evenodd or args['even_odd'] or args['evenodd']
groupwidth = args.groupwidth or args['ölçü_qrup']
listpadding = args.listpadding or args['listpadding']
bodyclass = args.bodyclass or args['gövdənin sinfi']
titleclass = args.titleclass or args['başlıq sinfi']
aboveclass = args.aboveclass or args['yuxarının sinfi']
belowclass = args.belowclass or args['aşağının sinfi']
groupclass = args.groupclass or args['qrupun sinfi']
listclass = args.listclass or args['siyahı sinfi']
imageclass = args.imageclass or args['şəklin sinfi']
-- render the main body of the navbox
local tbl = renderMainTable()
 
-- render the mainappropriate bodywrapper ofaround the navbox, depending on the border param
local tblres = renderMainTablemw.html.create()
if border == 'none' then
local nav = res:tag('div')
:attr('role', 'navigation')
:node(tbl)
if maintitle then
nav:attr('aria-labelledby', mw.uri.anchorEncode(maintitle))
else
nav:attr('aria-label', 'Naviqasiya şablonu')
end
elseif border == 'subgroup' then
-- We assume that this navbox is being rendered in a list cell of a parent navbox, and is
-- therefore inside a div with padding:0em 0.25em. We start with a </div> to avoid the
-- padding being applied, and at the end add a <div> to balance out the parent's </div>
res
:wikitext('</div>') -- XXX: hack due to lack of unclosed support in mw.html.
:node(tbl)
:wikitext('<div>') -- XXX: hack due to lack of unclosed support in mw.html.
else
local nav = res:tag('div')
:attr('role', 'navigation')
:addClass('navbox')
:cssText(bodystyle)
:cssText(style)
:css('padding', '3px')
:node(tbl)
if maintitle then
nav:attr('aria-labelledby', mw.uri.anchorEncode(maintitle))
else
nav:attr('aria-label', 'Naviqasiya şablonu')
end
end
 
renderTrackingCategories(res)
-- render the appropriate wrapper around the navbox, depending on the border param
local res = mw.html.create()
if border == 'none' then
res:node(tbl)
elseif border == 'subgroup' or border == 'child' then
-- We assume that this navbox is being rendered in a list cell of a parent navbox, and is
-- therefore inside a div with padding:0em 0.25em. We start with a </div> to avoid the
-- padding being applied, and at the end add a <div> to balance out the parent's </div>
res
:wikitext('</div>') -- XXX: hack due to lack of unclosed support in mw.html.
:node(tbl)
:wikitext('<div>') -- XXX: hack due to lack of unclosed support in mw.html.
else
res
:tag('table')
:addClass('navbox')
:css('border-spacing', 0)
:cssText(args.bodystyle)
:cssText(args.style)
:tag('tr')
:tag('td')
:css('padding', '2px')
:node(tbl)
end
 
return striped(tostring(res))
renderTrackingCategories(res)
 
return tostring(res)
end
 
function p.navbox(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
args = getArgs(frame, {wrappers = {'TemplateŞablon:Navbox', 'Şablon:Navbox subgroup'}})
if frame.args.border then
 
-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}.
-- Read the arguments in the order they'll be output in, to make references number in the right order.
args.border = frame.args.border
local _
end
_ = args.title
_ = args.above
-- Read the arguments in the order they'll be output in, to make references number in the right order.
for i = 1, 20 do
local _
_ = args["group" .. tostring(i)]
_ = maintitle
_ = args["list" .. tostring(i)]
_ = above
end
for i = 1, 23 do
_ = args.below
_ = args["group" .. tostring(i)] and args["başlıq" .. tostring(i)] and args["qrup" .. tostring(i)]
_ = args["list" .. tostring(i)] and args["siyahı" .. tostring(i)]
end
_ = below
 
return p._navbox(args)
end