<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ADot_chart</id>
	<title>Module:Dot chart - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ADot_chart"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Dot_chart&amp;action=history"/>
	<updated>2026-05-24T20:12:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Dot_chart&amp;diff=136005&amp;oldid=prev</id>
		<title>imported&gt;Pppery: Pppery moved page Module:Dot graph to Module:Dot chart without leaving a redirect: Make module name match template name</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Dot_chart&amp;diff=136005&amp;oldid=prev"/>
		<updated>2018-12-15T05:10:20Z</updated>

		<summary type="html">&lt;p&gt;Pppery moved page &lt;a href=&quot;/index.php?title=Module:Dot_graph&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:Dot graph (page does not exist)&quot;&gt;Module:Dot graph&lt;/a&gt; to &lt;a href=&quot;/research/Module:Dot_chart&quot; title=&quot;Module:Dot chart&quot;&gt;Module:Dot chart&lt;/a&gt; without leaving a redirect: Make module name match template name&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local getArgs = require(&amp;quot;Module:Arguments&amp;quot;).getArgs&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
---------- P . D O T S ---------------------------------------------------------&lt;br /&gt;
---------- Returns all the dots (with absolute postions) -----------------------&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.data(frame)                                                          -- Returns the data of the graph&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	-- Dot related&lt;br /&gt;
	local yTable = {}&lt;br /&gt;
	local xTable = {}&lt;br /&gt;
	local xCount = 0&lt;br /&gt;
	local yCount = 0&lt;br /&gt;
	local isx;&lt;br /&gt;
	local dotTable = {}&lt;br /&gt;
	local x;&lt;br /&gt;
	-- Color related&lt;br /&gt;
	local colorTable = {}&lt;br /&gt;
	local num;&lt;br /&gt;
	local colorTime;&lt;br /&gt;
	-- X label related&lt;br /&gt;
	local xLabels = {}&lt;br /&gt;
	local xLCount = 0&lt;br /&gt;
	-- Y label related&lt;br /&gt;
	local yLabels = {}&lt;br /&gt;
	local yLCount = 0&lt;br /&gt;
&lt;br /&gt;
	if yesno(args[&amp;quot;yx&amp;quot;]) == true then&lt;br /&gt;
		isx = false&lt;br /&gt;
	else&lt;br /&gt;
		isx = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;x labels&amp;quot;] then                                                    -- Create xLabels&lt;br /&gt;
		for str in string.gmatch(args[&amp;quot;x labels&amp;quot;], &amp;quot;([^,]+)&amp;quot;) do&lt;br /&gt;
	        table.insert(xLabels,str)&lt;br /&gt;
	        xLCount = xLCount+1&lt;br /&gt;
	    end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;y labels&amp;quot;] then                                                    -- Create yLabels&lt;br /&gt;
		for str in string.gmatch(args[&amp;quot;y labels&amp;quot;], &amp;quot;([^,]+)&amp;quot;) do&lt;br /&gt;
			table.insert(yLabels,str)&lt;br /&gt;
			yLCount = yLCount+1&lt;br /&gt;
	    end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;dots&amp;quot;] then                                                        -- Creates xTable from dots&lt;br /&gt;
		local i = 0&lt;br /&gt;
		local j = 0&lt;br /&gt;
		&lt;br /&gt;
		for k,v in pairs(args) do&lt;br /&gt;
			if string.match(k,&amp;quot;%d+&amp;quot;) &lt;br /&gt;
			and not string.match(k,&amp;quot;color%-&amp;quot;) then&lt;br /&gt;
				table.insert(yTable,v)&lt;br /&gt;
				yCount = yCount+1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local cols = yCount / tonumber(args[&amp;quot;dots&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
		if cols ~= math.floor(cols) then&lt;br /&gt;
			return table.concat({&amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error&amp;quot;&amp;gt;The amount of y parameters (&amp;#039;,yCount,&amp;#039;) ÷ parameter dots (&amp;#039;,args[&amp;quot;dots&amp;quot;],&amp;#039;) is not a integer (&amp;#039;,cols,&amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;})&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		while(cols&amp;gt;i) do&lt;br /&gt;
			local xValue = ((100/cols*i)+(100/cols/10))*1.1&lt;br /&gt;
			i=i+1&lt;br /&gt;
			while(tonumber(args[&amp;quot;dots&amp;quot;])&amp;gt;j) do&lt;br /&gt;
				j=j+1&lt;br /&gt;
				table.insert(xTable,xValue)&lt;br /&gt;
				xCount = xCount + 1&lt;br /&gt;
			end&lt;br /&gt;
			j=0&lt;br /&gt;
		end&lt;br /&gt;
	else                                                                        -- Divides args into the yTable and the xTable&lt;br /&gt;
		for k,v in pairs(args) do                                               &lt;br /&gt;
			if string.match(k,&amp;quot;%d+&amp;quot;) &lt;br /&gt;
			and not string.match(k,&amp;quot;color%-&amp;quot;) then&lt;br /&gt;
				if isx == false then&lt;br /&gt;
					table.insert(yTable,v)&lt;br /&gt;
					yCount = yCount + 1&lt;br /&gt;
					isx = true&lt;br /&gt;
				elseif not args[&amp;quot;dots&amp;quot;] then&lt;br /&gt;
					table.insert(xTable,v)&lt;br /&gt;
					xCount = xCount + 1&lt;br /&gt;
					isx = false&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if xCount &amp;lt; yCount then                            &lt;br /&gt;
		return table.concat({&amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error&amp;quot;&amp;gt;The amount of x values (&amp;#039;,xCount,&amp;#039;) is less then the number y values (&amp;#039;,yCount,&amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;})&lt;br /&gt;
	elseif xCount &amp;gt; yCount then&lt;br /&gt;
		return table.concat({&amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error&amp;quot;&amp;gt;The amount of x values (&amp;#039;,xCount,&amp;#039;) is more then the number y values (&amp;#039;,yCount,&amp;#039;)&amp;lt;/span&amp;gt;&amp;#039;})&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;color-even&amp;quot;] then                                                  -- Creates the colorTable if color-even is set&lt;br /&gt;
		colorTime = false&lt;br /&gt;
		for k,v in pairs(yTable) do&lt;br /&gt;
			if colorTime == true then&lt;br /&gt;
				colorTable[k] = args[&amp;quot;color-even&amp;quot;]&lt;br /&gt;
				colorTime = false&lt;br /&gt;
			else&lt;br /&gt;
				colorTime = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;color-odd&amp;quot;] then                                                   -- Creates the colorTable if color-odd is set&lt;br /&gt;
		colorTime = true&lt;br /&gt;
		for k,v in pairs(yTable) do&lt;br /&gt;
			if colorTime == true then&lt;br /&gt;
				colorTable[k] = args[&amp;quot;color-odd&amp;quot;]&lt;br /&gt;
				colorTime = false&lt;br /&gt;
			else&lt;br /&gt;
				colorTime = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for k,v in pairs(args) do                                                   -- Adds values to the colorTable if color-# is set&lt;br /&gt;
		if k == mw.ustring.match(k,&amp;quot;color%-%d+&amp;quot;) then&lt;br /&gt;
			num = mw.ustring.gsub(k,&amp;quot;color%-&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
			num = tonumber(num)&lt;br /&gt;
			colorTable[num] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for k,y in pairs(yTable) do                                                 -- Creates the dotTable&lt;br /&gt;
		local InnerDiv = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		local div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		local size; &lt;br /&gt;
		if args[&amp;quot;size&amp;quot;] then&lt;br /&gt;
			size = tonumber(mw.ustring.match(args[&amp;quot;size&amp;quot;],&amp;quot;(%d+)&amp;quot;))&lt;br /&gt;
		else&lt;br /&gt;
			size = 8&lt;br /&gt;
		end&lt;br /&gt;
		x = xTable[k]&lt;br /&gt;
		InnerDiv&lt;br /&gt;
			:css(&amp;#039;position&amp;#039;,&amp;#039;absolute&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;top&amp;#039;,table.concat({&amp;#039;-&amp;#039;,size/2,&amp;#039;px&amp;#039;}))&lt;br /&gt;
			:css(&amp;#039;left&amp;#039;,table.concat({&amp;#039;-&amp;#039;,size/2,&amp;#039;px&amp;#039;}))&lt;br /&gt;
			:css(&amp;#039;line-height&amp;#039;,&amp;#039;0&amp;#039;)&lt;br /&gt;
			:wikitext(&amp;#039;[[File:Location dot &amp;#039;,colorTable[k] or &amp;#039;red&amp;#039;,&amp;#039;.svg|&amp;#039;,size,&amp;#039;x&amp;#039;,size,&amp;#039;px]]&amp;#039;)&lt;br /&gt;
		div&lt;br /&gt;
			:css(&amp;#039;position&amp;#039;,&amp;#039;absolute&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;bottom&amp;#039;,table.concat({y*0.85+15,&amp;#039;%&amp;#039;}))&lt;br /&gt;
			:css(&amp;#039;left&amp;#039;,table.concat({x*0.85+15,&amp;#039;%&amp;#039;}))&lt;br /&gt;
			:wikitext(tostring(InnerDiv))&lt;br /&gt;
		table.insert(dotTable,tostring(div))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for k,v in pairs(xLabels) do&lt;br /&gt;
		local div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		div&lt;br /&gt;
			:css(&amp;#039;position&amp;#039;,&amp;#039;absolute&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;bottom&amp;#039;,&amp;#039;0%&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;left&amp;#039;,table.concat({((100/xLCount*k-100/xLCount)*0.85+15)-4,&amp;#039;%&amp;#039;}))&lt;br /&gt;
			:wikitext(v)&lt;br /&gt;
		table.insert(dotTable,tostring(div))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for k,v in pairs(yLabels) do&lt;br /&gt;
		local div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		div&lt;br /&gt;
			:css(&amp;#039;position&amp;#039;,&amp;#039;absolute&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;bottom&amp;#039;,table.concat({(((((100/yLCount*k-100/yLCount)-(100/yLCount/3))+5))+100/yLCount/2)*1.02,&amp;#039;%&amp;#039;}))&lt;br /&gt;
			:css(&amp;#039;left&amp;#039;,&amp;#039;0%&amp;#039;)&lt;br /&gt;
			:wikitext(v)&lt;br /&gt;
		table.insert(dotTable,tostring(div))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(dotTable)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---------- L E G E N D ---------------------------------------------------------&lt;br /&gt;
---------- Makes the legendTable -----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function legend(args)&lt;br /&gt;
	local color;&lt;br /&gt;
	local aValue;&lt;br /&gt;
	local Table = {}&lt;br /&gt;
	for k,v in pairs(args) do                                                   -- Adds values to the table&lt;br /&gt;
		if k == mw.ustring.match(k,&amp;quot;legend%-%a+&amp;quot;) then&lt;br /&gt;
			color = mw.ustring.gsub(k,&amp;quot;legend%-&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
			v = table.concat({&amp;#039;&amp;lt;div&amp;gt;[[File:Location dot &amp;#039;,color or &amp;#039;red&amp;#039;,&amp;#039;.svg|8x8px]] (&amp;#039;,color,&amp;#039;) = &amp;#039;,v,&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;})&lt;br /&gt;
			table.insert(Table,v)&lt;br /&gt;
			aValue = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if aValue == true then&lt;br /&gt;
		return table.concat(Table)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
---------- P . G R A P H -------------------------------------------------------&lt;br /&gt;
---------- Returns all the dots in div tags-------------------------------------&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.graph(frame)         	                                        	-- Returns a graph with the dots on it&lt;br /&gt;
	if mw.ustring.match(p.data(frame),&amp;quot;&amp;lt;span&amp;quot;) then                             -- Return error messages from p.data&lt;br /&gt;
		return p.data(frame) &lt;br /&gt;
	end   &lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local picture = &amp;quot;Blank.png&amp;quot;&lt;br /&gt;
	local div = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	local center = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	local container = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	local top = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	local size; &lt;br /&gt;
	if args[&amp;quot;size&amp;quot;] then&lt;br /&gt;
		size = tonumber(mw.ustring.match(args[&amp;quot;size&amp;quot;],&amp;quot;(%d+)&amp;quot;))&lt;br /&gt;
	else&lt;br /&gt;
		size = 8&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;width&amp;quot;] then&lt;br /&gt;
		if args[&amp;quot;width&amp;quot;] == mw.ustring.match(args[&amp;quot;width&amp;quot;],&amp;quot;(%d+)&amp;quot;) then&lt;br /&gt;
			args[&amp;quot;width&amp;quot;] = table.concat({args[&amp;quot;width&amp;quot;],&amp;#039;px&amp;#039;})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;quot;picture&amp;quot;] then                                                     -- Set local picture&lt;br /&gt;
		picture = args[&amp;quot;picture&amp;quot;]&lt;br /&gt;
	elseif yesno(args[&amp;quot;square&amp;quot;]) == true then&lt;br /&gt;
		picture = &amp;quot;Transparent.png&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	picture = mw.ustring.gsub(picture,&amp;#039;|.+&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
	picture = mw.ustring.gsub(picture,&amp;#039;.-:&amp;#039;,&amp;#039;&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if p.data(frame) == &amp;quot;&amp;quot; then                                                 -- Don&amp;#039;t make box if empty&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	 &lt;br /&gt;
	if args[&amp;quot;top&amp;quot;] then&lt;br /&gt;
		top                                                                     -- Create top text&lt;br /&gt;
			:css(&amp;#039;font-weight&amp;#039;,&amp;#039;bold&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;text-decoration&amp;#039;,&amp;#039;underline&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;text-align&amp;#039;,&amp;#039;center&amp;#039;)&lt;br /&gt;
			:wikitext(args[&amp;quot;top&amp;quot;])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	container                                                                   -- Creates container&lt;br /&gt;
		:css(&amp;#039;width&amp;#039;,args[&amp;quot;width&amp;quot;] or &amp;#039;240px&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;float&amp;#039;,&amp;#039;right&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;position&amp;#039;,&amp;#039;relative&amp;#039;)&lt;br /&gt;
		:wikitext(&amp;#039;[[File:&amp;#039;,picture,&amp;#039;|&amp;#039;,args[&amp;quot;width&amp;quot;] or &amp;#039;240px&amp;#039;,&amp;#039;]]&amp;#039;)&lt;br /&gt;
		:wikitext(p.data(frame))&lt;br /&gt;
	div                                                                         -- Creates box&lt;br /&gt;
		:css(&amp;#039;width&amp;#039;,args[&amp;quot;width&amp;quot;] or &amp;#039;240px&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;display&amp;#039;,&amp;#039;inline-block&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;float&amp;#039;,args[&amp;quot;align&amp;quot;] or &amp;#039;right&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;margin&amp;#039;,args[&amp;quot;margin&amp;quot;] or &amp;#039;2px&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;padding&amp;#039;,args[&amp;quot;padding&amp;quot;] or table.concat({size/2,&amp;#039;px&amp;#039;}))&lt;br /&gt;
		:css(&amp;#039;background&amp;#039;,args[&amp;quot;color&amp;quot;] or &amp;#039;none&amp;#039;)&lt;br /&gt;
		:wikitext(tostring(top))&lt;br /&gt;
		:wikitext(tostring(container))&lt;br /&gt;
		:wikitext(legend(args))&lt;br /&gt;
		:wikitext(args[&amp;quot;bottom&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
	if yesno(args[&amp;#039;border&amp;#039;]) ~= false then                                      -- Creates box border&lt;br /&gt;
		div&lt;br /&gt;
			:css(&amp;#039;border-style&amp;#039;,&amp;#039;solid&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;border-color&amp;#039;,&amp;#039;black&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;border-width&amp;#039;,&amp;#039;3px&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if args[&amp;#039;align&amp;#039;] == &amp;#039;center&amp;#039; then                                           -- Centers output if needed&lt;br /&gt;
		center&lt;br /&gt;
			:addClass(&amp;#039;center&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;width&amp;#039;,&amp;#039;auto&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;margin-left&amp;#039;,&amp;#039;auto&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;margin-right&amp;#039;,&amp;#039;auto&amp;#039;)&lt;br /&gt;
			:wikitext(tostring(div))&lt;br /&gt;
		return center                                                   &lt;br /&gt;
	else&lt;br /&gt;
		return div&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Pppery</name></author>
	</entry>
</feed>