Modul:Databox

Från Wikipedia

Dokumentation [visa] [redigera] [historik] [rensa sidcachen]




Användning[redigera wikitext]

Tips på hur man steg för steg lägger in mallen.
Tjernobylolyckan
Reaktorolycka i kärnkraftverket i Tjernobyl, Ukraina den 26 april 1986 Redigera Wikidata
Kärnkraftsolycka, miljökatastrof Redigera Wikidata
LandSovjetunionen Redigera Wikidata
Inom det admi­nis­tra­ti­va områdetUkraina
 • Kiev oblast Redigera Wikidata
PlatsTjernobyls kärnkraftverk Redigera Wikidata
Koor­di­na­ter51°23′22″N 30°5′57″E Redigera Wikidata
Tidpunkt26 april 1986 Redigera Wikidata
DeltagareIekaterina Ivanenko Redigera Wikidata
Antal döda och skadade134 Redigera Wikidata
Antal döda4 000 Redigera Wikidata
INES-ska­laINES nivå 7 Redigera Wikidata
Direkt orsak tillDeclaration of State Sovereignty of Ukraine Redigera Wikidata
Map

Databox är en generell faktarutemall som hämtar data från wikidata. Mallen visar de flesta av wikidataobjektets egenskaper och uttalanden. Mallen är användbar inom ämnesområden för vilka andra faktamallar och mallar som använder data från wikidata ännu inte har utvecklats, men även om man vill hämta fler uppgifter från wikidata än vad som visas av andra wikidatamallar. Finns specialmallar för ett ämne är de i allmänhet att föredra.

Mallen bör användas försiktigt och införas långsamt och med stor noggrannhet, dels för att Wikidata innehåller många fel och oöversatta begrepp, dels för att den ännu inte visar uppgifters källäge, dels för att kunskapen fortfarande är låg om Wikidata och många upplever det svårt att åtgärda problem där.

För att ändra en uppgift i en databox, klicka på pennan vid uppgiften så att du hamnar på Wikidata.org, klicka på pennan där, ändra, spara. Klart! För att se källa för en uppgift i en databox måste man för närvarande klicka på pennan.

Mallen använder modul:Databox som är en vidareutvecklad variant av wikidata:Module:Databox. Den utökade varianten används på svensk-, dansk- och nordfrisiska Wikipedia. Den äldre enklare varianten används främst på wales-, hawaiansk-, afrikaans-, turkisk- och aymara-språkiga Wikipedia. Andra generella faktamallar används främst på Commons och på ryska Wikipedia.

Vanliga användningsområden[redigera wikitext]

De vanligaste användningsområdena för databox på svenskspråkiga Wikipedia är i avtagande ordning:

  • gator, städer, torg, byggnader, järnvägsstationer, parker och bostadsområden (eftersom den kan ange stadsdel och visa stadskarta), vattendrag (eftersom den kan visa översiktskarta med utbredning), byar (eftersom den visar socken/distrikt), utomnordiska orter (eftersom {{Ortsfakta WD}} ännu inte hanterar detta), öar.
  • företag (särskilt multinationella, eftersom Wikidata då brukar uppdateras snabbare med finansiella data än svenska Wikipedia), organisationer
  • förhistoriska personer, händelser, arkeologiska kulturer, epoker, fornminnen, litterära verk och alfabet (eftersom den visar årtal, decennium, sekel och millenium korrekt, även före år 1000)
  • fiktiva och mytologiska personer, t.ex. litterära figurer, rollfigurer, gudar, sagokungar, tidiga bibliska personer, eftersom databox (till skillnad från biografimallarna) indikerar att de kan vara fiktiva. OBS! Bör användas restriktivt, eftersom databox ännu inte indikerar att specifika uppgifter är enligt den religiösa traditionen, hypotetiska, att källor eller tolkningar motsäger varandra, osv.
  • litterära verk, datorspel, musikgrupper, musikverk
  • TV-serier, TV-program (eftersom {{Infobox TV-program}} hämtar få Wikidata-egenskaper)
  • begrepp som ingår i en internationellt väldefinierad taxonomi eller ämneshierarki, t.ex. musikgenrer/konststilar, språk, etniciteter, astronomiska objekt, akademiska discipliner, musikinstrument, ideologier, ädelstenar och växtsorter (därför att databox presenterar artikelns plats i hierarkin med en punktlista)
  • epidemier, pandemier och sjukdomar (som komplement till {{faktamall hälsotillstånd}}) och olycks-/våldshändelser, eftersom den anger aktuellt antal smittade, skadade och direkta dödsoffer. Dock kan den ännu inte ange bestämningar såsom "cirka" efter värdet, och har svårt att visa osäkerhetsintervall, alternativa värden och indirekta dödsoffer snyggt, eller att skilja på kumulativa värden och frekvenser (antal sedan start, och antal per år).
  • kemiska ämnen och material eftersom den visar kemiska ekvationer
  • algoritmer och matematiska samband eftersom den visar ekvationer, t.ex. definierande formel (P2534).
  • grupper av personer (eftersom biografimallarna bara kan användas för enskilda personer).

Områden där mallen bör användas restriktivt[redigera wikitext]

Kritik har uppstått främst när mallen presenterat en uppgift som enda sanningen eller exakt, trots att uppgiften är hypotetisk eller ungefärlig, eller det finns andra möjliga tolkningar eller motstridiga källor. Vid sådana artikelämnen bör man invänta att lägga in databox tills mallen har vidareutvecklas så att den kan indikera osäkerheter och källäge. Problemet är särskilt vanligt vid förhistoriska och mytologiska personer och händelser.

Kritik har även förekommit när mallen har visat "undertyp av" för abstrakta begrepp som inte ingår i en oomtvistad hierarki, exempelvis politiska ideologier.

Mallen visar open street map-karta om geokoordinater finns på Wikidata, och kan även visa andra kartbilder om de är försedda med svensk bildtext finns på Wikidata. Mallen får därför ofta positiva omdömen i ortsartiklar. Synpunkter har dock framförts om att vi bör vänta med att föra in den i stor skala för svenska ortsartiklar eftersom den visar andra radrubriker ("administrativt område" istället för kommun, län, osv) än våra faktarutor annars brukar visa, och eftersom GPS-koordinaterna visar väderstreck på engelska (S/N/W/E).

Förberedelser[redigera wikitext]

Innan man lägger in mallen måste man vanligen åtgärda problem på Wikidata och i wikipediaartikeln. Se filmen överst till höger för en enkel steg-för-steg-instruktion. Exempelː

  • Översätta vissa inlänkade objekts och egenskapers namn till svenska. Saknas både svenskt och engelskt namn, m.fl. språk, dyker ett fult q-nummer upp.
  • Ta bort befintlig bild ur artikeln om den är identisk med mallens. Lägga in den svenska bildtexten i Wikidata. Om bilden är lämpligare där den visas i artikeln kan man ge negativt värde på mallparametern height (varvid bilden inte visas i mallen) eller skriva svensk bildtext till den bild man istället vill visa i mallen, vilket fungerar tills någon skriver svensk bildtext också till den andra bilden. Tillsvidare kan man inte i mallen bestämma vilken bild som visas.
  • Zooma ut (se nedan) om mallen innehåller en karta och orten är stor.
  • Kontrollera att faktarutan:
    • inte motsäger artikeln,
    • inte visar uppgifter där artikelns löptext presenterar flera alternativa hypoteser och tolkningar eller motstridiga källor (eller du vet att uppgiften är osäker),
    • inte presenterar uppgifter som den enda sanningen om de har en restriktiv bestämning på wikidata, exempelvis källäge/uttalandets natur->"hypotetiskt", "enligt traditionen", "ungefär", uttalande ifrågasatt av ->... (eller du tror att uppgiften är sådan),
    • inte visar orimliga uppgifter,
    • inte visar samma uppgift eller inlänkade objekt flera gånger.
    • inte visar kuriosa och encyklopediskt irrelevanta fakta som inte skulle passa i artikeln
    • inte är nästan tom eller inte tillför något.
    • inte visar formler som inte får plats
    • inte visar anakronismer och gör uppenbara stilbrott mot terminologi som är bruklig när man beskriver en tidsålder
  • Isåfall främst försöka rätta uppgiften på Wikidata, eller be om hjälp med att rätta den. Om det inte går, dölja uppgiften genom att göra något av följande:
    • Om uppgiften är inaktuell eller irrelevant, justera ned värdets rang till "orekommenderad" på Wikidata eller höja det önskade värdets rang. Om uppgiften är felaktig eller upprepad, radera den från Wikidata. Då påverkas andra språkversioner, och ändringen kan komma att återställas av andra.
    • Eller lägga till egenskapen i property_blacklist i modul:Databox. Då döljs egenskapen från databoxar i andra artiklar.
    • Eller ange ett lågt värde på mallparametern list_length eller sätta levels=1. Då döljs egenskaper som har fler värden, respektive punktlistor (flernivålistor, se nedan).
    • Eller avstå från att lägga in mallen.
  • Skapa snygga punktlistor genom att eftersträva att artikeln bara visar ett föräldraobjekt på "underklass till", "del av", "föregås av" eller "nästa högre rang", eller ett barnobjekt på "följs av", mm, och detta i sin tur bara har ett föräldra-/barnobjekt. I synnerhet bör man radera ett föräldraobjekt som också är en annan förälders förälder.
  • Föra in fler uppgifter till Wikidata, exempelvis från en gammal ersatt faktaruta, från faktarutor på andra språk, från artikelns löptext, eller från källor.
  • Komplettera artikeln så att den diskuterar eller källbelägger faktarutans uppgifter.
  • Skapa nya artiklar om nyckelord som är svartlänkade, särskilt om de förekommer i faktarutor i många artiklar.
  • Innan databox läggs in i en serie artiklar av nytt slag, skapa gärna en {{wikidatalista}} och lägg in i huvudartikelns eller en listartikels diskussionssida t.ex. på svenska och engelska, så att fler först kan kontrollera wikidatas innehåll. Gå fram långsamt och be ämnesexperter om synpunkter innan den läggs in i en serie artiklar.

Faktarutor syftar till att ge en översiktlig sammanfattning av artikeämnets grundfakta, så att läsaren slipper läsa hela löptexten för att hitta väsentliga uppgifter som kan uttryckas kort, och snabbt kan navigera mellan relaterade artiklar och jämföra dem. Faktarutor ska bara visa entydiga och obestridliga fakta. De ska inte visa kuriosa som inte passar i en encyklopedi, utan bara uppgifter som står i eller skulle kunna stå i artikeln. Om flera relaterade artiklar har faktarutor bör rutorna om möjligt ha liknande struktur.

Mallen visar i dagsläget ofta namn (wikidataobjekt) som saknar artikel på svenska wikipedia, men som ren text, utan varken rödlänkar eller wikidatalänkar. Vissa visade egenskaper saknar svensk förklaring. När mallen visar många sådana namn bör man överväga att inte ta med mallen i artikeln.

Exempel[redigera wikitext]

{{databox}}

{{databox|width=246}} för samma bredd som bildminiatyrers standardbredd

{{databox|item=Q486|width=246|zoom=9|list_separator=<br>}} ger övre Tjernobyl-faktarutan till höger.

Tjernobylolyckan
Reaktorolycka i kärnkraftverket i Tjernobyl, Ukraina den 26 april 1986 Redigera Wikidata
LandSovjetunionen Redigera Wikidata
Inom det admi­nis­tra­ti­va områdetUkraina
 • Kiev oblast Redigera Wikidata
PlatsTjernobyls kärnkraftverk Redigera Wikidata
Koor­di­na­ter51°23′22″N 30°5′57″E Redigera Wikidata
Tidpunkt26 april 1986 Redigera Wikidata
DeltagareIekaterina Ivanenko Redigera Wikidata
Antal döda och skadade134 Redigera Wikidata
Antal döda4 000 Redigera Wikidata
INES-ska­laINES nivå 7 Redigera Wikidata
Direkt orsak tillDeclaration of State Sovereignty of Ukraine Redigera Wikidata

{{databox|item=Q486|height=-1|zoom=-1|list_length=1}} ger nedre Tjernobyl-faktarutan till höger.

Parametrar[redigera wikitext]

item
Wikidata qid. För att visa faktaruta för ett annat wikidataobjekt än sidans wikidataobjekt.
width
Mallens bredd, bildens maxbredd, kartans bredd och höjd. Standardvärde 270. Användbar exempelvis om den automatiska avstavningen av egenskapsnamnen skulle bli märklig, om det blir onödiga radbrytningar eller onödigt mycket luft mellan spalterna, eller om man vill harmonisera mallen med bilders och andra mallars storlek.
height
Bilders maxhöjd. Standardvärde 240. Negativt värde gör att bilder och andra mediafiler, utom positionskartan, döljs.
zoom
Positionskartans skala. Heltal mellan 0 (världskarta) och 19 (max inzoomning), eller negativt tal för dold positionskarta. Standardvärde 12.
list_length
Max antal värden per egenskap. Standardvärde 8.
list_separator
Kommatecken i listor (mellan flera värden på samma egenskap) ersätts med denna text. Påverkar inte den gråade listan med instans av (P31). Exempel på värden:
<br> för att visa varje listelement på egen rad, utan komma
;<br> för varje listelement följt av semikolon på egen rad
levels
Max antal högre och lägre nivåer (av föräldra- och barnobjekt) i flernivålistorna för vissa egenskaper. Se nedan. Standardvärde 3. Om parametern sätts till 1 eller lägre visas inga flernivålistor, utan enbart en nivå högre eller en nivå lägre.
era
Suffix som ska visas vid datum innan år 1. Exempel på parametervärden:
f.Kr. = BC (standardvärde),
f.v.t. = BCE
Tom sträng, eller sedan för "år sedan". Ingen omräkning sker, utan det ger ett fel på drygt 2000 år, varför detta enbart är användbart vid 100 000-tals års ålder. Då är det emellertid bättre att använda daterad ålder (P7584) (datatyp kvantitet) än egenskaper av datatyp datum.
keep_title_case
Sätt keep_title_case=true eller till annat icke-tomt värde (utom defaultvärdet =false) för att behålla skiftläget för faktarutans titel. Standardbeteendet är istället att första bokstaven omvandlas till en versal.

Vad mallen visar och inte visar[redigera wikitext]

Mallens innehåll visas i ordningsföljd enligt följande.

Etikett och beskrivning[redigera wikitext]

Överst, i en grå list, visas etikett för wikidataobjektet, vilket ofta är samma som artikelnamnet. Under det visas objektets beskrivning.

Bild[redigera wikitext]

Mallen visar den första bild (egenskap bild (P18)) som är försedd med svensk bildtext. Om alla P18-bilder saknar bildtext visas den första P18-bild som är inlagd på Wikidata. Om man vill dölja en viss bild kan man gå in på Wikidata och ställa in låg rang för bilden (men då kan faktarutor på andra wikier påverkas) eller förse en annan bild med svensk bildtext. Vill man dölja alla bilder i faktarutan kan man i sätta parametern height till ett negativt värde.

Instans av[redigera wikitext]

Ordet "instans av" visas inte, men värden av instans av (P31) visas i en mörkgrå list. Värdet "Människa" döljs dock från den listan.

Tabell med textvärden[redigera wikitext]

Mallen visar en tabell med egenskapernas etiketter i vänster kolumn, och egenskapernas textvärden i höger kolumn.

Egenskapens etikett länkas till motsvarande Wikipediaartikel om egenskapen har subjektobjekt (P1629). Egenskapens egentliga etikett kan ersättas av kortare namn på det lokala språket baserat på kort namn (P1813). Se lista över egenskaper som har svenskt kortnamn.

Fysiska enheter förkortas inte och länkas inte, och visas i singularis, exempelvis "24 timme".

Egenskaper av datatyp "monolingual" (textsträngar som kan vara på flera alternativa språk) visas om de har ett värde på svenska, dock högst ett värde per egenskap. Vanliga exempel är gatuadress (P6375), kort namn (P1813) och smeknamn (P1449).

Inga värden av datatypen "extern referens" och "url" visas, förutom att länk till officiell webbplats visas. Mallen visar inte källhänvisningar och bestämningar. Den visar få ID-koder för kataloger och databaser. I tabellen över värden kan mallen visa en länk till gränskarta (geografisk form (P3896), men inga andra länkar till mediafiler.

Tabellen har smala spalter så att långa egenskapsnamn kanske inte får plats. Automatisk avstavning har därför aktiverats i modulens css-inställningar, vilket vissa webbläsare kan hantera. Modulkoden har dessutom en inbyggd algoritm för automatisk avstavning av egenskapsnamnen enligt konsonantprincipen och med undantag för några svenska ord.

Punktlista med objektets föräldrar eller barn[redigera wikitext]

Äldre nysvenska
Kronolekt Redigera Wikidata
Under­klass tillnordiska språk
 • östnordiska språk
  • nysvenska Redigera Wikidata
Kronologirunsvenska
klassisk fornsvenska
yngre fornsvenska

äldre nysvenska Redigera Wikidata

yngre nysvenska
nusvenska Redigera Wikidata
Start­da­tum1526 Redigera Wikidata
Slutdatum1750 Redigera Wikidata
Uppslag i lista över för­kort­ning­arvur Redigera Wikidata

Som framgår av exemplet för äldre nysvenska till höger visar mallen som standard en successivt indragen punktlista med tre högre nivåer (föräldraobjekt, dess förälder, och dess förälder) för följande egenskaper: inom det administrativa området (P131), förlaga (P144), föregås av (P155), nästa högre taxon (P171), underklass till (P279), del av (P361), placerad på landform (P706), moderorganisation (P749) och underegenskap av (P1647). Detta förutsätter dock att det bara finns ett objekt på varje nivå. I så fall visas nivåerna som en punktlista, med mer indragning ju lägre nivå. Annars visas bara en nivå som kan ha flera värden med komman emellan. På samma vis visas tre lägre nivåer (dotter-, dotterdotter- och doterdotterdotterobjekt) av egenskaperna följs av (P156), dotterorganisation (P355), utmynnar i (P403) och har del(ar) (P527) om enbart ett objekt finns på varje nivå.

Kronologi[redigera wikitext]

Ordet "Kronologi" visas som ledtext i vänster kolumn istället för egenskapsnamnen om objektet både har ett element av föregås av (P155) och ett av följs av (P156), och ev. föräldraobjekt och barnobjekt till dem. Då visas dessutom objektet självt som en rad i punktlistan. Kronologin är inte indragen.

Man bör vara uppmärksam på om huvudobjektets relation till nästa nivå avser en tidsålder, och relationen mellan nivå 1 och 2 avser en helt annan tidsålder. Exempelvis kan en förhistorisk ort administrativt ha tillhört en stad, och denna stad idag tillhöra en administrativ region som inte existerade på den tiden, och inte är relevant i den artikel där faktarutan visas. Isåfall kan man dölja samtliga punktlistor, och enbart visa en nivå högre och lägre, i faktarutan genom att sätta parametern levels = 1.

Positionskarta[redigera wikitext]

En open street map-karta visas om geokoordinater finns på Wikidata-objektet. Ortnamnen i kartan är i första hand på svenska, i andra hand det lokala språket. Kartan påverkas av parametern zoom, där och kan döljas genom att sätta zoom till ett negativt värde.

Andra commonsMedia-filer[redigera wikitext]

Längst ned kan mallen inbädda andra mediafiler, exempelvis andra bilder som lagras på Wikimedia Commons, men endast om de är försedda med mediabeskrivning (t.ex. bildtext) på svenska, eller om deras innehåll anges till svenskspråkigt. Mallen visar högst en fil för varje egenskap av datatypen commonsMedia. För att en fil ska visas, gå in på Wikidata, välj "lägg till bestämning" vid filen, ange mediabeskrivning (mediabeskrivning (P2096)), och språk svenska. Alternativ väljer du "lägg till bestämning" vid filen, anger verkets eller namnets språk (P407) och svenska (Q9027).

För att dölja en mediafil, radera sådanna bestämningar. Mediafiler döljs även genom att ge dem en låg rang eller ge parametern height ett negativt värde.

Det finns i dagsläget 77 egenskaper av datatypen "Mediafil från Commons". Se lista

För att se förekomsten av commonsMedia-filer som kan visas av Databox, se:

  • Länk till databasfråga som ger en frekvenstabell per egenskap över antalet svwp-artiklar med mallen Databox kopplade Wikidataobjekt som har egenskaper av typen Mediefil från Commons dels totalt och dels som är föresedda med en mediabeskrivning (P2096) på svenska.
  • Länk till databasfråga som ger en tabell över alla till svwp-artiklar med mallen Databox kopplade Wikidataobjekt som har någon egenskap av typen Mediefil från Commons där det finns en mediabeskrivning (P2096) på svenska. I tabellen visas även vilken egenskap det är och den svenska beskrivningen av respektive mediefil.

Kartbilder[redigera wikitext]

Exempelvis kan mallen visa kartbilder såsom översiktskarta (P242), vägkarta (P15), utbredningskarta (P1846) och detaljkarta (P1621) om bilder förses med bildtexter – högst en bild per egenskap. Här är lista på de svwiki-artiklar som har databox och har ett värde på översiktskarta (P242) på Wikidata:

Exempel på lämplig bildtext vid kartbilder kan vara "Läge i Slovenien", "Topologisk karta", "Utbredningskarta" eller "Översiktskarta från Open street map".

Underhållskategorier[redigera wikitext]

Vissa artiklar i huvudnamnrymden med denna mall placeras i olika underkategorier för Kategori:Underhållskategori för Databox, exempelvis om de innehåller qid som behöver åtgärdas, eller om de innehåller långa listor.

Fler exempel[redigera wikitext]

{{databox|item=Q5086|list_separator = ,<br>}}
ger:
Berlinmuren
Mur som åtskilde Väst- och Östberlin 1961–1989 Redigera Wikidata
Berlinmuren i november 1975 Redigera Wikidata
Kordong, tidigare byggnadsverk, sevärdhet, försvarslinje, skiljemur Redigera Wikidata
Del avInomtyska gränsen,
Järnridån
 Redigera Wikidata
Tillkomst13 augusti 1961 Redigera Wikidata
Väpnad konfliktkalla kriget Redigera Wikidata
Uppkallad efterBerlin Redigera Wikidata
LandVästtyskland,
Östtyskland,
Tyskland
 Redigera Wikidata
Inom det admi­nis­tra­ti­va områdetBerlin,
Östberlin
 Redigera Wikidata
Koor­di­na­ter52°30′16″N 13°26′28″E Redigera Wikidata
Betydande händelsebyggandet av Berlinmuren,
Berlinmurens fall
 Redigera Wikidata
Beställd avÖsttyskland Redigera Wikidata
Materialarmerad betong Redigera Wikidata
Kostnad100 000 000 östtysk mark Redigera Wikidata
Upphörde9 november 1989 Redigera Wikidata
Kul­tur­skydds­statusHeritage monument in Berlin Redigera Wikidata
Längd155 kilometer Redigera Wikidata
Höjd3,60 meter Redigera Wikidata
Officiell webbplatswww.berlin.de/mauer Redigera Wikidata
Beva­ran­de­statuspartially destroyed Redigera Wikidata
Anv­änd­nings­statuspermanent stängd Redigera Wikidata
Map
Tvärsnittsvy Redigera Wikidata
{{databox|item=Q17382129|list_separator = &nbsp;• |levels=2}}
ger:
Lappia-huset
Teater- och kongresscenter i Rovaniemi, Finland Redigera Wikidata
Konferensanläggning, teaterhus, konserthus Redigera Wikidata
Del avRovaniemi administrativa och kulturella centrum Redigera Wikidata
Tillkomst1961 Redigera Wikidata
LandFinland Redigera Wikidata
Inom det admi­nis­tra­ti­va områdetLappland
 • Rovaniemi Redigera Wikidata
Koor­di­na­ter66°29′48″N 25°43′22″E Redigera Wikidata
ArkitektAlvar Aalto Redigera Wikidata
InhyserRovaniemi teater • Lapplands musikskola Redigera Wikidata
Officiell webbplatslänk Redigera Wikidata
Map

Se även[redigera wikitext]

  • {{Wikidata Infobox}}, som också är en generell faktarutemall, men är mer komplicerad.
-- This extended version of Databox is stored at https://sv.wikipedia.org/wiki/Modul:Databox, but can be used by other languages
-- Versions: (Besides minor adjustments to the property_blacklist and layout)
-- 2024-03-03 Parameter "keep_title_case" to not change first letter to upper case (default false)
-- 2023-06-18 Shows monolingualtext but only in local language - and maximum one value per property
--  		  Can show any commonsMedia file that has media caption qualifier in the local language, or with content in ("language of work" qualifier) the local language
--			  Can show several maps if several coordinates, limited by parameter maxFiles (default 1).
-- 2023-06-11 Locator map image shown if it has media caption in the local language
-- 2020-05-25 Hide "is instance of" -> "human"
-- 2020-05-25 Category:Databox that shows qid code
-- 2020-05-24 Years linked to articles. Decades, centuries and millennia formated in local language.
-- 2020-05-13 P155 (follows) and P156 (followed by) merged into one "Chronology" list, also showing current object.
--			Parameter "list_separator" for replacing comma in lists.  
-- 2020-05-10 Parameter "era" for choosing if year "BCE" (or similar in local language) should be replaced by "BC", empty string or other.
--			Upper-case initial letter of P31 (instance of).
-- 2020-05-05 P31 hidden if too long list. Administrative wiki category if too long list.
-- 2020-05-02 More than two parent/child levels in bulleted list.
-- 2020-05-01 Property short names based on P1813. Image legend/caption. 
-- 2020-04-28 Properties linked to articles (based on Property:P1629 of the property). 
--			Datatype "url" not shown (except for official web site). Input parameter "levels". 
-- 2020-04-27 Two higher and two lower levels of child and parent items shown as bulleted list for some properties
-- 2020-04-21 Parameters "width", "height", "zoom" and "list_length". Soft hyphens auto-inserted in long property names.
-- 2020-04-18 (Monolingual text strings hidden.) Property name hidden if no good value. First image shown if several images. 
-- 2020-04-16 Description shown (only in local language). First letter of label upper-case.
-- 2020-04-13 Values of datatype "quantity" shown. Pen hidden in printout.
-- 2020-04-13 Mapframe code copied from the 2019-03-04 af.wikipedia.org version.
-- 2020-04-07 Imported from the 2019-04-26 fr.wikipedia.org version 

-- Blocked properties:
local property_blacklist = {
	'P360', --is a list of
	'P4224', --category contains
	'P935', -- Commons gallery
	'P1472', -- Commons Creator page
	'P1612', -- Commons Institution page
	'P373', -- Commons category
	'P3722', -- Commons maps category
	'P7561', --  for the interior of the item
	'P1151', -- topic's main Wikimedia portal
	'P1424', -- topic's main template
	'P910', -- topic's main category
	'P1200', -- bodies of water basin category
	'P1792', -- category of associated people
	'P1464', -- category for people born here
	'P1465', -- category for people who died here
	'P1791', -- category of people buried here
	'P1740', -- category for films shot at this location
	'P2033', -- Category for pictures taken with camera
	'P2517', -- category for recipients of this award
	'P4195', -- category for employees of the organization
	'P1754', -- category related to list
	'P301', -- category's main topic
	'P971', -- category combines topics
	'P3876', -- category for alumni of educational institution
	'P1753', -- list related to category
	'P7867', -- category for maps
	'P1921', -- Wikidata RDF URI format
	'P3921', -- Wikidata SPARQL query equivalent
	'P1204', -- Wikimedia portal's main topic
	'P1423', -- template's main topic
	'P1709', -- equivalent class
	'P3950', -- narrower external class
	'P2888', -- exact match
	'P1382', -- coincident with
	'P2670', -- has parts of the class
	'P3113', -- does not have part
	'P2737', -- union of
	'P2738', -- disjoint union of
	'P2445', -- metasubclass of
	'P1963', -- properties for this type
	'P3176', -- uses property
	'P1889', -- different from
	'P460', -- said to be the same as
	'P2959', -- permanent duplicated item
	'P2860', -- cites
	'P5125', -- wikimedia outline
	'P5008', -- on focus list of Wikimedia project
	'P7084', -- related category
	'P1687', -- Wikidata main property for this item 
	'P2559', -- Wikidata usage instructions
	'P5692', -- Wikidata dummy value
	'P1343', -- described by source
	'P972',  -- catalogue
	'P1282', -- OSM tag or key
	'P553',  -- web site account
	'P968',  -- email
	'P2572', -- hashtag
	'P3761', -- IPv4 range
	'P4839', -- Wolfram Language entity code
	'P6104', -- Maintained by Wikiproject
	'P5996', -- Category for films in this language
	'P2354', -- list article (seldom available in local language)
	'P6365', -- member category
	'P528', -- catalog code
	'P667', -- ICPC 2 ID
	'P944', -- Code of nomenclature
	'P1438', -- Jewish Encyclopedia ID (Russian)e
	'P1402', -- Foundational Model of Anatomy ID
	'P1461', -- Patientplus ID
	'P1692', -- ICD-9-CM code
	'P1748', -- NCI Thesaurus ID
	'P1193', -- prevalence (often different value in different countries)
	'P2176', -- drug used for treatment (we avoid medical advise)
	'P2293', -- genetic association
	'P1814', -- Japanese name in kana
	'P747', -- editions
	'P1433', -- published in
	'P4969', -- derivative work
	'P217', -- inventory number
	'P2540', -- Aarne–Thompson–Uther Tale Type Index
	'P1036', -- DDC
	'P1149', -- LCC
	'P1150', -- RVK
	'P1190', -- UDC
	'P1987', -- MCN code
	'P2263', -- ISOCat id
	'P2283', -- Uses 
	'P2184', -- History of subject. (Should be shown if article in local language)
	'P989',  -- spoken text. (Should be shown if in local language)
	'P1793', -- format as a regex
	'P4354', -- search formatter URL
	'P5869', -- model item
	'P859',  -- sponsor
	'P7973', -- quantity symbol (LaTeX)
	'P6216', -- copyright status
	'P1830', -- owner of (seldom useful)
	'P487',  -- Unicode character 
	'P8933', -- category for the view from the item
	'P1299', -- depicted by
	'P6112', -- category for members of a team
	'P8687',  -- social media followers 
	'P1559',  -- name in native language
	'P8596', -- category for multimedia files depicting exterior views of this item 
	'P7763', -- copyright status as a creator
	'P8989', -- category for the view of the item
	'P7782', -- category for ship name
	'P2817', -- appears in the heritage monument list
	'P8402', -- open data portal
    'P6686', -- musical motif (not supported)
}

-- Exceptions to the datatype blocking:
local property_whitelist = { 
	'P856', -- official website
	'P3896',-- geoshape
	'P345', -- IMDB id
	'P6375' -- street address
}

-- Properties with higher level items:
local properties_with_parents = { 
	'P131', -- located in the administrative territorial entity
	'P144', -- based on
	'P155', -- follows
	'P171', -- parent taxon
	'P276', -- location
	'P279', -- subclass of
	'P361', -- part of
	'P706', -- located on terrain feature
	'P749', -- parent organization
	'P807', -- separated/forked from
	'P1365', -- replaced
	'P1647', -- subproperty of
	'P3730' -- next higher rank
}

local properties_with_children = { 
-- Properties with lower level items:
	'P150', -- contains administrative territorial entity
	'P156', -- followed by
	'P355', -- subsidiary
	'P527', -- has part 
	'P1012', -- contains
	'P1366', -- replaced by
	'P3729', -- next lower rank
	'P4330', -- contains
	'P7888' -- merged into
}

local function buildInteractiveMap(width, point, item_id, zoom)
--Utility function to build maps
	local geojson = {
		{
			type = 'Feature',
			geometry = {
				type = "Point",
				coordinates = {point.longitude, point.latitude}
			},
			properties = {
				title = point.text or '',
				['marker-symbol'] = point.marker or 'marker',
				['marker-color'] =  point.markercolor or "#224422",
			}
		}
	}
	local args = {
		['height'] = width,
		['width'] = width,
		['frameless'] = 'frameless',
		['align'] = 'center',
		['latitude'] = point.latitude,
		['longitude'] = point.longitude,
		['zoom'] = zoom,
		['lang'] = lang -- fallbacks to wiki language if local name is missing. )
	}
	return mw.getCurrentFrame():extensionTag('mapframe', mw.text.jsonEncode(geojson), args)
end

function Set(list) -- values to booleans with keys
	local set = {}
	for _, l in pairs(list) do 
		set[l] = true
	end
	return set
end

function  listCase(str)
	-- Capitalizes first visible character of list produced by formatStatements() 
	-- Example: <span><span>[[link|first item]]</span>, <span>second item</span></span>
	--	 -->  <span><span>[[link|First item]]</span>, <span>second item</span></span>
	return str
		:gsub('^<span><span>%[%[(.-)|(.-)%]%]</span>',
			function(a,b) 
				return '<span><span>[[' .. a .. '|' 
				.. b:gsub('^%l', string.upper) 
				.. ']]</span>' 
			end)
		:gsub('^<span><span>(%l)', 
			function(a) 
				return '<span><span>' ..string.upper(a) 
			end)
end

function listSeparate(str, list_separator)
	-- Replaces comma in list produced by formatStatements() 
	-- Example: list_separator = ';<br>'  
	--   str  = <span><span>[[link|first item]]</span>, <span>second item</span></span>
	--	 ->   <span><span>[[link|first item]]</span>;<br> <span>second item</span></span>
	if list_separator ~= ',' then
		return str
			:gsub('</span>,', '</span>'..list_separator)
	else 
		return str
	end
end

function hyphenate(str, lang)
	-- Inserts soft hyphens in long words, typically before each consonant that is followed by a vowel (lower-case letters)
	-- Should work good enough for most languages. Language specific exceptions may be added.
	local nonHyphenatedLanguages = Set{'ar', 'he', 'zh', 'ja', 'ko', 'vi', 'fa', 'ps'}
	if nonHyphenatedLanguages[lang] then -- Not languages without alphabetic writing system or with few vowels 
		return str
	end
	result = ''
	for word in str:gmatch("%S+") do 
		if #word < 10 then
			result = result .. ' ' .. word
		else
			result = result .. ' ' 
			.. word:sub(1,3) -- Not too early in word
			.. word:sub(4)
			:gsub("([bcdfghjklmnpqrstvwxzđçčĉñŋĝĥĵŝšŧžßÐðþğşśćńŁżźбвгжийклмнпрст]"
				.. "[aouåeiyäöæøáéíóúýàèâêëüãŭœāēīōūəąęóадеёзоу])",
				"&shy;%1") -- Insert soft-hyphens before each consonant that is followed by vowel
			:gsub("&shy;([\128-\193])", "%1" ) -- Revert split of two-byte UTF-8 character
			:gsub("-(%a?%a?%a?%a?)&shy;", "-%1"):gsub("&shy;(%a?%a?%a?%a?)-", "%1-") -- Not too near a hard hyphen
			
			-- Some Scandinavian exceptions for wikidata properties, relevant to similar languages:
			:gsub("&shy;x", "x&shy;") -- Example: tids-komp-le-xi-tet -> tids-komp-lex-i-tet   
			:gsub("sc&shy;h", "&shy;sch") -- Example: sc-h -> -sch
			:gsub("ss&shy;j", "s&shy;sj")-- Example: ss-j-> s-sj
			:gsub("n&shy;g", "ng&shy;") -- Example: n-g -> ng- 
			:gsub("ngs", "ngs&shy;") -- Example: Befolk-ningsg-rup-pe -> Befolk-nings-g-rup-pe, Rege-ring-s-che-fens -> Rege-rings-chefens 
			:gsub("g&shy;rup&shy;pe", "&shy;gruppe") -- Example: g-rup-pe -> -gruppe
			:gsub("nist&shy;ra", "nis&shy;tra") -- Example: admi-nist-ra-tion -> admi-nis-tra-tion
			:gsub("&shy;ror&shy;ga[&shy;]*n", "r&shy;organ") -- Example: dotte-ror-ga-ni-sa-tion -> dotter-organi-sa-tion
			:gsub("&shy;rob[&shy;]*jek", "r&shy;objek") -- Example: dot-te-rob-jekt -> dot-ter-objekt
			:gsub("s&shy;ta&shy;tus", "&shy;status") -- Example: skydds-status
			:gsub("k&shy;las[&shy;]*s", "&shy;klass") -- Example: deci-malk-las-si-fi-ka-tion -> deci-mal-klas-si-fi-ka-tion
			:gsub("&shy;nom&shy;rå&shy;de", "n&shy;område") -- Example: vatte-nom-rå-de -> vatten-område
			:gsub("&shy;som&shy;rå&shy;de", "s&shy;område") -- Example: Rets-gyl-dig-hed-som-rå-de -> Rets-gyl-dig-heds-om-rå-de
			:gsub("ra&shy;lort", "ral&shy;ort") -- Example: central-ort
			:gsub("s&shy;kydd", "&shy;skydd") -- Example: Kul-turs-kydd -> Kul-tur-skydd
			:gsub("k&shy;ri&shy;te&shy;ri", "&shy;kri&shy;te&shy;ri")-- Example: Värld-sarvsk-ri-te-rium -> Värld-sarvs-kri-te-rium
			:gsub("guasp&shy;he", "gua&shy;sphe") -- Example: lingua-sphere
			:gsub("gars&shy;kap", "gar&shy;skap") -- Example: medbor-gars-kap -> medbor-gar-skap
			:gsub("k&shy;var&shy;ter", "&shy;kvarter") -- Example: Hovedk-var-ter -> Hoved-kvarter
			:gsub("s&shy;ted", "&shy;sted") -- Example: Pro-duk-tionss-ted -> Pro-duk-tions-sted
			:gsub("&shy;&shy;", "&shy;") -- Example -- -> -
		end
	end
	return result:sub(2,-1)
	-- :gsub("&shy;", "-") -- Show soft hyphens as hard hyphens. Only for sandboxed test purposes.
end

function year(str, lang, replaceTime)
	-- Postprocesses years (datatype time) in local language

	-- Incorrect formating of the first decade.
	if lang == 'sv'	then
		str = str
			:gsub("<span>0</span>", "<span>00-talet</span>")
			:gsub("<span>0 BCE</span>", "<span>00-talet f.v.t.</span>")
	end
	-- Replace BCE with BC (or corresponding in local language) depending on era template parameter:
	if replaceTime then
		for p,r in pairs(replaceTime) do
			str = str:gsub(p, r)
		end
	end
	
	-- Link years to articles:
	str = str
		:gsub("([%s>])(%d?%d?%d?%d)</span>", "%1[[%2]]</span>") -- April 1852 -> April [[1852]]
		:gsub("([%s>])(%d?%d?%d?%d) ([%a%.]*)</span>", "%1[[%2 %3]]</span>") -- April 20 BCE -> April [[20 BCE]]

	-- Format decades, centuries and millennias correctly in local language, and link to articles:  
	if lang=='sv' then
		str = str
			:gsub("(%d?1%d)%.? år([h|t])(%a+)det?", "%1:e år%2%3det") -- 12. årtusende -> 12:e årtusendet
			:gsub("(%d?%d?[1-2])%.? år([h|t])(%a+)det?", "%1:a år%2%3det") -- 2. århundrade  -> 2:a århundradet
			:gsub("(%d?%d?[0,3-9])%.? år([h|t])(%a+)det?", "%1:e år%2%3det") -- 13 århundrandet f.Kr. -> 13:e århundradet f.Kr 
			:gsub("<span>(%d?%d?%d?)00-talet</span>", "<span>[[%100-talet (decennium)]]</span>") -- 1900-talet -> [[1900-talet (årtionde)]]
			:gsub("<span>(%d?%d?%d?)00-talet ([%a%.]*)</span>", "<span>[[%100-talet	(decennium) %2]]</span>") -- 100-talet f.Kr. -> [[100-talet f.Kr. (decennium)]]
			:gsub("(%d?%d?%d):[a|e] århundradet", 
				function(a) 
					return tonumber(a)-1 .. '00-talet' 
				end) -- 21:a århundradet -> 2000-talet
			:gsub("<span>(%d+)-talet</span>", "<span>[[%1-talet]]</span>") -- 2000-talet -> [[2000-talet]]
			:gsub("<span>(%d+)-talet ([%a%.]*)</span>", "<span>[[%1-talet %2]]</span>") -- 000-talet f.Kr. -> [[000-talet f.Kr.]]	
			:gsub("(%d?%d?%d):[a|e] årtusendet", 
				function(a) 
					return tonumber(a)-1 .. '000-talet' 
				end) -- 2:a århundradet -> 2000-talet
			:gsub("<span>(%d+)-talet</span>", "<span>[[%1-talet (millennium)]]</span>") -- 2000-talet -> [[2000-talet (millennium)]]
			:gsub("<span>(%d+)-talet ([%a%.]*)</span>", "<span>[[%1-talet %2 (millennium)]]</span>") -- 0000-talet f.Kr. -> [[0000-talet f.Kr. (millennium)]]	
	end	
	return str
end

local p = {}

function p.databox(frame)
	local args = frame:getParent().args
	local itemId = nil
	if args.item then
		itemId = args.item
	end
	local item = mw.wikibase.getEntity(itemId) 
	if item == nil then
		mw.addWarning("Wikidata item not found")
		return ""
	end
	
	local width = '260' -- default max width of template, image and map, and height of map 
	if args.width then
		width = args.width
	end
	local height = '240' -- default max height of image. hidden if <= 0.
	if args.height then
		height = args.height
	end
	local zoom = 12 -- default map zoom level. hidden if <0.
	if args.zoom then
		zoom = tonumber(args.zoom)
	end
	local list_length = 8 -- default max no of values in lists
	if args.list_length then
		list_length = tonumber(args.list_length)
	end
	local list_separator = ',' -- default no replacement of comma in lists
	if args.list_separator then
		list_separator = args.list_separator
	end
	local levels = 3 -- default max no of child and parent levels
	if args.levels then
		levels = tonumber(args.levels)
	end
	local maxFiles = 1 -- default max no of coordinate location maps
	if args.maxFiles then
		maxFiles = tonumber(args.maxFiles)
	end
	local langObject = mw.language.getContentLanguage()
	local lang = langObject:getCode()

	local langIdDict = { -- Dictionary for translating language code to language Wikidata item id
		['af'] = 'Q14196',
		['atj'] = 'Q56590',
		['be-tarask'] = 'Q8937989',
		['ca'] = 'Q7026',
		['ceb'] = 'Q33239',
		['ckb'] = 'Q36811',
		['cs'] = 'Q9056',
		['da'] = 'Q9035',
		['dag'] = 'Q32238',
		['de'] = 'Q188',
		['en'] = 'Q1860', 
		['es'] = 'Q1321',
		['ewe'] = 'Q30005',
		['fi'] = 'Q1412',
		['fa'] = 'Q9168',
		['fr'] = 'Q150',
		['frr'] = 'Q28224',
		['haw'] = 'Q33569',
		['he'] = 'Q9288',
		['hi'] = 'Q1568',
		['it'] = 'Q652', 
		['ja'] = 'Q5287',
		['kab'] = 'Q35853',
		['ko'] = 'Q9176',
		['mzn'] = 'Q13356',
		['nap'] = 'Q33845',
		['nds'] = 'Q25433',
		['nl'] = 'Q10000',
		['no'] = 'Q9043',
		['nqo'] = 'Q18546266',
		['pap'] = 'Q33856',
		['pl'] = 'Q809',
		['pcm'] = 'Q33655',
		['pt'] = 'Q5146',
		['ru'] = 'Q7737',
		['rue'] = 'Q26245',
		['sh'] = 'Q9301',
		['sv'] = 'Q9027',
		['tr'] = 'Q256',
		['uk'] = 'Q8798',
		['vi'] = 'Q9199',
		['zh'] = 'Q7850'
	}
	local dump = ''
	local langId -- Local language Wikidata item id
	langId = langIdDict[lang] or nil

	local edit_message = mw.message.new('vector-view-edit'):plain() .. ' Wikidata'
	
	-- Date formating
	local bceDict = { -- Dictionary: Before current era (BCE) in different languages
		['da'] = 'f.v.t.',
		['en'] = 'BCE',
		['sv'] = 'f.v.t.'
	}
	local bcDict = { -- Dictionary: Before Christ (BC) in different languages
		['da'] = 'f.Kr.',
		['en'] = 'BC',	
		['sv'] = 'f.Kr.'
	}
	local bc = bcDict[lang] or 'BC'
	local bce = bceDict[lang] or 'BCE'
	local era = bc -- default era 
	if args.era then
		if args.era == 'BC' then
			era = bc -- replace 'BCE' by 'BC' in content language
		elseif args.era == 'BCE' then
			era = bce -- replace 'BC' by 'BCE' in content language
		else
			era = args.era -- replace 'BCE' and 'BC' by arbitrary argument value, for example empty string
		end
	end
	local replaceTime = {} -- global variable
	replaceTime[' BCE'] = ' '..era
	replaceTime[' '..bce] = ' '..era
	replaceTime[' '..bc] = ' '..era

	local noValueDict = { -- Dictionary: No value
		['da'] = 'ingen værdi',
		['en'] = 'no value',
		['sv'] = 'inget värde'
	}
	local wikicategory = ''
	
	local databoxRoot = mw.html.create('div')
		:addClass('infobox')
		:css({
			float = 'right',
			clear = 'right',
			border = '1px solid #aaa',
			['background-color'] = '#f9f9f9',
			['width'] = width .. 'px',
			padding = '0 0.4em',
			margin = '0 0 0.4em 0.4em',
		})

	--Title
	local title = item:getLabel() or mw.title.getCurrentTitle().text
    if args.keep_title_case == nil or #args.keep_title_case == 0 or args.keep_title_case == 'false' then
	    title = langObject:ucfirst(title)
	end
	databoxRoot:tag('div')
		:css({
			['text-align'] = 'center',
			['background-color'] = 'LightGrey',
			padding = '0em 0.4',
			margin = '0em 0',
			['font-size'] = '120%',
			['font-weight'] = 'bold',
		})
		:wikitext(title)

	--Description
	local descr, descrLang = item:getDescriptionWithLang()
	if descrLang == lang then -- Do not show any fallback language
		databoxRoot:tag('div')
		:css({
			['text-align'] = 'center',
			['vertical-align'] = 'text-top',
			['font-size'] = '90%',
			['line-height'] = '140%',
			padding = '0.2em 0.4',
			margin = '0.0em 0.4',
			['padding-bottom'] = '0.5em',
		})
		:wikitext(langObject:ucfirst(descr):sub(1,-1))
		:wikitext('<sup class="noprint Inline-Template">&nbsp;[[File:Arbcom_ru_editing.svg|' 
			.. edit_message .. '|8px|baseline|class=noviewer|link=https://www.wikidata.org/wiki/' 
			.. item.id .. ']]</sup>')
	end
	
	--Show first good image with legend/caption in content language, or first good image
	if tonumber(height) > 0 then
		local images = item:getBestStatements('P18') -- p18 is 'image'
		if #images >= 1 then
			local image = images[1]
			for _, i in pairs(images) do
				
 				if i.qualifiers and i.qualifiers.P2096 then -- P2096 is 'caption'
 					for _, c in pairs(i.qualifiers.P2096) do 
 						if c.snaktype == 'value' and c.datavalue.value.language == lang then
							caption = c
				 			image = i
							break
 						end
 					end 
 				end
 				if caption then
 					break
 				end
			end 
 			if image.mainsnak.snaktype == 'value' then
	 			databoxRoot
		   		:tag('div')
		   		:css({
					['text-align'] = 'center',
					padding = '0.0em 0.4',
				})
				:wikitext('[[File:' .. image.mainsnak.datavalue.value .. '|frameless|' 
			   		.. width .. 'x' .. height .. 'px]]')			
			   	if caption then
		 			databoxRoot
			   		:tag('div')
		   			:css({
						['text-align'] = 'center',
						['font-size'] = '90%',
						['line-height'] = '140%',
						['padding-bottom'] = '0.5em',
				})
					:wikitext(caption.datavalue.value.text)
					:wikitext('<sup class="noprint Inline-Template">&nbsp;[[File:Arbcom_ru_editing.svg|' 
						.. edit_message .. '|8px|baseline|class=noviewer|link=https://www.wikidata.org/wiki/' 
						.. item.id .. '#' .. 'P18' .. ']]</sup>')
			   	end
			end
		end
	end
	
	--Table:
	local dataTable = databoxRoot
		:tag('table')
		:css({
			['text-align'] = 'left',
			['font-size'] = '90%',
			['line-height'] = '140%',
			['hyphens'] = 'auto', -- works only in some browsers and languages
			['word-break'] = 'break-word',
			['width'] = '100%',
			['table-layout'] = 'fixed',
			['padding-bottom'] = '0.5em',
		})
	
	--Instance of:
	local dataValues 
	local statements = item:getBestStatements('P31')
	if #statements > list_length then -- Hide too long list of values
		if lang == 'sv' then
			wikicategory = wikicategory .. '[[Kategori:Databox med dold lång lista]]'
		end
	elseif #statements >= 1 then
		dataValues=item:formatStatements('P31').value
		if lang == 'sv' then
			if dataValues:match("<span>%[%[Människa|människa%]%]</span>") then -- Remove 'is instance of' -> 'human' TODO: Same for other languages
				if #statements == 1 then
					dataValues = ''
				else
					dataValues = dataValues:gsub("<span>%[%[Människa|människa%]%]</span>,?%s?", "")
				end
			end
		elseif lang == 'da' then
			if dataValues:match("<span>%[%[Menneske|menneske%]%]</span>") then -- Remove 'is instance of' -> 'human'
				if #statements == 1 then
					dataValues = ''
				else
					dataValues = dataValues:gsub("<span>%[%[Menneske|menneske%]%]</span>,?%s?", "")
				end
			end
		end
		dataValues = dataValues:gsub(", </span>$", "</span>") -- Removing ending comma after removed ", human"
		
		if #dataValues > 0 then
			dataValues=listCase(dataValues)
				
			dataTable:tag('caption')
				 :css({
				 	['background-color'] = 'LightGrey',
				 	['font-weight'] = 'bold',
				 	['margin-top'] = '0.4em',
				 	margin = '0.5em 0',
					padding = '1em 1',
				 })
				:wikitext(dataValues)			 
				:wikitext('<sup class="noprint Inline-Template">&nbsp;[[File:Arbcom_ru_editing.svg|' 
					   	.. edit_message .. '|8px|baseline|class=noviewer|link=https://www.wikidata.org/wiki/' 
					   	.. item.id .. '#P31' .. ']]</sup>')
	
			if #statements >= math.max(list_length-3,3) and lang == 'sv' then -- warning of long list but not too long list
				wikicategory = wikicategory .. '[[Kategori:Databox med lång lista]]'
			end
		end
	end
	
	local properties = mw.wikibase.orderProperties(item:getProperties())
	local property_blacklist_hash = Set(property_blacklist)
	property_blacklist_hash['P18'] = true --Showed separately
	property_blacklist_hash['P31'] = true --Showed separately
	local property_whitelist_hash = Set(property_whitelist)
	local properties_with_parents_hash = Set(properties_with_parents)
	local properties_with_children_hash = Set(properties_with_children)
	local countryid = ' '
	pcall(function () 
		countryid = item.claims['P17'][1].mainsnak.datavalue.value.id 
	end)

	for _, property in pairs(properties) do
		local datatype = item.claims[property][1].mainsnak.datatype
		local statements = item:getBestStatements(property)
		if ( (datatype ~= 'external-id' 
					and datatype ~= 'commonsMedia'
					and datatype ~= 'url')
				or property_whitelist_hash[property] )
			and not property_blacklist_hash[property] 
			and 1 <= #statements then
			
			if #statements > list_length then
				if lang == 'sv' then
				   	wikicategory = wikicategory .. '[[Kategori:Databox med dold lång lista]]' 
				end	
			else
				local propertyValue = item:formatStatements(property)
				propertyValue.label = langObject:ucfirst(hyphenate(propertyValue.label, lang)) -- left table cell content
				local propertyEntity = mw.wikibase.getEntity(property) -- Time consuming
				if propertyEntity then
					
					-- Replace property name by short name if only one in content language:
					if propertyEntity['claims']['P1813'] then
						local shortNames = propertyEntity['claims']['P1813'] -- 'P1813' = short name.
						shortname = ''
						for _, s in pairs(shortNames) do 
	 						if s.mainsnak.snaktype == 'value' 
	 						   and s.mainsnak.datavalue.value.language == lang then -- (Should check that only one value is in the content lang)
								if #shortname > 0 then
									shortname = ''
									break -- Several shortnames in the local language
								end
								shortname = s.mainsnak.datavalue.value.text
							end
	 					end 
						if #shortname > 0 then
							propertyValue.label = langObject:ucfirst(hyphenate(shortname, lang))  
						end
					end
	
					-- Link row label (property name) to related article in content language:
					local propertySubjects = propertyEntity:getBestStatements('P1629') -- 'P1629 = subject item of this property'
					if #propertySubjects == 1 
					   and propertyEntity['claims']['P1629'][1].mainsnak.snaktype == 'value' then
						local subjectItemQid = propertyEntity['claims']['P1629'][1].mainsnak.datavalue.value.id
						articleSitelink = mw.wikibase.getSitelink(subjectItemQid)
						if articleSitelink ~= nil then -- Property subject item has local article
							propertyValue.label = '[[' .. articleSitelink .. '|' .. propertyValue.label .. ']]'  
						end
						
					end
				
				end
			
				local dataValues -- right table cell content
				if #statements == 1 
						and levels >= 2 
						and (properties_with_parents_hash[property] 
							or properties_with_children_hash[property])
						then 
					dataValues = propertyValue.value
					if merged_chronology and property == 'P156' then -- If 'P155' (follows) already shown as bulleted list, P156 (followed by) should be part of same list.
						propertyValue.label = '' -- Hide 'Followed by' in left column
					end
					if property == 'P155' or property == 'P156' then -- follows or followed by
						dataValues = '• ' .. dataValues
					end					
				
					local level = {}
					
					-- Show parent/child item if any:
					if item['claims'][property][1].mainsnak.snaktype == 'value' then					
						level[1] = {}
						level[1].value = item['claims'][property][1].mainsnak.datavalue.value -- (Can give non-best statement?)
						level[1].item = mw.wikibase.getEntity(level[1].value.id) -- Time consuming
						level[1].statements = mw.wikibase.getBestStatements(level[1].item.id, property) 
					end
					
					if item['claims'][property][1].mainsnak.snaktype == 'value' 
					   and #level[1].statements == 1 and level[1].statements[1].mainsnak.datavalue then
						level[1].qid = level[1].statements[1].mainsnak.datavalue.value.id
						if level[1].qid ~= countryid then -- do not repeat country as administrative belonging or place 
							level[1].propertyValue = level[1].item:formatStatements(property)
							if level[1].propertyValue then
							-- Show multi-level list as bulleted list:
								if not (property == 'P155' or property == 'P156') then
									dataValues = '• ' .. dataValues
								end							
								level[1].qid = level[1].statements[1].mainsnak.datavalue.value.id
								if properties_with_children_hash[property] then -- next lower level / child item: put in end of the list. 
									if property == 'P156' then -- follows
										dataValues = dataValues 
										.. '<br/>• ' .. level[1].propertyValue.value
									else -- indent
										dataValues = dataValues 
										.. '<br/>' .. '&nbsp;• ' .. level[1].propertyValue.value
									end
									
								else -- next higher level / parent item: put first in list
									if property == 'P155' then -- followed by
										dataValues = '• ' .. level[1].propertyValue.value
										.. '<br/>' .. dataValues 
									else -- indent
										dataValues = '• ' .. level[1].propertyValue.value
										.. '<br/>&nbsp;' .. dataValues 
									end
								end
						
								local lc = 2 -- level counter
								while lc<levels and level[lc-1].item.claims[property][1].mainsnak.datavalue do 
									level[lc]={}
									level[lc].value = level[lc-1].item.claims[property][1].mainsnak.datavalue.value -- (Best statement?)
									level[lc].item = mw.wikibase.getEntity(level[lc].value.id) -- Time consuming
									level[lc].statements = mw.wikibase.getBestStatements(level[lc].item.id, property)  
									 
									if #level[lc].statements > 0 and level[lc].statements[1].mainsnak.datavalue then 
										level[lc].qid = level[lc].statements[1].mainsnak.datavalue.value.id
										if #level[lc].statements == 1 
												and level[lc].qid ~= countryid -- do not repeat country as administrative belonging or place 
												then
											level[lc].propertyValue = level[lc].item:formatStatements(property) -- (Best statement?)
											if properties_with_children_hash[property] then -- next lower level / child item 
												if property == 'P156' then -- follows
													dataValues = dataValues .. '<br/>'
													.. '• ' .. level[lc].propertyValue.value
												else -- indent
													dataValues = dataValues .. '<br/>'
													.. string.rep('&nbsp;', lc) .. '• ' .. level[lc].propertyValue.value
												end
											else -- next higher level / parent item
												if property == 'P155' then -- followed by
													dataValues = '• ' .. level[lc].propertyValue.value
													.. '<br/>' .. dataValues
												else -- indent
													dataValues = '• ' .. level[lc].propertyValue.value
													.. '<br/>&nbsp;' .. dataValues:gsub('<br/>', '<br/>&nbsp;')
												end
											end
											lc = lc+1
										else
											break
										end
									else
										break
									end
								end -- while lc
								if lang == 'sv' then
									wikicategory = wikicategory .. '[[Kategori:Databox med ' .. lc .. ' nivåer]]' 
								end
							end
						end
					end
					if property == 'P155' then -- P155 (follows) was a bulleted list
						if level[1] then
							followed_by = mw.wikibase.getBestStatements(level[1].item.id, 'P156')
							if followed_by and #followed_by == 1 then -- P156 (followed by) may also be a bulleted list
								-- Show merged chronology list, including this wikidata object
								dataValues = dataValues
								.. "<p>• \'\'\'" .. item:getLabel() .. "\'\'\'"
								if lang == 'da' or lang == 'sv'  then
									propertyValue.label = 'Kronologi'
									merged_chronology = true
								end
								if lang == 'en' then
									propertyValue.label = 'Chronology'
									merged_chronology = true
								end
							end
						end
					end

				else -- not a multi-level list
					if datatype == 'url' then  -- only show first url
						if statements[1].mainsnak.snaktype == 'value' then
							if #statements[1].mainsnak.datavalue.value>40 then -- replace long url by "link"
								if lang == 'sv' then
									dataValues = frame:preprocess('[' .. statements[1].mainsnak.datavalue.value .. ' länk]')
								else
									dataValues = frame:preprocess('[' .. statements[1].mainsnak.datavalue.value .. ' link]')
								end
							else -- hide "https://" or "http:// and / in the end"
								dataValues = frame:preprocess('[' .. statements[1].mainsnak.datavalue.value 
									.. ' ' .. statements[1].mainsnak.datavalue.value:gsub('https?://', ''):gsub('/$', '') .. ']')
							end
						end
					
					elseif datatype == 'geo-shape' then -- only show first geo-shape
						if lang == 'sv' then
							dataValues = frame:preprocess('[https://commons.wikimedia.org/wiki/' 
								.. statements[1].mainsnak.datavalue.value:gsub(' ', '_') .. ' kartlänk]')
						else
							dataValues = frame:preprocess('[https://commons.wikimedia.org/wiki/' 
								.. statements[1].mainsnak.datavalue.value:gsub(' ', '_') .. ' link]')
						end
					
					elseif datatype == 'monolingualtext' then
						for _, s in pairs(statements) do
							if s.mainsnak.snaktype == 'value' 
							   and s.mainsnak.datavalue.value.language == lang then
								dataValues = frame:preprocess(s.mainsnak.datavalue.value)
								if lang == 'sv' then
									wikicategory = wikicategory .. '[[Kategori:Databox med monolingualtext]]'
								end
								break -- Maximum one monolingualtext per property
							end
						end
					else 
						dataValues = frame:preprocess(propertyValue.value)
						if #statements > 1 then
							dataValues = listSeparate(dataValues, list_separator)
						end
						if datatype == 'time' then
							dataValues = year(dataValues, lang, replaceTime)
						end
						if #statements >= math.max(list_length-3,3) 
						   and lang == 'sv' then --Warning on long but not hidden list
							wikicategory = wikicategory .. '[[Kategori:Databox med lång lista]]'
						end
					end
				end
				
				-- Replace "no value" with a dash:
				if dataValues  and noValueDict[lang] then
					dataValues = dataValues:gsub('<span>' .. noValueDict[lang] .. '</span>', '<span>–</span>')
				end
				
				-- Render table row:
				if dataValues and dataValues ~= '<span>–</span>' then
					dataTable:tag('tr')
						:tag('th')
						:css({
			   				['vertical-align'] = 'text-top',
						})
							:attr('scope', 'row')
							:attr('colspan', '1')
							:wikitext(frame:preprocess(propertyValue.label)):done()
						:tag('td')
						:css({
			   				['vertical-align'] = 'text-top',
						 })
							:attr('colspan', '2')
							:wikitext(dataValues)
							:wikitext('<sup class="noprint Inline-Template">&nbsp;[[File:Arbcom_ru_editing.svg|' 
								.. edit_message .. '|8px|baseline|class=noviewer|link=https://www.wikidata.org/wiki/' 
								.. item.id .. '#' .. property .. ']]</sup>')
				end -- if dataValues
			
			end -- if #statements
		end -- if datatype
	end -- for property
	
	--Automatic coordinate location map(s)
	if zoom >= 0 then
		local coordinates_statements = item:getBestStatements('P625') -- P625 is coordinate location
		local cnt = 0
		for _, s in pairs(coordinates_statements) do
			if s.mainsnak.datavalue and s.mainsnak.datavalue.value.globe == 'http://www.wikidata.org/entity/Q2' then
				cnt = cnt + 1
				databoxRoot:wikitext(buildInteractiveMap(width, s.mainsnak.datavalue.value, item.id, zoom))
				if lang == 'sv' then
					if cnt == 1 then
						wikicategory = wikicategory .. '[[Kategori:Sidor med kartor skapade med Databox]]' .. ' '
					else
						wikicategory = wikicategory .. '[[Kategori:Sidor med flera kartor skapade med Databox]]' .. ' '
					end
				end
			end
			if cnt >= maxFiles then
				break -- Show maximum maxFiles maps or coordinates.
			end
		end -- for
	end

	--Other commonsMedia files: show first good file for each property that have media legend in content language
	if tonumber(height) > 0 then
		for _, property in pairs(properties) do
			local datatype = item.claims[property][1].mainsnak.datatype
			local statements = item:getBestStatements(property)
			if (datatype == 'commonsMedia')
				and not property_blacklist_hash[property] 
				and property ~= 'P18' then -- Image showed separately
	
				local files = item:getBestStatements(property)
				if #files >= 1 then
					local file
					local caption
					for _, i in pairs(files) do
			 			if i.qualifiers then
			 				if i.qualifiers.P2096 then -- P2096 is 'caption'
			 					for _, q in pairs(i.qualifiers.P2096) do 
			 						if q.snaktype == 'value' and q.datavalue.value.language == lang then
										caption = q
						 				file = i
										break
			 						end
			 					end
			 				elseif langId and i.qualifiers.P407 then -- P407 is 'language of work or name'
			 					for _, q in pairs(i.qualifiers.P407) do 
			 						if q.snaktype == 'value' 
			 							and q.datavalue.value.id == langId -- local language
			 						then
						 				file = i
						 				break
			 						end
			 					end
			 				end
			 			end -- if i.qualifiers
			 			if file then
			 				break
			 			end
			 		end -- for _, i in pairs(files) 
			 		if file then
			 			if caption then
				 	 		databoxRoot
							:tag('div')
							:css({
								['text-align'] = 'center',
								padding = '0.0em 0.4',
							})
							:wikitext('[[File:' .. file.mainsnak.datavalue.value .. '|frameless|' 
					   			.. width .. 'x' .. height .. 'px]]')			
					   		databoxRoot
					   		:tag('div')
				   			:css({
								['text-align'] = 'center',
								['font-size'] = '90%',
								['line-height'] = '140%',
								['padding-bottom'] = '0.5em',
							})
							:wikitext(caption.datavalue.value.text)
							:wikitext('<sup class="noprint Inline-Template">&nbsp;[[File:Arbcom_ru_editing.svg|' 
								.. edit_message .. '|8px|baseline|class=noviewer|link=https://www.wikidata.org/wiki/' 
								.. item.id .. '#' .. property .. ']]</sup>')
						else -- no caption
							databoxRoot
							:tag('div')
							:css({
								['text-align'] = 'center',
								padding = '0.0em 0.4',
							})
							:wikitext('[[File:' .. file.mainsnak.datavalue.value .. '|frameless|' 
					   			.. width .. 'x' .. height .. 'px]]')			
					   		databoxRoot
					   		:tag('div')
				   			:css({
								['text-align'] = 'center',
								['font-size'] = '90%',
								['line-height'] = '140%',
								['padding-bottom'] = '0.5em',
							})

			 			end -- if caption
						if lang == 'sv' then
							if property == 'P242' then -- P242 is 'locator map image'
								wikicategory = wikicategory .. '[[Kategori:Sidor med översiktskartor skapade med Databox]]' .. ' '
							else
								wikicategory = wikicategory .. '[[Kategori:Sidor med andra mediafiler i Databox]]' .. ' '
							end 
						end
					end -- if file
				end -- if #files
			end -- if datatype
		end -- for _, property
	end -- if height

	--Category
	if mw.title.getCurrentTitle().namespace == 0 then -- Only in main namespace 
		if tostring(databoxRoot):match('<span>Q%d+</span>') then
			if lang == 'da' then
				wikicategory = wikicategory .. '[[Kategori:Databox der viser Qid-kode]]' .. ' '
			elseif lang == 'sv' then
				wikicategory = wikicategory .. '[[Kategori:Databox som visar qid-kod]]' .. ' '
			elseif lang == 'en' then
				wikicategory = wikicategory .. '[[Category:Databox that shows qid code]]' .. ' '
			elseif lang == 'frr' then
				wikicategory = wikicategory .. '[[Kategorie:Databox mit Qid-Code]]' .. ' '
			end
		end
		if #wikicategory then
			databoxRoot:wikitext(wikicategory)
		end
  	end
	if #dump then
		databoxRoot:wikitext(dump)
	end
	return tostring(databoxRoot)
end -- function

return p