Modul for {{Levde-lua}}. For å sjekka om modulen verkar som han skal, gå til Moduldiskusjon:Levde/test.




local sams = require('Modul:Sams')

local p = {}

function p.erDag(oppg)
    if oppg:find('^%d%d%.$') or oppg:find('^%d%.$') then
        return true
    else
        return false
    end
end

function p.erMaanad(oppg)
    if sams.erI(oppg, sams.maanader()) then
        return true
    else
        return false
    end
end

function p.erAarstal(oppg)
    if oppg:find('^%-*%d+$') then
        return true
    else
        return false
    end
end

function p.dato(arg_spl, n)
    -- Henta ut datoen
    datoTab = {}
    if p.erDag(arg_spl[n]) then
        datoTab['dag'] = arg_spl[n]
        datoTab['månad'] = arg_spl[n+1]
        datoTab['år'] = arg_spl[n+2]
        datoTab['dato'] = '[[' .. datoTab['dag'] .. ' '  .. datoTab['månad'] .. ']]' .. ' [[' .. datoTab['år'] .. ']]' 
        hopp = n+2
    elseif p.erMaanad(arg_spl[n]) then
        datoTab['månad'] = arg_spl[n]
        datoTab['år'] = arg_spl[n+1]
        datoTab['dato'] = datoTab['månad'] .. ' [[' .. datoTab['år'] .. ']]' 
        hopp = n+1
    elseif p.erAarstal(arg_spl[n]:gsub(',$', '')) then
        datoTab['år'] = arg_spl[n]:gsub(',$', '')
        datoTab['dato'] = '[[' .. datoTab['år'] .. ']]'
        hopp = n
    elseif arg_spl[n] == '?' then
        datoTab['dato'] = 'ukjend fødedato'
        hopp = n
    end
    return datoTab, hopp
end

function p.namn(arg_spl, n)
    -- Henta ut namnet
    -- Mogelege avgrensingar: «,», «-», «–» og «og»
    for i, ele in ipairs(arg_spl) do
        if i > n then
            if ele == ',' or ele == '-' or ele == '–' or ele == 'og' then
                ende = i-1
                break
            else
                ende = i
            end
            if ele:find(',$') then
                ende = i
                length = ele:len()
                arg_spl[ende] = ele:sub(1, length-1)
                break
            end
        end        
    end
    
    namnet = table.concat(arg_spl, ' ', n+1, ende)
    
    return namnet
end

function p.stad(arg_spl, n)
    -- Henta ut stad
    -- Mogelege avgrensingar: «,», «som», «-», «–» og «og»
    for i, ele in ipairs(arg_spl) do
        if i > n then
            if ele == ',' or ele == 'som' or ele == '-' or ele == '–' or ele == 'og' then
                ende = i-1
                break
            else
                ende = i
            end
            if ele:find(',$') then
                ende = i
                length = ele:len()
                arg_spl[ende] = ele:sub(1, length-1)
                break
            end
        end        
    end
    
    if ende == n + 1 and not arg_spl[ende]:find(']]') then
        arg_spl[ende] = '[[' .. arg_spl[ende]  .. ']]'
    end
    
    stadnamn = ' ' .. table.concat(arg_spl, ' ', n, ende)
    
    return stadnamn
end
    
function p.hovud(ramme) 
    sidenamn = mw.title.getCurrentTitle().fullText
    if sidenamn == 'Mal:Levde-lua' then
        return ''
    end    
    arg = ramme:getParent().args
    hArg = arg[1]
    if hArg:find('%d–%d') then -- syrg for mellomrom
        hArg = hArg:gsub('–', ' - ')
    elseif hArg:find('%d%-%d') then 
        hArg = hArg:gsub('-', ' - ')
    elseif hArg:find('%?.%d') then
        hArg = hArg:gsub('%?.', '? - ')
    end
    arg_spl = mw.text.split(hArg, ' ')
    
    l = table.maxn(arg_spl)
    
    hopp = 0
    
    stad1 = nil
    stad2 = nil
    foedd_dato = ''
    daud_dato = ''
    foedenamn = ''
    foedd_kring = ''
    daud_kring = ''
    kat1 = ''
    kat2 = ''
    kat3 = ''
    kat4 = ''
    side = 'fødd' -- kva dato jobbar me med?
    
    i_hovudNR = mw.title.getCurrentTitle():inNamespace(0) -- er me i hovudnamnerommet?
    
    for n, arget in ipairs(arg_spl) do
        if arget == 'kring' or arget == 'ca.' or arget == 'cirka' then
            if side == 'fødd' then
                foedd_kring = 'kring '
            elseif side == 'daud' then
                daud_kring = 'kring '
            end        
        elseif arget == 'fødd' or n == 1 or (n == 2 and foedd_kring ~= '') then
            if arg_spl[n+1] == 'kring' or arg_spl[n+1] == 'ca.' or arg_spl[n+1] == 'cirka' then
                dato_indeks = n+2                
            elseif arget == 'fødd' then
                dato_indeks = n+1
            else
                dato_indeks = n
            end 
            if arg_spl[dato_indeks] == 'i' or arg_spl[dato_indeks] == 'på' then -- ukjend fødedato
                foedd_dato = ''
            else
                datoTab, hopp = p.dato(arg_spl, dato_indeks)
                foedd_dato = datoTab['dato']                
            end

            if foedd_dato ~= '' and datoTab['år'] then
                kat1 = '[[Kategori:Fødde i ' .. datoTab['år'] .. ']]'
                if datoTab['dag'] then
                    kat2 = '[[Kategori:Fødde den ' .. datoTab['dag'] .. ' ' .. datoTab['månad'] .. ']]'
                end
            end            
            
        elseif arget == 'daud' or arget == 'død' or arget == '-' then
            side = 'daud'
            if arg_spl[n+1] == 'kring' or arg_spl[n+1] == 'ca.' or arg_spl[n+1] == 'cirka' then
                dato_indeks = n+2                
            else
                dato_indeks = n+1
            end
            datoTab, hopp = p.dato(arg_spl, dato_indeks)
            daud_dato = datoTab['dato']
            if daud_dato ~= '' and datoTab['år'] then
                kat3 = '[[Kategori:Døde i ' .. datoTab['år'] .. ']]'
                if datoTab['dag'] then
                    kat4 = '[[Kategori:Døde den ' .. datoTab['dag'] .. ' ' .. datoTab['månad'] .. ']]'
                end
            end
        elseif arget == 'i' or arget == 'på' then
            if side == 'fødd' then
                stad1 = p.stad(arg_spl, n)
            elseif side == 'daud' then
                stad2 = p.stad(arg_spl, n)
            end
        elseif arget == 'som' then
            foedenamn, hopp = p.namn(arg_spl, n)
            foedenamn = ' som ' .. "'''"  .. foedenamn .. "'''"
        end          
    end

    if not stad1 then
        stad1 = ''
    end
    if not stad2 then
        stad2 = ''
    end
    
    if not i_hovudNR then
        kat1 = ''
        kat2 = ''
        kat3 = ''
        kat4 = ''
    end
        
    if stad1 == '' and stad2 == '' and foedenamn == '' then -- stuttversjon
        tekst = foedd_kring .. foedd_dato .. '–' .. daud_kring .. daud_dato 
    else -- langversjon
        tekst = 'fødd ' .. foedd_kring .. foedd_dato .. stad1 .. foedenamn .. ', daud ' .. daud_kring .. daud_dato .. stad2
    end
    tekst = tekst .. kat1 .. kat2 .. kat3 .. kat4
    tekst = tekst:gsub(',]]', ']]') -- snøggløysing for å få bort uynskte komma
    tekst = tekst:gsub('  ', ' ')
    return tekst
end

return p