Modul:WikidataAlder: Forskjell mellom sideversjoner

Fra wikisida.no
Hopp til navigering Hopp til søk
Ingen redigeringsforklaring
Problemer med en loop som gir feil svar
Linje 65: Linje 65:
     local i = 0
     local i = 0
     local oki = 0
     local oki = 0
    -- use for i,prop in iprop(entity['claims'][pv])
     while i < #prop do
     while i < #prop do
         i = i + 1
         i = i + 1
Linje 71: Linje 72:
             return prop[i]
             return prop[i]
         end
         end
        -- dette gir siste med normal rank, det er ikke gitt at hverken første eller siste er riktig
        -- alle oppføringer er riktige i dette tilfellet
         if rank == 'normal' then
         if rank == 'normal' then
             if oki == 0 then
             if oki == 0 then
Linje 77: Linje 80:
         end
         end
     end
     end
    -- merk tidligere kommentar
     if oki>0 then
     if oki>0 then
         return prop[oki]
         return prop[oki]

Sideversjonen fra 27. sep. 2015 kl. 14:23

Formål

Å presentere datoer fra Wikidata.

Bruk

Modulen brukes ved å legge inn en av:

{{#invoke:WikidataAlder|alderInfoboks|qv=Qxxx}}

i en mal.

Feilmelding

Om du ser en feilmelding i en infoboks angående fødsels- eller dødsdato, dobbeltsjekk at fødsels- eller dødsdato er riktig på Wikidata. Dette kan forekomme bl.a. av ikke-eksisterende datoer som ved skuddår.

Eksempler

Artikkel Manuell bruk av maler
{{Fødselsdato og alder}} / {{Dødsdato og alder}}
Modul:WikidataAlder
({{ #invoke:WikidataAlder | alderInfoboks }}
Kommentar
Sverige (Q34) (har ikke, siden dette ikke er en person) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke. Har ikke fødsels- eller dødsdatoer, så da prøver vi ikke å regne ut alder
Bjørn Ousland (Q4919913) 14. mai 1959 (66 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Zdeněk Grygera (Q168997) 14. mai 1980 (45 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Synnøve Solemdal (Q257682) 15. mai 1989 (36 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Veronica Campbell-Brown (Q5796) 15. mai 1982 (43 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Jens Stoltenberg (Q57665) 16. mars 1959 (67 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Susann Goksør Bjerkrheim (Q2153171) 7. juli 1970 (55 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Lady Gaga (Q19848) 28. mars 1986 (40 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Arve Opsahl (Q716993) 29. april 2007 (85 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
B.B. King (Q188969) 14. mai 2015 (89 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Einar Gerhardsen (Q164346) 19. september 1987 (90 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Marie Curie (Q7186) 4. juli 1934 (66 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Isaac Newton (Q935) 31. mars 1727 (84 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Karl III Johan (Q52927) 8. mars 1844 (81 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Karl XII av Sverige (Q52934) (ikke brukt i artikkel) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Elisabeth I (Q7207) 24. mars 1603 (69 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Vladimir Lenin (Q1394) 21. januar 1924 (53 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Arthur Townsend (Q4800483) (ikke brukt) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke. Wikidata har ukjent verdi for dødsdato, så da skal vi ikke regne ut alder.
Julius Cæsar (Q1048) (ikke brukt, men manuelt oppgitt til 55 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke. Wikidata har ikke nøyaktige dager, så da prøver vi ikke å regne ut alder
Aleksander den store (Q8409) (ikke brukt, men manuelt oppgitt til 32 år) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke.
Pythagoras (Q10261) (ikke brukt i artikkel) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke. Wikidata har ikke nøyaktige dager, så da prøver vi ikke å regne ut alder
Ramses II (Q1523) (ikke brukt i artikkel) Skriptfeil: Funksjonen «alderInfoboks» eksisterer ikke. Wikidata har ikke nøyaktige dager, så da prøver vi ikke å regne ut alder

local p = {}

local function frameargs(frame)
    local args = frame.args
    if args[1] == nil then
        local pFrame = frame:getParent();
        args = pFrame.args;
        for k,v in pairs( frame.args ) do
            args[k] = v;
        end
     end
     return args['qv'],args['pv']
end

function splitTimestamp(timestamp)
	-- tonumber can return nil, what happens then?
    local aar = tonumber(string.sub(timestamp, 2, 5))
	-- tonumber can return nil, what happens then?
    local maaned = tonumber(string.sub(timestamp, 7, 8))
	-- tonumber can return nil, what happens then?
    local dag = tonumber(string.sub(timestamp, 10, 11))
        if string.sub(timestamp, 1, 1) == '-' then
        aar = 0 - aar
    end
    return dag,maaned,aar
end

function ageFromBirthAndDeathDates(birthtimestamp, birthprecision, deathtimestamp, deathprecision)
    local birthday, birthmonth, birthyear = splitTimestamp(birthtimestamp)
    local deathday, deathmonth, deathyear = splitTimestamp(deathtimestamp)
    if birthprecision == 11 and deathprecision == 11 then
        local age = deathyear - birthyear
        if deathmonth < birthmonth then
            age = age - 1
        end
        if deathmonth == birthmonth and deathday < birthday then
            age = age - 1
        end
        return '('..age..' år)'
    end
    if birthprecision >= 10 and deathprecision >= 10 then
        local age = deathyear - birthyear
        if deathmonth < birthmonth then
            age = age - 1
        end
        return '('..age..' år)'
    end
    if birthprecision >= 9 and deathprecision >= 9 then
        local age = deathyear - birthyear
        local age1 = age - 1
        return '('..age1..'–'..age..' år)'
    end
    return ''
end

function p.finnBesteProperty(qv,pv)
    local entity = mw.wikibase.getEntity(qv)
    if not entity then
        return
    end
    if not entity['claims'] or not entity['claims'][pv] then
        return
    end
    local prop = entity['claims'][pv]
    local i = 0
    local oki = 0
    -- use for i,prop in iprop(entity['claims'][pv])
    while i < #prop do
        i = i + 1
        local rank = prop[i]['rank']
        if rank == 'preferred' then
            return prop[i]
        end
        -- dette gir siste med normal rank, det er ikke gitt at hverken første eller siste er riktig
        -- alle oppføringer er riktige i dette tilfellet
        if rank == 'normal' then
            if oki == 0 then
                oki = i
            end
        end
    end
    -- merk tidligere kommentar 
    if oki>0 then
        return prop[oki]
    end
end

function p.frawikidata(frame)
    local qv,pv = frameargs(frame)
    local birthClaim = p.finnBesteProperty(qv, 'P569')
    local deathClaim = p.finnBesteProperty(qv, 'P570')
    if not deathClaim or not birthClaim then
        return ''
    end
    if birthClaim['mainsnak']['snaktype'] ~= 'value' or deathClaim['mainsnak']['snaktype'] ~= 'value' then
        return ''
    end

    local birthValue = birthClaim['mainsnak']['datavalue']['value']
    local deathValue = deathClaim['mainsnak']['datavalue']['value']
    return ageFromBirthAndDeathDates(
        birthValue['time'], birthValue['precision'],
        deathValue['time'], deathValue['precision']
    )
end

return p