Module:Dot chart/sandbox
| This is the module sandbox page for Module:Dot chart (diff). See also the companion subpage for test cases. |
local p = {}
local getArgs = require("Module:Arguments").getArgs
local yesno = require('Module:Yesno')
--------------------------------------------------------------------------------
---------- P . D O T S ---------------------------------------------------------
---------- Returns all the dots (with absolute postions) -----------------------
--------------------------------------------------------------------------------
function p.data(frame) -- Returns the data of the graph
local args = getArgs(frame)
-- Dot related
local yTable = {}
local xTable = {}
local xCount = 0
local yCount = 0
local isx;
local dotTable = {}
local x;
-- Color related
local colorTable = {}
local num;
local colorTime;
-- X label related
local xLabels = {}
local xLCount = 0
-- Y label related
local yLabels = {}
local yLCount = 0
if yesno(args["yx"]) == true then
isx = false
else
isx = true
end
if args["x labels"] then -- Create xLabels
for str in string.gmatch(args["x labels"], "([^,]+)") do
table.insert(xLabels,str)
xLCount = xLCount+1
end
end
if args["y labels"] then -- Create yLabels
for str in string.gmatch(args["y labels"], "([^,]+)") do
table.insert(yLabels,str)
yLCount = yLCount+1
end
end
if args["dots"] then -- Creates xTable from dots
local i = 0
local j = 0
for k,v in pairs(args) do
if string.match(k,"%d+")
and not string.match(k,"color%-") then
table.insert(yTable,v)
yCount = yCount+1
end
end
local cols = yCount / tonumber(args["dots"])
if cols ~= math.floor(cols) then
return table.concat({'<span style="font-size:100%" class="error">The amount of y parameters (',yCount,') ÷ parameter dots (',args["dots"],') is not a integer (',cols,')</span>'})
end
while(cols>i) do
local xValue = ((100/cols*i)+(100/cols/10))*1.1
i=i+1
while(tonumber(args["dots"])>j) do
j=j+1
table.insert(xTable,xValue)
xCount = xCount + 1
end
j=0
end
else -- Divides args into the yTable and the xTable
for k,v in pairs(args) do
if string.match(k,"%d+")
and not string.match(k,"color%-") then
if isx == false then
table.insert(yTable,v)
yCount = yCount + 1
isx = true
elseif not args["dots"] then
table.insert(xTable,v)
xCount = xCount + 1
isx = false
end
end
end
end
if xCount < yCount then
return table.concat({'<span style="font-size:100%" class="error">The amount of x values (',xCount,') is less then the number y values (',yCount,')</span>'})
elseif xCount > yCount then
return table.concat({'<span style="font-size:100%" class="error">The amount of x values (',xCount,') is more then the number y values (',yCount,')</span>'})
end
if args["color-even"] then -- Creates the colorTable if color-even is set
colorTime = false
for k,v in pairs(yTable) do
if colorTime == true then
colorTable[k] = args["color-even"]
colorTime = false
else
colorTime = true
end
end
end
if args["color-odd"] then -- Creates the colorTable if color-odd is set
colorTime = true
for k,v in pairs(yTable) do
if colorTime == true then
colorTable[k] = args["color-odd"]
colorTime = false
else
colorTime = true
end
end
end
for k,v in pairs(args) do -- Adds values to the colorTable if color-# is set
if k == mw.ustring.match(k,"color%-%d+") then
num = mw.ustring.gsub(k,"color%-","")
num = tonumber(num)
colorTable[num] = v
end
end
for k,y in pairs(yTable) do -- Creates the dotTable
local InnerDiv = mw.html.create('div')
local div = mw.html.create('div')
local size;
if args["size"] then
size = tonumber(mw.ustring.match(args["size"],"(%d+)"))
else
size = 8
end
x = xTable[k]
InnerDiv
:css('position','absolute')
:css('top',table.concat({'-',size/2,'px'}))
:css('left',table.concat({'-',size/2,'px'}))
:css('line-height','0')
:wikitext('[[File:Location dot ',colorTable[k] or 'red','.svg|',size,'x',size,'px]]')
div
:css('position','absolute')
:css('bottom',table.concat({y*0.85+15,'%'}))
:css('left',table.concat({x*0.85+15,'%'}))
:wikitext(tostring(InnerDiv))
table.insert(dotTable,tostring(div))
end
for k,v in pairs(xLabels) do
local div = mw.html.create('div')
div
:css('position','absolute')
:css('bottom','0%')
:css('left',table.concat({((100/xLCount*k-100/xLCount)*0.85+15)-4,'%'}))
:wikitext(v)
table.insert(dotTable,tostring(div))
end
for k,v in pairs(yLabels) do
local div = mw.html.create('div')
div
:css('position','absolute')
:css('bottom',table.concat({(((((100/yLCount*k-100/yLCount)-(100/yLCount/3))+5))+100/yLCount/2)*1.02,'%'}))
:css('left','0%')
:wikitext(v)
table.insert(dotTable,tostring(div))
end
return table.concat(dotTable)
end
---------- L E G E N D ---------------------------------------------------------
---------- Makes the legendTable -----------------------------------------------
local function legend(args)
local color;
local aValue;
local Table = {}
for k,v in pairs(args) do -- Adds values to the table
if k == mw.ustring.match(k,"legend%-%a+") then
color = mw.ustring.gsub(k,"legend%-","")
v = table.concat({'<div>[[File:Location dot ',color or 'red','.svg|8x8px]] (',color,') = ',v,'</div>'})
table.insert(Table,v)
aValue = true
end
end
if aValue == true then
return table.concat(Table)
else
return ""
end
end
--------------------------------------------------------------------------------
---------- P . G R A P H -------------------------------------------------------
---------- Returns all the dots in div tags-------------------------------------
--------------------------------------------------------------------------------
function p.graph(frame) -- Returns a graph with the dots on it
if mw.ustring.match(p.data(frame),"<span") then -- Return error messages from p.data
return p.data(frame)
end
local args = getArgs(frame)
local picture = "Blank.png"
local div = mw.html.create('div')
local center = mw.html.create('div')
local container = mw.html.create('div')
local top = mw.html.create('div')
local size;
if args["size"] then
size = tonumber(mw.ustring.match(args["size"],"(%d+)"))
else
size = 8
end
if args["width"] then
if args["width"] == mw.ustring.match(args["width"],"(%d+)") then
args["width"] = table.concat({args["width"],'px'})
end
end
if args["picture"] then -- Set local picture
picture = args["picture"]
elseif yesno(args["square"]) == true then
picture = "Transparent.png"
end
picture = mw.ustring.gsub(picture,'|.+','')
picture = mw.ustring.gsub(picture,'.-:','')
if p.data(frame) == "" then -- Don't make box if empty
return ""
end
if args["top"] then
top -- Create top text
:css('font-weight','bold')
:css('text-decoration','underline')
:css('text-align','center')
:wikitext(args["top"])
end
container -- Creates container
:css('width',args["width"] or '240px')
:css('float','right')
:css('position','relative')
:wikitext('[[File:',picture,'|',args["width"] or '240px',']]')
:wikitext(p.data(frame))
div -- Creates box
:css('width', args["width"] or '240px')
:css('display', 'inline-block')
:css('float', args["align"] or 'right')
:css('margin', args["margin"] or '2px')
:css('padding', args["padding"] or table.concat({size/2,'px'}))
:wikitext(tostring(top))
:wikitext(tostring(container))
:wikitext(legend(args))
:wikitext(args["bottom"])
if args["color"] then
div:css('background', args["color"])
end
if yesno(args['border']) ~= false then -- Creates box border
div
:css('border-style','solid')
:css('border-color','black')
:css('border-width','3px')
end
if args['align'] == 'center' then -- Centers output if needed
center
:addClass('center')
:css('width','auto')
:css('margin-left','auto')
:css('margin-right','auto')
:wikitext(tostring(div))
return center
else
return div
end
end
return p
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.