Redigerer
Modul:Bruk Wikidata
Hopp til navigering
Hopp til søk
Advarsel:
Du er ikke innlogget. IP-adressen din vil bli vist offentlig om du redigerer. Hvis du
logger inn
eller
oppretter en konto
vil redigeringene dine tilskrives brukernavnet ditt, og du vil få flere andre fordeler.
Antispamsjekk.
Ikke
fyll inn dette feltet!
-- Overførte parametere til funksjoner hent_emne, hent_tid, hent_tall, hent_streng, hent_tekst: -- Felles: -- 1: Wikidata egenskap (Pxxx) -- 2: Lokal spesifisert verdi. Wikidata brukes bare hvis det er tomt eller ikke spesifisert -- feltnavn. Brukes til å sjekke om Wikidata skal brukes til dette feltet. -- wikidata: Liste over feltnavn. Bruk Wikidata hvis '' feltnavn '' er på listen eller hvis verdien er 'ja' eller 'alle', -- og '' navn '' ikke på listen '' ingen_wikidata ''. -- ingen_wikidata: Liste over feltnavn. Ikke bruk Wikidata hvis '' feltnavn '' er på listen. -- adskil: Separasjon mellom flere verdier -- liste: Sett opp flere verdier i punktlisten -- ingen: tekst for novalue -- ukjent: Tekst for somevalue -- maks: Maks antall resultater -- q: Wikidata-emne (Qxxx). Hvis definert, bruk dette Wikidata-emnet i stedet for det som er knyttet til den viste siden (mest for testing) -- Ikon: Opprett et ikon med link til Wikidata hvis verdien er 'ja' -- tid: Hvis verdien er 'ja': Angi tid eller start- og sluttid som er oppnådd fra kvalifiserende spillere. (ikke for nedlastingstid) -- kvalifisering1, kvalifisering2, kvalifisering3, etc.: kvalifiseringer -- kvalifiseringsformat1, kvalifiseringsformat2, kvalifiseringsformat3, etc .: format for å vise verdier med kvalifiseringsprogrammer -- kvalifiseringsformatut1, Kvalifiseringsformatut2, Kvalifiseringsformatut3, etc .: Format for å vise verdier uten kvalifiseringsprogrammer -- kvalifisatorbruk1, kvalifisatorbruk2, kvalifisatorbruk3, etc.: 'med': kun verdier uten kvalifiseringsenhet, 'med': kun verdier uten kvalifikator, -- entall: Tekst etter resultat hvis det er et resultat -- flertall: Tekst etter resultater hvis det er flere -- For hent_emne: -- sprogkat: Bruk kategori etter språk tilbakebetaling -- sprognotat: Bruk notat ved tilbakekalling av språk -- srpognotategruppe: Gruppetributt etter språknotat -- msk: Vis MSK-tidssone for UTC-tidssoner i Russland -- pari: Skriv politisk parti for emnet i det angitte formatet -- storboks: 'ja': skriv første verdi med første bokstav, -- 'alle': skriv inn alle verdier med stor bokstav -- kursiv: Skriv verdiene kursiv hvis verdien er 'ja' -- land: Skriv land for emnet i det angitte formatet -- kun: Inkluder kun resultater med det angitte emnet som verdi -- For hent_tall: -- Decimaler: Antall decimaler i tall -- enhet: Konverter nummeret til den angitte enheten (må være i wanted_units-tabellen) -- visusikkerhet: Vis usikkerhet (standard: ja) -- visningsenhet: visningsenhet (standard: ja) -- areal tetthet: Visningsverdi, område og tetthet i spesifisert format ($ 1 = tallet, $ 2 = området, $ 3 = tettheten) -- områdealgoritme: vis verdi i spesifisert format hvis ikke område ($ 1 = tall) -- For hent_tekst: -- sprog: Liste over språkkoder for ønsket språk. 'alle' for alle språk. (standard: da) -- skrivsprog: Skriv inn navnet på språket i parentes hvis 'ja' -- For hent_streng: -- format: Format for streng. $ 1 i formatet vil bli erstattet med strengen. -- For hent_tid: -- kunaar: Skriv kun året hvis verdien er 'ja' (gjelder også for andre datatyper med tidskvalifiserende) -- alder: Beregn alder i forhold til en tidsverdi -- aldersformat: format for aldersindikasjon local preferred_language = 'nb' local fallback_languages = { 'da', 'nn', 'sv', 'en', 'de', 'nl', 'fr', 'sp', 'it', 'pt' } local fallback_languages_humans = { 'da', 'nn', 'sv' } local fallback_note = '<span style="color:gray; cursor:help;"><small>Navnet er anført på %s og stammer fra [[d:%s|Wikidata]] hvor navnet enda ikke finnes på norsk.</small></span>' local bc = ' fvt.' local months = { ['1'] = 'januar ', ['2'] = 'februar ', ['3'] = 'mars ', ['4'] = 'april ', ['5'] = 'mai ', ['6'] = 'juni ', ['7'] = 'juli ', ['8'] = 'august ', ['9'] = 'september ', ['10'] = 'oktober ', ['11'] = 'november ', ['12'] = 'december ' } -- Units used for quantity values. For each give name to display, conversion factor, local wd_units = { -- area units Q712226 = { name = 'km2', show_as = 'km<sup>2</sup>', conv = 1e6, type = 'area' }, Q25343 = { name = 'm2', show_as = 'm<sup>2</sup>', conv = 1, type = 'area' }, Q232291 = { name = 'mi2', show_as = 'mi<sup>2</sup>', conv_to = 'km2', conv = 2589988.110336, type = 'area'}, Q35852 = { name = 'ha', show_as = 'ha', conv_to = 'km2', conv = 10000, type = 'area'}, -- currency units Q25417 = { name = 'DKK', show_as = "dkk", conv = 1, type = 'currency' }, Q4916 = { name = 'EUR', show_as = "€", conv = 1, type = 'currency' }, Q25224 = { name = 'GBP', show_as = "£", conv = 1, type = 'currency' }, Q132643 = { name = 'NOK', show_as = "nok", conv = 1, type = 'currency' }, Q122922 = { name = 'SEK', show_as = "sek", conv = 1, type = 'currency' }, Q4917 = { name = 'USD', show_as = "$", conv = 1, type = 'currency' }, Q41044 = { name = 'RUB', show_as = "rub", conv = 1, type = 'currency' }, -- russiske rubler Q1104069 = { name = 'CAD', show_as = "cad", conv = 1, type = 'currency' }, -- canadiske dollar Q8146 = { name = 'JPY', show_as = "¥", conv = 1, type = 'currency' }, -- Japanese yen Q25344 = { name = 'CHF', show_as = "CHF", conv = 1, type = 'currency' }, -- Swiss franc Q202040 = { name = 'KRW', show_as = "₩", conv = 1, type = 'currency' }, -- South Korean won -- length units Q11573 = { name = 'm', show_as = 'm', conv = 1, type = 'length' }, Q828224 = { name = 'km', show_as = 'km', conv = 1e3, type = 'length' }, Q253276 = { name = 'mile', show_as = 'mil', conv_to = 'km', conv = 1609.344, type = 'length' }, Q3710 = { name = 'fot', show_as = 'fot', conv_to = 'm', conv = 0.3048006, type = 'length' }, Q174728 = { name = 'cm', show_as = 'cm', conv = 0.01, type = 'length' }, Q174789 = { name = 'mm', show_as = 'mm', conv = 0.001, type = 'length' }, Q218593 = { name = 'in', show_as = '″', conv = 0.0254, type = 'length' }, -- mass units Q11570 = { name = 'kg', show_as = 'kg', conv = 1, type = 'mass' }, Q100995 = { name = 'lb', show_as = "lb", conv = 0.45359237, type = 'mass' }, -- time units Q11574 = { name = 's', show_as = 's', conv = 1, type = 'time' }, Q7727 = { name = 'minut', show_as = 'min.', conv = 60, type ='time' }, Q25235 = { name = 'time', show_as = 't', conv = 3600, type = 'time' }, -- speed units Q182429 = { name = 'm/s', show_as = 'm/s', conv = 1, type = 'speed' }, Q180154 = { name = 'km/t', show_as = 'km/t', conv = 0.2777777777777777778, type = 'speed' }, Q128822 = { name = 'knop', show_as = 'kn', conv = 0.51444444444444444444, type = 'speed' }, Q748716 = { name = 'ft/s', show_as = 'ft/s', conv = 0,3048, type = 'speed' } } -- Units as requested in parameter 'enhet' local wanted_units = { m2 = { show_as = 'm<sup>2</sup>', conv = 1, type = 'area' }, km2 = { show_as = 'km<sup>2</sup>', conv = 1e-6, type = 'area' }, m = { show_as = 'm', conv = 1, type = 'length' }, km = { show_as = 'km', conv = 1e-3, type = 'length' }, cm = { show_as = 'cm', conv = 100, type = 'length' }, kg = { show_as = 'kg', conv = 1, type = 'mass' }, ['km/t'] = { show_as = 'km/t', conv = 3.6, type = 'speed' }, ['m/s'] = { show_as = 'm/s', conv = 1, type = 'speed' }, min = { show_as = 'min.', conv = 1/60, type = 'time' } } local msk_timezones = { Q6723 = ' ([[Moskva tid|MSK]]-1)', -- UTC+2 Q6760 = ' ([[Moskva tid|MSK]])', -- UTC+3 Q6779 = ' ([[Moskva tid|MSK]]+1)', -- UTC+4 Q6806 = ' ([[Moskva tid|MSK]]+2)', -- UTC+5 Q6906 = ' ([[Moskva tid|MSK]]+3)', -- UTC+6 Q6940 = ' ([[Moskva tid|MSK]]+4)', -- UTC+7 Q6985 = ' ([[Moskva tid|MSK]]+5)', -- UTC+8 Q7041 = ' ([[Moskva tid|MSK]]+6)', -- UTC+9 Q7056 = ' ([[Moskva tid|MSK]]+7)', -- UTC+10 Q7069 = ' ([[Moskva tid|MSK]]+8)', -- UTC+11 Q7105 = ' ([[Moskva tid|MSK]]+9)', -- UTC+12 } local fallback_langues_after_country = { Q35 = 'da', --Danmark Q30 = 'en', -- USA Q34 = 'sv', -- Sweden Q142 = 'fr', -- France Q145 = 'en', -- UK Q183 = 'de' -- Germany } local fallback_langues_for_persons = { Q29 = 'sp', -- Spain Q30 = 'en', -- USA Q33 = 'fi', -- Finland Q38 = 'it', -- Italy Q40 = 'de', -- Austria Q45 = 'pt', -- Portugal Q55 = 'nl', -- Netherlands Q96 = 'sp', -- Mexico Q142 = 'fr', -- France Q145 = 'en', -- UK Q155 = 'pt', -- Brazil Q183 = 'de', -- Germany Q189 = 'is', -- Iceland Q298 = 'sp', -- Chile Q408 = 'en', -- Australia Q414 = 'sp', -- Argentina Q664 = 'en' -- New Zealand } local p = {} local fallback_category ='[[Kategori:Informasjon fra Wikidata på et annet språk enn norsk]]' local category_human_missing_name ='[[Kategori:Personnavn fra Wikidata på et annet språk enn norsk]]' local many_p106_category='[[Kategori:Masse informasjon fra WikiData for P106 (beskjeftigelse)]]' local tiplus_p106_category='[[Kategori:Mer enn 10 opplysninger fra WikiData for P106 (beskjeftigelse)]]' local many_p166_category ='[[Kategori:Masse informasjon fra WikiData for P166 (utmerkelse)]]' local many_p463_category ='[[Kategori:Masse informasjon fra WikiData for P463 (medlem av)]]' local many_p737_category ='[[Kategori:Masse informasjon fra Wikidata for P737 (influert av)]]' local many_p800_category ='[[Kategori:Masse informasjon fra Wikidata for P800 (verk)]]' local many_p802_category ='[[Kategori:Masse informasjon fra Wikidata for P802 (elev)]]' local many_p1082_category ='[[Kategori:Masse informasjon fra Wikidata for P1082 (folketall)]]' local many_p1344_category ='[[Kategori:Masse informasjon fra Wikidata for P1344 (deltatt i)]]' local category_unrecognized_unit = '[[Kategori:Enhet fra Wikidata Ukjent]]' local category_missing_russian_name = '[[Kategori:Navn mangler på Wikidata for russere eller steder i Russland]]' local category_repeated_ref = '[[Kategori:Wikidata-referanse bruker samme eierskap mer enn en gang]]' local category_unknown_ref = '[[Kategori:Wikidata-referansen bruker ukjente egenskaper]]' local tracking_categories = '' local add_tracking_category = function(cat) tracking_categories = tracking_categories .. cat end -- The following values are set by get_statements local the_entity -- Used when finding additionel information from statements for other properties local the_qid -- Used to make links to Wikidata local the_pid -- Used to make links to Wikidata -- The following value is set by get_references local ref_texts = {} local function has_value (tab, val) for index, value in ipairs(tab) do if value == val then return index end end return false end -- Get and format a reference to a statement local get_reference = function(ref, kunurl) local refargs = {} -- go throug all reference properties local snaks = ref.snaks for refpid, ref in pairs(snaks) do --mw.logObject(refpid, 'refpid') --mw.logObject(ref, 'ref') -- There may be more than more than value with the same property, but ignore all but the first ref1 = ref[1] if ref[2] then add_tracking_category(category_repeated_ref) end if ref1.snaktype == 'value' then -- We have a reel value, as in not 'somevalue' or 'novalue' if refpid == 'P248' then -- P248 is stated in -- Get the item the rerefence is stated in local refentity = mw.wikibase.getEntity(ref1.datavalue.value.id) -- Check these: for book editions -- P1476 is title (monolingual text, the language can be default for language) -- P1680 is subtitle (monolingual text, include this?) -- P50 is author (item) -- P2093 is author name strin (string), check also for qualifier P1545 (series ordinal, warning: it is type string!) -- P393 is edition number (string) -- P98 is editor (item, check no) -- P123 is publisher (item) -- P291 is place of publication (item) -- P577 is publication date (time) -- P407 is language of work or name (item) -- P1683 is quote (monolinual text) -- for journals -- P433 is issue (string) -- P1433 is published in (item, go to it for journal=title, other info from this?) -- P478 is volume -- P698 is PubMed ID (pmid, external identifier) -- P932 is PMCID (pmc, external identifier) -- P356 is DOI (doi, external identifier) -- P1065 is archive URL (URL) -- P2960 is archive date (time) -- P179 is series (item) (Should this be used??) -- P31 is instance of (could be checked to know which properties to look for?) local reftypestatements = refentity:getBestStatements('P31') local instancesof = {} if reftypestatements then mw.logObject(reftypestatements, 'reftypestatements') for _, io in pairs(reftypestatements) do mw.logObject(io, 'io') if io.mainsnak.snaktype == 'value' then instancesof[io.mainsnak.datavalue.value.id] = true end end end elseif refpid == 'P854' then -- P854 is reference URL refargs.url = ref1.datavalue.value elseif refpid == 'P813' then -- P813 is retrieved refargs.accessdate = p.format_time({}, ref1.datavalue.value) elseif refpid == 'P304' then -- P304 is page(s) refargs.page = ref1.datavalue.value elseif refpid == 'P792' then -- P792 is chapter refargs.chapter = ref1.datavalue.value elseif refpid == 'P143' then -- P143 is "imported from" refargs.importedfrom = ref1.datavalue.value local refentity = mw.wikibase.getEntity(ref1.datavalue.value.id) local label, lang = refentity:getLabelWithLang(preferred_language) if label then refargs.importedfrom["label"] = label end --mw.logObject(ref1,'ref1') else add_tracking_category(category_unknown_ref) end end end local text = '' -- mw.logObject(refargs, 'refargs') if refargs.url then local reftext = refargs.url -- Opprett en linktekst fra url -- finn startpros. local j1 = string.find(reftext,'//',1,true) -- Fjern den første delen av strengen gjennom de to skråstreker hvis de eksisterer if j1 then reftext = string.sub(reftext,j1+2,string.len(reftext)) else reftext = '' end -- mw.logObject(reftext,'reftext') -- hvis strengen ikke er tom if reftext ~= '' then -- Finn posisjonen til neste skråstrek i strengen local i1 = string.find(reftext,'/',1,true) -- Bruk bare delen av strengen som ligger foran skråstreket hvis den eksisterer if i1 then reftext = string.sub(reftext,1,i1-1) end text = 'Opplysningen er fra [[d:' .. the_qid .. '#' .. the_pid .. '|Wikidata]] som viser til kilden: ['..refargs.url..' '..reftext..']. ' end end if refargs.accessdate and text ~= '' then text = text..'Hentet '..refargs.accessdate..'. ' end if refargs.importedfrom and kunurl ~= 'ja' then text = text..'Importert fra '..refargs.importedfrom.label..'. ' end mw.logObject(text,'text') return text end -- Get and format all references to a statement -- Append the references to text and return the new text -- If text is nil, return nil again local get_references = function(args, text, references) -- This function is work in progess. -- kilderef er satt til 'ja' hvis du vil ha referanser local kilderef = mw.text.trim(args['ref'] or '') if kilderef ~= 'ja' then return text end if not text then return nil end -- kunurl er satt til 'ja' hvis du kun ønskes ref-url (P854) local kunurl = mw.text.trim(args['kunurl'] or '') -- viskm er satt til 'ja' hvis det skulle være et notat om at kilder mangler local viskm = mw.text.trim(args['viskm'] or '') local reference = '' -- refs er en tabell av referansene funnet local refs = {} if not references or not next(references) then --refs[1] = '\nOpplysning er fra [[d:' .. the_qid .. '#' .. the_pid .. '|Wikidata]] som ikke har kilder til den.' else for _ ,ref in pairs(references) do reference = get_reference(ref, kunurl) if reference ~= '' then table.insert(refs, reference) end end end -- innholdet i notatet innhold = '' -- Antall referanser funnet if #refs == 1 then innhold = '\n'..refs[1] elseif #refs > 1 then innhold = '\nOpplysningen er fra [[d:' .. the_qid .. '#' .. the_pid .. '|Wikidata]] som har disse referansene: \n*'..table.concat(refs, '\n*') elseif viskm == 'ja' then innhold = '\nOpplysning er fra [[d:' .. the_qid .. '#' .. the_pid .. '|Wikidata]] som ikke har referanser til den.' end --mw.logObject(table.concat(refs, '\n*'),'slutprodukt') if innhold ~= '' then local nr -- index for innhold i ref_texts local itabel = has_value(ref_texts, innhold) if not itabel then table.insert(ref_texts, innhold) nr = #ref_texts else nr = itabel end local ref_args = { name = 'kilde ' .. the_pid .. the_qid .. nr } text = text .. p.frame:extensionTag{ name = 'ref', content = innhold, args = ref_args } --mw.logObject(innhold..nr,'innhold') end --elseif viskm == 'ja' blir da text = text .. '<sup><small>[kildeløs]</small></sup>' end return text end -- Looks at the arguments 'sprog' og 'skrivsprog' in args -- Returns 3 values: 1) get_all: true if all languages are wanted -- 2) show_language: true if language name is wanted -- 3) a table with keys for wanted languages. local get_lang_args = function(args) local languages = mw.text.trim(args.sprog or preferred_language) local show_language = mw.text.trim(args.skrivsprog or '') == 'ja' local get_all = false local wanteds = {} if languages == 'alle' then get_all = true else for key in mw.text.gsplit(languages, '%s*,%s*') do wanteds[key] = true end end return get_all, show_language, wanteds end -- Get values from a qualifier with data type time -- Insert the values in the table given as first argument -- The table elements are tables with the uformatted and the formatted value -- Return the table local get_time_qualifier = function(args, times, qualifiers) if qualifiers then for key, qualifier in pairs(qualifiers) do if qualifier.snaktype == "value" then local value = qualifier.datavalue.value local text = p.format_time(args, value) if text then table.insert(times, { value.time, text }) end end end end return times end -- combine the formated dates in the second element of the element in the dates table local combine_dates = function(dates) local text = '' if dates and dates[1] then text = dates[1][2] end for i = 2, #dates do text = text .. '/' .. dates[i][2] end return text end -- Get time values from the qualifiers and add them to the table times -- The elements of times are tables with unformated and formated time values -- Returns the times table local get_qualifier_times = function(args, times, qualifiers) if qualifiers then get_time_qualifier(args, times, qualifiers.P585) -- P585 is point of time local starts = get_time_qualifier(args, {}, qualifiers.P580) -- P580 is start time local ends = get_time_qualifier(args, {}, qualifiers.P582) -- P582 is end time if #starts > 0 then -- There can more than one start time, e.g. if the sources don't agree if #ends > 0 then -- Period with start and end time table.insert(times, { starts[1][1], combine_dates(starts) .. '-' .. combine_dates(ends) } ) else -- Only start time table.insert(times, { starts[1][1], 'fra ' .. combine_dates(starts) } ) end else if #ends > 0 then -- Only end time table.insert(times, { ends[1][1], 'til ' .. combine_dates(ends) } ) end end end return times end -- Sort and combine the qualifier time values in the table times. -- The elements of times are tables with unformated and formated time values. -- Returns text ready to append to the value. local format_qualifier_times = function(times) local text = '' if #times > 0 then table.sort(times, function (a,b) -- Use the unformated ISO 8601 time string for sorting local signa, signb = a[1]:sub(1, 1), b[1]:sub(1, 1) if signa == '+' then if signb == '+' then return a[1] < b[1] -- 2 AD times: The higher number is greater else return false -- AD time is greater than BC time end else if signb == '+' then return true -- BC time is lesser than AD time else return a[1] > b[1] -- 2 BC times: The higher number is lesser end end end) text = text .. ' (' .. times[1][2] for i = 2, #times do text = text .. ', ' .. times[i][2] end text = text .. ')' end return text end -- Handle a qualifier -- Return new text inkl. the qualifier or nil to remove the statement from the results local get_qualifier = function(args, text, qual, format, formatwithout, use) if not qual then -- No such qualifier if use == 'med' then -- Only statements with the qualifier is wanted, so remove this statement return nil else -- Otherwise return the statement with the formatwithout applied -- Use the table version of string.gsub to avoid having to escape % chars return (string.gsub(formatwithout, '$1', { ['$1'] = text })) end end if use == 'uten' then -- Only statements without the qualifier is wanted, so remove this statement return nil end -- These are used for monolingual texts. We will only get values for them if necessary local get_all, show_language, wanteds = false, false, false -- Get the qualifier. There can be several values, loop over them and separate with comma local qualtext, qualpure, testUseValue = {}, {}, ( use ~= 'alle' and use ~= 'med' and use~= '' ) -- 'uten' er elementer her for key, q in pairs(qual) do if q.snaktype == 'novalue' then table.insert(qualtext, 'ingen') elseif q.snaktype == 'somevalue' then table.insert(qualtext, 'ukjent') else local datatype = q.datavalue.type if datatype == 'time' then table.insert(qualtext, p.format_time(args, q.datavalue.value)) elseif datatype == 'monolingualtext' then if not wanteds then -- wanteds will be true if the language args are already fetched get_all, show_language, wanteds = get_lang_args(args) end if get_all or wanteds[q.datavalue.value.language] then if show_language then table.insert(qualtext, mw.text.nowiki(q.datavalue.value.text) .. ' (' .. mw.language.fetchLanguageName(q.datavalue.value.language, preferred_language) .. ')') else table.insert(qualtext, mw.text.nowiki(q.datavalue.value.text)) end end elseif datatype == 'string' then table.insert(qualtext, mw.text.nowiki(q.datavalue.value)) elseif datatype == 'url' or datatype == 'commonsMedia' or datatype == 'external-id' then table.insert(qualtext, q.datavalue.value) elseif datatype == 'quantity' then local textvalue = p.format_number(args, q.datavalue.value) table.insert(qualtext, textvalue) elseif datatype == 'wikibase-entityid' then table.insert(qualtext, p.get_label(args, q.datavalue.value.id, nil, nil)) if testUseValue then -- q-value table.insert(qualpure, q.datavalue.value.id) -- label without link local entity = mw.wikibase.getEntity(q.datavalue.value.id) if entity then local label, lang = entity:getLabelWithLang(preferred_language) if label then table.insert(qualpure,label) end end end end end end if testUseValue then local function useValueInTable( tbl ) for _, qualTextHere in pairs( tbl ) do if qualTextHere == use then return true end end return false end if ( not useValueInTable( qualtext ) and ( not useValueInTable( qualpure ) ) ) then return nil end end return (string.gsub(format, '$[12]', { ['$1'] = text, ['$2'] = table.concat(qualtext, ', ') })) end -- Handle requets for qualifiers for a statement -- text is the already formated statement -- Return the new text with qualifiers or nil to remove the statement from the results local get_qualifiers = function(args, text, qualifiers, notime) if not notime and mw.text.trim(args.tid or '') == 'ja' then -- Check qualifiers for point of time, start time, and end time local times = get_qualifier_times(args, {}, qualifiers) text = text .. format_qualifier_times(times) end -- mw.logObject(qualifiers,'qualifiers') local qualno = 1 repeat local qual = mw.text.trim(args['kvalifisering1' .. tostring(qualno)] or '') if qual == '' then break end local format = mw.text.trim(args['kvalifiseringsformat' .. tostring(qualno)] or '$1 ($2)') local formatwithout = mw.text.trim(args['kvalifiseringsformatut' .. tostring(qualno)] or '$1') local use = mw.text.trim(args['kvalifisatorbruk' .. tostring(qualno)] or 'alle') text = get_qualifier(args, text, qualifiers and qualifiers[qual], format, formatwithout, use) qualno = qualno + 1 until not text return text end -- Determine if the string 'name' is in the list 'list' med comma separated names -- Returns true if 'name' is in the list. local function inlist (name, list) for n in mw.text.gsplit(list, '%s*,%s*') do if n == name then return true end end return false end -- Determine if Wikidata should be used in this case -- Uses the arguments ingen_wikidata (blacklist), wikidata (whitelist), navn (fieldname) -- Returns true if OK to use Wikidata p.use_wikidata = function(args) -- The name of the field that this function is called from is passed in the parameter "feltnavn" local fieldname = mw.text.trim(args.feltnavn or '') -- Use Wikidata if not specified if #fieldname == 0 then return true end -- The blacklist is passed in the parameter "ingen_wikidata" local blacklist = args.ingen_wikidata if blacklist and inlist(fieldname, blacklist) then return false end -- The whitelist is passed in the parameter "wikidata" local whitelist = mw.text.trim(args.wikidata or '') if whitelist == 'alle' or whitelist == 'ja' or inlist(fieldname, whitelist) then return true else return false end end -- Get the best statements (rank preferred if it exist, or else rank normal) for the required item and property -- Sets the values the_entity, the_pid, the_qid p.get_statements = function(args) -- Get the item to use from either the parameter q or the item connected to the current page the_qid = mw.text.trim(args.q or '') if the_qid == '' then the_qid = mw.wikibase.getEntityIdForCurrentPage() end the_entity = mw.wikibase.getEntity(the_qid) if not the_entity then return nil end -- Get the best statements (rank preferred if exist, else rank normal) for the required property the_pid = mw.text.trim(args[1] or "") return the_entity:getBestStatements(the_pid) end -- Make a link to a page if wanted from a label -- Make the link to the entity 'entity' if not nil, else to 'qid' p.make_link = function(args, label, entity, qid) -- Convert characters with special meaning in wikitext to HTML entities label = mw.text.nowiki(label) -- Use italics if requested local use_italics = mw.text.trim(args.kursiv or "") if use_italics == 'ja' then label = "''" .. label .. "''" end local link = mw.text.trim(args.link or "") if link == 'nei' then -- link is not wanted return label end local sitelink if entity then sitelink = entity:getSitelink() else sitelink = mw.wikibase.getSitelink(qid) end if sitelink == nil then -- link is not possible return label end if sitelink == label then return '[[' .. sitelink .. ']]' else return '[[' .. sitelink .. '|' .. label .. ']]' end end -- Make text with message, reference, and category about using a fallback language p.make_language_message = function(args, langcode, qid) local language = mw.language.fetchLanguageName(langcode, preferred_language) -- No language in parenthesis for now -- local text =' (' .. language .. ')' local text = '' local language_note = mw.text.trim(args.sprognotat or '') if language_note ~= 'nei' then local ref_args = { name = 'sprog ' .. langcode .. qid } local language_notegroup = mw.text.trim(args.sprognotategruppe or '') if language_notegroup ~= '' then ref_args.group = language_notegroup end text = text .. p.frame:extensionTag{ name = 'ref', content = string.format(fallback_note, language, qid), args = ref_args } end local language_cat = mw.text.trim(args.sprogkat or '') if language_cat ~= 'nei' then add_tracking_category(fallback_category) end return text end -- Get a value of type item from an entity if it is unique. local get_unique_item_value = function(entity, pid) local statements = entity:getBestStatements(pid) if statements and #statements == 1 and statements[1].mainsnak and statements[1].mainsnak.snaktype == 'value' then return statements[1].mainsnak.datavalue.value.id end return nil end -- Format the label with upper case, link, extras (party or country), and language note -- make_note is the item ID to link to if a note is wanted, or else nil -- If requested there is linked to 'entity', or 'qid' if no entity local format_label = function(args, format, text, extra_text, entity, qid, lang, use_ucfirst, make_note) if use_ucfirst then text = mw.getLanguage(lang):ucfirst(text) end local text = p.make_link(args, text, entity, qid) if make_note then text = text .. p.make_language_message(args, lang, make_note) end if extra_text then return (string.gsub(format, '$[12]', { ['$1'] = text, ['$2'] = extra_text })) else return text end end -- Get the label of an item. -- Creates a link using the sitelink if it exists unless the link argument is set to no -- Converts the first character of the label to uppercase if use_ucfirst -- Finds and adds country or political party for the item if requested in the args and get_extras is true p.get_label = function(args, qid, use_ucfirst, get_extras) -- In order to save memory we will only get the entire entity for qid if necessary. -- It isn't needed if country or political party isn't requsted, -- and the entity have a label in the preferred language -- Find out if which extra, if any, are requested, and get extra_format local extra_format local get_party local get_country if get_extras then extra_format = mw.text.trim(args.parti or '') if extra_format ~= '' then get_party = true else extra_format = mw.text.trim(args.land or '') if extra_format ~= '' then get_country = true else get_extras = nil end end end if not get_extras then -- Try for a label in the the preferred language local label = mw.wikibase.getLabelByLang(qid, preferred_language) if label then return format_label(args, nil, label, nil, nil, qid, preferred_language, use_ucfirst, nil) end end -- OK, we will need the entity to continue local entity = mw.wikibase.getEntity(qid) if not entity then return nil end local extra_text local country_id, tried_to_get_country_id -- Find political party of the item if requested if get_party then -- P102 is member of political party local party_id = get_unique_item_value(entity, 'P102') if party_id then -- First try a shortname/abbreviation for the party local party_entity = mw.wikibase.getEntity(party_id) if party_entity then -- P1813 is short name shortname_statements = party_entity:getBestStatements('P1813') for key, statement in pairs(shortname_statements) do if statement.mainsnak.snaktype == 'value' and statement.mainsnak.datavalue.value.language == 'da' then extra_text = statement.mainsnak.datavalue.value.text break -- one is enough. As we don't know which is best, take the first end end if not extra_text then -- No shortname, get the label local label, lang = party_entity:getLabelWithLang(preferred_language) if lang == preferred_language then extra_text =label end end if extra_text then extra_text = p.make_link(args, extra_text, party_entity) end end end else -- Party was not requested. Get country if requested if get_country then -- P17 is country country_id, tried_to_country_id = get_unique_item_value(entity, 'P17'), true -- Don't repeat the country if it refers to itself if country_id and country_id ~= qid then local label, lang = mw.wikibase.getLabelWithLang(country_id) if lang == preferred_language then extra_text = mw.text.nowiki(label) if mw.text.trim(args.link or "") ~= 'nei' then -- link to the country local link = mw.wikibase.sitelink(country_id) if link then -- There is an article (consider to use tracking category otherwise) extra_text = '[[' .. link .. '|' .. extra_text .. ']]' end end end end end end -- Try the preferred language local label, lang = entity:getLabelWithLang(preferred_language) if lang == preferred_language then return format_label(args, extra_format, label, extra_text, entity, nil, lang, use_ucfirst, nil) end -- Next try the local language if the item is located in certain countries if not country_id and not tried_to_get_country_id then -- P17 is country country_id, tried_to_country_id = get_unique_item_value(entity, 'P17'), true end if country_id then local fallback = fallback_langues_after_country[country_id] if fallback then local label, lang = entity:getLabelWithLang(fallback) if lang == fallback then return format_label(args, extra_format, label, extra_text, entity, nil, lang, use_ucfirst, nil) end end if country_id == 'Q159' or -- Q159 is Russia country_id == 'Q34266' or -- Q34266 is Russian Empire country_id == 'Q15180' then -- Q15180 is Soviet Union add_tracking_category(category_missing_russian_name) end end -- Find out if the item is a human local ishuman = nil -- P31 is instance of local instanceof = entity:getBestStatements('P31') for key, statement in pairs(instanceof) do -- Q5 is human if statement.mainsnak.snaktype == 'value' and statement.mainsnak.datavalue.value.id == 'Q5' then ishuman = true break end end if ishuman then -- Next for humans try first group of fallback languags for humans (Norgewian and Swedish) for i, fallback in ipairs(fallback_languages_humans) do local label, lang = entity:getLabelWithLang(fallback) if lang == fallback then return format_label(args, extra_format, label, extra_text, entity, nil, lang, use_ucfirst, nil) end end -- Next for humans try the language of their country if there is one main language -- and it is written in a Latin script (the table of these is probably incomplete) -- P27 is country of citizenship local citizenship = get_unique_item_value(entity, 'P27') if citizenship then local fallback = fallback_langues_after_country[citizenship] if fallback then local label, lang = entity:getLabelWithLang(fallback) if lang == fallback then return format_label(args, extra_format, label, extra_text, entity, nil, lang, use_ucfirst, nil) end end if citizenship == 'Q159' or -- Q159 is Russia citizenship == 'Q34266' or -- Q34266 is Russian Empire citizenship == 'Q15180' then -- Q15180 is Soviet Union add_tracking_category(category_missing_russian_name) end end add_tracking_category(category_human_missing_name) end -- Try the fallback languages for i, fallback in ipairs(fallback_languages) do local label, lang = entity:getLabelWithLang(fallback) if lang == fallback then return format_label(args, extra_format, label, extra_text, entity, nil, lang, use_ucfirst, qid) end end -- Last resort: try any label local labels = entity.labels if labels then for lang,labeltable in pairs(labels) do if lang then return format_label(args, extra_format, labeltable.value, extra_text, entity, nil, lang, use_ucfirst, qid) else return '' -- ingen label hos wikidata resulterer i manglende tekst (kun evt. et blyantikon) end break end end return nil end p.format_statement_group = function(args, statements, startrange, endrange, use_ucfirst) local text = nil if statements[startrange].sortkey == 'novalue' then text = mw.text.trim(args.ingen or "") if (text == '') then return nil end elseif statements[startrange].sortkey == "somevalue" then text = mw.text.trim(args.ukjent or "") if (text == '') then return nil end else text = p.get_label(args, statements[startrange].sortkey, use_ucfirst, true) -- if the entity is a timezone in Russia, then add the MSK time if requested if mw.text.trim(args.msk or '') == 'ja' and msk_timezones[statements[startrange].sortkey] then text = text .. msk_timezones[statements[startrange].sortkey] end -- Go through all statements for time qualifiers if requested if mw.text.trim(args.tid or '') == 'ja' then local times = {} for i = startrange, endrange - 1 do local qualifiers = statements[i].qualifiers get_qualifier_times(args, times, qualifiers) end text = text .. format_qualifier_times(times) end end -- handle qualifier arguments except for "tid" which may be used for statement groups -- and is handled separately above. When grouping is used, this call will have no effect -- because the qualifier arg will have turned grouping off in hent_emne(). text = get_qualifiers(args, text, statements[startrange].qualifiers, true) text = get_references(args, text, statements[startrange].references) return text end -- format the list of statements with the wanted separator p.output_all_statements = function(args, output, mere_enn_maks) -- Avoid empty lists if #output == 0 then -- No tracking categories for empty results, as infoboxes or others may test if the result is empty or not return '' end -- Prepare an icon with link to Wikidata local icon = '' if mw.text.trim(args.ikon or '') == 'ja' then icon = '[[File:Blue pencil.svg|frameless|text-top|5px|alt=Rediger på Wikidata|link=d:' .. the_qid .. '#' .. the_pid .. '|Rediger på Wikidata]]' end local max = tonumber(args.maks or 1e6) local number = math.min(#output, max) local suffix if number == 1 then suffix = mw.text.trim(args.entall or '') else suffix = mw.text.trim(args.flertall or '') end local list = args.liste or '' if (list == 'ja') then if mere_enn_maks then mere_enn_maks = '</li><li>' .. mere_enn_maks else mere_enn_maks = '' end return '<ul><li>' .. table.concat(output, '</li><li>', 1, number) .. mere_enn_maks .. '</li></ul>' .. icon .. suffix .. tracking_categories else local separator = args.adskil or ', ' if mere_enn_maks then mere_enn_maks = separator .. mere_enn_maks else mere_enn_maks = '' end return table.concat(output, separator, 1, number) .. mere_enn_maks .. icon .. suffix .. tracking_categories end end p.hent_emne = function(frame) p.frame = frame -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args else args = frame.args end -- There may be a local parameter supplied. If set and not empty, return it unconditionally local input_parm = mw.text.trim(args[2] or "") if input_parm and (#input_parm > 0) then return input_parm end -- Now test if Wikidate should be used for the current field. if not p.use_wikidata(args) then return '' end local statements = p.get_statements(args) if statements == nil or #statements == 0 then return end -- Sort the statements after snaktype (value, novalue, somevalue) and id -- This makes id possible to find and group equal values together for key, statement in pairs(statements) do if statement.mainsnak.snaktype == 'value' then if statement.mainsnak.datatype ~= 'wikibase-item' then -- The property has a wrong datatype, ignore it. return '' end statement.sortkey = statement.mainsnak.datavalue.value.id else statement.sortkey = statement.mainsnak.snaktype end end table.sort(statements, function (a,b) return (a.sortkey < b.sortkey) end) if #statements > 5 then -- finder sider hvor meget hentes fra Wikidata if the_pid =='P463' then add_tracking_category(many_p463_category) elseif the_pid =='P106' and #statements > 10 then add_tracking_category(tiplus_p106_category) elseif the_pid =='P106' then add_tracking_category(many_p106_category) elseif the_pid =='P1344' then add_tracking_category(many_p1344_category) elseif the_pid =='P802' then add_tracking_category(many_p802_category) elseif the_pid =='P800' then add_tracking_category(many_p800_category) elseif the_pid =='P737' then add_tracking_category(many_p737_category) elseif the_pid =='P166' then add_tracking_category(many_p166_category) end end local output = {} local upper_case_labels = mw.text.trim(args.storboks or '') local firstvalue = true local qual1 = mw.text.trim(args.kvalifisering1 or '') local no_statement_grouping = qual1 ~= '' -- Go thru the statements and format them for displaying local startrange = 1 local endrange = 1 local only = mw.text.trim(args.kun or '') -- We need to keep track of the maximal allowed number of results here, so references -- made with frame:extensionTag() for removed results will not stay behind. local max = tonumber(args.maks) if not max then max = 1e6 end -- if no limit then set some limit we will never reach while max > 0 and startrange <= #statements do local sortkey = statements[startrange].sortkey while endrange <= #statements and statements[endrange].sortkey == sortkey do endrange = endrange + 1 if no_statement_grouping then -- We have qualifiers to check for each statement, so we cannot group -- statements with equal values together. break end end -- Check if only results with a certain value is requested if only == '' or only == sortkey then local use_ucfirst = upper_case_labels == 'alle' or (upper_case_labels == 'ja' and firstvalue) local text = p.format_statement_group(args, statements, startrange, endrange, use_ucfirst) if text then table.insert(output, text) max = max - 1 firstvalue = false end end startrange = endrange end local mere_enn_maks = nil -- Et tillegg som sier at ikke alt vises fordi listen er lengre enn maks if tonumber(args.maks) and #statements > tonumber(args.maks) then mere_enn_maks = mw.text.trim(args.mere_enn_maks or '') if mere_enn_maks == '' then mere_enn_maks = 'med flere' end end return p.output_all_statements(args, output, mere_enn_maks) end -- Format a time value -- Return formatted text for the date p.format_time = function(args, value) -- Parse the ISO 8601 time value -- The format is like '+2000-00-00T00:00:00Z'. -- For now the value can only contain date. Their is no timezone or time. local sign, year, month, day = string.match(value.time, '^([%+-])0*(%d+)-0?(%d+)-0?(%d+)T') if not sign then -- No match. We can consider an error message or category for this, but ignore for now return nil end -- handle year and AD/BC local bc_text = '' -- text for AD or BC if sign == '-' then -- Year 0 doesn't exist, year 1,2,3 BC etc is given as -1,-2,-3 etc. -- (or maybe also in some cases as 0,-1,-2 etc.?) -- (see also [[d:Help:Dates#Years BC]]) bc_text = bc end if value.precision >= 9 then -- precision is year or greater local date = year .. bc_text local yearonly = mw.text.trim(args['kunaar'] or "") == 'ja' if not yearonly and value.precision >= 10 then -- precision is month or greater: Prepend the month date = months[month] .. date if value.precision >= 11 then -- precision is day or greater: Prepend the day date = day .. '. ' .. date -- Compare the date with another date and calculate age if requested local agepid = mw.text.trim(args['alder'] or "") if agepid ~= '' then local ageformat = mw.text.trim(args['alderformat'] or "$1 ($3 år)") local agestatements = the_entity:getBestStatements(agepid) local agevalue = agestatements and #agestatements == 1 and agestatements[1].mainsnak and agestatements[1].mainsnak.snaktype == 'value' and agestatements[1].mainsnak.datavalue.value if agevalue and agevalue.precision >= 11 then agedate = p.format_time({['kunaar']=args['kunaar']}, agevalue) local age local agesign, ageyear, agemonth, ageday = string.match(agevalue.time, '^([%+-])0*(%d+)-0?(%d+)-0?(%d+)T') -- First get the difference in the years. Remember that year 0 doesn't exist. if agesign == '-' then if sign == '-' then age = tonumber(ageyear) - tonumber(year) -- e.g. 100 BC - 50 BC else age = tonumber(ageyear) + tonumber(year) - 1 -- e.g. 10 BC - 40 AD end else if sign == '-' then age = 1 - tonumber(year) - tonumber(ageyear) -- e.g 40 AD - 10 BC (negative gives no sense) else age = tonumber(year) - tonumber(ageyear) -- e.g. 50 AD - 100 AD end end --Substract a year if the birthday isn't reached in the last year if tonumber(month) < tonumber(agemonth) or (tonumber(month) == tonumber(agemonth) and tonumber(day) < tonumber(ageday)) then age = age - 1 end return (string.gsub(ageformat, '$[123]', { ['$1'] = date, ['$2'] = agedate, ['$3'] = tostring(age) })) end -- if agevalue end -- if agepid end -- if value.precision >= 11 then end -- if value.precision >= 10 then return date end --if value.precision >= 9 then -- precision is less than year local year_num = tonumber(year) if value.precision == 8 then -- precision is decade -- 10 (or any number in the period) seems to mean years 10-19, -- 20 (or any number in the period) seems to mean years 20-29, -- 2010 (or any number in the period) seems to mean years 2010-2019 if year_num <= 10 then return '1. tiår' .. bc_text else -- Make sure the number ends with 0 return tostring(math.floor(year_num/10)*10) .. "-årene" .. bc_text end end if value.precision == 7 then -- precision is century -- 100 (or any number in the period) seems to mean years 1-100, -- 200 (or any number in the period) seems to mean years 101-200, -- 2100 (or any number in the period) seems to mean years 2001-2100 if year_num <= 100 then return '1. århundre' .. bc_text else -- Make sure the number ends with 00 and convert the period one year down return tostring(math.floor((year_num - 1)/100)*100) .. '-tallet' .. bc_text end end -- precision less than century is not handled return nil -- if value.precision == 6 then -- precision is 1000 years -- if value.precision == 5 then -- precision is 10.000 years -- if value.precision == 4 then -- precision is 100.000 years -- if value.precision == 3 then -- precision is million years -- if value.precision == 2 then -- precision is 10 million years -- if value.precision == 1 then -- precision is 100 million years -- if value.precision == 0 then -- precision is 1 billion years end p.hent_tid = function(frame) p.frame = frame -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args else args = frame.args end -- There may be a local parameter supplied. If set and not empty, return it unconditionally local input_parm = mw.text.trim(args[2] or "") if input_parm and (#input_parm > 0) then return input_parm end -- Now test if Wikidate should be used for the current field. if not p.use_wikidata(args) then return '' end local statements = p.get_statements(args) if statements == nil or #statements == 0 then return end local output = {} -- Go thru the statements and format them for displaying for key, statement in pairs(statements) do local text = nil if statement.mainsnak.snaktype == 'value' then if statement.mainsnak.datatype == 'time' then text = p.format_time(args, statement.mainsnak.datavalue.value) end elseif statement.mainsnak.snaktype == 'novalue' then text = mw.text.trim(args.ingen or "") elseif statement.mainsnak.snaktype == 'somevalue' then text = mw.text.trim(args.ukjent or "") end if text then text = get_qualifiers(args, text, statement.qualifiers) text = get_references(args, text, statement.references) if text and text ~= '' then table.insert(output, text) end end end return p.output_all_statements(args, output, nil) end local insert_delimiters = function(number) -- first change the decimal mark to comma number = string.gsub(number, '%.', ',') repeat -- Find the group of 3 digits and insert delimiter local matches number, matches = string.gsub(number, "^(-?%d+)(%d%d%d)", '%1.%2') until matches == 0 return number end local make_the_number = function(args, amount, diff, unit) local decimals = mw.text.trim(args.decimaler or '0') if decimals == 'smart' then if amount > 100 then decimals = '0' elseif amount > 10 then decimals = '1' elseif amount > 1 then decimals = '2' else decimals = '3' end else decimals = tostring(math.floor(tonumber(decimals) or 0)) end -- First the amount local text = insert_delimiters(string.format('%.' .. decimals .. 'f', amount)) -- Second the variation if diff > 0 and mw.text.trim(args.visusikkerhet or "") ~= 'nei' then local difftext = string.format('%.' .. decimals .. 'f', diff) -- Don't show the diff it if is rounded to 0 if tonumber(difftext) ~= 0 then text = text .. '±' .. insert_delimiters(difftext) end end -- Third the unit if unit and mw.text.trim(args.visningsenhet or "") ~= 'nei' then text = text .. ' ' .. unit end return text end -- Format a quantity value and return the formated value -- Also return the amount as a number if it a quantity with a recogniced unit -- (used to get area) p.format_number = function(args, value) local amount = tonumber(value.amount) local diff1, diff2 = 0, 0 if value.lowerBound then diff1 = amount - tonumber(value.lowerBound) end if value.upperBound then diff2 = tonumber(value.upperBound) - amount end local diff = math.max(diff1, diff2) local unit = value.unit if unit == '1' then -- Number without unit local text = make_the_number(args, amount, diff, nil) -- We may have to find the area and calculate the density local densityformat = mw.text.trim(args['areal_tetthet'] or '') if densityformat ~= '' then local area_text, area_number, density_text -- P2046 is area area_statements = the_entity:getBestStatements('P2046') if area_statements and #area_statements == 1 and area_statements[1].mainsnak.snaktype == 'value' then area_text, area_number = p.format_number({ enhet='km2', visningsenhet='nei', visusikkerhet=args.visusikkerhet, decimaler='smart' }, area_statements[1].mainsnak.datavalue.value) if area_number then density_text = p.format_number({ decimaler='smart' }, { amount=amount / area_number, unit='1' }) return (string.gsub(densityformat, '$[123]', { ['$1'] = text, ['$2'] = area_text, ['$3'] = density_text })) end end -- No area found. Return the value with densityformatwithout applied local densityformatwithout = mw.text.trim(args['områdealgoritme'] or '$1') return (string.gsub(densityformatwithout, '$1', { ['$1'] = text })) end -- area and density was not asked for. return text end unit_qid = string.match(unit, 'http://www%.wikidata%.org/entity/(Q%d+)$') if not unit_qid then -- Unknown unit format return nil end wd_unit = wd_units[unit_qid] if not wd_unit then -- The unit is not in our table. Here we could read information -- about the unit entity. Maybe to be done later add_tracking_category (category_unrecognized_unit) return make_the_number(args, amount, diff, nil) end wanted_unit = mw.text.trim(args.enhet or "") if wanted_unit == '' and wd_unit.conv_to then wanted_unit = wd_unit.conv_to end local wanted = wanted_units[wanted_unit] if wanted and wd_unit.name ~= wanted_unit and wd_unit.type == wanted.type then amount = amount * wd_unit.conv * wanted.conv diff = diff * wd_unit.conv * wanted.conv return make_the_number(args, amount, diff, wanted.show_as), amount end return make_the_number(args, amount, diff, wd_unit.show_as), amount end p.hent_tall = function(frame) p.frame = frame -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args else args = frame.args end -- There may be a local parameter supplied. If set and not empty, return it unconditionally local input_parm = mw.text.trim(args[2] or "") if input_parm and (#input_parm > 0) then return input_parm end -- Now test if Wikidate should be used for the current field. if not p.use_wikidata(args) then return '' end local statements = p.get_statements(args) if statements == nil or #statements == 0 then return end if #statements > 1 then -- mer enn 1 resultat hentes fra Wikidata if the_pid =='P1082' then add_tracking_category(many_p1082_category) end -- Innbyggertall end local output = {} -- Go thru the statements and format them for displaying for key, statement in pairs(statements) do local text = nil if statement.mainsnak.snaktype == 'value' then if statement.mainsnak.datatype == 'quantity' then text = p.format_number(args, statement.mainsnak.datavalue.value) end elseif statement.mainsnak.snaktype == 'novalue' then text = mw.text.trim(args.ingen or "") elseif statement.mainsnak.snaktype == 'somevalue' then text = mw.text.trim(args.ukjent or "") end -- mw.logObject(statement.references,'statement.references') if text then text = get_qualifiers(args, text, statement.qualifiers) text = get_references(args, text, statement.references) if text and text ~= '' then table.insert(output, text) end end end return p.output_all_statements(args, output, nil) end -- Handle datatypes string, url, commonsMedia, external-id which have similar structures p.hent_streng = function(frame) p.frame = frame -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args else args = frame.args end -- There may be a local parameter supplied. If set and not empty, return it unconditionally local input_parm = mw.text.trim(args[2] or "") if input_parm and (#input_parm > 0) then return input_parm end -- Now test if Wikidate should be used for the current field. if not p.use_wikidata(args) then return '' end local statements = p.get_statements(args) if statements == nil or #statements == 0 then return end local output = {} -- For formating of strings. $1 in the format vil be replaced by the string local format = mw.text.trim(args.format or '') if format == '' then format = nil end -- Go thru the statements and format them for displaying for key, statement in pairs(statements) do local text = nil if statement.mainsnak.snaktype == 'value' then if statement.mainsnak.datatype == 'string' then text = mw.text.nowiki(statement.mainsnak.datavalue.value) elseif statement.mainsnak.datatype == 'url' or statement.mainsnak.datatype == 'commonsMedia' or statement.mainsnak.datatype == 'external-id' then text = statement.mainsnak.datavalue.value end if format and text then -- We have to escape any % in the found string with another % before using it as repl in string.gsub text = string.gsub(text, '%%', '%%%%') text = string.gsub(format, '$1', text) end elseif statement.mainsnak.snaktype == 'novalue' then text = mw.text.trim(args.ingen or "") elseif statement.mainsnak.snaktype == 'somevalue' then text = mw.text.trim(args.ukjent or "") end if text then text = get_qualifiers(args, text, statement.qualifiers) text = get_references(args, text, statement.references) if text and text ~= '' then table.insert(output, text) end end end return p.output_all_statements(args, output, nil) end p.hent_tekst = function(frame) p.frame = frame -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. local args if frame == mw.getCurrentFrame() then args = frame:getParent().args else args = frame.args end -- There may be a local parameter supplied. If set and not empty, return it unconditionally local input_parm = mw.text.trim(args[2] or "") if input_parm and (#input_parm > 0) then return input_parm end -- Now test if Wikidate should be used for the current field. if not p.use_wikidata(args) then return '' end local statements = p.get_statements(args) if statements == nil or #statements == 0 then return end local output = {} local get_all, show_language, wanteds = get_lang_args(args) -- Go thru the statements and format them for displaying for key, statement in pairs(statements) do local text = nil if statement.mainsnak.snaktype == 'value' then if statement.mainsnak.datatype == 'monolingualtext' then if get_all or wanteds[statement.mainsnak.datavalue.value.language] then text = mw.text.nowiki(statement.mainsnak.datavalue.value.text) if show_language then text = text .. ' (' .. mw.language.fetchLanguageName(statement.mainsnak.datavalue.value.language, preferred_language) .. ')' end end end elseif statement.mainsnak.snaktype == 'novalue' then text = mw.text.trim(args.ingen or "") elseif statement.mainsnak.snaktype == 'somevalue' then text = mw.text.trim(args.ukjent or "") end if text then text = get_qualifiers(args, text, statement.qualifiers) text = get_references(args, text, statement.references) if text and text ~= 0 then table.insert(output, text) end end end return p.output_all_statements(args, output, nil) end -- Get Wikidata entity ID for the current page. -- Arguments: format: format string with $1 for the ID, ingen: text to return for no entity p.hent_id = function(frame) local args if frame == mw.getCurrentFrame() then args = frame:getParent().args else args = frame.args end -- Get the item to use from either the parameter q or the item connected to the current page local qid = mw.text.trim(args.q or '') if qid == '' then qid = mw.wikibase.getEntityIdForCurrentPage() end if qid then local format = mw.text.trim(args.format or '$1') return (string.gsub(format, '$1', { ['$1'] = qid })) else return mw.text.trim(args.ingen or '') end end return p
Redigeringsforklaring:
Merk at alle bidrag til Wikisida.no anses som frigitt under Creative Commons Navngivelse-DelPåSammeVilkår (se
Wikisida.no:Opphavsrett
for detaljer). Om du ikke vil at ditt materiale skal kunne redigeres og distribueres fritt må du ikke lagre det her.
Du lover oss også at du har skrevet teksten selv, eller kopiert den fra en kilde i offentlig eie eller en annen fri ressurs.
Ikke lagre opphavsrettsbeskyttet materiale uten tillatelse!
Avbryt
Redigeringshjelp
(åpnes i et nytt vindu)
Forhåndsvis en side som bruker denne malen
Mal som brukes på denne siden:
Modul:Bruk Wikidata/dok
(
rediger
)
Navigasjonsmeny
Personlige verktøy
Ikke logget inn
Brukerdiskusjon
Bidrag
Opprett konto
Logg inn
Navnerom
Modul
Diskusjon
English
Visninger
Les
Rediger kilde
Vis historikk
Mer
Navigasjon
Forside
Siste endringer
Tilfeldig side
Hjelp til MediaWiki
Verktøy
Lenker hit
Relaterte endringer
Spesialsider
Sideinformasjon