<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://salisford.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AChem2</id>
	<title>Module:Chem2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://salisford.net/index.php?action=history&amp;feed=atom&amp;title=Module%3AChem2"/>
	<link rel="alternate" type="text/html" href="https://salisford.net/index.php?title=Module:Chem2&amp;action=history"/>
	<updated>2026-05-05T05:33:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://salisford.net/index.php?title=Module:Chem2&amp;diff=798&amp;oldid=prev</id>
		<title>Cascadia: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://salisford.net/index.php?title=Module:Chem2&amp;diff=798&amp;oldid=prev"/>
		<updated>2023-04-05T14:39:49Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:39, 5 April 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&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;/table&gt;</summary>
		<author><name>Cascadia</name></author>
	</entry>
	<entry>
		<id>https://salisford.net/index.php?title=Module:Chem2&amp;diff=797&amp;oldid=prev</id>
		<title>wp&gt;Pppery: Per edit request</title>
		<link rel="alternate" type="text/html" href="https://salisford.net/index.php?title=Module:Chem2&amp;diff=797&amp;oldid=prev"/>
		<updated>2023-03-04T22:10:11Z</updated>

		<summary type="html">&lt;p&gt;Per edit request&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
local p = {} -- module's table&lt;br /&gt;
&lt;br /&gt;
-- Elements with wiki links&lt;br /&gt;
local am = {&lt;br /&gt;
	H = &amp;quot;Hydrogen&amp;quot;,&lt;br /&gt;
	He = &amp;quot;Helium&amp;quot;,&lt;br /&gt;
	Li = &amp;quot;Lithium&amp;quot;,&lt;br /&gt;
	Be = &amp;quot;Beryllium&amp;quot;,&lt;br /&gt;
	B = &amp;quot;Boron&amp;quot;,&lt;br /&gt;
	C = &amp;quot;Carbon&amp;quot;,&lt;br /&gt;
	N = &amp;quot;Nitrogen&amp;quot;,&lt;br /&gt;
	O = &amp;quot;Oxygen&amp;quot;,&lt;br /&gt;
	F = &amp;quot;Fluorine&amp;quot;,&lt;br /&gt;
	Ne = &amp;quot;Neon&amp;quot;,&lt;br /&gt;
	Na = &amp;quot;Sodium&amp;quot;,&lt;br /&gt;
	Mg = &amp;quot;Magnesium&amp;quot;,&lt;br /&gt;
	Al = &amp;quot;Aluminium&amp;quot;,&lt;br /&gt;
	Si = &amp;quot;Silicon&amp;quot;,&lt;br /&gt;
	P = &amp;quot;Phosphorus&amp;quot;,&lt;br /&gt;
	S = &amp;quot;Sulfur&amp;quot;,&lt;br /&gt;
	Cl = &amp;quot;Chlorine&amp;quot;,&lt;br /&gt;
	Ar = &amp;quot;Argon&amp;quot;,&lt;br /&gt;
	K = &amp;quot;Potassium&amp;quot;,&lt;br /&gt;
	Ca = &amp;quot;Calcium&amp;quot;,&lt;br /&gt;
	Sc = &amp;quot;Scandium&amp;quot;,&lt;br /&gt;
	Ti = &amp;quot;Titanium&amp;quot;,&lt;br /&gt;
	V = &amp;quot;Vanadium&amp;quot;,&lt;br /&gt;
	Cr = &amp;quot;Chromium&amp;quot;,&lt;br /&gt;
	Mn = &amp;quot;Manganese&amp;quot;,&lt;br /&gt;
	Fe = &amp;quot;Iron&amp;quot;,&lt;br /&gt;
	Co = &amp;quot;Cobalt&amp;quot;,&lt;br /&gt;
	Ni = &amp;quot;Nickel&amp;quot;,&lt;br /&gt;
	Cu = &amp;quot;Copper&amp;quot;,&lt;br /&gt;
	Zn = &amp;quot;Zinc&amp;quot;,&lt;br /&gt;
	Ga = &amp;quot;Gallium&amp;quot;,&lt;br /&gt;
	Ge = &amp;quot;Germanium&amp;quot;,&lt;br /&gt;
	As = &amp;quot;Arsenic&amp;quot;,&lt;br /&gt;
	Se = &amp;quot;Selenium&amp;quot;,&lt;br /&gt;
	Br = &amp;quot;Bromine&amp;quot;,&lt;br /&gt;
	Kr = &amp;quot;Krypton&amp;quot;,&lt;br /&gt;
	Rb = &amp;quot;Rubidium&amp;quot;,&lt;br /&gt;
	Sr = &amp;quot;Strontium&amp;quot;,&lt;br /&gt;
	Y = &amp;quot;Yttrium&amp;quot;,&lt;br /&gt;
	Zr = &amp;quot;Zirconium&amp;quot;,&lt;br /&gt;
	Nb = &amp;quot;Niobium&amp;quot;,&lt;br /&gt;
	Mo = &amp;quot;Molybdenum&amp;quot;,&lt;br /&gt;
	Tc = &amp;quot;Technetium&amp;quot;,&lt;br /&gt;
	Ru = &amp;quot;Ruthenium&amp;quot;,&lt;br /&gt;
	Rh = &amp;quot;Rhodium&amp;quot;,&lt;br /&gt;
	Pd = &amp;quot;Palladium&amp;quot;,&lt;br /&gt;
	Ag = &amp;quot;Silver&amp;quot;,&lt;br /&gt;
	Cd = &amp;quot;Cadmium&amp;quot;,&lt;br /&gt;
	In = &amp;quot;Indium&amp;quot;,&lt;br /&gt;
	Sn = &amp;quot;Tin&amp;quot;,&lt;br /&gt;
	Sb = &amp;quot;Antimony&amp;quot;,&lt;br /&gt;
	Te = &amp;quot;Tellurium&amp;quot;,&lt;br /&gt;
	I = &amp;quot;Iodine&amp;quot;,&lt;br /&gt;
	Xe = &amp;quot;Xenon&amp;quot;,&lt;br /&gt;
	Cs = &amp;quot;Caesium&amp;quot;,&lt;br /&gt;
	Ba = &amp;quot;Barium&amp;quot;,&lt;br /&gt;
	La = &amp;quot;Lanthanum&amp;quot;,&lt;br /&gt;
	Ce = &amp;quot;Cerium&amp;quot;,&lt;br /&gt;
	Pr = &amp;quot;Praseodymium&amp;quot;,&lt;br /&gt;
	Nd = &amp;quot;Neodymium&amp;quot;,&lt;br /&gt;
	Pm = &amp;quot;Promethium&amp;quot;,&lt;br /&gt;
	Sm = &amp;quot;Samarium&amp;quot;,&lt;br /&gt;
	Eu = &amp;quot;Europium&amp;quot;,&lt;br /&gt;
	Gd = &amp;quot;Gadolinium&amp;quot;,&lt;br /&gt;
	Tb = &amp;quot;Terbium&amp;quot;,&lt;br /&gt;
	Dy = &amp;quot;Dysprosium&amp;quot;,&lt;br /&gt;
	Ho = &amp;quot;Holmium&amp;quot;,&lt;br /&gt;
	Er = &amp;quot;Erbium&amp;quot;,&lt;br /&gt;
	Tm = &amp;quot;Thulium&amp;quot;,&lt;br /&gt;
	Yb = &amp;quot;Ytterbium&amp;quot;,&lt;br /&gt;
	Lu = &amp;quot;Lutetium&amp;quot;,&lt;br /&gt;
	Hf = &amp;quot;Hafnium&amp;quot;,&lt;br /&gt;
	Ta = &amp;quot;Tantalum&amp;quot;,&lt;br /&gt;
	W = &amp;quot;Tungsten&amp;quot;,&lt;br /&gt;
	Re = &amp;quot;Rhenium&amp;quot;,&lt;br /&gt;
	Os = &amp;quot;Osmium&amp;quot;,&lt;br /&gt;
	Ir = &amp;quot;Iridium&amp;quot;,&lt;br /&gt;
	Pt = &amp;quot;Platinum&amp;quot;,&lt;br /&gt;
	Au = &amp;quot;Gold&amp;quot;,&lt;br /&gt;
	Hg = &amp;quot;Mercury (element)&amp;quot;,&lt;br /&gt;
	Tl = &amp;quot;Thallium&amp;quot;,&lt;br /&gt;
	Pb = &amp;quot;Lead&amp;quot;,&lt;br /&gt;
	Bi = &amp;quot;Bismuth&amp;quot;,&lt;br /&gt;
	Po = &amp;quot;Polonium&amp;quot;,&lt;br /&gt;
	At = &amp;quot;Astatine&amp;quot;,&lt;br /&gt;
	Rn = &amp;quot;Radon&amp;quot;,&lt;br /&gt;
	Fr = &amp;quot;Francium&amp;quot;,&lt;br /&gt;
	Ra = &amp;quot;Radium&amp;quot;,&lt;br /&gt;
	Ac = &amp;quot;Actinium&amp;quot;,&lt;br /&gt;
	Th = &amp;quot;Thorium&amp;quot;,&lt;br /&gt;
	Pa = &amp;quot;Protactinium&amp;quot;,&lt;br /&gt;
	U = &amp;quot;Uranium&amp;quot;,&lt;br /&gt;
	Np = &amp;quot;Neptunium&amp;quot;,&lt;br /&gt;
	Pu = &amp;quot;Plutonium&amp;quot;,&lt;br /&gt;
	Am = &amp;quot;Americium&amp;quot;,&lt;br /&gt;
	Cm = &amp;quot;Curium&amp;quot;,&lt;br /&gt;
	Bk = &amp;quot;Berkelium&amp;quot;,&lt;br /&gt;
	Cf = &amp;quot;Californium&amp;quot;,&lt;br /&gt;
	Es = &amp;quot;Einsteinium&amp;quot;,&lt;br /&gt;
	Fm = &amp;quot;Fermium&amp;quot;,&lt;br /&gt;
	Md = &amp;quot;Mendelevium&amp;quot;,&lt;br /&gt;
	No = &amp;quot;Nobelium&amp;quot;,&lt;br /&gt;
	Lr = &amp;quot;Lawrencium&amp;quot;,&lt;br /&gt;
	Rf = &amp;quot;Rutherfordium&amp;quot;,&lt;br /&gt;
	Db = &amp;quot;Dubnium&amp;quot;,&lt;br /&gt;
	Sg = &amp;quot;Seaborgium&amp;quot;,&lt;br /&gt;
	Bh = &amp;quot;Bohrium&amp;quot;,&lt;br /&gt;
	Hs = &amp;quot;Hassium&amp;quot;,&lt;br /&gt;
	Mt = &amp;quot;Meitnerium&amp;quot;,&lt;br /&gt;
	Ds = &amp;quot;Darmstadtium&amp;quot;,&lt;br /&gt;
	Rg = &amp;quot;Roentgenium&amp;quot;,&lt;br /&gt;
	Cp = &amp;quot;Copernicium&amp;quot;,&lt;br /&gt;
	Nh = &amp;quot;Nihonium&amp;quot;,&lt;br /&gt;
	Fl = &amp;quot;Flerovium&amp;quot;,&lt;br /&gt;
	Mc = &amp;quot;Moscovium&amp;quot;,&lt;br /&gt;
	Lv = &amp;quot;Livermorium&amp;quot;,&lt;br /&gt;
	Ts = &amp;quot;Tennessine&amp;quot;,&lt;br /&gt;
	Og = &amp;quot;Oganesson&amp;quot;,&lt;br /&gt;
	&lt;br /&gt;
	-- Groups etc with element-like names&lt;br /&gt;
	Bn = 'Benzyl group',&lt;br /&gt;
	Bz = 'Benzoyl group',&lt;br /&gt;
	D = 'Deuterium',&lt;br /&gt;
	Et = 'Ethyl group',&lt;br /&gt;
	Ln = 'Lanthanide',&lt;br /&gt;
	Nu = 'Nucleophile',&lt;br /&gt;
	Ph = 'Phenyl group',&lt;br /&gt;
	R = 'Substituent',&lt;br /&gt;
	T = 'Tritium',&lt;br /&gt;
	Tf = 'Trifluoromethylsulfonyl group',&lt;br /&gt;
	X = 'Halogen',&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Groups which are redirected from their normal target if wikilinked; never&lt;br /&gt;
-- autolinked.&lt;br /&gt;
local groups = {&lt;br /&gt;
	CH3 = 'Methyl group',&lt;br /&gt;
	CO3 = 'Carbonate',&lt;br /&gt;
	COOH = 'Carboxyl group',&lt;br /&gt;
	ClO = 'Hypochlorite',&lt;br /&gt;
	ClO2 = 'Chlorite',&lt;br /&gt;
	ClO3 = 'Chlorate',&lt;br /&gt;
	ClO4 = 'Perchlorate',&lt;br /&gt;
	H2O = 'Water of crystallization',&lt;br /&gt;
	H3O = 'Hydronium',&lt;br /&gt;
	NH2 = 'Amine group',&lt;br /&gt;
	NH4 = 'Ammonium',&lt;br /&gt;
	NO3 = 'Nitrate',&lt;br /&gt;
	PO3 = 'Phosphite',&lt;br /&gt;
	PO4 = 'Phosphate',&lt;br /&gt;
	SH = 'Thiol group',&lt;br /&gt;
	SO3 = 'Sulfite',&lt;br /&gt;
	SO4 = 'Sulfate',&lt;br /&gt;
	SeH = 'Selenol group'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local T_ELEM = 0         -- token types&lt;br /&gt;
local T_NUM = 1          -- number&lt;br /&gt;
local T_OPEN = 2         -- open '('&lt;br /&gt;
local T_CLOSE = 3        -- close ')'&lt;br /&gt;
local T_PM_CHARGE = 4    -- + or −&lt;br /&gt;
local T_WATER = 6        -- .xH2O x number&lt;br /&gt;
local T_CRYSTAL = 9      -- .x&lt;br /&gt;
local T_CHARGE = 8       -- charge (x+), (x-)&lt;br /&gt;
local T_SUF_CHARGE = 10  -- suffix and charge e.g. 2+ from H2+&lt;br /&gt;
local T_SUF_CHARGE2 = 12 -- suffix and (charge) e.g. 2(2+) from He2(2+)&lt;br /&gt;
local T_SPECIAL = 14     -- starting with \ e.g. \d for double bond (=)&lt;br /&gt;
local T_SPECIAL2 = 16    -- starting with \y{x} e.g. \i{12} for isotope with mass number 12&lt;br /&gt;
local T_ARROW_R = 17     -- match: -&amp;gt;&lt;br /&gt;
local T_ARROW_EQ = 18    -- match: &amp;lt;-&amp;gt;&lt;br /&gt;
local T_UNDERSCORE = 19  -- _{ ... }&lt;br /&gt;
local T_CARET = 20       -- ^{ ... }&lt;br /&gt;
local T_LINKOPEN = 21    -- Opening of link, always like &amp;quot;[[target|&amp;quot; even if the source wasn't&lt;br /&gt;
local T_NOCHANGE = 30    -- Anything else like ☃&lt;br /&gt;
&lt;br /&gt;
function su(up, down)&lt;br /&gt;
	if up == &amp;quot;&amp;quot; then&lt;br /&gt;
		return ('&amp;lt;sub class=&amp;quot;template-chem2-sub&amp;quot;&amp;gt;%s&amp;lt;/sub&amp;gt;'):format(down)&lt;br /&gt;
	end&lt;br /&gt;
	if down == &amp;quot;&amp;quot; then&lt;br /&gt;
		return ('&amp;lt;sup class=&amp;quot;template-chem2-sup&amp;quot;&amp;gt;%s&amp;lt;/sup&amp;gt;'):format(up)&lt;br /&gt;
	end&lt;br /&gt;
    return ('&amp;lt;span class=&amp;quot;template-chem2-su&amp;quot;&amp;gt;&amp;lt;span&amp;gt;%s&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;%s&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;'):format(up, down)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function DotIt()&lt;br /&gt;
    return '&amp;amp;middot;'&lt;br /&gt;
end&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;
&lt;br /&gt;
    return function ()&lt;br /&gt;
        local t, x = nil, nil&lt;br /&gt;
&lt;br /&gt;
        if (i == 1) and f:match('^[0-9]', i) then &lt;br /&gt;
            x = f:match('^[%d.]+', i); t = T_NOCHANGE; i = i + x:len();   -- matching coefficient (need a space first)&lt;br /&gt;
&lt;br /&gt;
        elseif i &amp;lt;= f:len() then&lt;br /&gt;
            x = f:match('^%s+[%d.]+', i); t = T_NOCHANGE;  -- matching coefficient (need a space first)&lt;br /&gt;
            if not x then x = f:match('^%s[+]', i); t = T_NOCHANGE; end       -- matching + (H2O + H2O)&lt;br /&gt;
            if not x then x = f:match('^%&amp;amp;%#[%w%d]+%;', i); t = T_NOCHANGE; end       -- &amp;amp;#...;&lt;br /&gt;
            if not x then x = f:match('^%&amp;lt;%-%&amp;gt;', i); t = T_ARROW_EQ; end       -- matching &amp;lt;-&amp;gt;&lt;br /&gt;
            if not x then x = f:match('^%-%&amp;gt;', i); t = T_ARROW_R; end       -- matching -&amp;gt;&lt;br /&gt;
            if not x then x = f:match('^%u%l*', i); t = T_ELEM; end        -- matching symbols like Aaaaa&lt;br /&gt;
            if not x then x = f:match('^%d+[+-]', i); t = T_SUF_CHARGE; end        -- matching x+, x-&lt;br /&gt;
            if not x then x = f:match('^%d+%(%d*[+-]%)', i); t = T_SUF_CHARGE2; end        -- matching x(y+/-), x(+/-)&lt;br /&gt;
            if not x then x = f:match('^%(%d*[+-]%)', i); t = T_CHARGE; end        -- matching (x+) (xx+), (x-) (xx-)&lt;br /&gt;
            if not x then x = f:match('^[%d.]+', i); t = T_NUM; end        -- matching number&lt;br /&gt;
            if not x and (f:match('^%[%[%[[^[]', i) or f:match('^%[[^[]', i)) then&lt;br /&gt;
            	i = i + 1; return T_OPEN, '&amp;amp;#91;' end -- escape [[[X or [X (relevant to auto-linking)&lt;br /&gt;
            if not x and f:sub(i, i + 1) == '[[' then&lt;br /&gt;
            	x = f:match('^%[%[([^]|]*)', i) -- link target&lt;br /&gt;
            	local len = x:len() + 3&lt;br /&gt;
            	x = '[[' .. (groups[x] or am[x] or x) .. '|'  -- override link target for common groups&lt;br /&gt;
&lt;br /&gt;
            	if f:sub(len + i, len + i) == ']' then&lt;br /&gt;
            		-- We're going to read the link twice, once as target and once as&lt;br /&gt;
            		-- chemical markup, e.g. [[CH3]] =&amp;gt; &amp;quot;[[CH3|&amp;quot;, &amp;quot;CH3]]&amp;quot;&lt;br /&gt;
            		i = i + 2&lt;br /&gt;
            	else&lt;br /&gt;
            		i = i + len&lt;br /&gt;
            	end&lt;br /&gt;
            	return T_LINKOPEN, x&lt;br /&gt;
            end&lt;br /&gt;
            if not x then x = f:match('^[(|{|%[]', i); t = T_OPEN; end     -- matching ({[&lt;br /&gt;
            if not x then x = f:match('^[)|}|%]]', i); t = T_CLOSE; end    -- matching )}]&lt;br /&gt;
            if not x then x = f:match('^[+-]', i); t = T_PM_CHARGE; end    -- matching + or -&lt;br /&gt;
            if not x then x = f:match('^%*[%d.]*H2O', i); t = T_WATER; end -- Crystal water&lt;br /&gt;
            if not x then x = f:match('^%*[%d.]*', i); t = T_CRYSTAL; end  -- Crystal&lt;br /&gt;
            if not x then x = f:match('^[\\].{%d+}', i); t = T_SPECIAL2; end -- \y{x}&lt;br /&gt;
            if not x then x = f:match('^[\\].', i); t = T_SPECIAL; end -- \x&lt;br /&gt;
            if not x then x = f:match('^_{[^}]*}', i); t = T_UNDERSCORE; end -- _{...}&lt;br /&gt;
            if not x then x = f:match('^^{[^}]*}', i); t = T_CARET; end   -- ^{...}&lt;br /&gt;
            if not x then x = f:match('^.', i); t = T_NOCHANGE; end  --the rest - one by one&lt;br /&gt;
            if x then i = i + x:len(); else i = i + 999; error(&amp;quot;Invalid character in formula! : &amp;quot;..f) 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 p._chem(args)&lt;br /&gt;
	&lt;br /&gt;
    local f = args[1] or ''&lt;br /&gt;
&lt;br /&gt;
	f = mw.text.decode( f, true ) -- handle entity input (like &amp;amp;minus;): decode right away&lt;br /&gt;
    f = string.gsub(f, &amp;quot;–&amp;quot;, &amp;quot;-&amp;quot;)  -- replace – with - (hyphen not ndash)&lt;br /&gt;
    f = string.gsub(f, &amp;quot;−&amp;quot;, &amp;quot;-&amp;quot;)  -- replace – with - (hyphen not minus sign)&lt;br /&gt;
&lt;br /&gt;
    local formula = ''&lt;br /&gt;
    local t, x&lt;br /&gt;
&lt;br /&gt;
    local link = args['link'] or &amp;quot;&amp;quot;&lt;br /&gt;
    local auto = args['auto'] or &amp;quot;&amp;quot;&lt;br /&gt;
    local seen = {}&lt;br /&gt;
    local _debug = false&lt;br /&gt;
&lt;br /&gt;
    if not (link == '') then formula = formula .. &amp;quot;[[&amp;quot; .. link .. &amp;quot;|&amp;quot;; end   -- wikilink start [[link|&lt;br /&gt;
 &lt;br /&gt;
    for t, x in item(f) do &lt;br /&gt;
    	if _debug then&lt;br /&gt;
    		formula = (&amp;quot;%s\n* %d %s&amp;quot;):format(formula, t, x)&lt;br /&gt;
        elseif t == T_ELEM then&lt;br /&gt;
            if (auto == '') or (not am[x]) or seen[x] then formula = formula .. x&lt;br /&gt;
            else formula = (&amp;quot;%s[[%s|%s]]&amp;quot;):format(formula, am[x], x); seen[x] = true&lt;br /&gt;
            end&lt;br /&gt;
        elseif t == T_COEFFICIENT then formula = formula .. x&lt;br /&gt;
        elseif t == T_NUM        then formula = formula .. su(&amp;quot;&amp;quot;, x);&lt;br /&gt;
        elseif t == T_LINKOPEN   then formula = formula .. x;      -- [[Link|&lt;br /&gt;
        elseif t == T_OPEN       then formula = formula .. x;          -- ([{&lt;br /&gt;
        elseif t == T_CLOSE      then formula = formula .. x;          -- )]}&lt;br /&gt;
        elseif t == T_PM_CHARGE  then formula = formula .. su(x:gsub(&amp;quot;-&amp;quot;, &amp;quot;−&amp;quot;), &amp;quot;&amp;quot;);&lt;br /&gt;
        elseif t == T_SUF_CHARGE then &lt;br /&gt;
            formula = formula .. su(x:match(&amp;quot;[+-]&amp;quot;):gsub(&amp;quot;-&amp;quot;, &amp;quot;−&amp;quot;), x:match(&amp;quot;%d+&amp;quot;), &amp;quot;&amp;quot;);&lt;br /&gt;
        elseif t == T_SUF_CHARGE2 then &lt;br /&gt;
            formula = formula .. su(x:match(&amp;quot;%(%d*[+-]&amp;quot;):gsub(&amp;quot;-&amp;quot;, &amp;quot;−&amp;quot;):sub(2, -1), x:match(&amp;quot;%d+&amp;quot;))&lt;br /&gt;
        elseif t == T_CHARGE then&lt;br /&gt;
        	formula = formula .. &amp;quot;&amp;lt;sup&amp;gt;&amp;quot;&lt;br /&gt;
        	if x:match(&amp;quot;%d+&amp;quot;) then formula = formula .. x:match(&amp;quot;%d+&amp;quot;); end&lt;br /&gt;
        	formula = formula .. x:match(&amp;quot;[%+-]&amp;quot;):gsub(&amp;quot;-&amp;quot;, &amp;quot;−&amp;quot;) .. &amp;quot;&amp;lt;/sup&amp;gt;&amp;quot;;&lt;br /&gt;
        	-- Cannot concatenat a nil value from x:match(&amp;quot;%d+&amp;quot;);&lt;br /&gt;
        elseif t == T_CRYSTAL then formula = formula .. DotIt() .. string.gsub( x, &amp;quot;*&amp;quot;, '', 1 );&lt;br /&gt;
        elseif t == T_SPECIAL then&lt;br /&gt;
            parameter = x:sub(2, 2) -- x fra \x  &lt;br /&gt;
            if     parameter == &amp;quot;s&amp;quot; then formula = formula .. &amp;quot;−&amp;quot;   -- single bond&lt;br /&gt;
            elseif parameter == &amp;quot;d&amp;quot; then formula = formula .. &amp;quot;=&amp;quot;   -- double bond&lt;br /&gt;
            elseif parameter == &amp;quot;t&amp;quot; then formula = formula .. &amp;quot;≡&amp;quot;   -- tripple bond&lt;br /&gt;
            elseif parameter == &amp;quot;q&amp;quot; then formula = formula .. &amp;quot;≣&amp;quot;   -- Quadruple bond&lt;br /&gt;
            elseif parameter == &amp;quot;h&amp;quot; then formula = formula .. &amp;quot;η&amp;quot;   -- η, hapticity&lt;br /&gt;
            elseif parameter == &amp;quot;*&amp;quot; then formula = formula .. &amp;quot;*&amp;quot;   -- *, normal *&lt;br /&gt;
            elseif parameter == &amp;quot;-&amp;quot; then formula = formula .. &amp;quot;-&amp;quot;   -- -&lt;br /&gt;
            elseif parameter == &amp;quot;\\&amp;quot; then formula = formula .. &amp;quot;\\&amp;quot;   -- \&lt;br /&gt;
            elseif parameter == &amp;quot;\'&amp;quot; then formula = formula .. &amp;quot;&amp;amp;#39;&amp;quot;   -- html-code for '&lt;br /&gt;
            end&lt;br /&gt;
        elseif t == T_SPECIAL2 then  -- \y{x}&lt;br /&gt;
            parameter = x:sub(2, 2) -- y fra \y{x} &lt;br /&gt;
            if parameter  == &amp;quot;h&amp;quot; then --[[Hapticity]]&lt;br /&gt;
                if (auto == '') then formula = formula .. &amp;quot;η&amp;lt;sup&amp;gt;&amp;quot; .. x:match('%d+') .. &amp;quot;&amp;lt;/sup&amp;gt;-&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                    formula = formula .. &amp;quot;[[Hapticity|η&amp;lt;sup&amp;gt;&amp;quot; .. x:match('%d+') .. &amp;quot;&amp;lt;/sup&amp;gt;]]-&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
            elseif parameter == &amp;quot;m&amp;quot; then formula = formula .. &amp;quot;μ&amp;lt;sub&amp;gt;&amp;quot; .. x:match('%d+') .. &amp;quot;&amp;lt;/sub&amp;gt;-&amp;quot; -- mu ([[bridging ligand]])&lt;br /&gt;
            end&lt;br /&gt;
        elseif t == T_WATER then &lt;br /&gt;
            if x:match(&amp;quot;^%*[%d.]&amp;quot;) then &lt;br /&gt;
                formula = formula .. DotIt() .. x:match(&amp;quot;%f[%.%d]%d*%.?%d*%f[^%.%d%]]&amp;quot;) .. &amp;quot;H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;quot;;&lt;br /&gt;
            else&lt;br /&gt;
                formula = formula .. DotIt() .. &amp;quot;H&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;O&amp;quot;;&lt;br /&gt;
            end&lt;br /&gt;
        elseif t == T_UNDERSCORE  then formula = formula .. su(&amp;quot;&amp;quot;, x:gsub(&amp;quot;-&amp;quot;, &amp;quot;−&amp;quot;):sub(3, -2)) -- x contains _{string}&lt;br /&gt;
        elseif t == T_CARET       then formula = formula .. su(x:gsub(&amp;quot;-&amp;quot;, &amp;quot;−&amp;quot;):sub(3, -2), &amp;quot;&amp;quot;) -- x contains ^{string}&lt;br /&gt;
        elseif t == T_ARROW_R     then formula = formula .. &amp;quot; → &amp;quot;&lt;br /&gt;
        elseif t == T_ARROW_EQ    then formula = formula .. &amp;quot; ⇌ &amp;quot;&lt;br /&gt;
        elseif t == T_NOCHANGE    then formula = formula .. x;  -- The rest - everything which isn't captured by the regular expresions.&lt;br /&gt;
        else error('unreachable - ???') end -- in fact, unreachable&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not (link == nil or link == '') then formula = formula .. &amp;quot;]]&amp;quot;; end   -- wikilink closing ]]&lt;br /&gt;
    formula = mw.getCurrentFrame():preprocess('&amp;lt;templatestyles src=&amp;quot;Module:Chem2/styles.css&amp;quot;/&amp;gt;') ..&lt;br /&gt;
        '&amp;lt;span class=&amp;quot;chemf nowrap&amp;quot;&amp;gt;' .. formula .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
    if args[2] or args[3] or args[4] then&lt;br /&gt;
        formula = formula .. require('Module:If preview')._warning{&lt;br /&gt;
'&amp;amp;#123;&amp;amp;#123;chem2&amp;amp;#125;&amp;amp;#125; was called with multiple positional arguments. It should have just one, e.g. &amp;amp;#123;&amp;amp;#123;chem2&amp;amp;#124;H2O&amp;amp;#125;&amp;amp;#125;.'&lt;br /&gt;
        }&lt;br /&gt;
    end&lt;br /&gt;
    return formula&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.chem(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    return p._chem(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- PRIVATE function to generate documentation.&lt;br /&gt;
function p._autodoc(frame)&lt;br /&gt;
	local TableTools = require('Module:TableTools') -- we don't want to load this on articles for no reason&lt;br /&gt;
	local result = {&lt;br /&gt;
		'===Elements and element-style symbols===\nThese may be automatically linked or used as if they were redirects.\n',&lt;br /&gt;
		'{| class=&amp;quot;wikitable&amp;quot;\n! Symbol !! Link target\n'&lt;br /&gt;
	}&lt;br /&gt;
	for symbol, target in TableTools.sortedPairs(am) do&lt;br /&gt;
		result[#result + 1] = ('|-\n| %s || [[%s]]\n'):format(symbol, target)&lt;br /&gt;
	end&lt;br /&gt;
	result[#result + 1] = '|}\n===Groups===\nThese must be linked manually; they work as if they were redirects.\n'&lt;br /&gt;
	result[#result + 1] = '{| class=&amp;quot;wikitable&amp;quot;\n! Symbol !! Link target\n'&lt;br /&gt;
	for symbol, target in TableTools.sortedPairs(groups) do&lt;br /&gt;
		result[#result + 1] = ('|-\n| %s || [[%s]]\n'):format(symbol, target)&lt;br /&gt;
	end&lt;br /&gt;
	result[#result + 1] = '|}'&lt;br /&gt;
	return table.concat(result)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wp&gt;Pppery</name></author>
	</entry>
</feed>