Module:Bar/sandbox: Difference between revisions
Appearance
Content deleted Content added
Optimized styling |
Fixed caption outside box problem |
||
Line 46: | Line 46: | ||
output[3] = |
output[3] = |
||
'<div class="' .. class .. '" style=" |
'<div class="' .. class .. '" style="background:' .. (args.backgroundcolor or 'white') .. |
||
'; border:' .. (args.borderwidth or '1') .. 'px solid silver' .. |
|||
(args.float == 'center' and '; margin:0 auto' or '') .. |
|||
'; width:' .. _width(args.width, 'auto') .. |
|||
(args.style and '; ' .. args.style or '') .. '">\n' .. |
|||
' |
'{|' .. (args.lineheight and ' style="line-height:' .. args.lineheight .. '"' or '') .. '\n' |
||
output[4] = args.title and |
output[4] = args.title and |
Revision as of 22:09, 20 February 2021
![]() | This is the module sandbox page for Module:Bar (diff). |
![]() | This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
![]() | 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 uses TemplateStyles: |
![]() | This module depends on the following other modules: |
![]() | This Lua module is used on many pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
{{Bar box}}, is used for construction of horizontal bar charts.
Usage
{{Bar box
|width = ''width of the graph'' (optional)
|barwidth= ''width of the bar area'' (optional, defaults to 100px)
|float = (left|right|none) (optional, defaults to none)
|title = ''title of the chart'' (optional)
|titlebar= ''title bar colour'' (optional, defaults to none)
|left1 = ''first left column header'' (optional)
|left2 = ''second left column header'' (optional)
|right1 = ''first right column header'' (optional)
|right2 = ''second right column header'' (optional)
|bars = ''chart contents'' (see below)
|caption = ''caption under the chart'' (optional)
}}
Alternatives to avoid Wikipedia's Post-expand include size limit
Pages with many boxes and charts may come close to or exceed Wikipedia's Post-expand include size limit. In these cases consider using Module:Bar as follows:
- {{Bar box}} → {{#invoke:Bar|box}}
- {{Bar percent}} → {{#invoke:Bar|percent}}
- {{Bar pixel}} → {{#invoke:Bar|pixel}}
- {{Bar log}} → {{#invoke:Bar|log}}
- {{Bar stacked}} → {{#invoke:Bar|stacked}}
- {{Bar gap}} → {{#invoke:Bar|gap}}
Tracking category
See also
- {{Vertical bar chart}}
- {{Bar chart}}
- {{Data bars}}
- WP:Graphs
local getArgs = require('Module:Arguments').getArgs
local p = {}
p.sDefaultAlign = 'lrlr'
p.tDefaultAlign = {false, 'r', false, 'r'}
function p._setAlign(align)
p.alignClasses = {}
for i, d in ipairs(p.tDefaultAlign) do
local a = align:sub(i, i)
if a == 'l' then
a = false
elseif a == 'd' then
a = d
elseif a ~= 'c' and a ~= 'r' then
error('unrecognized align[' .. i .. ']')
end
p.alignClasses[i] = (a and ' class=bb-' .. a or '') .. '|'
end
end
function p._box(args)
for key, value in pairs(args) do
if ({float=1, width=1, barwidth=1})[key] then -- if key in {...}
args[key] = value:lower()
end
end
local output = {}
local frame = mw.getCurrentFrame()
output[1] = frame:extensionTag('templatestyles', '', {src='Module:Bar box/styles.css'}) .. '\n'
output[2] = args.css and frame:extensionTag('templatestyles', '', {src=args.css}) .. '\n' or ''
local class = 'barbox'
if args.float == 'left' or args.float == 'right' then
class = class .. ' t' .. args.float
end
local function _width(width, default)
local w = width or default
if tonumber(w) then w = w .. 'px' end
return w
end
output[3] =
'<div class="' .. class .. '" style="background:' .. (args.backgroundcolor or 'white') ..
'; border:' .. (args.borderwidth or '1') .. 'px solid silver' ..
(args.float == 'center' and '; margin:0 auto' or '') ..
'; width:' .. _width(args.width, 'auto') ..
(args.style and '; ' .. args.style or '') .. '">\n' ..
'{|' .. (args.lineheight and ' style="line-height:' .. args.lineheight .. '"' or '') .. '\n'
output[4] = args.title and
'|+ class=bb-default style="' .. (args.titlebar and 'background:' .. args.titlebar .. '; ' or '') .. 'font-weight:bold" |\n' ..
args.title .. '\n'
or ''
output[5] = '|- class=bb-default style="font-size:88%; min-height:4px"\n'
if not p.alignClasses then
p._setAlign(p.sDefaultAlign)
end
output[6] = '!' .. (args.left2 and '' or 'colspan=2') .. p.alignClasses[1] .. (args.left1 or ' ')
output[7] = args.left2 and '!!' .. p.alignClasses[2] .. args.left2 or ''
output[8] = '!!style="width:' .. _width(args.barwidth, '100px') .. '"| '
output[9] = '!!' .. (args.right2 and p.alignClasses[3] or 'colspan=2' .. p.alignClasses[4]) .. (args.right1 or ' ')
output[10] = args.right2 and '!!' .. p.alignClasses[4] .. args.right2 or ''
output[11] = '\n'
output[12] = args.bars and args.bars .. '\n' or ''
if args.caption then
output[15] = '\n[[Category:Pages using bar box with deprecated caption parameter]]'
args.footer = args.caption
else
output[15] = ''
end
output[13] = args.footer and
'|- class=bb-default\n| colspan=5 style="padding:5px" | ' .. args.footer .. '\n' -- <p> created with \n before the footer
or ''
output[14] = '|}\n</div>\n'
return table.concat(output)
end
function p._percent(args)
local output = {}
local percentage = (args[3] or '0') .. '%'
output[1] = '|-' .. (args.bg and 'style="background:' .. args.bg .. '"' or '') .. '\n'
output[2] = '|colspan=2 class=bb-min8|' .. (args[1] or ' ')
output[3] = '||class=bb-b|'
output[4] = '<div style="background:' .. (args[2] or 'gray') .. '; width:' .. percentage .. '">​</div>'
output[5] = '||' .. (args.note and '' or 'colspan=2 class=bb-r|') .. (args[4] or percentage)
output[6] = args.note and '||class=bb-r|' .. args.note or ''
return table.concat(output)
end
function p._pixel(args)
local output = {}
local pixels = args[3] or '0'
output[1] = '|-' .. (args.bg and 'style="background:' .. args.bg .. '"' or '') .. '\n'
output[2] = '|colspan=2|' .. (args[1] or ' ')
output[3] = '||class=bb-b|'
output[4] = '<div style="background:' .. (args[2] or 'gray') .. '; width:' .. pixels .. 'px">​</div>'
output[5] = '||class="bb-min3' .. (args.note and '"' or ' bb-r" colspan=2') .. '|' .. (args[5] or pixels .. (args[4] or ''))
output[6] = args.note and '||class=bb-r|' .. args.note or ''
return table.concat(output)
end
function p._stacked(args)
if args.align then args.align:lower() end
local output = {}
output[1] = args.id and
'|-class="mw-collapsible' .. (args.collapsed and ' mw-collapsed' or '') .. '" id=mw-customcollapsible-' .. args.id .. '\n'
or '|-\n'
if not p.alignClasses then
p._setAlign(args.align or p.sDefaultAlign)
end
output[2] = '|' .. (args.note1 and '' or 'colspan=2') .. p.alignClasses[1] .. (args[1] or ' ')
output[3] = args.note1 and '||' .. p.alignClasses[2] .. args.note1 or ''
output[4] = '||class=bb-b|'
local len = 4 -- can't use #args because of [[Module:Arguments#Known limitations]]
for k in pairs(args) do
local idx = tonumber(k) or 0
if idx > len then len = idx end
end
local width, title, background
for i = 1, (len-2) / 2 do
width = args[2*i + 2] or 0
width = tonumber(('%.2f'):format(width))
if width == 0 then
output[i+4] = ''
else
title = args['title' .. i] and ' title="' .. args['title' .. i] .. '"' or ''
background = args[2*i + 1] or 'gray'
output[i+4] =
'<div' .. title .. ' style="background:' .. background .. '; width:' .. width .. 'px">​</div>'
end
end
output[#output+1] = '||' .. (args.note2 and p.alignClasses[3] or 'colspan=2' .. p.alignClasses[4]) .. (args[2] or ' ')
output[#output+1] = args.note2 and '||' .. p.alignClasses[4] .. args.note2 or ''
return table.concat(output)
end
function p._gap(args)
local output = {}
local height = tonumber(args.height) and args.height .. 'px' or args.height or '10px'
output[1] = '|-\n'
output[2] = '|colspan=5 style="height:' .. height .. '"|' .. (args[1] or '')
return table.concat(output)
end
function p.box(frame)
local args = getArgs(frame)
return p._box(args)
end
function p.percent(frame)
local args = getArgs(frame)
return p._percent(args)
end
function p.pixel(frame)
local args = getArgs(frame)
return p._pixel(args)
end
function p.stacked(frame)
local yesno = require('Module:Yesno')
local args = getArgs(frame, {
valueFunc = function (key, value)
if value then
if key == 'collapsed' then
return yesno(value)
end
value = mw.text.trim(value)
if value ~= '' then
return value
end
end
return nil
end
})
return p._stacked(args)
end
function p.gap(frame)
local args = getArgs(frame)
return p._gap(args)
end
return p