Mô đun:Sidebar games events

--
-- Mô đun này thực hiện
-- Mô đun này đã được tạo ra sử dụng mã được lấy trực tiếp từ Mô đun:Sidebar
--
require('strict')

local p = {}

local getArgs = require('Mô đun:Arguments').getArgs
local navbar = require('Mô đun:Navbar')._navbar

function p.sidebar(frame, args)

if not args then
args = getArgs(frame)
end

local root = mw.html.create()

root = root
:tag('table')
:addClass('vertical-navbox')
:addClass('nowraplinks')
:addClass(args.class or 'hlist')
:css('float', args.float or 'right')
:css('clear', (args.float 'none' and 'both') or args.float or 'right')
:css('width', args.width or 'auto')
:css('max-width', args.maxwidth or '25em')
:css('margin', args.float 'left' and '0 1.0em 1.0em 0' or '0 0 1.0em 1.0em')
:css('background', 'f5faff')
:css('border', '1px solid B8C7D9')
:css('padding', '0.2em')
:css('border-spacing', '0.4em 0')
:css('text-align', 'center')
:css('font-size', '88%')

-- enumerate the rows and count the columns
local cols = 1
local colindex = {a = '2', b = '3', c = '4', d = '5', e = '6'}
local lets = {'a', 'b', 'c', 'd', 'e'}
local rowNums = {}
local subevents = 0
local hasevents = false

for k, v in pairs(args) do
k = .. k
local num = k:match('^event(%d+)$')
or k:match('^image(%d+)$')
or k:match('^title(%d+)$')
or k:match('^type(%d+)[a-e]$')
or k:match('^event(%d+)%.%d+$')
or k:match('^results(%d+)%.%d+[a-e]?$')
if num then table.insert(rowNums, tonumber(num)) end

if k:match('^results%d+%.(%d+)$') then
cols = (2 > cols) and 2 or cols
end

local let = k:match('^results%d+%.%d+([a-e])$')
or k:match('^type%d+([a-e])$')
if let and colindex[let] then
local n = tonumber(colindex[let])
cols = (n > cols) and n or cols
end

local subnum = k:match('^results%d+%.(%d+)[a-e]?$')
or k:match('^event%d+%.(%d+)$')
if subnum then
subnum = tonumber(subnum)
subevents = (subnum > subevents) and subnum or subevents
end

if k:match('^(event%d+%.%d+)$') then
hasevents = true
end
end
-- remove duplicates from the list (e.g. 3 will be duplicated if both event3 and image3 are specified)
table.sort(rowNums)
for i = rowNums, 1, -1 do
if rowNums[i] == rowNums[i - 1] then
table.remove(rowNums, i)
end
end

-- alignment
local alignevents = 'text-align:left;'
if args.alignevents and args.alignevents == 'right' then
alignevents = 'text-align:right;'
end
local alignresults = nil
if args.alignresults and args.alignresults == 'right' then
alignresults = 'text-align:right; padding-right:1.5em'
elseif args.alignresults and args.alignresults == 'left' then
alignresults = 'text-align:left'
end

-- add the top level header
if args.event or args.title then
local t = args.event
if args.title then
t = args.title
elseif args.games then
t = .. args.event ..
t = t .. ' tại' .. .. args.games ..
end
local cell = root:tag('tr'):tag('th')
cell
:css('padding', '0.2em 0.4em 0.2em')
:css('font-size', '100%')
:css('line-height', '1.5em')
:css('background', 'cedff2')
:attr('colspan', cols)
if args.imageright then
local d = cell:tag('div')
:css('display', 'table')
:css('width', '100%')
d:tag('div')
:css('display', 'table-cell')
:css('width', '95%')
:wikitext(t)
d:tag('div')
:css('display', 'table-cell')
:css('width', '5%')
:wikitext(args.imageright)
else
cell:wikitext(t)
end
end

if args.image then
local imageCell = root:tag('tr'):tag('td')

imageCell
:css('padding', '0 0 0.2em')
:css('background', 'cedff2')
:attr('colspan', cols)
:wikitext(args.image)

if args.caption then
imageCell
:tag('div')
:css('padding-top', '0.2em')
:css('line-height', '1.2em')
:wikitext(args.caption)
end
end

if args.above then
local cell = root:tag('tr'):tag('td')
cell:attr('colspan', cols)
:wikitext(args.above)
end

-- start adding rows
for i, num in ipairs(rowNums) do
local heading = nil
local event = args['event' .. num]
local image = args['image' .. num]
local title = args['title' .. num]
if title then
root:tag('tr')
:tag('th')
:css('padding', '0.1em')
:css('background', '99badd')
:css('border-top', '1px solid f5faff')
:attr('colspan', cols)
:wikitext(title)
end

if event and image then
heading = event .. .. image
elseif event then
heading = event
elseif image then
heading = image
end

if heading then
root
:tag('tr')
:tag('th')
:css('padding', '0.1em')
:css('background', 'deeaf6')
:css('border-top', '1px solid f5faff')
:attr('colspan', cols)
:wikitext(heading)
end

local showtypes = false
for j, let in ipairs(lets) do
if j 2) and tostring(math.floor(100/(cols-1))) .. '%' or nil)
:wikitext(t)
end
end
end
end

for k=1,subevents do
local hasresults = false
if args['results' .. num .. '.' .. k] then
hasresults = true
else
for j, let in ipairs(lets) do
if j < cols then
if args['results' .. num .. '.' .. k .. let] then
hasresults = true
end
end
end
end

if hasresults then
local row = root:tag('tr')
local cell = row:tag('th'):css('display', (hasevents == false) and 'none' or nil)
local t = args['event' .. num .. '.' .. k]
local border = args['border' .. num .. '.' .. k] and 'solid 1px aaa' or nil
if t then
cell
:cssText(alignevents)
:css('line-height', '1.4em')
:css('padding', '0.1em 0.4em 0.2em 0.1em')
:css('font-weight', 'normal')
:css('border-bottom', border)
:wikitext(t)
end
if args['results' .. num .. '.' .. k] then
row:tag('td')
:attr('colspan', cols - 1)
:css('border-bottom', border)
:cssText(alignresults)
:newline() -- newline required for bullet-points to work
:wikitext(args['results' .. num .. '.' .. k])
else
for j, let in ipairs(lets) do
if j < cols then
t = args['results' .. num .. '.' .. k .. let]
row:tag('td')
:css('border-bottom', border)
:cssText(alignresults)
:wikitext(t)
end
end
end
end
end
end

if args.below then
root
:tag('tr')
:tag('td')
:addClass(args.belowclass)
:attr('colspan', cols)
:cssText(args.belowstyle)
:wikitext(args.below)
end

if args.prev or args.next then
local row = root:tag('tr'):tag('td')
:css('border-top', 'solid 1px deeaf6')
:attr('colspan', cols)
:tag('div')
:css('width', '100%')
row:tag('div')
:cssText('float: left; text-align:left;padding-right:0.5em;')
:wikitext('&larr;&nbsp;'..args.prev)
row:tag('div')
:cssText('float: right; text-align:right;padding-left:0.5em;')
:wikitext(args.next..'&nbsp;&rarr;')
end

local navbarArg = args.navbar or args.tnavbar
if navbarArg ~= 'none' and navbarArg ~= 'off' and (args.name or frame:getParent():getTitle():gsub('/sandbox$', ) ~= 'Bản mẫu:Sidebar games events') then
root
:tag('tr')
:tag('td')
:css('text-align', 'right')
:css('font-size', '115%')
:css('padding-top', '0')
:css('border-top', 'solid 1px deeaf6')
:attr('colspan', cols)
:wikitext(navbar{
args.name,
mini = 1,
fontstyle = args.navbarfontstyle or args.tnavbarfontstyle
})
end

if mw.title.getCurrentTitle().namespace == 10 and (args.name ~= mw.title.getCurrentTitle().text) and not (mw.title.getCurrentTitle().text:match('Sidebar games events')) then
root:wikitext("")
end
return tostring(root)
end
return p