<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AMolarMass</id>
	<title>Module:MolarMass - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AMolarMass"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:MolarMass&amp;action=history"/>
	<updated>2026-04-26T23:09:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:MolarMass&amp;diff=478718&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:MolarMass&amp;diff=478718&amp;oldid=prev"/>
		<updated>2021-07-16T05:01:00Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Computes the mollar mass from a simple chemical formula&lt;br /&gt;
--    like H2O, NH3, CuSO4, Si(OH)4, 2H2O&lt;br /&gt;
--&lt;br /&gt;
local c = {} -- module's table&lt;br /&gt;
	&lt;br /&gt;
local am = { -- Atomic Mass table (extracted from .svg)&lt;br /&gt;
	H=1.00794; He=4.002602;&lt;br /&gt;
	Li=6.941; Be=9.012182; B=10.811; C=12.0107; N=14.00674; O=15.9994; F=18.9984032; Ne=20.1797;&lt;br /&gt;
	Na=22.98976928; Mg=24.3050; Al=26.9815386; Si=28.0855; P=30.973762; S=32.066; Cl=35.4527; Ar=39.948;&lt;br /&gt;
	K=39.0983; Ca=40.078; Sc=44.955912; Ti=47.867; V=50.9415; Cr=51.9961; Mn=54.938045; Fe=55.845; Co=58.933195; Ni=58.6934; Cu=63.546; Zn=65.39; Ga=69.723; Ge=72.61; As=74.92160; Se=78.96; Br=79.904; Kr=83.80;&lt;br /&gt;
	Rb=85.4678; Sr=87.62; Y=88.90585; Zr=91.224; Nb=92.90638; Mo=95.94; Tc=97.9072; Ru=101.07; Rh=102.90550; Pd=106.42; Ag=107.8682; Cd=112.411; In=114.818; Sn=118.710; Sb=121.760; Te=127.60; I=126.90447; Xe=131.29;&lt;br /&gt;
	Cs=132.9054519; Ba=137.327; Hf=178.49; Ta=180.94788; W=183.84; Re=186.207; Os=190.23; Ir=192.217; Pt=195.084; Au=196.966569; Hg=200.59; Tl=204.3833; Pb=207.2; Bi=208.98040; Po=208.9824; At=209.9871; Rn=222.0176;&lt;br /&gt;
		La=138.90547; Ce=140.116; Pr=140.90765; Nd=144.242; Pm=144.9127; Sm=150.36; Eu=151.964; Gd=157.25; Tb=158.92535; Dy=162.500; Ho=164.93032; Er=167.259; Tm=168.93421; Yb=173.04; Lu=174.967;&lt;br /&gt;
	Fr=223.0197; Ra=226.0254; Rf=263.1125; Db=262.1144; Sg=266.1219; Bh=264.1247; Hs=269.1341; Mt=268.1388; Ds=272.1463; Rg=272.1535; Cn=277.0; Nh=284.0; Fl=289.0; Mc=288.0; Lv=292.0; Ts=292.0; Og=294.0;&lt;br /&gt;
		Ac=227.0277; Th=232.03806; Pa=231.03588; U=238.02891; Np=237.0482; Pu=244.0642; Am=243.0614; Cm=247.0703; Bk=247.0703; Cf=251.0796; Es=252.0830; Fm=257.0951; Md=258.0984; No=259.1011; Lr=262.110;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
local T_ELEM   = 0 -- token types&lt;br /&gt;
local T_NUM    = 1&lt;br /&gt;
local T_O      = 2 -- open '('&lt;br /&gt;
local T_C      = 3 -- close ')'&lt;br /&gt;
local T_MIDDOT = 4 -- hydration delimiter&lt;br /&gt;
local T_SPACE  = 5 -- whitespace&lt;br /&gt;
local T_WATER  = 6 -- crystallization water '•xH2O'&lt;br /&gt;
	&lt;br /&gt;
function item(f) -- (iterator) returns one token (type, value) at a time from the formula 'f'&lt;br /&gt;
	local i = 1&lt;br /&gt;
	return function ()&lt;br /&gt;
		local t, x = nil, nil&lt;br /&gt;
		if i &amp;lt;= f:len() then&lt;br /&gt;
			x = f:match('^%u%l*', i); t = T_ELEM;  -- matching elem (C, O, Ba, Na,...)&lt;br /&gt;
			if not x then x = f:match('^[%d.]+', i); t = T_NUM; end -- matching number&lt;br /&gt;
			if not x then x = f:match('^%(', i); t = T_O; end    -- matching '('&lt;br /&gt;
			if not x then x = f:match('^%)', i); t = T_C; end    -- matching ')'&lt;br /&gt;
																	if not x then x = f:match('^•[%d.]*H2O', i); t = T_WATER; end -- matching '•xH2O' x number, optional&lt;br /&gt;
			if not x then x = f:match('^•', i); t = T_MIDDOT; end    -- matching '•'&lt;br /&gt;
			if not x then x = f:match('^%s+', i); t = T_SPACE; end    -- matching whitespace&lt;br /&gt;
			if x then i = i + x:len(); else error(&amp;quot;Invalid character in formula beginning at '&amp;quot;..f:sub(i)..&amp;quot;'&amp;quot;) end&lt;br /&gt;
		end&lt;br /&gt;
		return t, x&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function c.mm(frame) -- molar mass of the formula 'f'&lt;br /&gt;
	local f = frame.args[1]&lt;br /&gt;
	local sum, cur = {0}, {0}  -- stacks to handle '()' ; 'cur' awaits to be multiplied (or not)&lt;br /&gt;
	local t, x&lt;br /&gt;
	for t, x in item(f) do &lt;br /&gt;
		if t == T_ELEM then if not am[x] then error(&amp;quot;Unknown element : &amp;quot;..x) end&lt;br /&gt;
		sum[#sum] = sum[#sum] + cur[#cur]; cur[#cur] = am[x]&lt;br /&gt;
		elseif t == T_NUM  then sum[#sum] = sum[#sum] + cur[#cur] * tonumber(x); cur[#cur] = 0&lt;br /&gt;
		elseif t == T_O    then sum[#sum] = sum[#sum] + cur[#cur]; cur[#cur] = 0;sum[#sum+1] = 0; cur[#cur+1] = 0 -- push&lt;br /&gt;
		elseif t == T_C    then if #sum &amp;lt; 2 then error(&amp;quot;Too many ')' in &amp;quot;..f) end&lt;br /&gt;
			sum[#sum] = sum[#sum] + cur[#cur]; cur[#cur-1] = sum[#sum]; sum[#sum], cur[#cur] = nil, nil -- pop&lt;br /&gt;
		elseif t == T_WATER then &lt;br /&gt;
			if string.match(x, '•%d+') then&lt;br /&gt;
				sum[#sum] = sum[#sum] + ((2*am.H + am.O) * tonumber(string.match(x, '[%d.]+')))&lt;br /&gt;
			else&lt;br /&gt;
				-- sum[#sum] = sum[#sum] + (2*am.H + am.O)&lt;br /&gt;
			end&lt;br /&gt;
		elseif t == T_MIDDOT then error(&amp;quot;Hydration syntax (•) not yet supported&amp;quot;)&lt;br /&gt;
		elseif t ~= T_SPACE then error('???') end -- ignore whitespace&lt;br /&gt;
	end&lt;br /&gt;
	if #sum &amp;gt; 1 then error(&amp;quot;Too many '(' in &amp;quot;..f) end&lt;br /&gt;
&lt;br /&gt;
	-- check leading number (2XyZ)&lt;br /&gt;
	if string.match(f, '^[%d.]+') then &lt;br /&gt;
		return (sum[1] + cur[1]) * tonumber(string.match(f, '^[%d.]+'))&lt;br /&gt;
	else&lt;br /&gt;
		return sum[1] + cur[1]&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
--[[ tests -------------&lt;br /&gt;
c.frame = {}&lt;br /&gt;
c.frame.args = {}&lt;br /&gt;
	&lt;br /&gt;
function pm(f)&lt;br /&gt;
	c.frame.args[1] = f&lt;br /&gt;
	print('The molar mass of '..f..' is '..c.mm(c.frame))&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
pm(&amp;quot;NaCl&amp;quot;)&lt;br /&gt;
pm(&amp;quot;NaOH&amp;quot;)&lt;br /&gt;
pm(&amp;quot;CaCO3&amp;quot;)&lt;br /&gt;
pm(&amp;quot;H2SO4&amp;quot;)&lt;br /&gt;
pm(&amp;quot;C10H8&amp;quot;)&lt;br /&gt;
pm(&amp;quot;CO2&amp;quot;)&lt;br /&gt;
pm(&amp;quot;Mo&amp;quot;)&lt;br /&gt;
pm(&amp;quot;HCl&amp;quot;)&lt;br /&gt;
pm(&amp;quot;Si(OH)4&amp;quot;)&lt;br /&gt;
pm(&amp;quot;CuSO4(H20)5&amp;quot;)&lt;br /&gt;
--------------- --]]&lt;br /&gt;
	&lt;br /&gt;
return c -- exports c.mm()&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>