Mô đun:Dot chart

local p = {}
local getArgs = require("Mô đun:Arguments").getArgs
local yesno = require('Mô đun:Yesno')

--------------------------------------------------------------------------------
---------- P . D O T S ---------------------------------------------------------
---------- Trả về tất cả các chấm (với vị trí tuyệt đối) -----------------------
--------------------------------------------------------------------------------

function p.data(frame) -- Trả về dữ liệu của đồ thị
local args = getArgs(frame)
-- Liên quan đến chấm
local yTable = {}
local xTable = {}
local xCount = 0
local yCount = 0
local isx;
local dotTable = {}
local x;
-- Liên quan đến màu sắc
local colorTable = {}
local num;
local colorTime;
-- Liên quan đến nhãn X
local xLabels = {}
local xLCount = 0
-- Liên quan đến nhãn Y
local yLabels = {}
local yLCount = 0

if yesno(args["yx"]) == true then
isx = false
else
isx = true
end

if args["x labels"] then -- Tạo xLabels
for str in string.gmatch(args["x labels"], "([^,]+)") do
table.insert(xLabels,str)
xLCount = xLCount+1
end
end

if args["y labels"] then -- Tạo yLabels
for str in string.gmatch(args["y labels"], "([^,]+)") do
table.insert(yLabels,str)
yLCount = yLCount+1
end
end

if args["dots"] then -- Tạo xTable từ các chấm
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({'Số lượng tham số y (',yCount,') ÷ tham số dots (',args["dots"],') không phải là số nguyên (',cols,')'})
end

while(cols>i) do
local xValue = ((100/colsi)+(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 -- Chia args vào yTable và 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 Số lượng giá trị x (',xCount,') ít hơn số lượng giá trị y (',yCount,')'})
elseif xCount > yCount then
return table.concat({'Số lượng giá trị x (',xCount,') nhiều hơn số lượng giá trị y (',yCount,')'})
end

if args["color-even"] then -- Tạo colorTable nếu color-even được thiết lập
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 -- Tạo colorTable nếu color-odd được thiết lập
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 -- Thêm giá trị vào colorTable nếu color- được thiết lập
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 -- Tạo 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('[[Tập tin:Location dot ',colorTable[k] or 'red','.svg|',size,'x',size,'px]]')
div
:css('position','absolute')
:css('bottom',table.concat({y0.85+15,'%'}))
:css('left',table.concat({x0.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/xLCountk-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/yLCountk-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

---------- C H Ú G I Ả I ------------------------------------------------------
---------- Tạo bảng chú giải ---------------------------------------------------

local function legend(args)
local color;
local aValue;
local Table = {}
for k,v in pairs(args) do -- Thêm giá trị vào bảng
if k == mw.ustring.match(k,"legend%-%a+") then
color = mw.ustring.gsub(k,"legend%-","")
v = table.concat({' (',color,') = ',v,})
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 -------------------------------------------------------
---------- Trả về tất cả các chấm trong thẻ div --------------------------------
--------------------------------------------------------------------------------

function p.graph(frame) -- Trả về một đồ thị với các chấm trên đó
if mw.ustring.match(p.data(frame),"<span") then -- Trả về thông báo lỗi từ 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 -- Thiết lập hình ảnh cục bộ
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 -- Không tạo hộp nếu trống
return ""
end

if args["top"] then
top -- Tạo văn bản trên cùng
:css('font-weight','bold')
:css('text-decoration','underline')
:css('text-align','center')
:wikitext(args["top"])
end

container -- Tạo vùng chứa
:css('width',args["width"] or '240px')
:css('float','right')
:css('position','relative')
:wikitext('[[Tập tin:',picture,'|',args["width"] or '240px',']]')
:wikitext(p.data(frame))
div -- Tạo hộp
: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 -- Tạo viền hộp
div
:css('border-style','solid')
:css('border-color','black')
:css('border-width','3px')
end

if args['align'] == 'center' then -- Căn giữa đầu ra nếu cần
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