Modul:GetP856

Template-info.png Dokumentation für das Modul GetP856[Ansicht] [Bearbeiten] [Versionsgeschichte] [Aktualisieren]

Funktion

Das Modul bietet einige Funktionen, um die Wikidata-Eigenschaft offizielle Website (P856) eines Objektes abzurufen. Es kann sowohl in anderen Modulen als auch in Vorlagen verwendet werden. Folgende Funktionen sind implementiert:

getUrl
  • getUrl(id,lang)
    • Aufruf in einer Vorlage: {{#invoke:GetP856|getUrl|id|lang}}
    • Aufruf in einem Modul: p856.GetP856().getUrl(id,lang)
    • Funktion: Liefert offizielle Webseite eines Objektes als einfache URL.
getUrlAsLinkWithHost
  • getUrlAsLinkWithHost(id,lang)
    • Aufruf in einer Vorlage: {{#invoke:GetP856|getUrlAsLinkWithHost|id|lang}}
    • Aufruf in einem Modul: p856.GetP856().getUrlAsLinkWithHost(id,lang)
    • Funktion: Liefert offizielle Webseite eines Objektes als Wiki-Markup. Als Linktext wird nur die Domain verwendet.
getUrlAsLinkWithHostAndLanguage
  • getUrlAsLinkWithHostAndLanguage(id,lang)
    • Aufruf in einer Vorlage: {{#invoke:GetP856|getUrlAsLinkWithHostAndLanguage|id|lang}}
    • Aufruf in einem Modul: p856.GetP856().getUrlAsLinkWithHostAndLanguage(id,lang)
    • Funktion: Liefert offizielle Webseite eines Objektes als Wiki-Markup. Als Linktext wird nur die Domain verwendet. Zusätzlich wird die Sprache der Webseite angezeigt (derzeit nicht, wenn der erstbeste Eintrag aus der Datenbank geliefert wird, siehe Prierität weiter unten).
getOfficialWebsite
  • getOfficialWebsite(id,lang, message)
    • Aufruf in einer Vorlage: {{#invoke:GetP856|getOfficialWebsite|id|lang|message}}
    • Aufruf in einem Modul: p856.GetP856().getOfficialWebsite(id,lang,message)
    • Funktion: Liefert alles komplett für die Vorlage {{Offizielle Webseite}}

Bei der Verwendung in anderen Modulen muss am Skriptanfang noch ein p856 = require( 'Module:GetP856' ) eingefügt werden.

Die Funktionen arbeiten mit den folgenden anonymen Parametern

  • |id= Wikidata-ID des Objektes, kann leer bleiben, wenn der eigene Artikel abgefragt werden soll.
  • |lang= Sprache der Homepage, ist keine angegeben oder die gesuchte nicht vorhanden, wird nach folgender Priorität abgefragt.
    1. Sprache des Wikis
    2. Englisch
    3. Amtssprache des Landes in dem der Ort des Artikels liegt
    4. Die erste, die von der Datenbank geliefert wird
  • |message= Dieser beschreibende Text wird hinter dem Link zusätzlich angezeigt. Ist ichst angegeben, wird der Standardtext „Offizielle Webseite von XY“ angezeigt, wobei für „XY“ die Bezeichnung aus Wikidata verwendet wird. Je nach Benennung auf Wikidata kann der Standardtext grammatikalisch falsch sein (wenn zum Beispiel das Wort „Provinz“ vorangestellt ist).
getUrlAsLinkWithHostQuickbar
Cottbus
Webseitewww.cottbus.de
  • getUrlAsLinkWithHostQuickbar ( id, wikiValue )
    • Aufruf in einer Vorlage: {{#invoke:GetP856|getUrlAsLinkWithHostQuickbar|id|wikiValue}}
    • Aufruf in einem Modul: p856.GetP856().getUrlAsLinkWithHostQuickbar(id,wikiValue)
    • Funktion: Liefert offizielle Webseite eines Objektes als Tabellenzeile zur Einbindung in einer Infobox (Quickbar). 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.

Folgendes HTML wird erzeugt:

<!-- Eintrag für die Zeile -->
<tr class="voy-qb-item voy-qb-item-website">

   <!-- Eintrag für die erste Spalte -->
   <th class="voy-qb-item-key">Offizielle Webseite</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="URL" title="Tooltip-Info">Offizielle Webseite</th>
   
   <!-- 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="URL" title="Tooltip-Info">Offizielle Webseite</th>
   
   <!-- 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="URL" title="Tooltip-Info">Offizielle Webseite</th>
   
   <!-- alle anderen Fälle -->
   <td class="voy-qb-item-value1 voy-wikidata-content" data-wikidata-id="Wikidata-ID, wenn vorhanden" data-wikidata-value="URL">Offizielle Webseite</th>
   
</tr>

Wartungskategorien:

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-website – Diese Zeile zeigt die offizielle Webseite 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

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 Kalsse 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:

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.

Verwendung in anderen Vorlagen

Dieses Modul wird in folgenden Vorlagen verwendet:

  • {{Offizielle Webseite}} – Die Vorlage erzeugt einen Eintrag mit der/den offiziellen Website(s) des Ortes und garantiert eine einheitliche Darstellung in allen Artikeln. Die Anwendung erfolgt als erster Eintrag im Abschnitt Weblinks eines Artikels.

Verwendete Module

Benötigte weitere Module

Dieses Modul benötigt folgende weitere Module: Wikidata utilities • URLutil • UrlCheck • Languages

Verwandte Module

  • GetP36 – Liefert die Hauptstadt einer Region.
  • GetP1082 – Liefert die Einwohnerzahl eines Ortes.
  • GetNumber – Liefert numerische Eigenschaften eines Objektes, derzeit die Fläche und die geografische Höhe von Regionen bzw. Orten.

Trackingkategorien

Hinweise
--[=[ GetP856 2021-10-16
* local getUrlWithLanguange (internal use)
* getUrl()
* getUrlAsLinkWithHost()
* getUrlAsLinkWithHostAndLanguage()
* getOfficialWebsite()
]=]
local GetP856 = {}

-- importing modules
local wu = require( 'Module:Wikidata utilities' )
local uu = require( 'Module:URLutil' )
local uc = require( 'Module:UrlCheck' )
local lg = require( 'Module:Languages' )

-- categories for data evaluation
local wikidataCat = {
	["equalData"]   = '[[Kategorie:Artikel mit identischer offizieller Webseite auf Wikidata]]',
	["noEqualData"] = '[[Kategorie:Artikel mit abweichender offizieller Webseite auf Wikidata]]',
	["noData"]      = '[[Kategorie:Artikel ohne offizielle Webseite auf Wikidata]]'
}

-- getting the language-ID to a given language code
local function getLngId( lng )
	
	-- checking, whether a code is given
	if not lng or lng == '' then
		return ''
	end

	-- getting the language entry
	local item = lg.lngProps[ lng ]
	
	-- if not got, testing for a hyphen and trying the first part
	if not item then
		local hyphen = lng:find( '-', 1, true )
		if hyphen and hyphen > 1 then
			item = lg.lngProps[ lng:sub( 1, hyphen - 1 ) ]
		end
	end
	
	-- getting the language-ID
	if item then
		item = item.q
	end

	return item or ''
end

-- getUrlWithLanguange() -> just for internal use. it delivers the url to the public functions
-- gets the official URL of an item in the requested langange
-- if more than one language for the website is provided, it follows the priority as stated below
--   the requested language
--   local wiki language (German)
--   Englisch
--   Local language (of the place, thats described in the article)
--   the first entry that's provided
local getUrlWithLanguange = function ( id, lang )

	-- 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
	
	-- requested language by code ( e.g. 'ja' for Japanese)
	-- it is set to Wiki local language, if not provided, 
	local requestedLang = lang or mw.getContentLanguage():getCode()  -- code of the requested language
	local requestedLangID = getLngId ( requestedLang )	             -- ID of the requested language
	local localLang = ''     							             -- local official language
	local localLangID = ''							                 -- ID of the local official language
	
	-- getting the websites
	local ar = {}
	if type( localID ) == 'string' and mw.wikibase.isValidEntityId( localID ) then
		ar = wu.getValuesByQualifier( localID, 'P856', 'P407', 'NO_LANGUAGE' )
	end
	
	-- variable vor the final url
	local url
	
	-- got results? then picking the right one
	if next( ar ) then
		
		-- if no local language or english website available, go back to Wikidata
		-- determining the official language in the country the article's destination belongs to
		if ar[ requestedLangID ] == nil and ar[ 'Q1860' ] == nil then
			
			-- determining the country
			local countryID = wu.getId( localID, 'P17' )
			
			-- determining official language
			if countryID ~= '' then 
				localLangID = wu.getId( countryID, 'P37' )
			end
			
			-- getting the name of the determined ID, if exists
			if localLangID ~= '' then
				localLang = lg.id2code[localLangID] or 'unknown language'
			else
				-- to avoid nil and maybe later features or returning messages
				localLangID = 'NO_LANGUAGE'
			end
			
		end
		
		-- fetching the linktext following the priority order
		url = ar[ requestedLangID ]		-- item in requested or local wiki language
			or ar[ 'Q1860' ]        	-- item in English as fallback
			or ar[ localLangID ]		-- the local language of the place in the article
			or ar[ next( ar, nil ) ]	-- first item

	end
	
	-- getting the language of the site
	local urlLanguage
	if next( ar ) then
		if ar[ requestedLangID ] ~= nil then urlLanguage = requestedLang
		elseif ar[ 'Q1860' ] ~= nil then urlLanguage = 'en'
		elseif ar[ localLangID ] ~= nil then urlLanguage = localLang
		end
	end
	
	-- Webseite zurückgeben
	return url or '', urlLanguage or '', localID
	
end

-- getting just the simple link
GetP856.getUrl = function ( id, lang )
	
	local urlLink
	local urlLinkLanguage
	urlLink, urlLinkLanguage = getUrlWithLanguange ( id, lang )
	
	-- providing the whole link (if determined)
	if urlLink == '' then
		return ''
	else
		return urlLink .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P856 benutzen]]'
	end
end

-- Get the link as wiki markup for external links 
-- includes the host to shorten the linktext (if its a long sub page)
GetP856.getUrlAsLinkWithHost = function ( id, lang )
	
	-- getting the link with the base function above
	local urlLink
	local urlLinkLanguage
	urlLink, urlLinkLanguage = getUrlWithLanguange ( id, lang )
	
	-- providing the whole link (if determined)
	if urlLink == '' then
		return ''
	else
		return '[' .. urlLink .. ' ' .. uu.URLutil().getHost( urlLink ) .. ']' .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P856 benutzen]]'
	end
	
end

-- Get the link as wiki markup for external links 
-- includes the host to shorten the linktext (if its a long sub page)
-- after the link, the site language is added
GetP856.getUrlAsLinkWithHostAndLanguage = function ( id, lang )
	
	-- getting the link with the function above
	local urlLink
	local urlLinkLanguage
	
	urlLink, urlLinkLanguage = getUrlWithLanguange ( id, lang )

	-- providing the whole link (if determined)
	if urlLink ~= '' and urlLinkLanguage ~= '' then
		-- link and site language are available
		return '[' .. urlLink .. ' ' .. uu.URLutil().getHost( urlLink ) .. '] (' .. urlLinkLanguage .. ')' .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P856 benutzen]]'
	elseif urlLink ~= '' and urlLinkLanguage == '' then
		-- no site language determined
		return '[' .. urlLink .. ' ' .. uu.URLutil().getHost( urlLink ) .. ']' .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P856 benutzen]]'
	else
		-- got nothing?
		return ''
	end
	
end

-- Same as above but shows a delivered message after the link
-- returning an automatic message with link to the Wikidata-item, if no website is available
-- used in Template: Vorlage:Offizielle Webseite
GetP856.getOfficialWebsite = function ( id, lang, message )

	-- getting the link with the function above
	local urlLink
	local urlLinkLanguage
	local wdID
	local wdLabel = ''
	
	urlLink, urlLinkLanguage, wdID = getUrlWithLanguange ( id, lang )
	
	local urlMessage
	if urlMessage ~= nil then
		urlMessage = message
	else
		if wdID ~= nil then
			wdLabel = wu.getLabel ( wdID )
			if wdLabel ~= nil then
				urlMessage = 'Offizielle Webseite von '	.. wdLabel
			else
				urlMessage = 'Offizielle Webseite'
			end
		else
			urlMessage = 'Offizielle Webseite'
		end
	end

	-- providing the whole link (if determined)
	if urlLink ~= '' and urlLinkLanguage ~= '' then
		-- link and site language are available
		return '<span class="wikidata-content">' .. '[' .. urlLink .. ' ' .. uu.URLutil().getHost( urlLink ) .. '] (' .. urlLinkLanguage .. ')' .. '</span>' .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P856 benutzen]]' .. ' – ' .. urlMessage
	elseif urlLink ~= '' and urlLinkLanguage == '' then
		-- no site language determined
		return '<span class="wikidata-content">' .. '[' .. urlLink .. ' ' .. uu.URLutil().getHost( urlLink ) .. ']' .. '</span>' .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P856 benutzen]]' .. ' – ' .. urlMessage
	else
		-- got nothing?
		if wdID ~= nil then
			return 'Eine offizielle Webseite ist nicht bekannt.<span class="wd-tools-message-inline"> Bitte auf [[:wikidata:' .. wdID .. '|Wikidata]] nachtragen.</span>[[Kategorie:Artikel ohne offizielle Webseite auf Wikidata]]'
		else 
			return 'Eine offizielle Webseite ist nicht bekannt.'			
		end
	end
	
end



-- Get the link as wiki markup for external links 
-- includes the host to shorten the linktext (if its a long sub page)
GetP856.getUrlAsLinkWithHostQuickbar = function ( id, wikiValue )
	
	-- getting the link with the base function above
	local urlLink
	local urlLinkLanguage
	local wikidataID
	local wikidataURL = ''
	urlLink, urlLinkLanguage, wikidataID = getUrlWithLanguange ( id, nil )
	
	-- 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 = ''

	-- is Wikidata value not available?
	if urlLink == '' then
		category = wikidataCat.noData
		wikidataClass = ''
	else
		wikidataURL = urlLink
	end
	
	-- is a wiki value defined?
	if ( wikiValue ~= nil ) then
		if ( wikiValue ~= '' ) and ( urlLink ~= '' ) then
			-- are the values equal?
			if tostring ( urlLink ) == wikiValue then
				category = wikidataCat.equalData
			else
				category = wikidataCat.noEqualData
			end
			
			-- showing the local given URL, if valid
			if uc.isUrl( wikiValue ) == 0 then
				urlLink = wikiValue
			end
			
		end
	end

	-- creating the table row 
	local tr = mw.html.create ( 'tr' )
	
	-- first table cell (heading)
	tr:addClass('voy-qb-item voy-qb-item-website' )
		:tag('th')
		:addClass('voy-qb-item-key')
		:wikitext('Webseite')
	
	-- second table cell (website)
	if category == wikidataCat.noData then
		tr:tag('td')
			:addClass( 'voy-qb-item-value1 voy-qb-item-value-nowikidata' .. wikidataClass )
				:attr('data-wikidata-id',wikidataID)
				:attr('title','Keine Webseite auf Wikidata')
			:wikitext( '&nbsp;' )
	elseif category == wikidataCat.equalData 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',wikidataURL)
				:attr('title','Daten identisch - URL auf Wikidata: ' .. wikidataURL)
				:wikitext( '[' .. urlLink .. ' ' .. uu.URLutil().getHost( urlLink ) .. ']' )
	elseif category == wikidataCat.noEqualData 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',wikidataURL)
				:attr('title','Daten unterschiedlich - URL auf Wikidata: ' .. wikidataURL)
				:wikitext( '[' .. urlLink .. ' ' .. uu.URLutil().getHost( urlLink ) .. ']' )
	else
		tr:tag('td')
				:addClass( 'voy-qb-item-value1' .. wikidataClass )
				:attr('data-wikidata-id',wikidataID)
				:attr('data-wikidata-value',wikidataURL)
				:wikitext( '[' .. urlLink .. ' ' .. uu.URLutil().getHost( urlLink ) .. ']' )
	end

	-- returning the row
	return tostring ( tr ) .. category .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P856 benutzen]]' 
	
end

-- Providing template access
local p = {}

function p.getUrl( frame )
    return GetP856.getUrl( frame.args[ 1 ], frame.args[ 2 ] ) or ""
end

function p.getUrlAsLinkWithHost( frame )
    return GetP856.getUrlAsLinkWithHost( frame.args[ 1 ], frame.args[ 2 ] ) or ""
end

function p.getUrlAsLinkWithHostAndLanguage( frame )
    return GetP856.getUrlAsLinkWithHostAndLanguage( frame.args[ 1 ], frame.args[ 2 ] ) or ""
end

function p.getOfficialWebsite( frame )
    return GetP856.getOfficialWebsite( frame.args[ 1 ], frame.args[ 2 ], frame.args[ 3 ] ) or ""
end

function p.getUrlAsLinkWithHostQuickbar( frame )
    return GetP856.getUrlAsLinkWithHostQuickbar( frame.args[ 1 ], frame.args[ 2 ] ) or ""
end

-- for usage in other modules
-- using it the following way:
--
-- local p856 = require( 'Module:GetP856' )
-- foo = p856.GetP856().getUrlAsLinkWithHost( id, lang )
function p.GetP856()
	return GetP856
end

return p