Modul:Sjølvformatert kjemisk formel
Utsjånad
Denne modulen implementerer {{Sjølvformatert kjemisk formel}}.
-- Modul som automatisk formaterer visse kjemiske formlar.
-- Stør berre ladningar med eitt siffer.
-- Prioritering:
-- 1. ladning
-- 2. atomtal
local eksport = {}
function eksport.ladningsformat(maltekst) -- vis ladningstalet over talet på atom
local treff = maltekst:gmatch('>(%d+)</sub><sup>([0-9][+%-])')
for mengd, ladning in treff do
local rettFormat = '<span style="display:inline-block;margin-bottom:-0.3em;vertical-align:-0.4em;line-height:1em;font-size:80%;text-align:left">' .. ladning .. '<br />' .. mengd .. '</span>'
maltekst = maltekst:gsub('<sub>' .. mengd .. '</sub><sup>' .. ladning:gsub('%-', '%%-'):gsub('%+', '%%+') .. '</sup>', rettFormat)
end
return maltekst
end
function eksport.hovud(frame)
local uformatert_formel = frame:getParent().args[1]
local lenkjeargument = frame:getParent().args['l'] or frame:getParent().args['lenkje']
local maltekst = '<span class="chemf nowrap">'
local sisteVarHeiltal = false -- hjelper til for å identifisera heiltal med fleire siffer (>9)
local ladning = false -- om formelen inneheld ladning
for i = 1, #uformatert_formel do -- gå gjennom alle teikna i strengen
local teikn = uformatert_formel:sub(i, i)
local nesteTeiknet = uformatert_formel:sub(i+1, i+1)
if teikn:match('%d') then -- fann eit heiltal
if nesteTeiknet == '+' or nesteTeiknet == '-' then -- sjå framover - er dette eit ladningstal?
if sisteVarHeiltal then
maltekst = maltekst .. '</sub>'
end
maltekst = maltekst .. '<sup>'
elseif not sisteVarHeiltal then
maltekst = maltekst .. '<sub>'
end
sisteVarHeiltal = true
maltekst = maltekst .. teikn
elseif teikn == '+' or teikn == '-' then
ladning = true
if not sisteVarHeiltal or uformatert_formel:sub(i-1, i-1) == '.' then
maltekst = maltekst .. '<sup>'
end
maltekst = maltekst .. teikn .. '</sup>'
sisteVarHeiltal = false
elseif teikn == '.' then
if maltekst:match('<sub>%d+$') then
maltekst = maltekst .. '</sub>'
end
else
if sisteVarHeiltal then
maltekst = maltekst .. '</sub>'
end
sisteVarHeiltal = false
maltekst = maltekst .. teikn
end
end
if sisteVarHeiltal then
maltekst = maltekst .. '</sub>'
end
if ladning then
maltekst = eksport.ladningsformat(maltekst)
end
maltekst = maltekst .. '</span>'
if lenkjeargument and lenkjeargument ~= 'nei' then
maltekst = '[[' .. uformatert_formel .. '|' .. maltekst .. ']]'
end
return maltekst
end
return eksport