Modul:GetP36

![]() | 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 GetP36/Test und die Anwendung auf der Spielwiese getestet werden, da wiederholte Trial-and-Error-Edits die Resourcen stark belasten können. |
![]() | Dieses Modul benutzt die Wikidata-Eigenschaft:
|
Funktion
Das Modul bietet einige Funktionen, um die Wikidata-Eigenschaft Hauptstadt (P36) eines Objektes abzurufen. Es werden derzeit die aktuellen Hauptstädte abgerufen. Ein träge mit einem angegebenen Endzeitpunkt werden herausgefiltert. Es kann sowohl in anderen Modulen als auch in Vorlagen verwendet werden. Folgende Funktionen sind implementiert:
getCapitals
getCapitals ( id, delimiter )
- Aufruf in einer Vorlage:
{{#invoke:GetP36|getCapitals|id|delimiter}}
- Aufruf in einem Modul:
p36.GetP36().getCapitals(id,delimiter)
- Funktion: Liefert die Hauptstadt, Angabe des Typs, wenn vorhanden.
- Aufruf in einer Vorlage:
Bei der Verwendung in anderen Modulen muss am Skriptanfang noch ein p36 = require( 'Module:GetP36' )
eingefügt werden.
Die Funktion arbeitet mit den folgenden anonymen Parametern
|id=
Wikidata-ID des Objektes, kann leer bleiben, wenn der eigene Artikel abgefragt werden soll.|delimiter=
Mehrere Hauptstädte werden durch die beim Delimiter angegebene Zeichenkette getrennt. Ist nichts angegeben, wird ein Komma, gefolgt von einem ungeschützten Leerzeichen verwendet. Möchte man die Funktion in Vorlagen und Artikeln benutzen und benötigt ein Leerzeichen, ist dort 
anzugeben, da der Wiki-Parser Leerzeichen einfach entfernt.
Beispiele:
{{#invoke:GetP36|getCapitals|Q1208}}
– Brandenburg: Potsdam{{#invoke:GetP36|getCapitals|Q54157| - }}
– Lebus: Gorzów Wielkopolski - Zielona Góra{{#invoke:GetP36|getCapitals|Q258}}
– Südafrika: Pretoria (Exekutive), Bloemfontein (Judikative), Kapstadt (Legislative)
getCapitalsQuickbar
Südafrika | |
Hauptstadt | Pretoria (Exekutive) Bloemfontein (Judikative) Kapstadt (Legislative) |
---|
getCapitalsQuickbar ( id, wikiValue )
- Aufruf in einer Vorlage:
{{#invoke:GetP36|getCapitalsQuickbar |id|wikiValue}}
- Aufruf in einem Modul:
p36.GetP36().getCapitalsQuickbar (id,wikiValue)
- Funktion: Liefert die Hauptstadt/Hauptstädte mit deren Typ als Tabellenzeile zur Einbindung in einer Infobox (Quickbar). Mehrere Werte werden durch einen Zeilenumbruch mit einem
<br />
getrennt. Diese Funktion wird im Regelfall nur in anderen Modulen, speziell denen für die Quickbars, benutzt. Der Einsatz in individuell zusammengestellten Infoboxen direkt in Artikeln ist aber trotzdem möglich.
- Aufruf in einer Vorlage:
Dieser Funktion kann auch ein „Sollwert“ für die Ausgabe übergeben werden. Das bewirkt eine Ausgabe dieses Wertes und keine Ausgabe des auf Wikidata gespeicherten Wertes. Ungeachet dessen wird der übergebene Wert mit Wikidata verglichen. Das Ergebnis des Abgleich finden sich in einer Wartungskategorie sowie in zusätzlichen CSS-Klassen. Für den Leser gibt es ein zusätzliches Tooltip mit dem Ergebnis des Vergleichs und dem Wert von Wikidata.
Ein lokaler Wert kann auch hier angegeben werden und wird auch mit Wikidata verglichen. Eckige Klammern werden vor dem Vergleich gegebenenfalls entfernt. Allerdings wird der Wert für den Vergleich als ein Wert betrachtet. Identität mit Wikidata wird erkannt, wenn der Wert mit einer der Hauptstädte auf Wikidata übereinstimmt, Abweichung, wenn die örtliche Angabe gar nicht auf Wikidata erfasst ist.
Wartungskategorien
- Artikel ohne Hauptstadt auf Wikidata
- Artikel mit identischer Hauptstadt auf Wikidata
- Artikel mit abweichender Hauptstadt auf Wikidata
HTML bei Nutzung in den Quickbars
Folgendes HTML wird erzeugt:
<!-- Eintrag für die Zeile -->
<tr class="voy-qb-item voy-qb-item-capital">
<!-- Eintrag für die erste Spalte -->
<th class="voy-qb-item-key">Hauptstadt</th>
<!-- Je nach Auswertung der Daten wird eine der folgenden Zellen ausgegeben -->
<!-- Ein Wikidata-Wert kann nicht ermittelt werden -->
<td class="voy-qb-item-value1 voy-qb-item-value-nowikidata" data-wikidata-id="Wikidata-ID, wenn vorhanden" data-wikidata-value="Hauptstadt" title="Tooltip-Info">Hauptstadt</td>
<!-- Wikidata-Wert und lokaler Wert sind identisch -->
<td class="voy-qb-item-value1 voy-qb-item-value-wikidata-equal voy-wikidata-content" data-wikidata-id="Wikidata-ID" data-wikidata-value="Hauptstadt" title="Tooltip-Info">Hauptstadt</td>
<!-- Wikidata-Wert und lokaler Wert unterscheiden sich -->
<td class="voy-qb-item-value1 voy-qb-item-value-wikidata-noequal voy-wikidata-content" data-wikidata-id="Wikidata-ID" data-wikidata-value="Hauptstadt" title="Tooltip-Info">Hauptstadt</td>
<!-- alle anderen Fälle -->
<td class="voy-qb-item-value1 voy-wikidata-content" data-wikidata-id="Wikidata-ID, wenn vorhanden" data-wikidata-value="Hauptstadt">Hauptstadt</td>
</tr>
CSS-Klassen bei Nutzung in den Quickbars
Jedes einzelne Informationsfeld der Quickbar lässt sich über CSS individuell gestalten, entweder zentral über die Systemdatei Mediawiki:common.css oder über benutzerspezifische Einstellungen Benutzer:<Dein Name>/common.css. Für Programmierer ist es damit auch möglich, an jedem Feld per Javascript Änderungen vorzunehmen und Werkzeuge zu programmieren.
Die gesamte Quickbar (<table>...</table>
) besitzt drei Klassen.
voy-qb
– Immer vorhanden ist die Klasseqb
. Über diese kann man jede Infobox beeinflussen.voy-qb-ort
- Alle Orts-Quickbars, die direkt oder indirekt über diese Vorlage eingebunden sind, besitzen diese Klassevoy-qb-<top-level-domain>
– Zusätzlich gibt es eine landesspezifische Klasse, die die Top-Level-Domain beinhaltet. Alle Artikel über Deutschland haben in ihrer Quickbar somit zusätzlich die Klassevoy-qb-de
hinterlegt. Lässt sich keine TLD ermitteln, heißt die Klasseqb-unknown-tld
.
Jede Zeile einer Quickbar besitzt eine allgemeine und eine eigene Klasse.
voy-qb-item
– Klasse, die alle Zeilen einer Infobox-Tabelle besitzen.
voy-qb-item-capital
– Diese Zeile zeigt die Hauptstadt an.
Jede Spalte einer Zeile der Quickbar (<tr>...</tr>
) hat eine individuelle Klasse, über die die Formatierungen angewendet werden können. Zusätzlich haben alle Spalten jeder Zeile eine individuelle Klasse:
voy-qb-item-key
– Erste Spalte mit der Eigenschaftsbezeichnung (standardmäßig fett geschrieben)voy-qb-item-value1
– Erste (und in der jetzigen Quickbar Ort im Regelfall einzige) Spalte mit einem Wert.voy-qb-item-value2
– weitere Spaltevoy-qb-item-value3
– weitere Spalte
Bei Bildern gibt es nur eine Tabellenzelle mit einem Div-Tag
voy-qb-item-image
– Klasse des<div>...</div>
. Die Positionierung der Bilder erfolgt dann über Flexboxen.
Die value-Spalten haben noch eine oder mehrere Klassen, wenn Daten aus Wikidata bezogen wurden.
voy-wikidata-content
– Zusätzliche Klasse, wenn die angezeigten Daten aus Wikidata stammen. Diese Klasse ist nicht auf die Quickbars beschränkt und kann überall im Artikel auftauchen.voy-qb-item-value-nowikidata
– Über Wikidata konnten keine Daten ermittelt werden. Es ist kein Objekt vorhanden, oder die gewünschte Information ist im Objekt nicht verfügbar.voy-qb-item-value-wikidata-equal
– Es gibt die Information auf Wikidata und es wirde ein lokaler Wert in der Quickbar angegeben (der auch angezeigt wird). Diese Klasse zeigt an, dass beide Werte identisch sind.voy-qb-item-value-wikidata-noequal
– Es gibt die Information auf Wikidata und es wirde ein lokaler Wert in der Quickbar angegeben (der auch angezeigt wird). Diese Klasse zeigt an, dass sich beide Werte unterscheiden.
Beispiele:
.voy-qb-item-population .voy-qb-item-value1 { color:blue; font-style:italic; }
– Die Einwohnerzahl wird blau und kursiv dargestellt..voy-qb-item-value-wikidata-equal { color:green; font-weight:bold; }
– Einträge werden grün und fett dargestellt, wenn sie lokal angegeben wurden und identisch mit Wikidata sind..voy-qb-item-value-wikidata-noequal { color:red; font-weight:bold; }
– Einträge werden rot und fett dargestellt, wenn sie lokal angegeben wurden sich von Wikidata unterscheiden.
Siehe auch:
- Wikivoyage:CSS-Klassen – Dokumentation der CSS-Klassen auf Wikivoyage
Verwendung in Vorlagen
Das Modul wird von folgenden Vorlagen verwendet:
- {{Quickbar Land}} – Quickbar für Länder
- {{Quickbar Region}} – Quickbar für Regionen
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:
- Quickbar Land • Quickbar Region
- Modul benötigt das Modul GetP36 – Wartungskategorie, in der nochmals alle Module gelistet sind, die von diesem Modul abhängig sind.
Benötigte weitere Module
Dieses Modul benötigt folgende weitere Module: Yesno
Verwandte Module
- GetP856 – Liefert die Offizielle Webseite eines Objektes.
- GetNumber – Liefert numerische Eigenschaften eines Objektes, wie z. B. Fläche, geografische Höhe und Einwohnerzahl von Regionen bzw. Orten.
- GetString – Liefert alphanumerische Eigenschaften eines Objektes (Datentypen string und monolingualtext)
- GetImage – Liefert Dateinamen von Bildateien.
- GetItem – Liefert Eigenschaften, die als Wikidata-Objekt erfasst sind. Das Ergebnis können Links auf Wikivoyage oder Wikipedia-Artikel sein.
- GetProvince – Ermittelt rekursiv die erste Verwaltungsstufe eines Ortes (Bundesland, Provinz usw.).
Trackingkategorien und Spezialseiten
- Seiten mit Skriptfehlern – Listet Seiten auf, bei denen Lua-Skripte Fehler verursachen.
- Gewünschte Kategorien – Gewünschte Kategorien. Hier tauche eine neue Kategorie der Art Seiten, die die Wikidata-Eigenschaft Pxxx benutzen auf, wenn eine bisher nicht genutzte Eigenschaft irgendwo verwendet wird.
- Die obige Dokumentation wurde aus der Seite Modul:GetP36/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
--[=[ GetP36 2023-02-07
* local getCapitalsWithType() (internal use)
* getCapitals()
* getCapitalsQuickbar()
]=]
local yesno = require( 'Modul:Yesno' )
local GetP36 = {}
-- categories for data evaluation
local wikidataCat = {
["equalData"] = '[[Kategorie:Artikel mit identischer Hauptstadt auf Wikidata]]',
["noEqualData"] = '[[Kategorie:Artikel mit abweichender Hauptstadt auf Wikidata]]',
["noData"] = '[[Kategorie:Artikel ohne Hauptstadt auf Wikidata]]'
}
-- returns the first value that is not nil
-- similar to the SQL function coalesce()
local function coalesce ( value1, value2, value3 )
return value1 or value2 or value3
end
-- getCapitalWithType() -> just for internal use. it delivers the capital as table
-- including the type of capital, if provided
local getCapitalsWithType = function ( id )
-- local variables
-- ID of the item
-- Determined, if not provided
local localID = id or mw.wikibase.getEntityIdForCurrentPage() or ''
-- compatibility to existing modules and templates:
-- some use the keyword "self" for using the own entity-ID
if localID == 'self' then
localID = mw.wikibase.getEntityIdForCurrentPage() or ''
end
-- no Wikidata object
if localID == '' then
return {}, ''
end
-- getting the values
local wdStatements = mw.wikibase.getBestStatements( localID, 'P36' )
-- getting the capitals
local capitals = {}
local capitalItem
local capitalItemString = ''
local entryIsValid
-- running through the array and store it in a simple table
for i, entry in ipairs ( wdStatements ) do
if entry.mainsnak.datatype == 'wikibase-item' then
entryIsValid = true
-- validity check
-- check for end time (P582)
-- is one defined, then brak because its an old entry and not valid
if entry.qualifiers ~= nil then
if entry.qualifiers.P582 ~= nil then
entryIsValid = false
end
end
if entryIsValid then
capitalItem = {}
-- get capital and sitelink or label as fallback
capitalItemString = mw.wikibase.getSitelink( entry.mainsnak.datavalue.value.id, 'dewikivoyage' ) or mw.wikibase.getLabel( entry.mainsnak.datavalue.value.id ) or ''
capitalItem.capital = '[[' .. capitalItemString .. ']]'
capitalItem.type = ''
-- getting the type, if given
if entry.qualifiers ~= nil then
if entry.qualifiers.P642 ~= nil then
if entry.qualifiers.P642[1] ~= nil then
if entry.qualifiers.P642[1].datatype == 'wikibase-item' then
capitalItem.type = mw.wikibase.getLabel( entry.qualifiers.P642[1].datavalue.value.id ) or ''
end
end
end
end
-- adding the capital to the list
table.insert( capitals, capitalItem )
end
end
end
-- returning the capitals as well as the Wikidata-ID
return capitals, localID
end
-- getting list of the capitals
-- the delimiter between the capitals is optional
-- standard is comma plus breakable space
-- If you use it in a template, use   for a space because its trimmed out when parsed
GetP36.getCapitals = function ( id, delimiter )
-- string for the list of capitals
local capitalString = ''
-- getting the capitals
local capitalStringTable = getCapitalsWithType ( id )
-- no delimiter in front of the first entry
local capitalDelimiter = ''
for i, entry in ipairs( capitalStringTable ) do
if entry["type"] == '' then
capitalString = capitalString .. capitalDelimiter .. entry["capital"]
else
capitalString = capitalString .. capitalDelimiter .. entry["capital"] .. ' (' .. entry["type"] .. ')'
end
-- setting the delimiter after the first entry
capitalDelimiter = delimiter or ', '
end
-- providing the list of capitals (if determined)
if capitalString == '' then
return ''
else
return capitalString .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P36 benutzen]]'
end
end
-- getting list of the capitals and creating a row for inserting into a quickbar
-- wikidata value comparision with zhe local value is difficult here, because one value is given
-- and wikidata value can contain a list. The local value is taken as a single value and not split by comma etc.
GetP36.getCapitalsQuickbar = function ( id, wikiValue )
-- getting the link with the base function above
local wikidataID
local wikidataCapitals = {}
wikidataCapitals, wikidataID = getCapitalsWithType ( id )
-- if it is taken from wikidata, this variable provides an additional class for: MediaWiki:Gadget-Wikidata-Content.css
-- space is needed becaus its simply added to the existing class string
local wikidataClass = ' voy-wikidata-content'
-- comparing a possibly given value with Wikidata
local category = ''
-- Wikidate comparision tags
-- is Wikidata available
local wikidataAvailable = true
-- is one of the entries equal to the wiki value?
local wikidataOneIsEqual = false
-- are none of the entries equal to the wiki value?
-- starting with false
-- later initialised to true, when local wiki value is given
local wikidataNothingIsEqual = false
-- checking, whether Wikidata value is available
if #wikidataCapitals == 0 then
category = wikidataCat.noData
wikidataClass = ''
wikidataAvailable = false
end
-- processing nil value for wikiValue
if wikiValue == nil then
wikiValue = ''
end
-- wikivalues, that can be interpreted as "TRUE" are removed and Wikidata is used
-- it's used to switch entries on and off in Quickbars
if yesno ( wikiValue, false ) then
wikiValue = ''
end
-- wikivalues, that can be interpreted as "FALSE" suppress the whole row
if not yesno ( wikiValue, true ) then
return ''
end
-- creating the string with capitals
-- used in Table cell
local capitalString = ''
local wikidataString = ''
-- used in data-Attribute
local capitalStringAttr = ''
local capitalDelimiterCell = ''
local capitalDelimiterAttr = ''
-- is a wiki value defined?
if coalesce ( wikiValue, '' ) ~= '' then
local wikiValueWithoutBrackets = wikiValue:gsub("[%[%]]","")
-- initializing with FALSE by default to avoid the "non equal" if Wikidata is empty
-- setting to TRUE if it goes into the loop the first time
-- set to FALSE if one value is equal
wikidataNothingIsEqual = false
-- running through the table and checking the entries
for i, entry in ipairs( wikidataCapitals ) do
-- starting with TRUE by default
-- set to FALSE if one value is equal
if i == 1 then
wikidataNothingIsEqual = true
end
if entry["capital"] == '[[' .. wikiValueWithoutBrackets .. ']]' then
wikidataOneIsEqual = true
wikidataNothingIsEqual = false
end
end
-- setting the categories
if wikidataOneIsEqual then
category = category .. wikidataCat.equalData
end
if wikidataNothingIsEqual then
category = category .. wikidataCat.noEqualData
end
capitalString = wikiValue
else
for i, entry in ipairs( wikidataCapitals ) do
if entry["type"] == '' then
capitalString = capitalString .. capitalDelimiterCell .. entry["capital"]
else
capitalString = capitalString .. capitalDelimiterCell .. entry["capital"] .. ' (' .. entry["type"] .. ')'
end
wikidataString = wikidataString .. capitalDelimiterAttr .. entry["capital"]:gsub('%[',''):gsub('%]','')
capitalDelimiterAttr = capitalDelimiterAttr .. capitalDelimiterAttr .. entry["capital"]
-- setting the delimiter after the first entry
capitalDelimiterCell = '<br />'
capitalDelimiterAttr = '; '
end
end
-- displaying only, if any data available
local trClass = ''
if capitalString == '' then
trClass = ' voy-qb-empty'
end
-- creating the table row
local tr = mw.html.create ( 'tr' )
-- first table cell (heading)
tr:addClass('voy-qb-item voy-qb-item-capital' .. trClass)
:tag('th')
:addClass('voy-qb-item-key')
:wikitext('Hauptstadt')
-- second table cell (capitals)
if not wikidataAvailable then
tr:tag('td')
:addClass( 'voy-qb-item-value1 voy-qb-item-value-nowikidata' .. wikidataClass )
:attr('data-wikidata-id',wikidataID)
:attr('title','Keine Hauptstadt auf Wikidata')
:wikitext( capitalString )
elseif wikidataOneIsEqual then
tr:tag('td')
:addClass( 'voy-qb-item-value1 voy-qb-item-value-wikidata-equal' .. wikidataClass )
:attr('data-wikidata-id',wikidataID)
:attr('data-wikidata-value',wikidataString)
:attr('title','(Eine) Hauptstadt identisch mit Wikidata: ' .. wikiValue )
:wikitext( capitalString )
elseif wikidataNothingIsEqual then
tr:tag('td')
:addClass( 'voy-qb-item-value1 voy-qb-item-value-wikidata-noequal' .. wikidataClass )
:attr('data-wikidata-id',wikidataID)
:attr('data-wikidata-value',wikidataString)
:attr('title','Daten unterschiedlich - Hauptstadt auf Wikidata: ' .. wikiValue)
:wikitext( capitalString )
else
tr:tag('td')
:addClass( 'voy-qb-item-value1' .. wikidataClass )
:attr('data-wikidata-id',wikidataID)
:attr('data-wikidata-value',wikidataString)
:wikitext( capitalString )
end
-- returning the row
return tostring ( tr ) .. category .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P36 benutzen]]'
end
-- Providing template access
local p = {}
function p.getCapitals( frame )
return GetP36.getCapitals( frame.args[ 1 ], frame.args[ 2 ] ) or ""
end
function p.getCapitalsQuickbar( frame )
return GetP36.getCapitalsQuickbar( frame.args[ 1 ], frame.args[ 2 ] ) or ""
end
-- for usage in other modules
-- using it the following way:
--
-- local p36 = require( 'Module:GetP36' )
-- foo = p36.GetP36().getCapitals( id )
function p.GetP36()
return GetP36
end
return p