Dokumentation für das Modul GetP36[Ansicht] [Bearbeiten] [Versionsgeschichte] [Aktualisieren]

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.

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:

getCapitalsQuickbar
Südafrika
HauptstadtPretoria (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.

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

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 Klasse qb. Über diese kann man jede Infobox beeinflussen.
  • voy-qb-ort - Alle Orts-Quickbars, die direkt oder indirekt über diese Vorlage eingebunden sind, besitzen diese Klasse
  • voy-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 Klasse voy-qb-de hinterlegt. Lässt sich keine TLD ermitteln, heißt die Klasse qb-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 Spalte
  • voy-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:

Verwendung in Vorlagen

Das Modul wird von folgenden Vorlagen verwendet:

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:

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.
Hinweise
--[=[ 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 &#32; 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