
Verwendung
Das Submodul ist eine Testversion des Moduls GetItem und nicht für den Produktivbetrieb geeignet. Es dient der Weiterentwicklung des Moduls GetItem, damit sich Änderungen nicht auf alle Artikel auswirken, die das Modul benutzen.
![]() | Derzeit arbeitet kein Benutzer an diesem Testmodul. Du kannst es für deine Zwecke benutzen. |
Das Modul ist eine Spielwiese und nicht zum produktiven Einsatz vorgesehen. Der derzeitige Code ist eine finale Testversion zur Inbetriebnahme. Er enthält für Analysezwecke zusätzliche Wikidata-Abfragen und Ausgaben.
Testaufrufe
- Bonusprogramm (P4446) der Thai Airways International (es existieren keine Sitelinks, nur eine Bezeichnung):
{{#invoke:GetItem/Test|getItems|Q188710|P4446}}
- Ergebnis: Royal Orchid Plus
- Allianz (P114) der Thai Airways International (Es existiert ein Link im deutschen Wikivoyage):
{{#invoke:GetItem/Test|getItems|Q188710|P159}}
- Ergebnis: Star Alliance
- Allianz (P114) der Thai Airways International (Es existiert ein Link im deutschen Wikivoyage, aber kein Link erwünscht):
{{#invoke:GetItem/Test|getItems|Q188710|P159||label}}
- Ergebnis: Star Alliance
- Hauptverwaltung (P159) der Thai Airways International (Es existiert nur ein Link auf die deutsche Wikipedia):
{{#invoke:GetItem/Test|getItems|Q188710|P159}}
- Ergebnis: Chatuchak
- „ist Teil von“ (P361) der Stadt Kamakura (Es existiert nur ein Link auf die lokale (japanische) Wikipedia):
{{#invoke:GetItem/Test|getItems|Q200267|P361}}
- Ergebnis: Shōnan
- Nachgeordnete Organisationen (P355) der Thai Airways International (Es existieren mehrere Objekte):
{{#invoke:GetItem/Test|getItems|Q188710|P355}}
- Ergebnis: Thai Smile, Nok Air
- Nachgeordnete Organisationen (P355) der Thai Airways International (Es existieren mehrere Objekte, nur eines gewünscht):
{{#invoke:GetItem/Test|getItems|Q188710|P355|single}}
- Ergebnis: Thai Smile
- Notrufnummern (P2852) Deutschlands:
{{#invoke:GetItem/Test|getItems|Q183|P2852|}}
- Ergebnis: Euronotruf 112, 110 (Polizei), 116117 (Polizei)
- Steckertypen (P2853) der Demokratischen Republik Kongo:
{{#invoke:GetItem/Test|getItems|Q974|P2853}}
- Ergebnis: Eurostecker, Stecker-Typ D, Stecker-Typ E
{{#invoke:GetItem/Test|getItems|Q974|P2853|4=label}}
- Ergebnis: Eurostecker, Stecker-Typ D, Stecker-Typ E
Test in Quickbars
Quickbar Wie auch sonst üblich enthalten die Tags data-, class- und title-Attribute mit zusätzlichen Infos über die Wikidata-Suche bzw den Wikidata-Abgleich.
Thai Airways International | |
Bonusprogr. | Royal Orchid Plus |
---|---|
Allianz | Star Alliance |
Hauptverwaltung | Chatuchak |
Tochterges. | Thai Smile,Nok Air |
Lufthansa | |
Bonusprogr. | Miles & More |
---|---|
Allianz | Star Alliance |
Hauptverwaltung | Köln |
Tochtergesellschaften | Austrian Airlines, Tyrolean Airways, ITA Airways, Swiss, Edelweiss Air, Air Dolomiti, Eurowings, Lufthansa CityLine, Germanwings, Lufthansa Cargo, SunExpress |
Dem. Rep. Kongo | |
Fahrseite | rechts |
---|---|
Stecker-Typ | Eurostecker, Stecker-Typ D, Stecker-Typ E |
Notrufnummer(n) | Notruf 113 (Feuerwehr), 114 (Polizei), Notruf 118 (Polizei) |
Hinweise
- Die obige Dokumentation wurde aus der Seite Modul:GetItem/Test/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
--[=[ GetItem 2023-02-12 * local GetItemsAsTable (internal use) * getItems * getItemsQuickbar ]=] local GetItem = {} -- categories and properties for data evaluation -- its used to determine the official language of an country local cg = mw.loadData( 'Module:CountryData/Geography' ) local gip = require ( 'Modul:GetItem/Properties' ) -- returns nil, if both values are equal, otherwise the value -- similar to the SQL function nullif() local function nilIf ( value, equalValue ) if ( value == nil ) then return nil elseif ( tostring ( value ) == tostring ( equalValue ) ) then return nil else return value end end -- 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 -- GetItemsAsTable() -> just for internal use. it delivers the requested items as a table -- item: Wikidata-ID -- property: requested property -- it delivers the requested items as a table -- label: Label of the object -- sitelink: Sitelink in the following order: -- - German Wikivoyage -- - German Wikipedia -- - local Wikipedia (if the country of an object is known) -- wiki: code of the wiki ("wikivoyage" for the German Wikivoyage ) -- wikilanguage: language of the wiki ("de" for the German Wikivoyage ) local getItemsAsTable = function ( id, property ) -- local variables -- ID of the item -- Determined, if not provided -- compatibility to existing modules and templates: -- some use the keyword "self" for using the own entity-ID local localID = nilIf ( nilIf ( id, '' ), 'self' ) or mw.wikibase.getEntityIdForCurrentPage() or '' -- no Wikidata object if localID == '' then return {}, '', '' end -- maintenance categories local maintenanceCategory = '' -- property local requestedProperty = property or 'none'; if string.sub(requestedProperty,1,1) ~= 'P' then requestedProperty = 'none' end -- no property given: category and exit if requestedProperty == 'none' then maintenanceCategory = maintenanceCategory .. gip.noProperty return {}, localID, maintenanceCategory end -- property unknown in table "gip": category but continue if not gip[requestedProperty] then maintenanceCategory = maintenanceCategory .. gip.unknownProperty end -- getting the values local wdStatements = mw.wikibase.getBestStatements( localID, requestedProperty ) -- variables to store the result local wdValues = {} local wdItem local hasEndDate = false -- setting the "property used" maintaining category if #wdStatements > 0 then maintenanceCategory = maintenanceCategory .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft ' .. requestedProperty .. ' benutzen]]' end -- no data? > setting the "no data" category if #wdStatements == 0 and gip[requestedProperty] ~= nil then maintenanceCategory = maintenanceCategory .. gip[requestedProperty].noData end -- running through the array and store it in a simple table for i, entry in pairs ( wdStatements ) do wdItem = {} -- Prüfen, ob Endzeittpunkt vorhanden ist hasEndDate = false if entry.qualifiers ~= nil then if entry.qualifiers.P582 ~= nil then hasEndDate = true end end -- check for wikibase-item if entry.mainsnak.datatype == 'wikibase-item' and entry.mainsnak.datavalue ~= nil and not ( hasEndDate ) then -- getting the item wdItem.item = entry.mainsnak.datavalue.value.id -- getting the label wdItem.label = mw.wikibase.getLabel( entry.mainsnak.datavalue.value.id ) or '' -- getting the sitelink wdItem.wiki = '' wdItem.wikiLanguage = '' -- trying German Wikivoyage first wdItem.siteLink = mw.wikibase.getSitelink( entry.mainsnak.datavalue.value.id, 'dewikivoyage' ) or '' if wdItem.siteLink ~= '' then -- setting the wiki information wdItem.wiki = 'wikivoyage' wdItem.wikiLanguage = 'de' else -- trying the German Wikipedia wdItem.siteLink = mw.wikibase.getSitelink( entry.mainsnak.datavalue.value.id, 'dewiki' ) or '' if wdItem.siteLink ~= '' then -- setting the wiki information wdItem.wiki = 'wikipedia' wdItem.wikiLanguage = 'de' else -- trying the local Wikipedia -- first getting the country local wdCountry = {} local wdCountry = mw.wikibase.getBestStatements( localID, 'P17' ) if #wdCountry > 0 then -- there where empty values if wdCountry[1].mainsnak.datavalue ~= nil then maintenanceCategory = maintenanceCategory .. '[[Kategorie:Seiten, die die Wikidata-Eigenschaft P17 benutzen]]' if cg.countries[wdCountry[1].mainsnak.datavalue.value.id] ~= nil then local language = cg.countries[wdCountry[1].mainsnak.datavalue.value.id].lang or '' wdItem.siteLink = mw.wikibase.getSitelink( entry.mainsnak.datavalue.value.id, language .. 'wiki' ) or '' -- found a local wikipedia? if wdItem.siteLink ~= '' then -- setting the wiki information wdItem.wiki = 'wikipedia' wdItem.wikiLanguage = language end end -- if #wdIso3166 > 0 end -- if wdCountry[1].mainsnak.datavalue ~= nil end -- if #wdCountry > 0 end -- if wdItem.siteLink ~= '' end -- if wdItem.siteLink ~= '' -- getting the qualifiers -- the qualifiers are set up in Modul:GetItem/Properties if gip[requestedProperty] ~= nil then if gip[requestedProperty].qualifiers ~= nil then wdItem.qualifiers = {} -- looping over the rquested qualifiers for i, qualifier in ipairs( gip[requestedProperty].qualifiers ) do if entry.qualifiers ~= nil then if entry.qualifiers[qualifier] ~= nil then -- Wikidata-Item if entry.qualifiers[qualifier][1].datatype == 'wikibase-item' then wdItem.qualifiers[i] = {} wdItem.qualifiers[i].qualifier = qualifier wdItem.qualifiers[i].value = mw.wikibase.getLabel ( entry.qualifiers[qualifier][1].datavalue.value.id ) or '' end end -- if entry.qualifiers.qualifier ~= nil end -- if entry.qualifiers ~= nil end -- for i, qualifier in ipairs( gip[requestedProperty].qualifiers ) end -- if gip[requestedProperty].qualifiers ~= nil end -- f gip[requestedProperty] ~= nil -- adding the capital to the list table.insert( wdValues, wdItem ) end -- if entry.mainsnak.datatype == 'wikibase-item' and entry.mainsnak.datavalue ~= nil and not ( hasEndDate ) end -- for i, entry in ipairs ( wdStatements ) -- returning the items return wdValues, localID, maintenanceCategory end -- GetItems() -- gets the text of a property including its language -- first parameters: see internal function -- values: -- - single: Only one (first) entry is shown -- - all (standard): All entries ar shown -- show: -- - sitelink (standard): the sitelink with the label as link label -- - label: just the label (removes tha category as well), -- delimiter: delimiter between the numbers; standard is comma and breakable space GetItem.getItems = function ( id, property, values, show, delimiter ) -- returning String local returnString = '' -- values local requestedValues = coalesce ( nilIf ( values, '' ), 'all' ) -- WD-Values local stringList = {} local wikidataID = '' local categories = '' stringList, wikidataID, categories = getItemsAsTable ( id, property ) -- linkText local linkText = '' -- no delimiter in front of the first entry local stringDelimiter = '' -- qualifiers, if requested local stringQualifier = '' -- displaying the values for key, value in pairs( stringList ) do if value.qualifiers ~= nil then if #value.qualifiers > 0 then stringQualifier = ' (' for i = 1, #value.qualifiers do if i == 1 then stringQualifier = stringQualifier .. value.qualifiers[i].value else stringQualifier = stringQualifier .. ', ' .. value.qualifiers[i].value end end stringQualifier = stringQualifier .. ')' end end if coalesce ( nilIf ( show, '' ), 'sitelink' ) == 'sitelink' and value.siteLink ~= '' then returnString = returnString .. stringDelimiter .. '[[' if value.wiki == 'wikipedia' then returnString = returnString .. 'w:' .. value.wikiLanguage .. ':' end linkText = coalesce ( nilIf ( value.label, '' ), value.siteLink ) returnString = returnString .. value.siteLink .. '|' .. linkText .. ']]' .. stringQualifier else -- showing just the label returnString = returnString .. stringDelimiter .. value.label .. stringQualifier end -- breaking, if requestedValues ~= 'all' then break; end stringDelimiter = coalesce ( nilIf ( delimiter, '' ), ', ' ) end returnString = returnString -- providing the list of capitals if coalesce ( show, '' ) == 'label' then return returnString, categories else return returnString .. categories, categories end end -- Get the string as wiki markup for quickbars (infoboxes) GetItem.getItemsQuickbar = function ( id, property, wikiValue, label, delimiter ) -- checking property if coalesce ( property, '' ) == '' then return '' end -- getting the link with the base function above local wikidataID local wikidataStrings = {} local wikidataCategories wikidataStrings, wikidataID, wikidataCategories = getItemsAsTable ( id, property ) -- 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? local wikidataNoData = false if wikidataID == '' then if gip[property] ~= nil then category = gip[property].noData wikidataNoData = true end wikidataClass = '' end -- creating text for display local returnString = '' local stringDelimiter = '' local stringQualifier = '' -- Wikidate comparision tags -- is Wikidata available local wikidataAvailable = true -- is one of the entries equal to the wiki value? local wikidataOneIsEqual = false local wikidataEqualData = 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 local wikidataNoEqualData = false -- 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 wikiValue =='yes' or wikiValue == 'y' or wikiValue == 'true' or wikiValue == 'wahr' or wikiValue == 'ja' or wikiValue == 'j' then wikiValue = '' end -- wikivalues, that can be interpreted as "FALSE" suppress the whole row if wikiValue =='no' or wikiValue == 'n' or wikiValue == 'false' or wikiValue == 'falsch' or wikiValue == 'nein' then return wikidataCategories end -- processing wikiValue if coalesce ( wikiValue, '' ) ~= '' then -- starting with TRUE by default -- set to FALSE if one value is equal wikidataNothingIsEqual = true wikidataNoEqualData = true end -- displaying the values and compare with Wikidata for key, value in pairs( wikidataStrings ) do if value.qualifiers ~= nil then if #value.qualifiers > 0 then stringQualifier = ' (' for i = 1, #value.qualifiers do if i == 1 then stringQualifier = stringQualifier .. value.qualifiers[i].value else stringQualifier = stringQualifier .. ', ' .. value.qualifiers[i].value end end stringQualifier = stringQualifier .. ')' end end if coalesce ( nilIf ( show, '' ), 'sitelink' ) == 'sitelink' and value.siteLink ~= '' then returnString = returnString .. stringDelimiter .. '[[' if value.wiki == 'wikipedia' then returnString = returnString .. 'w:' .. value.wikiLanguage .. ':' end linkText = coalesce ( nilIf ( value.label, '' ), value.siteLink ) returnString = returnString .. value.siteLink .. '|' .. linkText .. ']]' .. stringQualifier else -- showing just the label returnString = returnString .. stringDelimiter .. value.label .. stringQualifier end -- comparing with Wikidata if coalesce ( wikiValue, '' ) ~= '' then if mw.ustring.gsub ( wikiValue, '[%[%]]', '' ) == value.siteLink or mw.ustring.gsub ( wikiValue, '[%[%]]', '' ) == value.label then wikidataOneIsEqual = true end end -- Setting the delimiter stringDelimiter = coalesce ( nilIf ( delimiter, '' ), ',<br />' ) -- resetting the qualifier stringQualifier = '' end -- saving wikidata value in case of a local string is used local wikidataString = returnString -- do not state "different values", when no wikidata value is available if #wikidataStrings == 0 then wikidataNoEqualData = false wikidataClass = '' end -- Setting Wikidata categories if coalesce ( wikiValue, '' ) ~= '' then -- setting the categories if gip[property] ~= nil then if wikidataOneIsEqual then category = category .. gip[property].equalData wikidataEqualData = true end if wikidataNothingIsEqual and #wikidataStrings > 0 then category = category .. gip[property].noEqualData wikidataNoEqualData = true end end -- displaying the wikiValue returnString = wikiValue -- removing the WD-Class wikidataClass = '' end -- displaying only, if any data available local trClass = '' if returnString == '' then trClass = ' voy-qb-empty' end -- creating the table row local tr = mw.html.create ( 'tr' ) -- first table cell (heading) local trLabel = coalesce ( nilIf ( label, '' ), ' ' ) if gip[property] then trClass = ' ' .. gip[property].cssClass .. trClass if trLabel == ' ' then trLabel = gip[property].label end end tr:addClass('voy-qb-item' .. trClass ) :tag('th') :addClass('voy-qb-item-key') :wikitext(trLabel) -- second table cell (the requested number) if wikidataNoData then tr:tag('td') :addClass( 'voy-qb-item-value1 voy-qb-item-value-nowikidata' .. wikidataClass ) :attr('data-wikidata-id',wikidataID) :attr('title','Keine Wert auf Wikidata') :wikitext( returnString ) elseif wikidataEqualData 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','Daten identisch - Angabe auf Wikidata: ' .. wikidataString) :wikitext( returnString ) elseif wikidataNoEqualData 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 - Angabe auf Wikidata: ' .. wikidataString ) :wikitext( returnString ) else tr:tag('td') :addClass( 'voy-qb-item-value1' .. wikidataClass ) :attr('data-wikidata-id',wikidataID) :attr('data-wikidata-value',wikidataString) :wikitext( returnString ) end -- returning the row return tostring ( tr ) .. category .. wikidataCategories end -- Providing template access local p = {} function p.getItems( frame ) return GetItem.getItems( frame.args[ 1 ], frame.args[ 2 ], frame.args[ 3 ], frame.args[ 4 ], frame.args[ 5 ] ) or "" end function p.getItemsQuickbar( frame ) return GetItem.getItemsQuickbar( frame.args[ 1 ], frame.args[ 2 ], frame.args[ 3 ], frame.args[ 4 ], frame.args[ 5 ] ) or "" end -- for usage in other modules -- using it the following way: -- -- local GetItem = require( 'Module:GetItem' ) -- foo = GetItem.GetItem().xxx( id, lang ) function p.GetItem() return GetItem end return p