<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki3d.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ABar</id>
	<title>Module:Bar - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki3d.org/index.php?action=history&amp;feed=atom&amp;title=Module%3ABar"/>
	<link rel="alternate" type="text/html" href="https://mediawiki3d.org/index.php?title=Module:Bar&amp;action=history"/>
	<updated>2026-04-26T22:29:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://mediawiki3d.org/index.php?title=Module:Bar&amp;diff=2752&amp;oldid=prev</id>
		<title>OpenDEM 1: 1 revision imported from :wikipedia:en:Module:Bar</title>
		<link rel="alternate" type="text/html" href="https://mediawiki3d.org/index.php?title=Module:Bar&amp;diff=2752&amp;oldid=prev"/>
		<updated>2025-08-16T17:02:41Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported from &lt;a href=&quot;https://en.wikipedia.org/wiki/en:Module:Bar&quot; class=&quot;extiw&quot; title=&quot;wikipedia:en:Module:Bar&quot;&gt;wikipedia:en:Module:Bar&lt;/a&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:02, 16 August 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key wiki3d:diff:1.41:old-2751:rev-2752 --&gt;
&lt;/table&gt;</summary>
		<author><name>OpenDEM 1</name></author>
	</entry>
	<entry>
		<id>https://mediawiki3d.org/index.php?title=Module:Bar&amp;diff=2751&amp;oldid=prev</id>
		<title>wikipedia:en&gt;Pppery: Changed protection settings for &quot;Module:Bar&quot;: Match protection level with parent template ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://mediawiki3d.org/index.php?title=Module:Bar&amp;diff=2751&amp;oldid=prev"/>
		<updated>2025-08-11T16:01:06Z</updated>

		<summary type="html">&lt;p&gt;Changed protection settings for &amp;quot;&lt;a href=&quot;/index.php/Module:Bar&quot; title=&quot;Module:Bar&quot;&gt;Module:Bar&lt;/a&gt;&amp;quot;: Match protection level with parent template ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;Module:Lua class&amp;#039;)&lt;br /&gt;
require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local frame = mw.getCurrentFrame()&lt;br /&gt;
local metatable = {	-- Append to array by calling it&lt;br /&gt;
	__call = function (t, v) t[#t+1] = v end,&lt;br /&gt;
	__tostring = function(t) return table.concat(t) end&lt;br /&gt;
}&lt;br /&gt;
local function notblank(v) return (v or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039; end&lt;br /&gt;
local function ifblank(v, a) return notblank(v) and v or a end&lt;br /&gt;
&lt;br /&gt;
local BarBox = class(&amp;#039;BarBox&amp;#039;, {&lt;br /&gt;
&lt;br /&gt;
	_css = &amp;#039;Module:Bar/styles.css&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
	__init = function (self, args)&lt;br /&gt;
		self.css			 = args[1]  or args.css&lt;br /&gt;
		self.float			 = args[2]  or args.float or &amp;#039;none&amp;#039;&lt;br /&gt;
		self.backgroundcolor = args[3]  or args.backgroundcolor or &amp;#039;white&amp;#039;&lt;br /&gt;
		self.borderwidth	 = args[4]  or args.borderwidth or &amp;#039;1&amp;#039;&lt;br /&gt;
		self.style			 = args[5]  or args.style&lt;br /&gt;
		self.width			 = args[6]  or args.width-- or &amp;#039;auto&amp;#039;&lt;br /&gt;
		self.barwidth		 = args[7]  or args.barwidth or &amp;#039;100px&amp;#039;&lt;br /&gt;
		self.lineheight		 = args[8]  or args.lineheight-- or &amp;#039;1.6&amp;#039;&lt;br /&gt;
		self.title			 = args[9]  or args.title&lt;br /&gt;
		self.titlebar		 = args[10] or args.titlebar-- or &amp;#039;none&amp;#039;&lt;br /&gt;
		self.left1			 = args[11] or args.left1&lt;br /&gt;
		self.left2			 = args[12] or args.left2&lt;br /&gt;
		self.right1			 = args[13] or args.right1&lt;br /&gt;
		self.right2			 = args[14] or args.right2&lt;br /&gt;
		self.bars			 = args[15] or args.bars&lt;br /&gt;
		self.caption		 = args[16] or args.caption -- deprecated&lt;br /&gt;
		self.footer			 = args[17] or args.footer or args[16] or args.caption&lt;br /&gt;
	end,&lt;br /&gt;
&lt;br /&gt;
	create = function (cls, args)&lt;br /&gt;
		args = mw.clone(args)&lt;br /&gt;
		args.float	  = args.float and args.float:lower()&lt;br /&gt;
		args.width	  = tonumber(args.width) and args.width .. &amp;#039;px&amp;#039; or args.width and args.width:lower()&lt;br /&gt;
		args.barwidth = tonumber(args.barwidth) and args.barwidth .. &amp;#039;px&amp;#039; or args.barwidth and args.barwidth:lower()&lt;br /&gt;
		return cls(args)&lt;br /&gt;
	end,&lt;br /&gt;
&lt;br /&gt;
	_sDefaultAlign = &amp;#039;lrlr&amp;#039;,&lt;br /&gt;
	_tDefaultAlign = {false, &amp;#039;r&amp;#039;, false, &amp;#039;r&amp;#039;},&lt;br /&gt;
&lt;br /&gt;
	_setAlign = function (obj, align)&lt;br /&gt;
		obj._alignClasses = {}&lt;br /&gt;
		for i, d in ipairs(obj._tDefaultAlign) do&lt;br /&gt;
			local a = align:sub(i,i)&lt;br /&gt;
			if a == &amp;#039;l&amp;#039; then&lt;br /&gt;
				a = false&lt;br /&gt;
			elseif a == &amp;#039;d&amp;#039; then&lt;br /&gt;
				a = d&lt;br /&gt;
			elseif a ~= &amp;#039;c&amp;#039; and a ~= &amp;#039;r&amp;#039; then&lt;br /&gt;
				error(&amp;#039;unrecognized align[&amp;#039; .. i .. &amp;#039;]&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			obj._alignClasses[i] = a and &amp;#039;class=bb-&amp;#039; .. a&lt;br /&gt;
		end&lt;br /&gt;
	end,&lt;br /&gt;
&lt;br /&gt;
	html = function (self)&lt;br /&gt;
		local output = setmetatable({}, metatable)&lt;br /&gt;
&lt;br /&gt;
		output(frame:extensionTag(&amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, {src=self._css}) .. &amp;#039;\n&amp;#039;)&lt;br /&gt;
		output(self.css and frame:extensionTag(&amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, {src=self.css}) .. &amp;#039;\n&amp;#039; or &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		local class = &amp;#039;barbox&amp;#039;&lt;br /&gt;
		if self.float == &amp;#039;left&amp;#039; or self.float == &amp;#039;right&amp;#039; then&lt;br /&gt;
			class = class .. &amp;#039; t&amp;#039; .. self.float&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		output(&amp;#039;&amp;lt;div class=&amp;quot;&amp;#039; .. class .. &amp;#039;&amp;quot; style=&amp;quot;background:&amp;#039; ..&lt;br /&gt;
			self.backgroundcolor .. &amp;#039;; border:&amp;#039; .. self.borderwidth .. &amp;#039;px solid silver&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
		if self.float == &amp;#039;center&amp;#039; then output(&amp;#039;; margin:0 auto&amp;#039;) end&lt;br /&gt;
		if self.width then output(&amp;#039;; width:&amp;#039; .. self.width) end&lt;br /&gt;
		if self.style then output(&amp;#039;; &amp;#039; .. self.style) end&lt;br /&gt;
		output(&amp;#039;&amp;quot;&amp;gt;\n&amp;#039;)&lt;br /&gt;
			output(&amp;#039;{|&amp;#039;)&lt;br /&gt;
			if self.lineheight then	output(&amp;#039; style=&amp;quot;line-height:&amp;#039; .. self.lineheight .. &amp;#039;&amp;quot;&amp;#039;) end&lt;br /&gt;
			output(&amp;#039;\n&amp;#039;)&lt;br /&gt;
			if self.title then output(&lt;br /&gt;
				&amp;#039;|+ class=bb-default&amp;#039; .. (self.titlebar and &amp;#039; style=&amp;quot;background:&amp;#039; .. self.titlebar .. &amp;#039;&amp;quot;&amp;#039; or &amp;#039;&amp;#039;) .. &amp;#039; |\n&amp;#039; ..&lt;br /&gt;
				self.title .. &amp;#039;\n&amp;#039;&lt;br /&gt;
			) end&lt;br /&gt;
&lt;br /&gt;
			output(&amp;#039;|- class=bb-default style=&amp;quot;font-size:88%; min-height:4px&amp;quot;\n&amp;#039;)&lt;br /&gt;
				if self._alignClasses then -- same as self.__class._alignClasses&lt;br /&gt;
					self._alignClasses = self._alignClasses&lt;br /&gt;
					self.__class._alignClasses = nil&lt;br /&gt;
				else&lt;br /&gt;
					self._setAlign(self, self._sDefaultAlign)&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				local attributes =&lt;br /&gt;
					not self.left2 and &amp;#039;colspan=2&amp;#039; .. (self._alignClasses[1] and &amp;#039; &amp;#039; .. self._alignClasses[1] or &amp;#039;&amp;#039;) or self._alignClasses[1]&lt;br /&gt;
				output(&amp;#039;!&amp;#039; .. (attributes and attributes .. &amp;#039;|&amp;#039; or &amp;#039;&amp;#039;) .. (self.left1 or &amp;#039; &amp;#039;))&lt;br /&gt;
				output(self.left2 and &amp;#039;!!&amp;#039; .. (self._alignClasses[2] and self._alignClasses[2] .. &amp;#039;|&amp;#039; or &amp;#039;&amp;#039;) .. self.left2 or &amp;#039;&amp;#039;)&lt;br /&gt;
				output(&amp;#039;!!style=&amp;quot;width:&amp;#039; .. self.barwidth .. &amp;#039;&amp;quot;| &amp;#039;)&lt;br /&gt;
				attributes =&lt;br /&gt;
					not self.right2 and &amp;#039;colspan=2&amp;#039; .. (self._alignClasses[4] and &amp;#039; &amp;#039; .. self._alignClasses[4] or &amp;#039;&amp;#039;) or self._alignClasses[3]&lt;br /&gt;
				output(&amp;#039;!!&amp;#039; .. (attributes and attributes .. &amp;#039;|&amp;#039; or &amp;#039;&amp;#039;) .. (self.right1 or self.right2 and &amp;#039; &amp;#039; or &amp;#039;&amp;#039;))&lt;br /&gt;
				output(self.right2 and &amp;#039;!!&amp;#039; .. (self._alignClasses[4] and self._alignClasses[4] .. &amp;#039;|&amp;#039; or &amp;#039;&amp;#039;) .. self.right2 or &amp;#039;&amp;#039;)&lt;br /&gt;
			output(&amp;#039;\n&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
			if self.bars then output(self.bars .. &amp;#039;\n&amp;#039;) end&lt;br /&gt;
&lt;br /&gt;
			if self.caption then output(&amp;#039;\n[[Category:Pages using bar box with deprecated caption parameter]]&amp;#039;) end&lt;br /&gt;
			&lt;br /&gt;
			if self.footer then output(&lt;br /&gt;
				&amp;#039;|- class=bb-default\n| colspan=5 style=&amp;quot;padding:5px 0&amp;quot; | &amp;#039; .. -- &amp;lt;p&amp;gt; is created if \n precedes the footer&lt;br /&gt;
				self.footer .. &amp;#039;\n&amp;#039;&lt;br /&gt;
			) end&lt;br /&gt;
		output(&amp;#039;|}\n&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		return tostring(output)&lt;br /&gt;
	end,&lt;br /&gt;
&lt;br /&gt;
	__tostring = function (self)&lt;br /&gt;
		return self.html()&lt;br /&gt;
	end,&lt;br /&gt;
&lt;br /&gt;
	percent = function (args)&lt;br /&gt;
		local output = setmetatable({&amp;#039;|-&amp;#039;}, metatable)&lt;br /&gt;
		local percentage = (args[3] or &amp;#039;0&amp;#039;) .. &amp;#039;%&amp;#039;&lt;br /&gt;
		if args.bg then output(args.bg and &amp;#039;style=&amp;quot;background:&amp;#039; .. args.bg .. &amp;#039;&amp;quot;&amp;#039;) end&lt;br /&gt;
		output(&amp;#039;\n&amp;#039;)&lt;br /&gt;
			output(&amp;#039;|colspan=2 class=bb-min8|&amp;#039; .. (args[1] or &amp;#039; &amp;#039;))&lt;br /&gt;
			output(&amp;#039;||class=bb-b|&amp;#039;)&lt;br /&gt;
				output(&amp;#039;&amp;lt;div style=&amp;quot;background:&amp;#039; .. (args[2] or &amp;#039;gray&amp;#039;) .. &amp;#039;; width:&amp;#039; .. percentage .. &amp;#039;&amp;quot;&amp;gt;&amp;amp;#8203;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
			output(&amp;#039;||&amp;#039; .. (args.note and &amp;#039;&amp;#039; or &amp;#039;colspan=2 class=bb-r|&amp;#039;) .. (args[4] or percentage))&lt;br /&gt;
			if args.note then output(&amp;#039;||class=bb-r|&amp;#039; .. args.note) end&lt;br /&gt;
&lt;br /&gt;
		return tostring(output)&lt;br /&gt;
	end,&lt;br /&gt;
&lt;br /&gt;
	pixel = function (args)&lt;br /&gt;
		local output = setmetatable({&amp;#039;|-&amp;#039;}, metatable)&lt;br /&gt;
		local pixels = (args[3] or &amp;#039;0&amp;#039;)&lt;br /&gt;
		if args.bg then output(&amp;#039;style=&amp;quot;background:&amp;#039; .. args.bg .. &amp;#039;&amp;quot;&amp;#039;) end&lt;br /&gt;
		output(&amp;#039;\n&amp;#039;)&lt;br /&gt;
			output(&amp;#039;|colspan=2|&amp;#039; .. (args[1] or &amp;#039; &amp;#039;))&lt;br /&gt;
			output(&amp;#039;||class=bb-b|&amp;#039;)&lt;br /&gt;
				output(&amp;#039;&amp;lt;div style=&amp;quot;background:&amp;#039; .. (args[2] or &amp;#039;gray&amp;#039;) .. &amp;#039;; width:&amp;#039; .. pixels .. &amp;#039;px&amp;quot;&amp;gt;&amp;amp;#8203;&amp;lt;/div&amp;gt;&amp;#039;)&lt;br /&gt;
			output(&amp;#039;||class=&amp;quot;bb-min3&amp;#039; .. (args.note and &amp;#039;&amp;quot;&amp;#039; or &amp;#039; bb-r&amp;quot; colspan=2&amp;#039;) .. &amp;#039;|&amp;#039; .. (args[5] or pixels .. (args[4] or &amp;#039;&amp;#039;)))&lt;br /&gt;
			if args.note then output(&amp;#039;||class=bb-r|&amp;#039; .. args.note) end&lt;br /&gt;
&lt;br /&gt;
		return tostring(output)&lt;br /&gt;
	end,&lt;br /&gt;
&lt;br /&gt;
	stacked = function (cls, args)&lt;br /&gt;
		local output = setmetatable({&amp;#039;|-&amp;#039;}, metatable)&lt;br /&gt;
&lt;br /&gt;
		if args.id then&lt;br /&gt;
			output(&amp;#039;class=&amp;quot;mw-collapsible&amp;#039; ..&lt;br /&gt;
				(args.collapsed and &amp;#039; mw-collapsed&amp;#039; or &amp;#039;&amp;#039;) ..&lt;br /&gt;
				&amp;#039;&amp;quot; id=mw-customcollapsible-&amp;#039; .. args.id&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
		output(&amp;#039;\n&amp;#039;)&lt;br /&gt;
			if not cls._alignClasses then&lt;br /&gt;
				cls._setAlign(cls, args.align and args.align:lower() or cls._sDefaultAlign)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local attributes =&lt;br /&gt;
				not args.note1 and &amp;#039;colspan=2&amp;#039; .. (cls._alignClasses[1] and &amp;#039; &amp;#039; .. cls._alignClasses[1] or &amp;#039;&amp;#039;) or cls._alignClasses[1]&lt;br /&gt;
			output(&amp;#039;|&amp;#039; .. (attributes and attributes .. &amp;#039;|&amp;#039; or &amp;#039;&amp;#039;) .. (args[1] or &amp;#039; &amp;#039;))&lt;br /&gt;
			if args.note1 then&lt;br /&gt;
				output(&amp;#039;||&amp;#039; .. (cls._alignClasses[2] and cls._alignClasses[2] .. &amp;#039;|&amp;#039; or &amp;#039;&amp;#039;) .. args.note1)&lt;br /&gt;
			end&lt;br /&gt;
			output(&amp;#039;||class=bb-b|&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
				local len = 0 -- can&amp;#039;t use #args because of [[Module:Arguments#Known limitations]]&lt;br /&gt;
				for k in pairs(args) do&lt;br /&gt;
					local idx = tonumber(k) or 0&lt;br /&gt;
					if idx &amp;gt; len then len = idx end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				if args.bkgclasses then -- used when wikitext minimization is essential&lt;br /&gt;
					for i = 1, len-2 do&lt;br /&gt;
						local width, delim, title --is delim reset every cycle?&lt;br /&gt;
						width = args[i+2] or 0&lt;br /&gt;
						width = tonumber((&amp;#039;%.2f&amp;#039;):format(width))&lt;br /&gt;
						if width &amp;gt; 0 then&lt;br /&gt;
							if not delim then -- assuming title types are consistent&lt;br /&gt;
								delim = tonumber(args[&amp;#039;title&amp;#039; .. i]) and &amp;#039;&amp;#039; or &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
							end&lt;br /&gt;
							title = args[&amp;#039;title&amp;#039; .. i] and &amp;#039; title=&amp;#039; .. delim .. args[&amp;#039;title&amp;#039; .. i] .. delim or &amp;#039;&amp;#039;&lt;br /&gt;
							output(&lt;br /&gt;
								&amp;#039;&amp;lt;div&amp;#039; .. title .. &amp;#039; class=&amp;#039; .. args.bkgclasses[i] .. &amp;#039; style=width:&amp;#039; .. width .. &amp;#039;px&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
							)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					for i = 1, (len-2) / 2 do&lt;br /&gt;
						local width, title, background&lt;br /&gt;
						width = args[2*i + 2] or 0&lt;br /&gt;
						width = tonumber((&amp;#039;%.2f&amp;#039;):format(width))&lt;br /&gt;
						if width &amp;gt; 0 then&lt;br /&gt;
							title = args[&amp;#039;title&amp;#039; .. i] and &amp;#039; title=&amp;quot;&amp;#039; .. args[&amp;#039;title&amp;#039; .. i] .. &amp;#039;&amp;quot;&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
							background = args[2*i + 1] or &amp;#039;gray&amp;#039;&lt;br /&gt;
							output(&lt;br /&gt;
								&amp;#039;&amp;lt;div&amp;#039; .. title .. &amp;#039; style=&amp;quot;background:&amp;#039; .. background .. &amp;#039;;width:&amp;#039; .. width .. &amp;#039;px&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
							)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				if #output == 4 then output(&amp;#039; &amp;#039;) end&lt;br /&gt;
&lt;br /&gt;
			attributes =&lt;br /&gt;
				not args.note2 and &amp;#039;colspan=2&amp;#039; .. (cls._alignClasses[4] and &amp;#039; &amp;#039; .. cls._alignClasses[4] or &amp;#039;&amp;#039;) or cls._alignClasses[3]&lt;br /&gt;
			output(&amp;#039;||&amp;#039;)&lt;br /&gt;
			if attributes then output(attributes .. &amp;#039;|&amp;#039;) end&lt;br /&gt;
			if (args[2] or args.note2) then output(&amp;#039; &amp;#039;) end&lt;br /&gt;
			if args.note2 then&lt;br /&gt;
				output(&amp;#039;||&amp;#039;)&lt;br /&gt;
				if cls._alignClasses[4] then output (cls._alignClasses[4] .. &amp;#039;|&amp;#039;) end&lt;br /&gt;
				output(args.note2)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		return tostring(output)&lt;br /&gt;
	end,&lt;br /&gt;
&lt;br /&gt;
	gap = function (args)&lt;br /&gt;
		local output = setmetatable({&amp;#039;|-\n&amp;#039;}, metatable)&lt;br /&gt;
		local height = tonumber(args.height) and args.height .. &amp;#039;px&amp;#039; or args.height and args.height:lower() or &amp;#039;10px&amp;#039;&lt;br /&gt;
&lt;br /&gt;
			output(&amp;#039;|colspan=5 style=&amp;quot;height:&amp;#039; .. height .. &amp;#039;&amp;quot;|&amp;#039; .. (args[1] or &amp;#039;&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
		return tostring(output)&lt;br /&gt;
	end,&lt;br /&gt;
	&lt;br /&gt;
	[&amp;#039;table&amp;#039;] = function (args)&lt;br /&gt;
		local function expr(v, a)&lt;br /&gt;
			v = frame:callParserFunction(&amp;#039;formatnum&amp;#039;, {ifblank(v, a), &amp;#039;R&amp;#039;})&lt;br /&gt;
			v = frame:callParserFunction(&amp;#039;#expr&amp;#039;, v)&lt;br /&gt;
			return tonumber(ifblank(v, a)) or a&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local barValue = expr(args[1], 0)	&lt;br /&gt;
		local scale = expr(args[3], 1)&lt;br /&gt;
		local width = math.abs(scale * barValue)&lt;br /&gt;
		local height = ifblank(args[4], &amp;#039;2ex&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		local output = setmetatable({}, metatable)&lt;br /&gt;
		-- Handle the display of the value and unit (parameters 1 and 2) --&lt;br /&gt;
		if notblank(args[2]) then -- If a unit (parameter 2) is provided&lt;br /&gt;
			local titleparts = mw.text.split(args[2], &amp;#039;/&amp;#039;, true)&lt;br /&gt;
			if notblank(titleparts[2]) then -- If unit has multiple parts (e.g., &amp;#039;km|mi&amp;#039;), attempt conversion&lt;br /&gt;
				if notblank(titleparts[1]) then -- If unit has a single part, display value and unit directly&lt;br /&gt;
					output((args[1] or &amp;#039;&amp;#039;) .. args[2])&lt;br /&gt;
				else -- Otherwise, use the convert template to handle unit conversion&lt;br /&gt;
					local cvtArgs = {&lt;br /&gt;
						[1] = tostring(barValue),&lt;br /&gt;
						[2] = titleparts[2] or &amp;#039;&amp;#039;,&lt;br /&gt;
						[3] = titleparts[3] or &amp;#039;&amp;#039;,&lt;br /&gt;
						[4] = titleparts[4] or &amp;#039;&amp;#039;,&lt;br /&gt;
						abbr= &amp;#039;on&amp;#039;&lt;br /&gt;
					}&lt;br /&gt;
					local convert = require(&amp;#039;Module:Convert&amp;#039;)._convert&lt;br /&gt;
					output(convert({}, cvtArgs))&lt;br /&gt;
				end&lt;br /&gt;
			else -- If unit is simple, display value and unit without conversion&lt;br /&gt;
				output((args[1] or &amp;#039;&amp;#039;) .. args[2])&lt;br /&gt;
			end&lt;br /&gt;
		else -- If no unit is provided, display value or default to em dash&lt;br /&gt;
			output(ifblank(args[1], &amp;#039;&amp;amp;mdash;&amp;#039;))&lt;br /&gt;
		end&lt;br /&gt;
		-- Handle the bar visualization --&lt;br /&gt;
		local sortString = &amp;#039;data-sort-value=&amp;quot;&amp;#039; .. barValue .. &amp;#039;&amp;quot;|&amp;#039;&lt;br /&gt;
		local barString = sortString ..&lt;br /&gt;
			&amp;#039;&amp;lt;div style=&amp;quot;width:&amp;#039; .. width .. &amp;#039;px;height:&amp;#039; .. height .. &lt;br /&gt;
			&amp;#039;;background:#aaa;color:inherit;&amp;#039; .. (args[5] or &amp;#039;&amp;#039;) ..&lt;br /&gt;
			&amp;#039;&amp;quot; title=&amp;quot;&amp;#039; .. barValue .. &amp;#039;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
		&lt;br /&gt;
		if scale &amp;lt; 0 then -- If scale (parameter 3) is negative, add extra column&lt;br /&gt;
			output(&amp;#039;||&amp;#039;)&lt;br /&gt;
			if barValue &amp;lt; 0 then -- If value (parameter 1) is negative, align bar to the right &amp;amp; scale&lt;br /&gt;
				output(&amp;#039;align=&amp;quot;right&amp;quot; &amp;#039; .. barString)&lt;br /&gt;
			else -- output hidden sort key for sortable wikitables&lt;br /&gt;
				output(sortString)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		output(&amp;#039;\n|&amp;#039;)&lt;br /&gt;
		&lt;br /&gt;
		if barValue &amp;gt; 0 then -- if display value is positive, align bar to the left&lt;br /&gt;
			output(&amp;#039;align=&amp;quot;left&amp;quot; &amp;#039; .. barString)&lt;br /&gt;
		else -- output hidden sort key for sortable wikitables&lt;br /&gt;
			output(sortString)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return tostring(output)&lt;br /&gt;
	end,&lt;br /&gt;
&lt;br /&gt;
	__classmethods = {&amp;#039;create&amp;#039;, &amp;#039;stacked&amp;#039;},&lt;br /&gt;
	__staticmethods = {&amp;#039;_setAlign&amp;#039;, &amp;#039;percent&amp;#039;, &amp;#039;pixel&amp;#039;, &amp;#039;gap&amp;#039;},&lt;br /&gt;
	__slots = {&amp;#039;_alignClasses&amp;#039;}&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {BarBox}&lt;br /&gt;
&lt;br /&gt;
function p.box(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local box = BarBox.create(args)&lt;br /&gt;
	return tostring(box)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.percent(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return BarBox.percent(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.pixel(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return BarBox.pixel(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.log(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local outArgs = {[1] = args[2], [2] = args[3]}&lt;br /&gt;
	outArgs[3] = math.log((tonumber(args[4]) ~= nil) and (args[4] + 1) or 100)/&lt;br /&gt;
		math.log((tonumber(args[1]) ~= nil) and args[1] or 2)*30&lt;br /&gt;
	outArgs[5] = ifblank(args[6], ((args[4] or &amp;#039;&amp;#039;) .. (args[5] or &amp;#039;&amp;#039;)))&lt;br /&gt;
	return BarBox.pixel(outArgs)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.stacked(frame)&lt;br /&gt;
	local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
	local args = getArgs(frame, {&lt;br /&gt;
		valueFunc = function (key, value)&lt;br /&gt;
			if value then&lt;br /&gt;
				if key == &amp;#039;collapsed&amp;#039; then&lt;br /&gt;
					return yesno(value)&lt;br /&gt;
				elseif key == &amp;#039;bkgclasses&amp;#039; then&lt;br /&gt;
					return mw.text.jsonDecode(value) -- string to table&lt;br /&gt;
				end&lt;br /&gt;
				value = mw.text.trim(value)&lt;br /&gt;
				if value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					return value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
	return BarBox.stacked(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.gap(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return BarBox.gap(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bartable(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	return BarBox[&amp;#039;table&amp;#039;](args)&lt;br /&gt;
end&lt;br /&gt;
p[&amp;#039;table&amp;#039;] = p.bartable&lt;br /&gt;
&lt;br /&gt;
function p.tableTemplate(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	return BarBox[&amp;#039;table&amp;#039;](args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wikipedia:en&gt;Pppery</name></author>
	</entry>
</feed>