Hopp til innhald

Modul:Sjølvformatert kjemisk formel

Frå Wiktionary - den frie ordboka

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