Modul:Wikidata2

![]() |
Dieses Modul ist getestet und für den projektweiten Gebrauch geeignet. Es kann in Vorlagen benutzt und auf Hilfeseiten erläutert werden. Entwicklungen an dem Modul sollten auf Wikidata2/Test und die Anwendung auf der Spielwiese getestet werden, da wiederholte Trial-and-Error-Edits die Resourcen stark belasten können. |
Dieses Modul enthält Funktionen für die Verwendung von Wikidata. Die Funktionen holen sich die Argumente aus der Vorlage und müssen beim Modulaufruf nicht nochmals übergeben werden. Sie können aber, dann werden genutzt, wenn sie bei Verwendung der Vorlage vergessen wurden. Komplett vergessene Parameter werden mit Standardwerten belegt, unbekannte Parameter werden als Fehlermeldung zusätzlich mit im Artikel ausgegeben.
Allgemein gültige Parameter
Die allgemein gültigen Parameter kann man sowohl innerhalb der Vorlage in der Parserfunktion invoke
benutzen, als auch innerhalb des Artikels der Vorlage selbst übergeben. Der Paramter, der bei der Einbindung der Vorlage benutzt wird, hat dabei Vorrang. So kann man bestimmte Funktionalitäten für den generellen Gebrauch der Vorlage aktivieren (über invoke
) und im Einzelfall im Artikel abschalten (bei der Verwendung der Vorlage).
|ignore_errors=
auf 1 oder true gesetzt, werden die Ausgabe der Fehlermeldungen der Funktionen unterdrückt. Standardmäßig werden die Fehler angezeigt.|no_category=
auf 1 oder true gesetzt, werden die Artikel bei Fehlermeldungen des Moduls einer Fehlerkategorie zugeordnet. Standardmäßig werden Fehlermeldungen in die Kategorie Fehlerberichte des Moduls Wikidata2 eingefügt. Wurden unbekannte Parameter verwendet landen die Artikel zusätzlich in der Kategorie Vorlagen mit unbekannten Parametern.|error_category=
gibt den Namen einer Fehlerkategorie an, in der der Artikel bei auftretenden Fehlern einsortiert wird. Standardmäßig ist das Fehlerberichte des Moduls Wikidata2.
Submodule
- Modul:Wikidata2/i18n – Liefert sämtliche Meldungs- und Statustexte
- Modul:Wikidata2/Delimiters – Liefert die trennenden Elemente zwischen den einzelnen Einträgen bei der Serialisierung von Wikidataeigenschaften, standardmäßig ein Komma und ein Leerzeichen.
- Modul:Wikidata2/Units – Liefert die Namen von Maßeinheiten für Eigenaschaften vom Typ
quantity
- Modul:Wikidata2/Formats – Enthält Formatierungsanweisungen für die Daten von Wikidata
- Modul:Wikidata2/Geography – Das Modul enthält dient der Suche nach Provinzen von Ortschaften und wird von der Funktion
getProvince
dieses Moduls benutzt. Die Funktion ermittelt auf Wikidata zu jedem Ort die passende Provinz. Mit Provinz ist dabei die erste administrative Hierarchie eines Staates gemeint. Im Falle von Deutschland ist es das Bundesland. Angewendet wird diese Funktion zum Beispiel in der Ortsquickbar (Modul Quickbar Ort und Vorlage Quickbar Ort. Dabei hangelt sich die Funktion ausgehend vom Ort über die Objekteigenschaft Liegt in Verwaltungseinheit über Landkreise und Counties bis zur passenden Provinz. - Modul:Wikidata2/POITypes – Das Modul enthält die POI-Typen für das Modul Wikidata2. Benutzt wird des von der Funktion
wd.getPOITypes()
. Sie liefert zum übergebenen Objekt den passenden Typen zurück, sofern in der Tabelle in diesem Modul definiert ist. Ist nichts hinterlegt wird der Standardwert ausgegeben (derzeit: sight). Die Typen werden unter anderem von Vorlagen {{Poi}} und {{VCard}} benutzt um die Markierungen in den dynamischen Karten einzufärben. - Modul:Wikidata2/Params – enthält ein mehrdimensionales Array mit allen erlaubten Parametern für jede Funktion/Vorlage und ihre Standardbelegung.
Verwendete Module
- Modul:Check2 – enthält Routinen zur Parameterprüfung und Fehlergenerierung. Für die Parameterprüfung benötigt das aktuelle Modul Informationen über die erlaubten Parameter einer Funktionen. Diese wird im Regelfall über das Submodul Modul:Wikidata2/Params bereitgestellt.
- Modul:Yesno – Hilfsmodul zur Auswertung von Ja/Nein-Werten. Es wertet Angaben wie ja, no oder 1 als boolsche Werte aus
Einbindung in anderen Modulen
Dieses Modul wird in folgenden Modulen eingebunden und weiter verwendet. Änderungen an diesem Modul wirken sich daher möglicherweise auf andere Features aus sollten daher mit Bedacht vorgenommen werden. Sprich dich daher bitte mit den Modul- und Vorlagenprogrammierern ab.
- Quickbar Ort – Modul für die Infoboxen in Ortsartikeln. Von Wikidata werden verschiedene Informationen bezogen: Provinz, Einwohnerzahl, Höhe, Koordinaten und Ländercode für die Kartendarstellung sowie bei Bedarf auch das repräsentative Bild.
- Quickbar Region – Modul für die Infoboxen in Regionenartikeln. Von Wikidata werden verschiedene Informationen bezogen: Provinz, Einwohnerzahl, Fläche und die Lagekarte sowie bei Bedarf auch das repräsentative Bild oder Flagge, Siegel und Wappen.
- Quickbar Codes – Modul für einzelne Informationen in Infoboxen in Ortsartikeln. Das Modul holt Werte wie Postleitzahln und Ortsvorwahlen.
- Modul:Quickbar Position – Teil einer Quickbar mit einer Lagekarte.
Verwendung in anderen Vorlagen
Dieses Modul wird in folgenden Vorlagen verwendet:
- {{Wikidata}} – Dient den direkten Abruf von Daten aus Wikidata und Verwendung im Artikel.
- {{Quickbar Ort}} – Stellt die Infoboxen in Ortsartikeln dar und benutzt das gleichnamige Modul. Die vollautomatische Variante ist die {{Autoquickbar Ort}}
- {{Quickbar Region}} – Stellt die Infoboxen in Regoionenartikeln dar und benutzt das gleichnamige Modul. Von ihr sind länderspezifische Vorlagen abgeleitet. Vorlagen:Quickbars Provinzen.
- {{Offizielle Webseite}} – Erzeugt einen Eintrag mit der/den offiziellen Webseite(n) des Ortes und garantiert eine einheitliche Darstellung in allen Artikeln. Die Anwendung erfolgt im Abschnitt Weblinks eines Artikels.
Folgende Vorlagen werden nicht mehr eingesetzt, sind aber noch in Artikeln vorhanden.
- {{Vorwahl und PLZ}} – Blendet eine Miniquickbar mit Vorwahl und Postleitzahl eines Ortes ein.
Siehe auch
- Wikivoyage:Vorlagen/Wikidata – Übersicht über die Vorlagen, die Wikidata benutzen.
Funktionen
Im folgenden werden alle über das Modul verfügbaren Funktionen beschrieben. Für die Benutzung stehen zwei Wege zur Verfügung:
- Benutzung im Artikel oder in Vorlagen:
{{#invoke:Wikidata2|<Funktionsname>|<Parameter 1>=<Wert 1>|<Parameter 2>=<Wert 2>|.....}}
- Einbindung in ein anderes Modul
local wd = require('Modul:Wikidata2')
objekt = wd.EntityId()
Bei der Anwendung in Artikeln und Vorlagen muss bei den Bezeichnungen Parameter nicht auf Groß- und Kleinschreibung geachtet werden. Die beispielhafte Anwendung der Funktionen kannst du auch auf Wikivoyage:Wikidata/Test Modul:Wikidata2 näher anschauen.
Entity/ID
Einige Funktionen beschäftigen sich mit der Ermittlung der ID des zugehörigen Datenbankobjektes einer Wikivoyage-Seite.
EntityId
– Liefert die ID des Datenbankobjektes. Existiert kein Objekt, wird eine leere Zeichenkette zurückgegeben.hasEntity
– Ist ein Datenobjekt vorhanden? Die Funktion liefert true oder false.EntityIdErrCode
- Interner Fehlercode der Abfrage.0
Es gibt kein Wikidata-Objekt.1
Es gibt ein Wikidata-Objekt.
EntityIdErrText
– Fehlertext der Abfrage. Dieser ist auf Wikidata2/i18n parametrierbar.Entity
– Liefert ein Objekt mit allen Informationen der Abfrage der ID des Wikidataobjektes zurück. Damit ist eine Weiterverarbeitung in anderen Modulen einfach möglich. Das Objekt hat folgenden Aufbau:"id"
– ID des Objektes oder leere Zeichenkette"hasID"
– Ginbt es ein Objekt: Boolscher Wert (true/false)"errCode"
– Ergebniscode (0/1)"errMsg"
– Nachrichten-/Fehlertext der Abfrage"entity"
– komplettes Wikidata-Objekt
Bezeichnung/Label
Die folgenden Funktionen bieten Zugriff auf die Bezeichnungen des Wikidata-Objektes
Label
– Liefert die Bezeichnung des Objektes in der Sprache des WikisLabelByID
– Liefert die Bezeichnung eines beliebigen Objektes in der Sprache des WikisLabelLang
– Liefert die Bezeichnung des Objektes in einer gewünschten Sprache, gibt es keinen Eintrag, wird eine leere Zeichenkette geliefert.LabelLangByID
– Liefert die Bezeichnung eines beliebigen Objektes in einer gewünschten Sprache, gibt es keinen Eintrag, wird eine leere Zeichenkette geliefert.LabelLangByIDRaw
– Liefert ein Objekt mit allen Informationen der Abfrage der Bezeichnung des Wikidataobjektes zurück. Damit ist eine Weiterverarbeitung in anderen Modulen einfach möglich. Das Objekt hat folgenden Aufbau:"label"
– Bezeichnung des Objektes oder leere Zeichenkette"errCode"
– Ergebniscode (0/1)"errMsg"
– Nachrichten-/Fehlertext der Abfrage
Abfrage von Objekteigenschaften
getValue
– Die Funktion liefert die Eigenschaften eines Objektes formatiert für die Verwendung in Artikeln zurück. Alle Parameter haben Standardwerte. Komplett ohne Parameter angewendet, wird ausgegeben, was für ein Objekt der aktuelle Artikel darstellt (Eigenschaft: ist ein...).|id=
ID des Datenobjektes. Wird nichts angegeben, wird das eigene Objekt benutzt.|p=
Angabe der ID der Objekteigenschaft, die abgefragt werden soll. Die IDs beginnen mit einem „P“. Ist nichts angegeben wird die Eigenschaft „P31“ (ist ein...) zurückgeliefert.|format=
Wenn gewünscht, kann man für die Ausgabe der Eigenschaft zusätzlich vom Standard abweichende Formatieranweisungen übergeben. Sämtliche Formatierungen sind in dem Submodul Wikidata2/Formats hinterlegt.|ranking=
Standardmäßig liefert die Funktion bei mehreren vorhandenen Eigenschaften den bevorzugten Wert zurück (z.B. bei mehreren hinterlegten Einwohnerzahlen die jeweils aktuelle). Ist eine komplette Liste aller Werte gewünscht, kann man dies parametrieren.|ranking=best
bevorzugter Wert (Standard)|ranking=all
Ausgabe aller Einträge
|showranking=
Werden alle Eigenschaften angezeigt (siehe voriger Parameter), kann man sich die Werte entsprechen der hinterlegten Rankings unterschiedlich darstellen lassen. Für jede Stufe ist eine Standardfarbe im Wiki voreingestellt. Folgende CSS-Klassen sind für die Darstellung verantwortlich und können benutzerspezifisch in der Datei Benutzer:<Dein Name>/common.css individuell ausgestaltet werden:.wd-rank-truth
– Höchste Priorität.wd-rank-preferred
– Bevorzugte Priorität.wd-rank-normal
– Normale Priorität.wd-rank-deprecated
– Veraltete Information
getProperty
– Diese Funktion ist eine Subroutine, die die Aufbereitung der gelieferten Tabelle mit den Objekteigenschaften übernimmt. Sie wird von der hier drüber dokumentierten FunktiongetValue
benutzt und nicht direkt in Artikeln oder Vorlagen verwendet. Sie ist aber von außen verfügbar und kann somit von anderen Modulen benutzt werden. Sie erwartet als Parameter eine Tabelle die der Wikidata-Datenstruktur, wie sie unterhalb des KnotensClaims => Pxxx
geliefert wird.
Anwendungsspezifische Funktionen
Die folgenden Funktionen liefern maßgeschneiderte Informationen für bestimmte Vorlagen, so zum Beispiel die Kartentools und die VCard. Die Funktionen können auch in anderen Vorlagen benutzt werden, meistens wird sich die Anwendung aber auf eine bestimmte Vorlage beschränken.:
getPOIType
– Die Funktion liefert den POI-Typ eines Datenobjektes. Die Codes werden von dem Submodul Wikidata2/POITypes bezogen. Wird dort nichts passendes gefunden, wird der Standardwert ausgegeben (derzeit: sight). Die Typen werden unter anderem von Vorlagen {{Poi}} und {{VCard}} benutzt um die Markierungen in den dynamischen Karten einzufärben.|id=
Optionale Angabe einer Objekt-ID. Wird nichts angegeben, wird das eigene Objekt abgefragt.
getPOITypeDefault
– Die Funktion gibt den derzeit als Standard hinterlegten POI-Typ zurück.getOfficialWebsite
– Liefert die ofizielle(n) Webseite(n) des Artikels/Objektes inklusive des ergänzenden Textes: „offizielle Webseite von ...“|id=
Optionale Angabe einer Objekt-ID. Wird nichts angegeben, wird das eigene Objekt abgefragt.
Hilfsfunktionen
dumpEntity
– Die Funktion gibt die gesamte Struktur des Wikidataobjektes aus. Zu Analysezwecken kann man sich somit schnell einen Überblick über die Struktur und die Bezeichnungen der einzelnen Datenfelder verschaffen. Die Ausgabe nimmt schnell mehrere Bildschirmseiten ein (Hier einige Beispiele).|id=
Optionale Angabe einer Objekt-ID. Wird nichts angegeben, wird das eigene Objekt ausgegeben.
Benötigte weitere Module
Dieses Modul benötigt folgende weitere Module: Check2 • Languages • Yesno • VarDump
Verwendung in anderen Modulen
Dieses Modul ist notwendig für die Ausführung folgender Module. Bei Anpassungen sollte die Funktionstüchtigkeit der folgenden Module geprüft werden. Benutze dazu auch diese Tracking-Kategorie um Fehler zu finden, die sich dann auf Artikel auswirken:
- Quickbar2 • Quickbar Ort • Quickbar Region • Quickbar Codes
- Modul benötigt das Modul Wikidata2 – Wartungskategorie, in der nochmals alle Module gelistet sind, die von diesem Modul abhängig sind.
- Die obige Dokumentation wurde aus der Seite Modul:Wikidata2/Doku eingefügt. (bearbeiten | Versionsgeschichte) Die Kategorien für dieses Modul sollten in der Dokumentation eingetragen werden. Die Interwiki-Links sollten auf Wikidata eingepflegt werden.
- Liste der Unterseiten
local check = require('Modul:Check2')
local yesno = require('Modul:Yesno')
local languages = require('Modul:Languages')
local cfgI18 = mw.loadData('Modul:Wikidata2/i18n')
local cfgParams = mw.loadData('Modul:Wikidata2/Params')
local cfgDelimiters = mw.loadData('Modul:Wikidata2/Delimiters')
local cfgFormats = mw.loadData('Modul:Wikidata2/Formats')
local cfgPOITypes = mw.loadData('Modul:Wikidata2/POITypes')
local cfgGeography = mw.loadData('Modul:Wikidata2/Geography')
local cfgUnits = mw.loadData('Modul:Wikidata2/Units')
local lang = mw.language.getContentLanguage()
-- Auswertung und Prüfung von übergebenen Parametern
local function wdGetParameter ( Frame, Params, Parameter )
local argsParent = Frame:getParent().args
local argsFrame = Frame.args
for key,value in pairs ( argsParent ) do
argsParent[string.lower(key)] = value
end
for key,value in pairs ( argsFrame ) do
argsParent[string.lower(key)] = value
end
return argsParent[Parameter] or argsFrame[Parameter] or Params[Parameter]
end
local function getEntityId ()
local pageID = mw.wikibase.getEntityIdForCurrentPage()
local result = {}
if ( pageID ~= nil ) then
result = {
["id"] = pageID,
["hasID"] = true,
["errCode"] = 1,
["errMsg"] = cfgI18["getEntityId"]["1"]
}
else
result = {
["id"] = "",
["hasID"] = false,
["errCode"] = 0,
["errMsg"] = cfgI18["getEntityId"]["0"]
}
end
return result
end
local wdEntityId = getEntityId()
local wdErrCategory = ''
local wd = {}
function wd.formatNumberT ( number )
local decimalPosition = mw.ustring.find( number, ".", 1, true)
local minus = mw.ustring.find( number, "-", 1, true)
number = mw.ustring.gsub ( number, '%.', ',' )
if ( minus ) then number = mw.ustring.sub( number, 2) end
if (not decimalPosition) then
decimalPosition = mw.ustring.len ( number ) + 1;
end
if (decimalPosition > 4 ) then
local i = decimalPosition - 3;
while (i > 1) do
number = mw.ustring.sub(number, 1, i - 1) .. '.' .. mw.ustring.sub( number, i );
decimalPosition = decimalPosition + 1;
i = i - 3;
end
end
if ( minus ) then number = '−' .. number end
return number;
end
function wd.getLabel ( id )
if ( id == nil or id == "" or id == "self" ) then
if ( wdEntityId.hasID ) then
id = wdEntityId.id
else
return {
["label"] = '',
["errCode"] = 2,
["errMsg"] = cfgI18["getLabel"]["2"]
}
end
end
local result = {}
local label = mw.wikibase.label ( id )
if ( label ~= nil ) then
result = {
["label"] = label,
["errCode"] = 1,
["errMsg"] = cfgI18["getLabel"]["1"]
}
else
result = {
["label"] = "",
["errCode"] = 2,
["errMsg"] = cfgI18["getLabel"]["2"]
}
end
return result
end
function wd.getLabelLang ( id, lang )
if ( id == nil or id == "" or id == "self" ) then
if ( wdEntityId.hasID ) then
id = wdEntityId.id
else
return {
["label"] = "",
["errCode"] = 2,
["errMsg"] = cfgI18["getLabelLang"]["2"]
}
end
end
local result = {}
local entityLabel = mw.wikibase.getLabelByLang( id, lang )
if ( entityLabel ~= nil ) then
result = {
["label"] = entityLabel,
["errCode"] = 1,
["errMsg"] = cfgI18["getLabelLang"]["1"]
}
else
result = {
["label"] = "",
["errCode"] = 0,
["errMsg"] = cfgI18["getLabelLang"]["0"]
}
end
return result
end
function wd.getSiteLink ( id, wiki )
if ( wiki == nil ) then wiki = 'dewikivoyage' end
if ( id == nil or id == "" or id == "self" ) then
if ( wdEntityId.hasID ) then
id = wdEntityId.id
else
return {
["sitelink"] = '',
["errCode"] = 2,
["errMsg"] = cfgI18["getSiteLink"]["2"]
}
end
end
local result = {}
local sitelink = mw.wikibase.getSitelink ( id, wiki )
if ( sitelink == nil ) then
result = {
["sitelink"] = '',
["errCode"] = 0,
["errMsg"] = cfgI18["getSiteLink"]["0"]
}
else
result = {
["sitelink"] = sitelink,
["errCode"] = 1,
["errMsg"] = cfgI18["getSiteLink"]["1"]
}
end
return result
end
-- zählt die Einträge einer Eigenschaft
function wd.getPropertyCount ( claim )
return #claim
end
function wd.getBestStatement ( id, property )
if ( id == nil or id == "" or id == "self" ) then
if ( wdEntityId.hasID ) then
id = wdEntityId.id
else
return {
["statement"] = {},
["errCode"] = 2,
["errMsg"] = cfgI18["getStatement"]["2"],
["count"] = 0
}
end
end
local result = {}
local statement = mw.wikibase.getBestStatements( id, property )
if ( next(statement) == nil ) then
result = {
["statement"] = {},
["errCode"] = 0,
["errMsg"] = cfgI18["getStatement"]["0"],
["count"] = 0
}
else
result = {
["statement"] = statement,
["errCode"] = 1,
["errMsg"] = cfgI18["getStatement"]["1"],
["count"] = wd.getPropertyCount ( statement )
}
end
return result
end
function wd.getStatementAll ( id, property )
if ( id == nil or id == "" or id == "self" ) then
if ( wdEntityId.hasID ) then
id = wdEntityId.id
else
return {
["statement"] = {},
["errCode"] = 2,
["errMsg"] = cfgI18["getStatement"]["2"],
["count"] = 0
}
end
end
local result = {}
local statement = mw.wikibase.getAllStatements( id, property )
if ( next(statement) == nil ) then
result = {
["statement"] = {},
["errCode"] = 0,
["errMsg"] = cfgI18["getStatement"]["0"],
["count"] = 0
}
else
result = {
["statement"] = statement,
["errCode"] = 1,
["errMsg"] = cfgI18["getStatement"]["1"],
["count"] = wd.getPropertyCount ( statement )
}
end
return result
end
function wd.getPlainWikidataId (id)
if (( id == nil or id == "" or id == "self" ) and wdEntityId.hasID) then
return wdEntityId.id
else
return id
end
end
function wd.getWikidataLink (id, property)
local uri = 'wikidata:' .. wd.getPlainWikidataId(id)
if (property ~= nil) then
uri = uri .. '#' .. property
end
return uri
end
function wd.Entity ()
return wdEntityId
end
function wd.EntityId ()
return wdEntityId.id
end
function wd.hasEntity ()
return wdEntityId.hasID
end
function wd.EntityIdErrCode ()
return wdEntityId.errCode
end
function wd.EntityIdErrText ()
return wdEntityId.errMsg
end
function wd.Label ()
return wd.getLabel().label
end
function wd.getQualifier ( property, qualifier, formatting, delimiter )
local formatString = formatting or ''
local delimiterString = delimiter or ','
local result = {
["errCode"] = 0,
["errText"] = '',
["qualifier"] = ''
}
local wdValue
if property.qualifiers ~= nil then
if property.qualifiers[qualifier] ~= nil then
local out = {}
for k,v in pairs(property.qualifiers[qualifier]) do
if ( v.datavalue.type == 'time' ) then
wdValue = v.datavalue.value.time
-- Workaround für Timestamps, die nur ein Jahr repräsentieren
wdValue = mw.ustring.gsub ( wdValue, '%-00%-00T00:00:00Z', '-01-01T00:00:00Z' )
if ( formatString ~= '' ) then
wdValue = lang:formatDate ( formatString, wdValue )
end
out[#out + 1] = wdValue
end
if ( v.datavalue.type == 'wikibase-entityid' ) then
wdValue = v.datavalue.value.id
out[#out + 1] = wdValue
end
end
result.errCode = 1
result.errText = cfgI18["getQualifier"]["1"]
result.qualifier = table.concat(out, delimiterString)
else
result.errText = cfgI18["getQualifier"]["0"]
end
else
result.errText = cfgI18["getQualifier"]["0"]
end
return result
end
function wd.getLangQualifier ( property )
local result = ''
if property.qualifiers ~= nil then
if property.qualifiers.P407 ~= nil then
if property.qualifiers.P407[1] ~= nil then
if property.qualifiers.P407[1].datavalue ~= nil then
if property.qualifiers.P407[1].datavalue.value ~= nil then
if property.qualifiers.P407[1].datavalue.value.id ~= nil then
local langID = property.qualifiers.P407[1].datavalue.value.id
result = languages.id2code[langID] or 'no_lang'
if languages.id2code[langID] == nil then
wdErrCategory = wdErrCategory .. '[[Kategorie:Wikidata:Unbekannter Sprachcode]]'
end
else
result = 'no_lang'
end
else
result = 'no_lang'
end
else
result = 'no_lang'
end
else
result = 'no_lang'
end
else
result = 'no_lang'
end
else
result = 'no_lang'
end
return result
end
function wd.getProperty ( claim, formatting, showRanking, label, parameters )
if ( claim[1] ~= nil ) then
if ( claim[1].mainsnak.snaktype == 'novalue' ) then return '' end
local wdValue = ''
local delimiter = cfgDelimiters[claim[1].mainsnak.property]
if ( delimiter == nil ) then delimiter = cfgDelimiters["default"] end
if ( formatting == nil ) then formatting = 'default' end
local formatString = cfgFormats[formatting] or cfgFormats["default"]
local formatStringParameters = mw.ustring.match ( formatString, '//.-#' )
if ( formatStringParameters ~= nil ) then
formatString = string.sub ( formatString, 1 , string.find ( formatString, formatStringParameters ) - 1 ) .. '#'
end
local qualifierParameters = mw.ustring.match ( formatString, '#QUALIFIER:.-#' ) or ''
local qualifierParameter = mw.ustring.gsub( qualifierParameters, '#QUALIFIER:(.-):(.-)#', '%1' ) or ''
local qualifierFormat = mw.ustring.gsub( qualifierParameters, '#QUALIFIER:(.-):(.-)#', '%2' ) or ''
local qualifierResult = {}
if ( showRanking == nil ) then showRanking = false end
if ( label == nil ) then label = wd.getLabel().label end
local out = {}
if ( claim[1].mainsnak.datatype == 'wikibase-item' ) then
for k,v in pairs ( claim ) do
wdValue = wd.getLabel( v.mainsnak.datavalue.value.id ).label
if ( wdValue == '' ) then
wdValue = wd.getLabelLang( v.mainsnak.datavalue.value.id, 'en' ).label
end
if ( formatStringParameters ~= nil ) then
local tmpFormatStringParameters = string.sub ( formatStringParameters, 3 )
if ( string.sub ( tmpFormatStringParameters, 1, 9 ) == 'sitelink:' ) then
local interwiki = string.sub ( tmpFormatStringParameters, 10 )
interwiki = mw.ustring.gsub( interwiki, '#', '' )
if ( interwiki ~= 'no' ) then
local Link = wd.getSiteLink (v.mainsnak.datavalue.value.id, interwiki )
if ( Link.errCode == 1 ) then
if ( interwiki == 'dewiki' ) then
wdValue = '[[w:' .. Link.sitelink .. '|' .. wdValue .. ']]'
elseif ( interwiki == 'dewikivoyage' ) then
wdValue = '[[' .. Link.sitelink .. '|' .. Link.sitelink:gsub ( '%(.*%)', '' ) .. ']]'
end
end
end
end
else
local deLink = wd.getSiteLink ( v.mainsnak.datavalue.value.id )
if ( deLink.errCode == 1 ) then wdValue = '[[' .. deLink.sitelink .. '|' .. wdValue .. ']]' end
end
wdValue = mw.ustring.gsub ( mw.ustring.gsub ( mw.ustring.gsub ( formatString, '#ID#', v.mainsnak.datavalue.value.id ), '#LABEL#', label ), '#PROPERTY#', wdValue )
if showRanking then
out[#out + 1] = '<span class="wd-rank-' .. v.rank .. '">' .. wdValue .. '</span>'
else
out[#out + 1] = wdValue
end
end
elseif ( claim[1].mainsnak.datatype == 'commonsMedia' ) then
for k,v in pairs ( claim ) do
wdValue = v.mainsnak.datavalue.value
wdValue = mw.ustring.gsub ( formatString, '#PROPERTY#', wdValue )
out[#out + 1] = wdValue
end
elseif ( claim[1].mainsnak.datatype == 'quantity' ) then
for k,v in pairs ( claim ) do
if v.mainsnak.datavalue then
wdValue = tostring ( tonumber ( v.mainsnak.datavalue.value.amount ) )
wdValue = mw.ustring.gsub ( mw.ustring.gsub ( formatString, '#FORMAT:T#', wd.formatNumberT ( wdValue ) ), '#PROPERTY#', wdValue )
if ( qualifierParameters ~= '' ) then
qualifierResult = wd.getQualifier ( v, qualifierParameter, qualifierFormat )
wdValue = mw.ustring.gsub ( wdValue, qualifierParameters, qualifierResult.qualifier )
end
local unit = cfgUnits[v.mainsnak.datavalue.value.unit] or ''
wdValue = mw.ustring.gsub ( wdValue, '#UNIT#', unit )
if showRanking then
out[#out + 1] = '<span class="wd-rank-' .. v.rank .. '">' .. wdValue .. '</span>'
else
out[#out + 1] = wdValue
end
end
end
elseif ( claim[1].mainsnak.datatype == 'globe-coordinate' ) then
local lat = ''
local long = ''
local precision = ''
for k,v in pairs ( claim ) do
lat = tonumber ( v.mainsnak.datavalue.value.latitude )
long = tonumber ( v.mainsnak.datavalue.value.longitude )
precision = tonumber ( v.mainsnak.datavalue.value.precision )
wdValue = mw.ustring.gsub ( mw.ustring.gsub ( mw.ustring.gsub ( formatString, '#LAT#', lat ), '#LONG#', long ), '#PRECISION#', precision )
if showRanking then
out[#out + 1] = '<span class="wd-rank-' .. v.rank .. '">' .. wdValue .. '</span>'
else
out[#out + 1] = wdValue
end
end
elseif ( claim[1].mainsnak.datatype == 'url' ) then
if ( claim[1].mainsnak.datavalue ~= nil ) then
local qualifierLang = mw.ustring.match ( formatString, '#PROPERTY:LANG:.-#' ) or ''
local qualifierLangPlus = mw.ustring.match ( formatString, '#PROPERTY:LANG%+:.-#' ) or ''
if ( qualifierLang ~= '' ) then
local qLang = string.lower ( mw.ustring.gsub( qualifierLang, '#PROPERTY:LANG:(.-)#', '%1' ) ) or ''
local urlList = {}
local langCode = ''
for k,v in pairs ( claim ) do
langCode = wd.getLangQualifier(v)
urlList[langCode] = mw.ustring.gsub ( formatString, '#PROPERTY:LANG:(.-)#', v.mainsnak.datavalue.value )
if ( ( langCode ~= qLang ) and ( langCode ~= 'en' ) and ( langCode ~= 'no_lang' ) ) then
urlList['xxx'] = mw.ustring.gsub ( formatString, '#PROPERTY:LANG:(.-)#', v.mainsnak.datavalue.value )
end
end
out[#out + 1] = urlList[qLang] or urlList['en'] or urlList['xxx'] or urlList['no_lang']
elseif ( qualifierLangPlus ~= '' ) then
local qLang = string.lower ( mw.ustring.gsub( qualifierLangPlus, '#PROPERTY:LANG%+:(.-)#', '%1' ) ) or ''
local urlList = {}
local langCode = ''
for k,v in pairs ( claim ) do
langCode = wd.getLangQualifier(v)
if ( ( langCode == 'no_lang' ) or ( langCode == qLang ) ) then
urlList[langCode] = mw.ustring.gsub ( formatString, '#PROPERTY:LANG%+:(.-)#', v.mainsnak.datavalue.value )
else
urlList[langCode] = mw.ustring.gsub ( formatString, '#PROPERTY:LANG%+:(.-)#', v.mainsnak.datavalue.value ) .. ' (' .. langCode .. ')'
if ( ( langCode ~= qLang ) and ( langCode ~= 'en' ) ) then
urlList['xxx'] = mw.ustring.gsub ( formatString, '#PROPERTY:LANG%+:(.-)#', v.mainsnak.datavalue.value ) .. ' (' .. langCode .. ')'
end
end
end
out[#out + 1] = urlList[qLang] or urlList['en'] or urlList['xxx'] or urlList['no_lang']
else
for k,v in pairs ( claim ) do
out[#out + 1] = mw.ustring.gsub ( mw.ustring.gsub ( mw.ustring.gsub ( formatString, '#PROPERTY#', v.mainsnak.datavalue.value ), '#PROPERTY_NO_HTTP#', v.mainsnak.datavalue.value:gsub ( 'https?://', '' ) ), '#LABEL#', label )
end
end
else
out[#out + 1] = '<em>Wert auf Wikidata fehlt.</em>'
end
elseif ( claim[1].mainsnak.datatype == 'string' or claim[1].mainsnak.datatype == 'external-id' ) then
for k,v in pairs ( claim ) do
out[#out + 1] = mw.ustring.gsub ( formatString, '#PROPERTY#', v.mainsnak.datavalue.value )
end
end
local propertyValue = table.concat(out, delimiter)
if ( parameters ~= nil ) then
for k,v in pairs ( parameters ) do
propertyValue = mw.ustring.gsub ( propertyValue , '#PARAMETER' .. k .. '#', v )
end
end
return propertyValue
else
return ''
end
end
-- Funktionen für spezielle Properties zur Verwendung in anderen Modulen
function wd.getDomain ( id )
local result = wd.getBestStatement ( id, 'P17' )
if ( result.errCode == 1 ) then
if ( result.statement[1].mainsnak.datavalue ~= nil ) then
local country = result.statement[1].mainsnak.datavalue.value["id"]
result = wd.getBestStatement ( country, 'P78' )
if ( result.errCode == 1 ) then
if ( result.statement[1].mainsnak.datavalue ~= nil ) then
return mw.wikibase.label ( result.statement[1].mainsnak.datavalue.value["id"] ) or ''
else
return ''
end
else
return ''
end
else
return ''
end
else
return ''
end
end
function wd.getCoordinates ( id )
local item = wd.getBestStatement ( id, 'P625' )
local result = {
["errCode"] = 0,
["lat"] = 0,
["long"] = 0,
["precision"] = 0
}
result.errCode = item.errCode
if ( item.errCode == 1 ) then
result.lat = tonumber ( item.statement[1].mainsnak.datavalue.value.latitude )
result.long = tonumber ( item.statement[1].mainsnak.datavalue.value.longitude )
result.precision = tonumber ( item.statement[1].mainsnak.datavalue.value.precision )
end
return result
end
function wd.getProvince ( id )
local newSearch = true
local provinceID = id
local provinceLabelID = ''
local labelProvince = wd.getLabel().label
local labelProvinceLink = ''
local labelProvinceLabel = ''
local isAn = {}
local result = {
["errCode"] = 0,
["errTxt"] = '',
["errTxtShort"] = '',
["provinceID"] = '',
["provinceCode"] = '',
["province"] = '',
["provinceLink"] = '',
["provinceLabel"] = 'Provinz'
}
local item = wd.getBestStatement ( id, 'P131' )
result.errCode = item.errCode
while newSearch do
if ( item.errCode == 1 and item.statement[1].mainsnak.datavalue ~= nil ) then
provinceID = 'Q' .. item.statement[1].mainsnak.datavalue.value["numeric-id"]
-- Prüfung ob das or irgendwann mal wieder auf das originale Objekt verwiesen wird (Schleife)
if ( provinceID == id ) then
result.errCode = 4
result.errTxt = cfgI18["getProvince"]["4"]
result.errTxtShort = '[[:wikidata:' .. id .. '|' .. labelProvince .. ']] bildet eine Schleife (Selbstreferenz). [[Kategorie:Artikel mit selbstreferenzierenden Verwaltungseinheiten]]'
newSearch = false
else
isAn = wd.getBestStatement ( provinceID, 'P31' )
if ( isAn.errCode == 1 ) then
provinceLabelID = 'Q' .. isAn.statement[1].mainsnak.datavalue.value["numeric-id"]
labelProvince = wd.getLabel ( provinceID ).label
labelProvinceLabel = wd.getLabel ( provinceLabelID ).label
if ( cfgGeography["provinces"][provinceLabelID] ) then
result.errCode = 1
result.errTxt = cfgI18["getProvince"]["1"]
result.provinceID = provinceID
result.province = labelProvince
local itemCode = wd.getBestStatement ( provinceID, 'P300' )
if ( itemCode.errCode == 1 and itemCode.statement[1].mainsnak.datavalue ~= nil ) then
result.provinceCode = wd.getProperty ( itemCode.statement )
end
labelProvinceLink = wd.getSiteLink ( provinceID ).sitelink
if ( labelProvinceLink == '' ) then
result.provinceLink = labelProvince
else
result.provinceLink = '[[' .. labelProvinceLink .. '|' .. mw.ustring.gsub( labelProvinceLink, '%s%(.*%)', '' ) .. ']]'
end
-- derzeit eigenes Label. Wenn Wikidata gewünscht: labelProvinceLabel benutzen
result.provinceLabel = cfgGeography["provinces"][provinceLabelID]
newSearch = false
if ( cfgGeography["countries"][provinceLabelID] ) then
result.errTxtShort = result.errTxtShort .. 'Provinzsuche endet beim Staat[[Kategorie:Artikel mit unbekannter Verwaltungseinheit auf Wikidata]]'
end
else
item = wd.getBestStatement ( provinceID, 'P131' )
end
else
result.errCode = 2
result.errTxt = cfgI18["getProvince"]["2"] .. wd.getLabel ( provinceID ).label
result.errTxtShort = 'Verwaltungseinheit [[:wikidata:' .. provinceID .. '|' .. provinceID .. ']] hat kein <em>ist ein(e)</em>[[Kategorie:Artikel mit unbekannter Verwaltungseinheit auf Wikidata]]'
newSearch = false
end
end
else
if ( provinceID == 'self' ) then provinceID = wd.EntityId() end
result.errCode = 0
result.errTxt = cfgI18["getProvince"]["0"]
result.errTxtShort = '[[:wikidata:' .. provinceID .. '|' .. labelProvince .. ']] hat keine übergeordnete Region.[[Kategorie:Artikel ohne übergeordnete Verwaltungseinheit auf Wikidata]]'
newSearch = false
end
end
return result
end
-- Funktionen zur Verwendung in Vorlagen
function wd.LabelByID ( frame )
local display = ''
local errorStr = ''
local id = wdGetParameter ( frame, cfgParams["LabelByID"], "id" )
local result = wd.getLabel(id)
display = result.label
if ( result.errCode ~= 1 ) then
errorStr = errorStr .. check._error ( 'Funktion <span style="font-weight: bold; font-style:italic">LabelByID</span>: ' .. result.errMsg .. "ID: " .. id, 'Wikidata2' )
end
return errorStr .. check._testParams ( frame:getParent().args, cfgParams["LabelByID"], 'Wikidata2', 'lower' ) .. display
end
function wd.LabelLang ( frame )
local display = ''
local lang= wdGetParameter ( frame, cfgParams["LabelLang"], "lang" )
local result = wd.getLabelLang ( 'self', lang )
if ( result.label ~= nil ) then
display = result.label
end
return check._testParams ( frame:getParent().args, cfgParams["LabelLang"], "Wikidata2", 'lower' ) .. display
end
function wd.LabelLangByID ( frame )
local display = ''
local id= wdGetParameter ( frame, cfgParams["LabelLang"], "id" )
local lang= wdGetParameter ( frame, cfgParams["LabelLang"], "lang" )
local result = wd.getLabelLang ( id, lang )
if ( result.label ~= nil ) then
display = result.label
end
return check._testParams ( frame:getParent().args, cfgParams["LabelLangByID"], 'Wikidata2', 'lower' ) .. display
end
function wd.LabelLangByIDRaw ( id, lang )
return wd.getLabelLang ( id, lang )
end
function wd.siteLink ( frame )
local display = ''
local id = wdGetParameter ( frame, cfgParams["siteLink"], "id" )
local wiki= wdGetParameter ( frame, cfgParams["siteLink"], "wiki" )
local result = wd.getSiteLink ( id, wiki )
if ( result.sitelink ~= nil ) then
display = result.sitelink
end
return check._testParams ( frame:getParent().args, cfgParams["siteLink"], "Wikidata2", 'lower' ) .. display
end
function wd.dumpEntity ( frame )
local vd = require('Modul:VarDump')
local display = ''
local id = wdGetParameter ( frame, cfgParams["dumpEntity"], "id" )
local property = mw.ustring.gsub ( wdGetParameter ( frame, cfgParams["dumpEntity"], "p" ), 'p', 'P' )
if ( property == '' ) then
display = display .. vd.dump ( mw.wikibase.getEntityObject(id) )
else
display = display .. vd.dump ( wd.getStatementAll ( id, property ).statement )
end
return check._testParams ( frame:getParent().args, cfgParams["dumpEntity"], "Wikidata2", 'lower' ) .. display
end
function wd.getValue ( frame )
local errorStr = ''
local display = ''
local category = ''
local result = {}
local id = wdGetParameter ( frame, cfgParams["getValue"], "id" )
if ( id == 'self' ) then id = wdEntityId.id end
local property = mw.ustring.gsub ( wdGetParameter ( frame, cfgParams["getValue"], "p" ), 'p', 'P' )
local category = '[[Kategorie:Seiten, die die Wikidata-Eigenschaft '.. property .. ' benutzen]]'
local ranking = wdGetParameter ( frame, cfgParams["getValue"], "ranking" )
local formatting = wdGetParameter ( frame, cfgParams["getValue"], "format" )
if (formatting == '' ) then formatting = property end
local showRanking = wdGetParameter ( frame, cfgParams["getValue"], "showRanking" )
if ( ranking == 'all' ) then
result = wd.getStatementAll ( id, property )
else
result = wd.getBestStatement ( id, property )
end
if ( result.errCode == 1 ) then
display = display .. wd.getProperty ( result.statement, formatting, yesno ( showRanking ), wd.getLabel(id).label )
else
errorStr = errorStr .. check._error ( 'FEHLER (Code: ' .. result.errCode .. '): ' .. result.errMsg .. '(ID= ' .. id .. ', Property= ' .. property .. ')', 'Wikidata2' )
if ( result.errCode == 2 ) then display = display .. '[[Kategorie:Artikel ohne Objekt auf Wikidata]]' end
end
return category .. errorStr .. check._testParams ( frame:getParent().args, cfgParams["getValue"], 'Wikidata2', 'lower' ) .. display
end
function wd.getPOIType ( frame )
local errorStr = ''
local display = ''
local poiType = ''
local result = {}
local id = wdGetParameter ( frame, cfgParams["getValue"], "id" )
result = wd.getBestStatement ( id, 'P31' )
if ( result.errCode == 0 ) then
-- Property nicht befüllt > Standard
display = display .. cfgPOITypes["default"]
elseif ( result.errCode == 1 ) then
-- was gefunden, ersten Eintrag holen, wenn nichts brauchbares da, dann Standard
poiType = cfgPOITypes["Q" .. result.statement[1].mainsnak.datavalue.value["numeric-id"]]
if ( poiType == nil ) then poiType = cfgPOITypes["default"] end
display = display .. poiType
else
-- kein Objekt mit der ID vorhanden: Fehlermeldung und Standardtyp
display = display .. cfgPOITypes["default"]
errorStr = errorStr .. check._error ( 'FEHLER (Code: ' .. result.errCode .. '): ' .. result.errMsg .. '(ID= ' .. id .. ')', 'Wikidata2' ) .. '[[Kategorie:Artikel ohne Objekt auf Wikidata]]'
end
return errorStr .. check._testParams ( frame:getParent().args, cfgParams["getPOIType"], 'Wikidata2', 'lower' ) .. display
end
function wd.getPOITypeDefault ()
return cfgPOITypes["default"]
end
function wd.getOfficialWebsite ( frame )
local display = ''
local category = ''
local result = {}
local text = wdGetParameter ( frame, cfgParams["getValue"], "text" ) or ''
local id = wdGetParameter ( frame, cfgParams["getValue"], "id" ) or wdEntityId
local vd = require('Modul:VarDump')
result = wd.getBestStatement ( id, 'P856' )
local i
local url
local statements
if ( result.errCode == 0 ) then
-- Property nicht befüllt > Standard
display = 'Eine offizielle Webseite ist nicht bekannt.<span class="wd-tools-message-inline"> Bitte auf [[:wikidata:' .. wdEntityId.id .. '|Wikidata]] nachtragen.</span>[[Kategorie:Artikel ohne offizielle Webseite auf Wikidata]]'
elseif ( result.errCode == 1 ) then
-- was gefunden, ersten Eintrag holen, wenn nichts brauchbares da, dann Standard
-- display = display .. wd.getProperty ( result.statement, 'P856-link+site' )
-- urls can contain percent signs
category = category .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P856 benutzen]]'
display = wd.getProperty ( result.statement, 'P856-lang+:de' )
if ( text ~= '' ) then
display = '<span class="wikidata-content">' .. display .. '</span>' .. ' – ' .. text
else
display = '<span class="wikidata-content">' .. display .. '</span>' .. ' – Offizielle Webseite von ' .. wd.getLabel(id).label
end
else
-- kein Objekt mit der ID vorhanden: Fehlermeldung und Standardtyp
display = 'Eine offizielle Webseite ist nicht bekannt.<span class="wd-tools-message-inline"> Objekt bitte auf [[:wikidata:Wikidata:Main Page|Wikidata]] nachtragen.</span>[[Kategorie:Artikel ohne Objekt auf Wikidata]]'
end
return category .. wdErrCategory .. check._testParams ( frame:getParent().args, cfgParams["getOfficialWebsite"], 'Wikidata2', 'lower' ) .. display
end
return wd