<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.osolia.xyz/index.php?action=history&amp;feed=atom&amp;title=Module%3AParliament_diagram</id>
	<title>Module:Parliament diagram - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.osolia.xyz/index.php?action=history&amp;feed=atom&amp;title=Module%3AParliament_diagram"/>
	<link rel="alternate" type="text/html" href="https://wiki.osolia.xyz/index.php?title=Module:Parliament_diagram&amp;action=history"/>
	<updated>2026-04-17T03:05:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.osolia.xyz/index.php?title=Module:Parliament_diagram&amp;diff=436&amp;oldid=prev</id>
		<title>Hydrogen: Created page with &quot;require(&#039;strict&#039;) local p = {} local getArgs = require(&#039;Module:Arguments&#039;).getArgs local errorCategory = &#039;Category:Compilation error of the Parliamentary diagram template&#039; local dimx = 175 local dimr = 50 local dimc = 40 local limite = 2000 local bgcolor = &quot;#fff&quot;  -- Error handler using xpcall, format the error local function errhandler(msg) 	local cat = mw.title.getCurrentTitle().namespace == 0 and errorCategory or &#039;&#039; 	return string.format(&#039;&lt;span class=&quot;error&quot;&gt;%s&lt;/s...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.osolia.xyz/index.php?title=Module:Parliament_diagram&amp;diff=436&amp;oldid=prev"/>
		<updated>2024-06-18T19:16:40Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;require(&amp;#039;strict&amp;#039;) local p = {} local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs local errorCategory = &amp;#039;&lt;a href=&quot;/index.php?title=Category:Compilation_error_of_the_Parliamentary_diagram_template&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Category:Compilation error of the Parliamentary diagram template (page does not exist)&quot;&gt;Category:Compilation error of the Parliamentary diagram template&lt;/a&gt;&amp;#039; local dimx = 175 local dimr = 50 local dimc = 40 local limite = 2000 local bgcolor = &amp;quot;#fff&amp;quot;  -- Error handler using xpcall, format the error local function errhandler(msg) 	local cat = mw.title.getCurrentTitle().namespace == 0 and errorCategory or &amp;#039;&amp;#039; 	return string.format(&amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;%s&amp;lt;/s...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local errorCategory = &amp;#039;[[Category:Compilation error of the Parliamentary diagram template]]&amp;#039;&lt;br /&gt;
local dimx = 175&lt;br /&gt;
local dimr = 50&lt;br /&gt;
local dimc = 40&lt;br /&gt;
local limite = 2000&lt;br /&gt;
local bgcolor = &amp;quot;#fff&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- Error handler using xpcall, format the error&lt;br /&gt;
local function errhandler(msg)&lt;br /&gt;
	local cat = mw.title.getCurrentTitle().namespace == 0 and errorCategory or &amp;#039;&amp;#039;&lt;br /&gt;
	return string.format(&amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;%s&amp;#039;, msg, cat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- create a single array from string&lt;br /&gt;
local function agg(a,...)&lt;br /&gt;
    local args = {...}&lt;br /&gt;
    for _, s in ipairs(args) do&lt;br /&gt;
        table.insert(a, s)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- get the party color from Module:Party color&lt;br /&gt;
-- a = party; b = optional color&lt;br /&gt;
local function color(a,b)&lt;br /&gt;
	local c = &amp;#039;#CCC&amp;#039;&lt;br /&gt;
	if (b) then&lt;br /&gt;
		c = b&lt;br /&gt;
	else&lt;br /&gt;
		c = &amp;quot;FFF&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if string.sub(c,1,5) == &amp;#039;&amp;amp;#35;&amp;#039; then c = &amp;quot;#&amp;quot; .. string.sub(c, 6, 11) end&lt;br /&gt;
	return c&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- create circles&lt;br /&gt;
local function values(n)&lt;br /&gt;
	local totals= {4, 17, 36, 65, 100, 144, 196, 255, 322, 398, 480, 571, 670, 776, 891, 1013, 1143, 1281, 1427, 1580, 1743, 1911, 2089}&lt;br /&gt;
&lt;br /&gt;
   	local dots = 0&lt;br /&gt;
	local benches = 1&lt;br /&gt;
	local jj,rr,aa&lt;br /&gt;
&lt;br /&gt;
	-- searches for the amount of benches needed to show all the dots&lt;br /&gt;
   	while (n &amp;gt; totals[benches]) do&lt;br /&gt;
      benches = benches + 1&lt;br /&gt;
	end&lt;br /&gt;
	local dd = dimr/benches -- distance between the arches&lt;br /&gt;
	dimc = 0.7*dimr/benches -- size of the circles&lt;br /&gt;
	local list = {} -- list of dots&lt;br /&gt;
	-- calculate angle and radius of each dot&lt;br /&gt;
	for rg=0,benches-2 do&lt;br /&gt;
		rr = dimx - dd*(2*rg+1) -- radius&lt;br /&gt;
    	jj = math.floor((n/totals[benches])*math.pi/(2*math.asin(dd/rr)))+1 --n° dots&lt;br /&gt;
    	if (jj==1) then&lt;br /&gt;
      		dots = dots + 1&lt;br /&gt;
        	list[dots] = {0.5, rr}&lt;br /&gt;
    	else&lt;br /&gt;
        	for ps=0,jj-1 do&lt;br /&gt;
        		aa = ps/(jj-1)&lt;br /&gt;
        		dots = dots + 1&lt;br /&gt;
        		list[dots] = {aa,rr}&lt;br /&gt;
        	end&lt;br /&gt;
        end&lt;br /&gt;
	end&lt;br /&gt;
	-- dots left to place on an internal arch&lt;br /&gt;
    jj=n-dots&lt;br /&gt;
    rr= dimx - dd*(2*benches-1) -- radius&lt;br /&gt;
    if (jj==1) then&lt;br /&gt;
		dots = dots + 1&lt;br /&gt;
		list[dots] = {1/2, rr}&lt;br /&gt;
    else&lt;br /&gt;
    	for ps=0,jj-1 do&lt;br /&gt;
			aa=ps/(jj-1)&lt;br /&gt;
			dots = dots + 1&lt;br /&gt;
			list[dots] = {aa,rr}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- order dots per increasing angle from the center&lt;br /&gt;
	table.sort(list, function(a,b) return ((a[1]&amp;lt;b[1]) or (a[1]==b[1] and a[2]&amp;lt;b[2])) end)&lt;br /&gt;
	return list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- create the parliamentary arch&lt;br /&gt;
function p._parliament(args)&lt;br /&gt;
	local ss = {}&lt;br /&gt;
	local ss2 = {}&lt;br /&gt;
	local data = {}&lt;br /&gt;
	local num = 1&lt;br /&gt;
	local totalDots = 0&lt;br /&gt;
	local cap = args.caption or &amp;#039;&amp;#039;&lt;br /&gt;
	local show = tonumber(args.show) or 0&lt;br /&gt;
&lt;br /&gt;
	while (args[&amp;#039;n&amp;#039;..num]) do&lt;br /&gt;
		if (tonumber(args[&amp;#039;n&amp;#039;..num])) then&lt;br /&gt;
			data[num] = {&lt;br /&gt;
				n = args[&amp;#039;n&amp;#039;..num] and tonumber(args[&amp;#039;n&amp;#039;..num]),&lt;br /&gt;
				c = color(args[&amp;#039;p&amp;#039;..num] or &amp;#039;&amp;#039;, args[&amp;#039;c&amp;#039;..num]),&lt;br /&gt;
				b = args[&amp;#039;b&amp;#039;..num] or &amp;#039;-&amp;#039;,&lt;br /&gt;
				p = args[&amp;#039;p&amp;#039;..num] or &amp;#039;Serie &amp;#039;..num&lt;br /&gt;
			}&lt;br /&gt;
			totalDots = totalDots + data[num].n&lt;br /&gt;
			num = num+1&lt;br /&gt;
		else&lt;br /&gt;
			error(string.format(&amp;#039;Invalid value for n%d&amp;#039;, num),2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	num = num - 1&lt;br /&gt;
	if (totalDots&amp;gt;limite) then&lt;br /&gt;
		error(&amp;#039;Number of dots superior to the limit&amp;#039;)&lt;br /&gt;
	elseif (totalDots&amp;lt;1) then&lt;br /&gt;
		error(&amp;#039;No dots are indicated&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local dots = values(totalDots)&lt;br /&gt;
	local width = 2*dimx&lt;br /&gt;
	local height = dimx+dimc&lt;br /&gt;
	local scale = 1.0&lt;br /&gt;
	if (args[&amp;#039;background&amp;#039;]) then&lt;br /&gt;
		bgcolor = args[&amp;#039;background&amp;#039;]&lt;br /&gt;
	end&lt;br /&gt;
	if (args[&amp;#039;width&amp;#039;] and tonumber(args[&amp;#039;width&amp;#039;])) then&lt;br /&gt;
		width = tonumber(args[&amp;#039;width&amp;#039;])&lt;br /&gt;
		scale = width/(2*dimx)&lt;br /&gt;
		height = (dimx+dimc)*scale&lt;br /&gt;
	elseif (args[&amp;#039;height&amp;#039;] and tonumber(args[&amp;#039;height&amp;#039;])) then&lt;br /&gt;
		height = tonumber(args[&amp;#039;height&amp;#039;])&lt;br /&gt;
		scale = height/(dimx+dimc)&lt;br /&gt;
		width = 2*dimx*scale&lt;br /&gt;
	elseif (totalDots&amp;lt;29) then&lt;br /&gt;
		width = 280&lt;br /&gt;
		scale = width/(2*dimx)&lt;br /&gt;
		height = (dimx+dimc)*scale&lt;br /&gt;
	elseif (totalDots&amp;lt;101) then&lt;br /&gt;
		width = 300&lt;br /&gt;
		scale = width/(2*dimx)&lt;br /&gt;
		height = (dimx+dimc)*scale&lt;br /&gt;
	elseif (totalDots&amp;lt;281) then&lt;br /&gt;
		width = 350&lt;br /&gt;
		scale = width/(2*dimx)&lt;br /&gt;
		height = (dimx+dimc)*scale&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- TEMPORARY FIX WHILE THE GRAPH EXTENSION IS DISABLED --&lt;br /&gt;
	local seats_diagram = require(&amp;#039;Module:Seats_diagram&amp;#039;)&lt;br /&gt;
	args.width = width&lt;br /&gt;
	if true then return tostring(seats_diagram._parliament(args)) end&lt;br /&gt;
	---------------------------------------------------------&lt;br /&gt;
	&lt;br /&gt;
	local graph = {&lt;br /&gt;
		version = 2, width = width, height = height, padding = &amp;quot;no&amp;quot;,&lt;br /&gt;
		background = bgcolor,&lt;br /&gt;
		data = { },&lt;br /&gt;
		scales = {&lt;br /&gt;
			{ name = &amp;quot;x&amp;quot;, type = &amp;quot;linear&amp;quot;, range = &amp;quot;width&amp;quot;, zero = true, domainMin = 0, domainMax = 2*dimx },&lt;br /&gt;
			{ name = &amp;quot;y&amp;quot;, type = &amp;quot;linear&amp;quot;, range = &amp;quot;height&amp;quot;, zero = true, domainMin = 0, domainMax = dimx + dimc }&lt;br /&gt;
		},&lt;br /&gt;
		marks = { }&lt;br /&gt;
	}&lt;br /&gt;
	local ee = 0&lt;br /&gt;
	local values&lt;br /&gt;
	for i=1,num do&lt;br /&gt;
		values = {}&lt;br /&gt;
		for j=1,data[i].n do&lt;br /&gt;
			ee = ee + 1&lt;br /&gt;
			values[j] = {&lt;br /&gt;
				px = dimx-dots[ee][2]*math.cos(math.pi*dots[ee][1]),&lt;br /&gt;
				py = dimc+dots[ee][2]*math.sin(math.pi*dots[ee][1]),&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		graph[&amp;#039;data&amp;#039;][i] = { name = &amp;quot;tab&amp;quot;..i, values = values }&lt;br /&gt;
		graph[&amp;#039;marks&amp;#039;][i] = { type = &amp;quot;symbol&amp;quot;, from = {data = &amp;quot;tab&amp;quot;..i },&lt;br /&gt;
			properties = {&lt;br /&gt;
				enter = {&lt;br /&gt;
					x = {scale = &amp;quot;x&amp;quot;,field = &amp;quot;px&amp;quot;},&lt;br /&gt;
					y = {scale = &amp;quot;y&amp;quot;,field = &amp;quot;py&amp;quot;},&lt;br /&gt;
					fill = {value = data[i].c},&lt;br /&gt;
					size = {value = (2*dimc*scale)^2}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if (data[i].b ~= &amp;quot;-&amp;quot;) then&lt;br /&gt;
			local bl = data[i].b&lt;br /&gt;
			if string.sub(bl,1,5) == &amp;#039;&amp;amp;#35;&amp;#039; then bl = &amp;quot;#&amp;quot; .. string.sub(bl, 6, 11) end&lt;br /&gt;
			graph[&amp;#039;marks&amp;#039;][i][&amp;#039;properties&amp;#039;][&amp;#039;enter&amp;#039;][&amp;#039;stroke&amp;#039;] = {value = bl}&lt;br /&gt;
			graph[&amp;#039;marks&amp;#039;][i][&amp;#039;properties&amp;#039;][&amp;#039;enter&amp;#039;][&amp;#039;strokeWidth&amp;#039;] = {value = 1}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	graph[&amp;#039;marks&amp;#039;][num+1] = {&lt;br /&gt;
		type = &amp;quot;text&amp;quot;,&lt;br /&gt;
		properties = {&lt;br /&gt;
			enter = {&lt;br /&gt;
				x = {scale = &amp;quot;x&amp;quot;,value=dimx},&lt;br /&gt;
				y = {scale = &amp;quot;y&amp;quot;,value=dimc+8},&lt;br /&gt;
				align = {value = &amp;quot;center&amp;quot;},&lt;br /&gt;
				fill = {value = &amp;quot;#000&amp;quot;},&lt;br /&gt;
				font = {value = &amp;quot;Helvetica&amp;quot;},&lt;br /&gt;
				fontSize = { value = 36*scale },&lt;br /&gt;
				fontWeight = { value = &amp;quot;bold&amp;quot; },&lt;br /&gt;
				text = {value = totalDots }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	agg(ss, mw.getCurrentFrame():extensionTag(&amp;#039;graph&amp;#039;, mw.text.jsonEncode(graph)))&lt;br /&gt;
	if (cap ~= &amp;#039;&amp;#039;) then&lt;br /&gt;
		agg(ss,string.format(&amp;#039;&amp;lt;p style=&amp;quot;font-size:90%%; margin-left:10px&amp;quot;&amp;gt;%s&amp;lt;/p&amp;gt;&amp;#039;,cap))&lt;br /&gt;
	end&lt;br /&gt;
	if show == 1 then&lt;br /&gt;
		for i=1,num do&lt;br /&gt;
			agg(ss2,string.format(&amp;#039;&amp;lt;span style=&amp;quot;display:inline-block;border:solid grey 1px;background:%s;width:1em;height:1em&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;amp;nbsp;%s&amp;#039;, data[i].c, data[i].n))&lt;br /&gt;
		end&lt;br /&gt;
		agg(ss,&amp;#039;&amp;lt;p style=&amp;quot;font-size:90%; margin-left:10px&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
		agg(ss,table.concat(ss2,&amp;quot; · &amp;quot;))&lt;br /&gt;
		agg(ss,&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;)&lt;br /&gt;
	elseif show ==2 then&lt;br /&gt;
		for i=1,num do&lt;br /&gt;
			agg(ss2,string.format(&amp;#039;&amp;lt;span style=&amp;quot;display:inline-block;border:solid grey 1px;background:%s;width:1em;height:1em&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;amp;nbsp;%s %s&amp;#039;, data[i].c, data[i].p, data[i].n))&lt;br /&gt;
		end&lt;br /&gt;
		agg(ss,&amp;#039;&amp;lt;p style=&amp;quot;font-size:90%; margin-left:10px&amp;quot;&amp;gt;&amp;#039;)&lt;br /&gt;
		agg(ss,table.concat(ss2,&amp;quot;&amp;lt;br/&amp;gt;&amp;quot;))&lt;br /&gt;
		agg(ss,&amp;#039;&amp;lt;/p&amp;gt;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if args[&amp;#039;debug&amp;#039;] then&lt;br /&gt;
		return mw.text.jsonEncode(graph)&lt;br /&gt;
	else&lt;br /&gt;
		return table.concat(ss)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.parliament(frame)&lt;br /&gt;
	return select(2, xpcall(function()&lt;br /&gt;
		return p._parliament(getArgs(frame, { parentOnly = true }))&lt;br /&gt;
	end, errhandler))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Hydrogen</name></author>
	</entry>
</feed>