Mô đun:Sandbox/Boyconga278/Navbox

--
-- Mô đun này thực hiện
--

local p = {}

local navbar = require('Mô đun:Navbar/sandbox')._navbar
local getArgs -- lazily initialized

local args
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 striped(wikitext)
-- 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 args.evenodd then
if args.evenodd == 'swap' then
first, second = second, first
else
first = args.evenodd
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 processItem(item, nowrapitems)
if item:sub(1, 2) == '{|' then
-- Applying nowrap to lines in a table does not make sense.
-- Add newlines to compensate for trim of x in |parm=x in a template.
return '\n' .. item ..'\n'
end
if nowrapitems == 'yes' then
local lines = {}
for line in (item .. '\n'):gmatch('([^\n])\n') do
local prefix, content = line:match('^([:;]+)%s(.)')
if prefix and not content:match('^') then
line = prefix .. .. content ..
end
table.insert(lines, line)
end
item = table.concat(lines, '\n')
end
if item:match('^[:;]') then
return '\n' .. item ..'\n'
end
return item
end

local function renderNavBar(titleCell)

if args.navbar ~= 'off' and args.navbar ~= 'plain' and not (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', ) == 'Bản mẫu:Hộp điều hướng') then
titleCell:wikitext(navbar{
args.name,
mini = 1,
fontstyle = (args.basestyle or ) .. ';' .. (args.titlestyle or ) .. ';background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;'
})
end

end

--
-- Title row
--
local function renderTitleRow(tbl)
if not args.title then return end

local titleRow = tbl:tag('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(args.title))
:addClass(args.titleclass)
:css('font-size', '114%')
:css('margin', '0 4em')
:wikitext(processItem(args.title))
end

--
-- Above/Below rows
--

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')
:tag('td')
:addClass('navbox-abovebelow')
:addClass(args.aboveclass)
:cssText(args.basestyle)
:cssText(args.abovestyle)
:attr('colspan', getAboveBelowColspan())
:tag('div')
:wikitext(processItem(args.above, args.nowrapitems))
end

local function renderBelowRow(tbl)
if not args.below then return end

tbl:tag('tr')
:tag('td')
:addClass('navbox-abovebelow')
:addClass(args.belowclass)
:cssText(args.basestyle)
:cssText(args.belowstyle)
:attr('colspan', getAboveBelowColspan())
:tag('div')
:wikitext(processItem(args.below, args.nowrapitems))
end

--
-- List rows
--
local function renderListRow(tbl, index, listnum)
local row = tbl:tag('tr')

if index == 1 and args.imageleft then
row
:tag('td')
:addClass('navbox-image')
:addClass(args.imageclass)
:css('width', '1px') -- Minimize width
:css('padding', '0px 2px 0px 0px')
:cssText(args.imageleftstyle)
:attr('rowspan', listnums)
:tag('div')
:wikitext(processItem(args.imageleft))
end

if args['group' .. listnum] then
local groupCell = row:tag('th')

groupCell
:attr('scope', 'row')
:addClass('navbox-group')
:addClass(args.groupclass)
:cssText(args.basestyle)
:css('width', args.groupwidth or '1%') -- If groupwidth not specified, minimize width

groupCell
:cssText(args.groupstyle)
:cssText(args['group' .. listnum .. 'style'])
:wikitext(args['group' .. 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 not args.groupwidth then
listCell:css('width', '100%')
end

local rowstyle -- usually nil so cssText(rowstyle) usually adds nothing
if index % 2 == 1 then
rowstyle = args.oddstyle
else
rowstyle = args.evenstyle
end

local listText = args['list' .. listnum]
local oddEven = ODD_EVEN_MARKER
if listText:sub(1, 12) ']"navbox%-title"') and RESTART_MARKER or 'odd'
end
listCell
:css('padding', '0px')
:cssText(args.liststyle)
:cssText(rowstyle)
:cssText(args['list' .. listnum .. 'style'])
:addClass('navbox-list')
:addClass('navbox-' .. oddEven)
:addClass(args.listclass)
:tag('div')
:css('padding', (index 1 and args.list1padding) or args.listpadding or '0em 0.25em')
:wikitext(processItem(listText, args.nowrapitems))

if index 1 and args.image then
row
:tag('td')
:addClass('navbox-image')
:addClass(args.imageclass)
:css('width', '1px') -- Minimize width
:css('padding', '0px 0px 0px 2px')
:cssText(args.imagestyle)
:attr('rowspan', listnums)
:tag('div')
:wikitext(processItem(args.image))
end
end

--
-- Tracking categories
--

local function needsHorizontalLists()
if 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,
}
return not (listClasses[args.listclass] or listClasses[args.bodyclass])
end

local function hasBackgroundColors()
for _, key in ipairs({'titlestyle', 'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do
if tostring(args[key]):find('background', 1, true) then
return true
end
end
end

local function hasBorders()
for _, key in ipairs({'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do
if tostring(args[key]):find('border', 1, true) then
return true
end
end
end

local function isIllegible()
local styleratio = require('Mô đun:Color contrast')._styleratio

for key, style in pairs(args) do
if tostring(key):match("style$") then
if styleratio{mw.text.unstripNoWiki(style)} to avoid the
-- padding being applied, and at the end add a to balance out the parent's
res
:wikitext()
:node(tbl)
:wikitext()
else
local nav = res:tag('div')
:attr('role', 'navigation')
:addClass('navbox')
:cssText(args.bodystyle)
:cssText(args.style)
:css('padding', '3px')
:node(tbl)
if args.title then
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title))
else
nav:attr('aria-label', 'Navbox')
end
end

renderTrackingCategories(res)

return striped(tostring(res))
end

function p.navbox(frame)
if not getArgs then
getArgs = require('Mô đun:Arguments').getArgs
end
args = getArgs(frame, {wrappers = {'Bản mẫu:Hộp điều hướng', 'Bản mẫu:Navbox subgroup'}})
if frame.args.border then
-- This allows Bản mẫu:Navbox_subgroup to use .
args.border = frame.args.border
end

-- Read the arguments in the order they'll be output in, to make references number in the right order.
local _
_ = args["tiêu đề"] or args.title
_ = args["trên"] or args.above
for i = 1, 20 do
_ = args["nhóm" .. tostring(i)] or args["group" .. tostring(i)]
_ = args["dsach" .. tostring(i)] or args["list" .. tostring(i)]
end
_ = args["dưới"] or args.below

-- Dịch các tên tham số từ tiếng Việt.
args.name = args["tên"] or args.name
args.state = args["trạng thái"] or args.state
args.navbar = args["thanh điều hướng"] or args.navbar
args.border = args.khung or args.border

args.title = args["tiêu đề"] or args.title
args.above = args["trên"] or args.above
for i = 1, 20 do
local groupNum = tostring(i)
args["group" .. groupNum] = args["nhóm" .. groupNum] or args["nhóm " .. groupNum] or args["group" .. groupNum]
args["group" .. groupNum .. "style"] = args["kiểu nhóm " .. groupNum] or args["group" .. groupNum .. "style"]
args["list" .. groupNum] = args["dsach" .. groupNum] or args["danh sách " .. groupNum] or args["list" .. groupNum]
args["list" .. groupNum .. "style"] = args["kiểu danh sách " .. groupNum] or args["list" .. groupNum .. "style"]
end
args.image = args["hình"] or args.image
args.imageleft = args["hình trái"] or args.imageleft
args.below = args["dưới"] or args.below

args.style = args["kiểu"] or args.style
args.basestyle = args["kiểu gốc"] or args.basestyle
args.titlestyle = args["kiểu tiêu đề"] or args.titlestyle
args.groupstyle = args["kiểu nhóm"] or args.groupstyle
args.groupwidth = args["chiều rộng nhóm"] or args.groupwidth
args.liststyle = args["kiểu danh sách"] or args.liststyle
args.listpadding = args["đậm danh sách"] or args.listpadding
args.oddstyle = args["kiểu lẻ"] or args.oddstyle
args.evenstyle = args["kiểu chẵn"] or args.evenstyle
args.evenodd = args["chẵn lẻ"] or args.evenodd
args.abovestyle = args["kiểu trên"] or args.abovestyle
args.belowstyle = args["kiểu dưới"] or args.belowstyle
args.imagestyle = args["kiểu hình"] or args.imagestyle
args.imageleftstyle = args["kiểu hình trái"] or args.imageleftstyle

args.bodyclass = args["lớp thân"] or args.bodyclass
args.aboveclass = args["lớp trên"] or args.aboveclass
args.groupclass = args["lớp nhóm"] or args.groupclass
args.listclass = args["lớp danh sách"] or args.listclass
args.belowclass = args["lớp dưới"] or args.belowclass

args.titlegroup = args["tiêu đề nhóm"] or args.titlegroup
args.titlegroupstyle = args["kiểu tiêu đề nhóm"] or args.titlegroupstyle
args.innerstyle = args["kiểu trong"] or args.innerstyle

args.titleclass = args["lớp tiêu đề"] or args.titleclass

return p._navbox(args)
end

return p