group = 'group',
xlegend = 'x legends',
yticks = 'y tick marks',
tooltip = 'tooltip',
accumulateTooltip = 'tooltip value accumulation',
groupNames = 'group names',
hideGroupLegends = 'hide group legends',
optint = 'only integer values',
slices = 'slices',
slice = 'slice',
} -- here is what you want to translate
local defColors = require "Module:Plotter/DefaultColors"
local hideGroupLegends
local optint
local function nulOrWhitespace( s )
end
end
function pieChart( frame )
function barChart( frame )
local res = {}
local res = {}
local args = frame.args -- can be changed to frame:getParent().args
local values, xlegends, colors, tooltips, yscales, yscalesneg = {}, {}, {}, {} ,{}, {}, {}, {}
local groupNames, unitsSuffix, unitsPrefix, links = {}, {}, {}, {}
local width, height, yticks, stack, delimiter = 500, 350, -1, false, args.delimiter or ':'
local chartWidth, chartHeight, defcolor, scalePerGroup, accumulateTooltip
local numGroups, numValues
local scaleWidth
table.insert( res, frame:extensionTag{ name = 'templatestyles', args = { src = 'TemplateStyles sandbox/Ita140188/styles.css'} })
function createGroupList( tab, legends, cols )
if #legends > 1 and not hideGroupLegends then
table.insert( tab, mw.text.tag( 'div', { style = string.format( "width:%spx;", chartWidth ) } ) )
local list = {}
local spanStyle = "padding:0 1em;background-color:%s;border:1px solid %s;margin-right:1em;-webkit-print-color-adjust:exact;"
for gi = 1, #legends do
local span = mw.text.tag( 'span', { style = string.format( spanStyle, cols[gi], cols[gi] ) }, ' ' ) .. ' '.. legends[gi]
table.insert( list, mw.text.tag( 'li', {}, span ) )
end
table.insert( tab,
mw.text.tag( 'ul',
{style="width:100%;list-style:none;-webkit-column-width:12em;-moz-column-width:12em;column-width:12em;"},
table.concat( list, '\n' )
)
)
table.insert( tab, '</div>' )
end
end
function validate()
defcolor = defcolor or 'blue'
colors[1] = colors[1] or defcolor
scaleWidth = scalePerGroup and 80 * numGroups or 30100
chartWidth = width -scaleWidth
asGroups( 'unitsPrefix', unitsPrefix, true, true )
end
elseif k == keywords.stack then stack = true
elseif k == keywords.optintyticks then optintyticks = truetonumber(v) or -1
elseif k == keywords.scalePerGroup then scalePerGroup = true
elseif k == keywords.defcolor then defcolor = v
end
local sum = math.max( unpack( sums ) )
localfor sumnegi = math.min(1, unpack(#values sumsdo )yscales[i] )= sum end
for i = 1, #values do
yscales[i] = sum
yscalesneg[i] = 0 -- -sumneg
end
else
for i, group in ipairs( values ) do yscales[i] = math.max( unpack( group ) ) end
yscales[i] = math.max( unpack( group ) )
yscalesneg[i] = -math.min( unpack( group ) )
end
end
for i, scale in ipairs( yscales ) do yscales[i] = roundup( scale * 0.9999 ) end
forif i,not scalescalePerGroup inthen ipairs(for yscalesnegi )= 1, #values do yscalesnegyscales[i] = roundupmath.max( scaleunpack( *yscales 0.9999) ) end end
if not scalePerGroup then for i = 1, #values do
yscales[i] = math.max( unpack( yscales ) )
yscalesneg[i] = math.max ( 0 , math.max( unpack( yscalesneg ) ) )
end end
end
function calcHeights( gi, i, val )
local barHeight = 0
local top, base = 0, 0
if tonumber( val ) >= 0 then
barHeight = math.floor( val / ( yscales[gi] + yscalesneg[gi] ) * chartHeight + 0.5 ) -- add half to make it "round" instead of "trunc"
top, base = chartHeight - barHeight - yscalesneg[gi] / ( yscales[gi] + yscalesneg[gi] ) * chartHeight , 0
-- barHeight = math.floor( val / yscales[gi] * chartHeight + 0.5 ) -- add half to make it "round" instead of "trunc"
-- top, base = chartHeight - barHeight, 0
else
barHeight = math.floor( -val / ( yscales[gi] + yscalesneg[gi] ) * chartHeight + 0.5 ) -- add half to make it "round" instead of "trunc"
top, base = chartHeight - yscales[gi] / ( yscales[gi] + yscalesneg[gi] ) * chartHeight, 0
end
if stack then
local rawbase = 0
for j = 1, gi - 1 do rawbase = rawbase + values[j][i] end -- sum the "i" value of all the groups below our group, gi.
base = math.floor( chartHeight * rawbase / yscales[gi] ) -- normally, and especially if it's "stack", all the yscales must be equal.
end
return barHeight, top - base
end
function calcHeightsOld( gi, i, val )
local barHeight = math.floor( val / yscales[gi] * chartHeight + 0.5 ) -- add half to make it "round" instead of "trunc"
local top, base = chartHeight - barHeight, 0
function groupBounds( i )
local setWidth = math.floor( chartWidth / numValues )
-- local setOffset = ( i - 1 ) * setWidth
local setOffset = ( i - 1 ) * setWidth
return setOffset, setWidth
local setOffset, setWidth = groupBounds( i )
if stack or numGroups == 1 then
local barWidth = math.min( 38, math.floor( 0.8 * setWidth ) )
return setOffset + (setWidth - barWidth) / 2, barWidth
end
setWidth = 0.85 * setWidth
local barWidth = math.floor( 0.75 * setWidth / numGroups )
local left = setOffset + math.floor( ( gi - 1 ) / numGroups * setWidth )
return left, barWidth
end
local link = links[gi] and links[gi][i] or ''
local img = not nulOrWhitespace( link ) and mw.ustring.format( '[[File:Transparent.png|1000px|link=%s|%s]]', link, custom and tooltip or '' ) or ''
table.insert( res, mw.text.tag( 'div', { style = style, title = tooltip, class = "chart2-bar" }, img ) )
end
function drawYScale()
function drawSingle( gi, color, width, yticks, single )
function drawSingle( gi, color, single )
local yscale = yscales[gi]
local _, top, ordermag = roundup( yscale * 0.999 )
local numnotches = topyticks <>= 1.50 and topyticks * 4or
or (top <= 4 1.5 and top * 24
or top < 4 and top * or top2
or top)
local valStyleStrCntnr = 'display:block;position:relative;height:%spx;text-align:right;margin:0px;' -- SINGLE ELEMENT OF Y AXIS
local valStyleStr =
local valStyleStrValue = 'display:block;position:relative;float:right;height:%spx;text-align:right;margin:%spx 0px 0px 0px;vertical-align:middle;line-height:%spx;' -- value
local valStyleStrNotch = single and 'display:block;position:relative;float:rightabsolute;height:%spx=20px;text-align:right;vertical-align:middle;width:5px%spx; border-top:1px%spx;padding:0 solid black2px' -- notch
-- or 'position:relativeabsolute;height=20px;text-align:right;vertical-align:middle;max-width:%spx;top:%spx;left:3px;background-color:%s;color:white;font-weight:bold;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000;padding:0 2px'
-- local notchStyleStr = 'position:absolute;height=1px;min-width:5px;top:%spx;left:%spx;border:1px solid %s;'
for i = 1, numnotches do
local val = (numnotches - i + 1) / numnotches * yscale -- value of this notch
local y = chartHeight - calcHeights( gi, 1, val )
local ydiv = mw.text.tag( 1'div', /{ numnotchesstyle *= chartHeight )string.format( valStyleStr, width --chartHeight -10, calcHeights(y gi,- 110, valcolor ) --}, heightmw.getContentLanguage():formatNum( oftonumber( aval single) notchor 0 ) )
local divCntnr = mwtable.text.taginsert( 'div'res, { style = string.format( valStyleStrCntnr, y, color ) }div )
local divValuediv = mw.text.tag( 'div', { style = string.format( valStyleStrValuenotchStyleStr, y, width -y/2, y4, color ) }, mw.getContentLanguage():formatNum( tonumber( val ) or 0 )'' )
table.insert( res, div )
local divNotch = mw.text.tag( 'div', { style = string.format( valStyleStrNotch, y, color ) }, ' ' )
table.insert( res, divCntnr )
if val~=math.floor(val) and optint then
else
table.insert( res, divNotch )
table.insert( res, divValue )
end
table.insert( res, '</div>' )
table.insert( res, '<div style="clear:right;display:block"></div>' )
-- div = mw.text.tag( 'div', { style = string.format( notchStyleStr, y, width - 4, color ) }, '' )
-- table.insert( res, div )
end
end
if scalePerGroup then
-- local colWidth = 80
-- local colStyle = "position:absolute;height:%spx;min-width:%spx;left:%spx;border-right:1px solid %s;color:%s"
for gi = 1, numGroups do
local left = ( gi - 1 ) * colWidth
-- local colStylecolor = "height:%spx;border-right:1pxcolors[gi] solidor %s;color:%s;display:inline-block;text-align:right"defcolor
table.insert( res, mw.text.tag( 'div', { style = string.format( colStyle, chartHeight, colWidth, left, color, color ) } ) )
-- for gi = 1, numGroups do
-- -- local left = drawSingle( gi, -color, 1colWidth, yticks ) * colWidth
-- table.insert( localres, color'</div>' = colors[gi] or defcolor)
end
-- -- table.insert( res, mw.text.tag( 'div', { style = string.format( colStyle, chartHeight, colWidth, left, color, color ) } ) )
-- table.insert( res, mw.text.tag( 'div', { style = string.format( colStyle, chartHeight, color, color ) } ) )
-- drawSingle( gi, color )
-- table.insert( res, '</div>' )
-- end
else
drawSingle( 1, 'black', scaleWidth, yticks, true ) -- gi is the id of y axis when more than 1
end
end
function drawXlegends()
local setOffset, setWidth
local legendDivStyleFormat = "displayposition:blockabsolute;float:left:%spx;positiontop:relative10px;verticalmin-alignwidth:top%spx;max-width:%spx;text-align:center;marginvertical-align:0px 0px 0px %spxtop;"
--local tickDivstyleFormat = "displayposition:blockabsolute;floatleft:left%spx;positionheight:relative10px;vertical-alignwidth:top1px;border-left:1px solid black;width:%spx;text-align:center;margin:0px 0px 0px %spx;"
local offsetleft = 0;
setOffset, setWidth = groupBounds( 1 )
for i = 1, numValues do
if not nulOrWhitespace( xlegends[i] ) then
setOffset, setWidth = groupBounds( i )
--table.insert( res, mw.text.tag( 'div', { style = string.format( tickDivStyleFormat, setWidth/2, offsetleft+setWidth/2 ) }, xlegends[i] or '' ) )
-- setWidth = 0.85 * setWidth table.insert( res, mw.text.tag( 'div', { style = string.format( legendDivStyleFormat, setOffset + 5, setWidth - 10, offsetleftsetWidth - 10 ) }, xlegends[i] or '' ) )
table.insert( res, mw.text.tag( 'div', { style = string.format( tickDivstyleFormat, setOffset + setWidth / 2 ) }, '' ) )
offsetleft=0;
else
offsetleft=offsetleft+setWidth;
end
-- setOffset, setWidth = groupBounds( i )
-- table.insert( res, mw.text.tag( 'div', { style = string.format( legendDivStyleFormat, setWidth ) }, xlegends[i] or '' ) )
end
end
function drawXticksdrawChart()
table.insert( res, mw.text.tag( 'div', { class = 'chart noresize', style = string.format( 'margin-top:1em;max-width:%spx;', width ) } ) )
local setOffset, setWidth
localtable.insert( tickDivStyleFormatres, mw.text.tag( 'div', { style = string.format("display:block;float:left;position:relative;min-height:5px%spx;verticalmin-align:top;border-left:1px solid black;width:%spx;textmax-alignwidth:center;margin:0px 0px 0px %spx;", height, width, width ) } ) )
local offsetleft = 0;
setOffset, setWidth = groupBounds( 1 )
for i = 1, numValues do
if not nulOrWhitespace( xlegends[i] ) then
table.insert( res, mw.text.tag( 'div', { style = string.format( tickDivStyleFormat, (setWidth/2)-1, (offsetleft+setWidth/2) ) }, '' ) )
offsetleft=0;
else
offsetleft=offsetleft+setWidth;
end
end
end
table.insert( res, mw.text.tag( 'div', { style = string.format("float:right;position:relative;min-height:%spx;min-width:%spx;max-width:%spx;border-left:1px black solid;border-bottom:1px black solid;", chartHeight, chartWidth, chartWidth ) } ) )
function drawChart()
table.insert( res, mw.text.tag( 'div', { style = string.format("position:relative;padding:1em 0em 1em 0em;") } ) ) -- container div
table.insert( res, mw.text.tag( 'div', { style = string.format("position:relative;white-space:nowrap;" ) } ) ) -- container div
table.insert( res, mw.text.tag( 'div', { style = string.format("position:relative;height:%spx;display:inline-block;text-align:right;vertical-align:top;", chartHeight ) } ) )
drawYScale()
table.insert( res, '</div><div style="position:relative;display:inline-block">' )
-- table.insert( res, mw.text.tag( 'div', { style = string.format("position:relative;display:inline-block" ) } ) ) -- right side container div (should not have space)
table.insert( res, mw.text.tag( 'div', { style = string.format("height:%spx;width:%spx;border-left:1px black solid;border-bottom:1px black solid;display:block;margin:0px;padding:0px;", chartHeight, chartWidth ) } ) ) -- the actual chart
local acum = stack and accumulateTooltip and {}
for gi, group in pairs( values ) do
end
table.insert( res, '</div>' )
table.insert( res, mw.text.tag( 'div', { style = string.format( "position:relativeabsolute;height:%spx;min-width:%spx;floatmax-width:left%spx;", chartWidthchartHeight, )scaleWidth, }scaleWidth, )scaleWidth ) --} X) ticks)
drawXticksdrawYScale()
table.insert( res, '</div>' )
table.insert( res, mw.text.tag( 'div', { style = string.format( "position:relativeabsolute;top:%spx;left:%spx;width:%spx;", chartHeight, scaleWidth, chartWidth ) } ) ) -- X legends
drawXlegends()
table.insert( res, '</div>' )
table.insert( res, '</div>' )
table.insert( res, '</div>' )
|