Module:Sidebar games events
Appearance
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This module depends on the following other modules: |
This module uses TemplateStyles: |
This module implements template {{Sidebar games events}}.
--
-- 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' 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+$') then
-- valid
elseif k == 'categories' or k == 'nocat' or k == 'demo' 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, '[[Category:Pages using sidebar games events with unknown parameters|' .. 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 == 'left' and 'sidebar-games-events-left' 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 == 'right' then
alignevents = 'event-r'
end
local alignresults = nil
if args.alignresults and args.alignresults == 'right' then
alignresults = 'result-r'
elseif args.alignresults and args.alignresults == 'left' then
alignresults = 'result-l'
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 .. ' at the ' .. args.games .. '|' .. args.event .. ']]'
.. ' at the<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-let')
: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('/sandbox$', '') ~= 'Template:Sidebar games events') 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.title.getCurrentTitle().text:match('Sidebar games events')) then
root:wikitext("[[Category:Templates using sidebar games events without correct name]]")
end
checkargs(args)
local trackstr = (#tracking > 0) and table.concat(tracking, '') or ''
if #preview > 0 then
trackstr = require('Module:If preview')._warning({
'Unknown parameters ' .. table.concat(preview, '; ') .. '.'
}) .. trackstr
end
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Sidebar games events/styles.css' }
} .. tostring(root) .. trackstr
end
return p