<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wicri-demo.istex.fr/Wicri/SitDemIstex/V131/pool/index.php?action=history&amp;feed=atom&amp;title=Module%3ASize</id>
	<title>Module:Size - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wicri-demo.istex.fr/Wicri/SitDemIstex/V131/pool/index.php?action=history&amp;feed=atom&amp;title=Module%3ASize"/>
	<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/SitDemIstex/V131/pool/index.php?title=Module:Size&amp;action=history"/>
	<updated>2026-04-19T13:33:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.10</generator>
	<entry>
		<id>https://wicri-demo.istex.fr/Wicri/SitDemIstex/V131/pool/index.php?title=Module:Size&amp;diff=10908&amp;oldid=prev</id>
		<title>Jacques Ducloy at 09:32, 2 November 2018</title>
		<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/SitDemIstex/V131/pool/index.php?title=Module:Size&amp;diff=10908&amp;oldid=prev"/>
		<updated>2018-11-02T09:32:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&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: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 09:32, 2 November 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l304&quot; &gt;Line 304:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 304:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			val = tonumber(val)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			val = tonumber(val)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if type(val)=='number' then &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			if type(val)=='number' then &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				local dimStr = wdLabel(dimName[field], lang, '-', &amp;quot;ucfirst&amp;quot;) &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				local dimStr = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;'???' -- &lt;/ins&gt;wdLabel(dimName[field], lang, '-', &amp;quot;ucfirst&amp;quot;) &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				local valStr = unit_conversion(val, units[field] or unit, prec, lang, wordsep)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				local valStr = unit_conversion(val, units[field] or unit, prec, lang, wordsep)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(results, dimStr .. colon .. valStr) &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;				table.insert(results, dimStr .. colon .. valStr) &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jacques Ducloy</name></author>
		
	</entry>
	<entry>
		<id>https://wicri-demo.istex.fr/Wicri/SitDemIstex/V131/pool/index.php?title=Module:Size&amp;diff=10907&amp;oldid=prev</id>
		<title>Jacques Ducloy: Created page with &quot;--[[   __  __           _       _        ____  _           |  \/  | ___   __| |_   _| | ___ _/ ___|(_)_______   | |\/| |/ _ \ / _` | | | | |/ _ (_)___ \| |_  / _ \  | |  | | (...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wicri-demo.istex.fr/Wicri/SitDemIstex/V131/pool/index.php?title=Module:Size&amp;diff=10907&amp;oldid=prev"/>
		<updated>2018-11-02T08:57:05Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--[[   __  __           _       _        ____  _           |  \/  | ___   __| |_   _| | ___ _/ ___|(_)_______   | |\/| |/ _ \ / _` | | | | |/ _ (_)___ \| |_  / _ \  | |  | | (...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
  __  __           _       _        ____  _         &lt;br /&gt;
 |  \/  | ___   __| |_   _| | ___ _/ ___|(_)_______ &lt;br /&gt;
 | |\/| |/ _ \ / _` | | | | |/ _ (_)___ \| |_  / _ \&lt;br /&gt;
 | |  | | (_) | (_| | |_| | |  __/_ ___) | |/ /  __/&lt;br /&gt;
 |_|  |_|\___/ \__,_|\__,_|_|\___(_)____/|_/___\___|&lt;br /&gt;
                                                    &lt;br /&gt;
Authors and maintainers:&lt;br /&gt;
* User:Zolo   - original draft&lt;br /&gt;
* User:Jarekt - original version&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local formatnum = require &amp;quot;Module:Formatnum&amp;quot;.formatNum&lt;br /&gt;
local wdLabel   = require &amp;quot;Module:Wikidata label&amp;quot;._getLabel&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === global parameters  ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
&lt;br /&gt;
--  arrays for unit conversion   3     4     5     6     7       8       9        10     11  12    13   14       15&lt;br /&gt;
local unitMult   = {1e-9, 1e-6, 1e-3, 1e-2,  1  , 1e3 , 0.0254, 0.3048, 0.9144, 1609.344, 1, 1e3, 1e6, 28.3495, 453.592, 1}  -- conversion to meters&lt;br /&gt;
local unitList   = {'nm', 'um', 'mm', &amp;quot;cm&amp;quot;, &amp;quot;m&amp;quot; , &amp;quot;km&amp;quot;, &amp;quot;in&amp;quot;  , &amp;quot;ft&amp;quot;  , &amp;quot;yd&amp;quot;  , &amp;quot;mi&amp;quot;,    &amp;quot;g&amp;quot;, &amp;quot;kg&amp;quot;, &amp;quot;t&amp;quot;, &amp;quot;oz&amp;quot;, &amp;quot;lb&amp;quot;, &amp;quot;ct&amp;quot; }   -- units handled by this module&lt;br /&gt;
local unitType   = {'m' , 'm' , 'm' , 'm' , 'm' , 'm' , 'i'   , 'i'   , 'i'   , 'i' ,    'm', 'm' , 'm', 'i' , 'i', ''    }   -- m for metric and i for imperial&lt;br /&gt;
local unitItem   = {nm='Q178674', um='Q175821', mm='Q174789', cm='Q174728', m='Q11573', km='Q828224',     -- used for unit abbreviation translation&lt;br /&gt;
                    ['in']='Q218593', ft='Q3710', yd='Q482798', mi='Q253276', kg='Q11570', g='Q41803', t='Q191118', oz='Q48013', lb=&amp;quot;Q100995&amp;quot;, ct=&amp;quot;Q261247&amp;quot; }&lt;br /&gt;
-- properties used for harvesting the wikidata 	and item IDs are used for translating dimension's name									&lt;br /&gt;
local dimProp = { length='P2043' , height='P2048'  , width='P2049' , depthH='P5524',    depthV='P4511'  , thickness='P2610'   , diameter='P2386' , radius='P2120'  , perimeter='P2547' , weight='P2067'}&lt;br /&gt;
local dimName = { length='Q36253', height='Q208826', width='Q35059', depthH='Q3250078', depthV='Q930412', thickness='Q3589038', diameter='Q37221', radius='Q173817', perimeter='Q28474', weight='Q11423'} &lt;br /&gt;
&lt;br /&gt;
local	aliases    = { -- aliases for units used to unify&lt;br /&gt;
	Q178674=&amp;quot;nm&amp;quot;, nm=&amp;quot;nm&amp;quot;, nanometer=&amp;quot;nm&amp;quot;,	nanometers= &amp;quot;nm&amp;quot;, nanometre=&amp;quot;nm&amp;quot;, nanometres=&amp;quot;nm&amp;quot;,&lt;br /&gt;
	Q175821=&amp;quot;um&amp;quot;,	um=&amp;quot;um&amp;quot;, [&amp;quot;µm&amp;quot;]=&amp;quot;um&amp;quot;, micrometer=&amp;quot;um&amp;quot;, micrometers=&amp;quot;um&amp;quot;, micrometre=&amp;quot;um&amp;quot;, micrometres=&amp;quot;um&amp;quot;,&lt;br /&gt;
	Q200323=&amp;quot;dm&amp;quot;, dm=&amp;quot;dm&amp;quot;, decimeter=&amp;quot;dm&amp;quot;, decimeters=&amp;quot;dm&amp;quot;, decimetre=&amp;quot;dm&amp;quot;, decimetres=&amp;quot;dm&amp;quot;,&lt;br /&gt;
	Q174789=&amp;quot;mm&amp;quot;, mm=&amp;quot;mm&amp;quot;, millimeter=&amp;quot;mm&amp;quot;, millimeters=&amp;quot;mm&amp;quot;, millimetre=&amp;quot;mm&amp;quot;, millimetres=&amp;quot;mm&amp;quot;,&lt;br /&gt;
	Q174728=&amp;quot;cm&amp;quot;, cm=&amp;quot;cm&amp;quot;, centimeter=&amp;quot;cm&amp;quot;, centimeters=&amp;quot;cm&amp;quot;, centimetre=&amp;quot;cm&amp;quot;, centimetres=&amp;quot;cm&amp;quot;,&lt;br /&gt;
	Q11573=&amp;quot;m&amp;quot;, m=&amp;quot;m&amp;quot;, meter=&amp;quot;m&amp;quot;, meters=&amp;quot;m&amp;quot;, metre=&amp;quot;m&amp;quot;, metres=&amp;quot;m&amp;quot;, &lt;br /&gt;
	Q828224=&amp;quot;km&amp;quot;, km=&amp;quot;km&amp;quot;, kilometer=&amp;quot;km&amp;quot;, kilometers=&amp;quot;km&amp;quot;, kilometre=&amp;quot;km&amp;quot;, kilometres=&amp;quot;km&amp;quot;,&lt;br /&gt;
	Q218593=&amp;quot;in&amp;quot;, [&amp;quot;in&amp;quot;]=&amp;quot;in&amp;quot;, inch=&amp;quot;in&amp;quot;, inches=&amp;quot;in&amp;quot;,&lt;br /&gt;
	Q3710=&amp;quot;ft&amp;quot;, ft=&amp;quot;ft&amp;quot;, foot=&amp;quot;ft&amp;quot;, feet=&amp;quot;ft&amp;quot;, &lt;br /&gt;
	Q482798=&amp;quot;yd&amp;quot;, yd=&amp;quot;yd&amp;quot;, yard=&amp;quot;yd&amp;quot;, yards=&amp;quot;yd&amp;quot;,&lt;br /&gt;
	Q253276=&amp;quot;mi&amp;quot;, mi=&amp;quot;mi&amp;quot;, mile=&amp;quot;mi&amp;quot;, miles=&amp;quot;mi&amp;quot;,&lt;br /&gt;
	Q93318=&amp;quot;nmi&amp;quot;, nmi=&amp;quot;nmi&amp;quot;, [&amp;quot;nautic mile&amp;quot;]=&amp;quot;nmi&amp;quot;, [&amp;quot;nautic miles&amp;quot;]=&amp;quot;nmi&amp;quot;,&lt;br /&gt;
	Q11570=&amp;quot;kg&amp;quot;, kilogram=&amp;quot;kg&amp;quot;, kilograms=&amp;quot;kg&amp;quot;, kg=&amp;quot;kg&amp;quot;,&lt;br /&gt;
	Q41803=&amp;quot;g&amp;quot;, gram=&amp;quot;g&amp;quot;, grams=&amp;quot;g&amp;quot;, g=&amp;quot;g&amp;quot;,&lt;br /&gt;
	Q191118=&amp;quot;t&amp;quot;, tonne=&amp;quot;t&amp;quot;, tonnes=&amp;quot;t&amp;quot;, ton=&amp;quot;t&amp;quot;, tons=&amp;quot;t&amp;quot;, [&amp;quot;metric ton&amp;quot;]=&amp;quot;t&amp;quot;, t=&amp;quot;t&amp;quot;, &lt;br /&gt;
	Q48013=&amp;quot;oz&amp;quot;, ounce=&amp;quot;oz&amp;quot;, oz=&amp;quot;oz&amp;quot;, &lt;br /&gt;
	Q100995=&amp;quot;lb&amp;quot;, pound=&amp;quot;lb&amp;quot;, pounds=&amp;quot;lb&amp;quot;, lb=&amp;quot;lb&amp;quot;,&lt;br /&gt;
	Q261247=&amp;quot;ct&amp;quot;, carat=&amp;quot;ct&amp;quot;, ct=&amp;quot;ct&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === Internal functions ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
local function langSwitch(list,lang)&lt;br /&gt;
	local langList = mw.language.getFallbacksFor(lang)&lt;br /&gt;
	table.insert(langList,1,lang)&lt;br /&gt;
	for i,language in ipairs(langList) do&lt;br /&gt;
		if list[language] then&lt;br /&gt;
			return list[language]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getProperty(itemID, prop, lang)&lt;br /&gt;
	local n, title = 0, {}&lt;br /&gt;
	entity = mw.wikibase.getEntity(itemID)&lt;br /&gt;
	for _, statement in pairs( entity:getBestStatements(prop)) do &lt;br /&gt;
		if (statement.mainsnak.snaktype == &amp;quot;value&amp;quot;) then &lt;br /&gt;
			local val = statement.mainsnak.datavalue.value&lt;br /&gt;
			title[val.language] = val.text -- look for multiple values each with a language code&lt;br /&gt;
			n = n+1;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if n&amp;gt;0 then&lt;br /&gt;
		return langSwitch(title, lang)&lt;br /&gt;
	end&lt;br /&gt;
	--return ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function normalize_input_args(input_args, output_args)&lt;br /&gt;
	for name, value in pairs( input_args ) do &lt;br /&gt;
		if value ~= '' then -- nuke empty strings&lt;br /&gt;
			if type(name)=='string' then &lt;br /&gt;
				name = string.lower(name)&lt;br /&gt;
			end&lt;br /&gt;
			output_args[name] = string.gsub(value, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;) -- trim whitespaces from the beggining and the end of the string&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return output_args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function findInArray(str, list)&lt;br /&gt;
	for k, v in ipairs(list) do&lt;br /&gt;
		if v==str then                -- match units with the list&lt;br /&gt;
			return k;&lt;br /&gt;
		end&lt;br /&gt;
	end	&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatNum( value, lang, precision )&lt;br /&gt;
	assert(value, &amp;quot;Input value is nil&amp;quot;)&lt;br /&gt;
	assert(precision, &amp;quot;Input precision is nil&amp;quot;)&lt;br /&gt;
	local str = formatnum( value, lang, precision )&lt;br /&gt;
	str = mw.ustring.gsub(str, &amp;quot;%.0+$&amp;quot;, &amp;quot;&amp;quot;) -- remove trailing zeros&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
INPUTS:&lt;br /&gt;
* v - size in meters&lt;br /&gt;
* unitMult - array used to convert meters to other units&lt;br /&gt;
* iMin, iMax - min and max index of unitMult array to use&lt;br /&gt;
]]&lt;br /&gt;
local function niceNumber(v, iMin, iMax)&lt;br /&gt;
	s = 10; -- scaling parameter. Means that &amp;quot;nice&amp;quot; numbers are in units that give the smallest number bigger than s&lt;br /&gt;
	if v&amp;lt;s*unitMult[iMin] then&lt;br /&gt;
			return iMin  -- will show as fractions of the smallest unit&lt;br /&gt;
	end&lt;br /&gt;
	for k = iMin,iMax-1 do&lt;br /&gt;
		if v&amp;gt;=s*unitMult[k] and v&amp;lt;s*unitMult[k+1] then&lt;br /&gt;
			return k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return iMax -- will use the largest unit&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function pickUnit(val, unit, lang)&lt;br /&gt;
	local k1, k2, unit1, unit2&lt;br /&gt;
	unit1 = aliases[unit]                                         -- convert unit item ID to standard units&lt;br /&gt;
	assert(unit1, &amp;quot;Unit name is not recognized: &amp;quot; .. unit)&lt;br /&gt;
	k1    = findInArray(unit1, unitList)	&lt;br /&gt;
	unit1 = getProperty(unitItem[unit1], 'P5061', lang) -- gets the abbreviated form of the name of the unit&lt;br /&gt;
	&lt;br /&gt;
	local valInM = val*unitMult[k1]            -- find value in metres&lt;br /&gt;
	if (k1&amp;lt;=6) then                         -- input units are metric length&lt;br /&gt;
		k2 = niceNumber(valInM, 7, 10) -- find best imperial units&lt;br /&gt;
	elseif (k1&amp;lt;=10) then                    -- input units are imperial length&lt;br /&gt;
		k2 = niceNumber(valInM, 1, 6)  -- find best metric units&lt;br /&gt;
	elseif (k1&amp;lt;=13) then                    -- input units are metric weight&lt;br /&gt;
		k2 = niceNumber(valInM, 14, 15)-- find best imperial units&lt;br /&gt;
	else                                    -- input units are imperial weight&lt;br /&gt;
		k2 = niceNumber(valInM, 11, 13)-- find best metric units&lt;br /&gt;
	end&lt;br /&gt;
	factor = unitMult[k1]/unitMult[k2]&lt;br /&gt;
	unit2 = getProperty(unitItem[unitList[k2]], 'P5061', lang) -- gets the abbreviated form of the name of the unit&lt;br /&gt;
	return unit1 or unit, unit2 or unitItem[unitList[k2]], factor, unitType[k1]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function unit_conversion(val, unit, prec, lang, wordsep)&lt;br /&gt;
	local factor, unit1, unit2, numStr1, numStr2, system&lt;br /&gt;
&lt;br /&gt;
	unit1, unit2, factor, system = pickUnit(val, unit, lang) -- based on val magnitude and unit, translate unit and provide coversion factor to convert to other type of units&lt;br /&gt;
&lt;br /&gt;
	numStr1 = formatNum( val, lang, prec)  .. wordsep .. unit1&lt;br /&gt;
	if (lang~='en' and lang~='en-US' and system=='m') or (system=='') then -- if input is in metric units and output language is not English then show only metric output&lt;br /&gt;
		return numStr1 --  just show metric values&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- final string in imperial and metric units&lt;br /&gt;
	numStr2 = formatNum( val*factor, lang, prec)&lt;br /&gt;
	return mw.ustring.format(&amp;quot;%s%s(%s%s%s)&amp;quot;, numStr1, wordsep, numStr2, wordsep, unit2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function disambiguate_dimensions(args)&lt;br /&gt;
	-- compare painting dimensions to image dimensions&lt;br /&gt;
	if args[2] and args[3] and not args[4] then&lt;br /&gt;
		local title = mw.title.getCurrentTitle()&lt;br /&gt;
		if title.namespace==6 then  -- this is a file&lt;br /&gt;
			local width, height, ratio, R, dr1, dr2, dr&lt;br /&gt;
			width  = title.file.width&lt;br /&gt;
			height = title.file.height&lt;br /&gt;
			ratio  = 1.0*height/width           -- file size ratio&lt;br /&gt;
			R      = 1.0*args[2]/args[3]        -- painting size ratio&lt;br /&gt;
			dr1    = math.abs(  R-ratio)/ratio  -- compare ratios&lt;br /&gt;
			dr2    = math.abs(1/R-ratio)/ratio&lt;br /&gt;
			dr     = math.min(dr1, dr2)&lt;br /&gt;
			args.debug = string.format('width=%f; height=%f; ratio=%f; R=%f; dr=%f', width, height, ratio, R, dr)&lt;br /&gt;
			if dr&amp;lt;0.1 and (ratio&amp;gt;1.15 or ratio&amp;lt;0.85) then -- ratios are within 10% from each other and image is not square&lt;br /&gt;
				if dr1&amp;lt;dr2 then&lt;br /&gt;
					args.height, args.width  = args[2], args[3]&lt;br /&gt;
				else&lt;br /&gt;
					args.height, args.width = args[3], args[2]&lt;br /&gt;
				end&lt;br /&gt;
				args[2], args[3] = nil, nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
-- === External functions ===========================&lt;br /&gt;
-- ==================================================&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._size_old(args, unit, prec, lang)&lt;br /&gt;
--This function mimics the functionality of the original {{Size|unit|dim1|dim2|dim3}} template&lt;br /&gt;
&lt;br /&gt;
	if not prec then&lt;br /&gt;
		prec = 1;&lt;br /&gt;
		if unit == 'mm' then prec=2; end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- process values&lt;br /&gt;
	local val, mean = {}, 0&lt;br /&gt;
	for i = 2,4 do&lt;br /&gt;
		v = args[i]&lt;br /&gt;
		if v then&lt;br /&gt;
			v = string.gsub(v, ',', '.')&lt;br /&gt;
			v = tonumber(v)&lt;br /&gt;
			if type(v)=='number' and v&amp;gt;0 then&lt;br /&gt;
				table.insert(val, v)&lt;br /&gt;
				mean = mean + v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	mean = mean / #val -- find mean of 3 dimensions&lt;br /&gt;
	assert(#val&amp;gt;0, &amp;quot;No numeric dimensions found.&amp;quot;)&lt;br /&gt;
	--if n==0 then return '' end&lt;br /&gt;
	&lt;br /&gt;
	-- pick metric and imperial units&lt;br /&gt;
	local factor, unit1, unit2, system &lt;br /&gt;
	unit1, unit2, factor, system = pickUnit(mean, unit, lang)&lt;br /&gt;
&lt;br /&gt;
	-- convert numbers to localized strings&lt;br /&gt;
	local numStr1, numStr2 = {}, {}&lt;br /&gt;
	for _, v in ipairs(val) do&lt;br /&gt;
		table.insert(numStr1, formatNum( v       , lang, prec))&lt;br /&gt;
		table.insert(numStr2, formatNum( v*factor, lang, prec))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- final string in the same units as input&lt;br /&gt;
	local wordsep = mw.message.new( &amp;quot;Word-separator&amp;quot; ):inLanguage(lang):plain()&lt;br /&gt;
	local x = wordsep .. '×'.. wordsep&lt;br /&gt;
	numStr1 = table.concat( numStr1, x) .. wordsep .. unit1&lt;br /&gt;
	if (lang~='en' and lang~='en-US' and system=='m') or (system=='') then -- if input is in metric units and output language is not English then show only metric output&lt;br /&gt;
		return numStr1 --  just show metric values&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- final string in imperial and metric units&lt;br /&gt;
	numStr2 = table.concat( numStr2, x) .. wordsep .. unit2&lt;br /&gt;
	return mw.ustring.format(&amp;quot;%s%s(%s)&amp;quot;, numStr1, wordsep, numStr2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ==================================================&lt;br /&gt;
function p._size(args, unit, prec, lang)&lt;br /&gt;
--This function mimics the functionality of the latter {{Size|unit|width=...|height=...|...}} template&lt;br /&gt;
	unit1 = aliases[unit] -- disambiguate units&lt;br /&gt;
	assert(unit1 or args.wikidata or args.entity, &amp;quot;Unit name is not recognized&amp;quot;)&lt;br /&gt;
	if not prec then&lt;br /&gt;
		prec = 1;&lt;br /&gt;
		if unit == 'mm' then prec=2; end&lt;br /&gt;
	end&lt;br /&gt;
	args.depthH = args.depth  -- assume that &amp;quot;depth&amp;quot; defined by {{Size}} meant &amp;quot;horizontal dimension away from the observer&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- harvest wikidata&lt;br /&gt;
	-- each property stores a single dimension. Notice that P4511 is for vertical depth only, while Size template parameter &amp;quot;depth&amp;quot; was mostly used for horizontal depth&lt;br /&gt;
	local entity, units = nil, {}&lt;br /&gt;
	if args.wikidata then&lt;br /&gt;
		entity = mw.wikibase.getEntity(args.wikidata)&lt;br /&gt;
	elseif args.entity then&lt;br /&gt;
		entity = args.entity&lt;br /&gt;
	end&lt;br /&gt;
	if entity then&lt;br /&gt;
		for field, prop in pairs(dimProp) do&lt;br /&gt;
			if entity.claims and entity.claims[prop] then -- if we have wikidata item and item has the property&lt;br /&gt;
				for _, statement in pairs( entity:getBestStatements( prop )) do&lt;br /&gt;
					if (statement.mainsnak.snaktype == &amp;quot;value&amp;quot;) then &lt;br /&gt;
						local v = statement.mainsnak.datavalue.value&lt;br /&gt;
						args [field] = v.amount&lt;br /&gt;
						units[field] = string.gsub(v.unit, &amp;quot;http:%/%/www%.wikidata%.org%/entity%/&amp;quot;, &amp;quot;&amp;quot;) -- strip URL and keep the item ID&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- create non-visible encoding with untranslated dimensions&lt;br /&gt;
	local mata_str = ''&lt;br /&gt;
	local fields = { 'length', 'height', 'width', 'depthH', 'depthV', 'thickness', 'diameter'}&lt;br /&gt;
	local meta = {}&lt;br /&gt;
	for _, field in ipairs( fields ) do&lt;br /&gt;
		if args[field] then&lt;br /&gt;
			local uStr = units[field] or unitItem[unit] -- get item ID of the unit&lt;br /&gt;
			table.insert(meta, dimProp[field] .. ',' .. args[field] .. &amp;quot;U&amp;quot; .. string.sub(uStr, 2, -1) )-- replace Q with U on the beginning of the string&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #meta&amp;gt;0 then&lt;br /&gt;
		mata_str = ' &amp;lt;div style=&amp;quot;display: none;&amp;quot;&amp;gt;dimensions QS:' .. table.concat(meta, &amp;quot;;&amp;quot;) .. '&amp;lt;/div&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- create the final string&lt;br /&gt;
	local colon     = mw.message.new( &amp;quot;Colon-separator&amp;quot; ):inLanguage(lang):plain()&lt;br /&gt;
	local semicolon = mw.message.new( &amp;quot;Semicolon-separator&amp;quot; ):inLanguage(lang):plain()&lt;br /&gt;
	local wordsep   = mw.message.new( &amp;quot;Word-separator&amp;quot; ):inLanguage(lang):plain()&lt;br /&gt;
	local dimOrder = { 'length', 'height', 'width', 'depthH', 'depthV', 'thickness', 'diameter', 'radius', 'perimeter', 'weight'} -- array with order of fields to display&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for _, field in ipairs(dimOrder) do -- values with named dimensions like &amp;quot;depth: 2 cm&amp;quot;&lt;br /&gt;
		local val = args[field]&lt;br /&gt;
		if val then&lt;br /&gt;
			val = string.gsub(val, ',', '.')&lt;br /&gt;
			val = tonumber(val)&lt;br /&gt;
			if type(val)=='number' then &lt;br /&gt;
				local dimStr = wdLabel(dimName[field], lang, '-', &amp;quot;ucfirst&amp;quot;) &lt;br /&gt;
				local valStr = unit_conversion(val, units[field] or unit, prec, lang, wordsep)&lt;br /&gt;
				table.insert(results, dimStr .. colon .. valStr) &lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(results, semicolon) .. mata_str&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
-- ==================================================&lt;br /&gt;
function p.size(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	args = normalize_input_args(frame:getParent().args, args)&lt;br /&gt;
	args = normalize_input_args(frame.args, args)&lt;br /&gt;
	if not args.lang or not mw.language.isSupportedLanguage(args.lang) then &lt;br /&gt;
		args.lang = frame:callParserFunction( &amp;quot;int&amp;quot;, &amp;quot;lang&amp;quot; ) -- get user's chosen language&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local unit = args[1] or args.unit or args.units&lt;br /&gt;
	unit = aliases[unit]&lt;br /&gt;
	if not unit and not args.wikidata then&lt;br /&gt;
		return ''&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- see if we can deduce which dimension is which&lt;br /&gt;
	local cat = ''&lt;br /&gt;
	if args[2] and args[3] then&lt;br /&gt;
		args = disambiguate_dimensions(args)&lt;br /&gt;
		if not args[2] then&lt;br /&gt;
			cat = '\n[[Category:Size templates with unnamed dimensions]]'&lt;br /&gt;
		end&lt;br /&gt;
		--cat = cat .. args.debug&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- call either a function for named and for unnamed dimensions&lt;br /&gt;
	if args[2] or args[3] or args[4] then&lt;br /&gt;
		return p._size_old(args, unit, args.prec, args.lang) .. cat -- old style of display for unnamed dimensions&lt;br /&gt;
	else&lt;br /&gt;
		return p._size(args, unit, args.prec, args.lang) .. cat -- dimensions are named&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Jacques Ducloy</name></author>
		
	</entry>
</feed>