پودمان:Sidebar games events
--
-- This module implements-- This module was created using code taken directly from Module:Sidebar -- require('Module:No globals')
local p = {}
local getArgs = require('Module:Arguments').getArgs local navbar = require('Module: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 .. ' at the
' .. '' .. 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 < cols then if args['type' .. num .. let] then showtypes = true end end end if showtypes == true then local row = root:tag('tr') row:tag('th'):css('display', (hasevents == false) and 'none' or nil) for j, let in ipairs(lets) do if j < cols then local t = args['type' .. num .. let] local cell = row:tag('th') if t then cell :css('font-weight', 'normal') :css('border-top', '1px solid #f5faff') :css('background', '#deeaf6') :css('width', (cols > 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('← '..args.prev) row:tag('div') :cssText('float: right; text-align:right;padding-left:0.5em;') :wikitext(args.next..' →') end
local navbarArg = args.navbar or args.tnavbar if navbarArg ~= 'none' and navbarArg ~= 'off' and (args.name or frame:getParent():getTitle():gsub('/sandbox$', ) ~= 'Template: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) then
root:wikitext("")
end return tostring(root) end return p
--
-- This module implements {{Sidebar games events}}
-- This module was created using code taken directly from [[Module:Sidebar]]
--
require('strict')
local p = {}
local getArgs = require('Module:Arguments').getArgs
local tracking, preview = {}, {}
local function checkargs(args)
for k, v in pairs(args) do
if v ~= '' then
if k and type(k) == 'string' then
if k == 'event' or k == 'games' or k == 'name' or k == 'image' or
k == 'imageright' or k =='caption' or k =='above' or
k == 'title' or k == 'alignresults' or k == 'alignevents' or
k == 'width' or k == 'maxwidth' or k == 'float' or
k == 'below' or k == 'prev' or k == 'next' or
-- Farsi
k == 'رویداد' or k == 'بازیها' or k == 'نام' or k == 'تصویر' or
k == 'تصویر راست' or k == 'توضیح تصویر' or k == 'بالا' or
k == 'عنوان' or k == 'تراز نتایج' or k == 'تراز رویدادها' or
k == 'عرض' or k == 'حداکثر عرض' or k == 'شناوری' or
k == 'پایین' or k == 'قبلی' or k == 'بعدی' then
-- valid
elseif k:match('^title%d+$') or k:match('^event%d+$') or
k:match('^image%d+$') or k:match('^type%d+[a-e]$') or
k:match('^event%d+%.%d+$') or
k:match('^results%d+%.%d+[a-e]?$') or
k:match('^border%d+%.%d+$') or
-- Farsi
mw.ustring.match(k, '^عنوان%d+') or mw.ustring.match(k, '^رویداد%d+') or
mw.ustring.match(k, '^تصویر%d+') or mw.ustring.match(k, '^نوع%d+') or
mw.ustring.match(k, '^نتایج%d+') or mw.ustring.match(k, '^قاب%d+') then
-- valid
elseif k == 'categories' or k == 'nocat' or k == 'demo' or
-- Farsi
k == 'ردهها' or k == 'بیرده' or k == 'دمو' then
-- valid for doc page
else
-- invalid
local vlen = mw.ustring.len(k)
k = mw.ustring.sub(k, 1, (vlen < 25) and vlen or 25)
k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
table.insert(tracking, '[[رده:صفحههایی که از نوار کتاری رویدادهای بازیها با پارامترهای نامعلوم استفاده میکنند|' .. k .. ']]')
table.insert(preview, '«' .. k .. '»')
end
end
end
end
end
function p.sidebar(frame, args)
if not args then
args = getArgs(frame)
end
local root = mw.html.create()
root = root
:tag('table')
:addClass('sidebar-games-events')
:addClass(args.float == 'right' and 'sidebar-games-events-right' or nil)
:addClass(args.float == 'none' and 'sidebar-games-events-none' or nil)
:addClass('sidebar')
:addClass('nomobile')
:css('width', args.width or nil)
:css('max-width', args.maxwidth or nil)
-- 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
-- find rows
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
-- find number of columns
if k:match('^results%d+%.(%d+)$') then
cols = (2 > cols) and 2 or cols
end
-- find number of columns based on let(s)
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
-- find subevents
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
-- identify events (that match looks awfully similar to subevents)
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 = nil
if args.alignevents and args.alignevents == 'left' then
alignevents = 'event-l'
end
local alignresults = nil
if args.alignresults and args.alignresults == 'left' then
alignresults = 'result-l'
elseif args.alignresults and args.alignresults == 'right' then
alignresults = 'result-r'
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 .. ' در ' .. args.games .. '|' .. args.event .. ']]'
.. ' در<br>' .. '[[' .. args.games .. ']]'
end
local cell = root:tag('tr'):tag('th')
cell
:addClass('sidebar-games-events-title')
:attr('colspan', cols)
if args.imageright then
local d = cell:tag('div')
:addClass('sidebar-games-events-ir-cont')
d:tag('div')
:addClass('sidebar-games-events-ir-title')
:wikitext(t)
d:tag('div')
:addClass('sidebar-games-events-ir')
:wikitext(args.imageright)
else
cell:wikitext(t)
end
end
if args.image then
local imageCell = root:tag('tr'):tag('td')
imageCell
:addClass('sidebar-games-events-image')
:attr('colspan', cols)
:wikitext(args.image)
if args.caption then
imageCell
:tag('div')
:addClass('sidebar-games-events-caption')
: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')
:addClass('event-title')
:attr('colspan', cols)
:wikitext(title)
end
if event and image then
heading = event .. '<br>' .. image
elseif event then
heading = event
elseif image then
heading = image
end
if heading then
root
:tag('tr')
:tag('th')
:addClass('sidebar-games-events-heading')
:attr('colspan', cols)
:wikitext(heading)
end
local showtypes = false
for j, let in ipairs(lets) do
if j < cols then
if args['type' .. num .. let] then
showtypes = true
end
end
end
if showtypes == true then
local row = root:tag('tr')
row:tag('th'):addClass((hasevents == false) and 'no-event' or nil)
for j, let in ipairs(lets) do
if j < cols then
local t = args['type' .. num .. let]
local cell = row:tag('th')
if t then
cell
:addClass('type-right')
:css('width', (cols > 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'):addClass((hasevents == false) and 'no-event' or nil)
local t = args['event' .. num .. '.' .. k]
local border = args['border' .. num .. '.' .. k] and 'erl-border' or nil
if t then
cell
:addClass('event')
:addClass(alignevents)
:addClass(border)
:wikitext(t)
end
if args['results' .. num .. '.' .. k] then
row:tag('td')
:addClass(border)
:addClass(alignresults)
:attr('colspan', cols - 1)
: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')
:addClass(border)
:addClass(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')
:addClass('sidebar-games-events-prevnext')
:attr('colspan', cols)
:tag('div')
row:tag('div')
:addClass('sidebar-games-events-prev')
:wikitext(args.prev)
row:tag('div')
:addClass('sidebar-games-events-next')
:wikitext(args.next)
end
if args.navbar ~= 'none' and args.navbar ~= 'off' and
(args.name or frame:getParent():getTitle():gsub('/تمرین$', '') ~= 'الگو:نوار کناری رویدادهای بازیها') then
root
:tag('tr')
:tag('td')
:addClass('sidebar-games-events-navbar')
:attr('colspan', cols)
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
fontstyle = args.navbarfontstyle
})
end
if mw.title.getCurrentTitle().namespace == 10 and (args.name ~= mw.title.getCurrentTitle().text) and not (mw.ustring.match(mw.title.getCurrentTitle().text, 'نوار کناری رویدادهای بازیها')) then
root:wikitext("[[رده:الگوهایی که از نوار کناری رویدادهای بازیها با نام نادرست استفاده میکنند]]")
end
checkargs(args)
local trackstr = (#tracking > 0) and table.concat(tracking, '') or ''
if #preview > 0 then
trackstr = require('Module:If preview')._warning({
'پارامترهای نامعلوم ' .. table.concat(preview, '؛ ') .. '.'
}) .. trackstr
end
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'پودمان:Sidebar games events/styles.css' }
} .. tostring(root) .. trackstr
end
return p