Modul:Wikidata2

Aus Wikivoyage
Zur Navigation springen Zur Suche springen
Template-info.png Dokumentation für das Modul Wikidata2[Ansicht] [Bearbeiten] [Versionsgeschichte] [Aktualisieren]

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

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 Wikis
  • LabelByID – Liefert die Bezeichnung eines beliebigen Objektes in der Sprache des Wikis
  • LabelLang – 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-truthHöchste Priorität
      • .wd-rank-preferredBevorzugte Priorität
      • .wd-rank-normalNormale Priorität
      • .wd-rank-deprecatedVeraltete 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 Funktion getValue 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 Knotens Claims => 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:

Hinweise
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"]  = ''
	}

	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
				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
		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"] )
				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