Modul:FastWikidata

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

Zweck der nachfolgenden Lua-Funktionen ist es, teure mw.wikibase.getEntity( i )-Aufrufe zu vermeiden.

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:

Interne Variable

local catTable
  • In der Tabelle werden die verwendeten Wikidata-Eigenschaften (Properties) gespeichert.

Funktionen

  • Parameter
    • anEntity Wikidata Entity Object (table) oder Wikidata Id (string).
    • id Wikidata Id (Q...) string.
    • p Wikidata Property (P...) string.
    • count Maximalanzahl der gelieferten Werte. Bei count = nil werden alle Werte zurückgeliefert.
function fw.getEntity( id )
  • liefert id, entity, wrongQualifier. Prüft eine Qualifier-Id auf Vorhandensein in Wikidata. wrongQualifier nennt mit true oder false das Ergebnis. Im Erfolgsfall wird zudem ein entity-Objekt zurückgeliefert.
function fw.getId( entity, p )
  • Liefert die erste Id als Zeichenkette, im Fehlerfall eine leere Zeichenkette.
function fw.getValue( entity, p )
  • Liefert den ersten Wert als Zeichenkette oder Tabelle, im Fehlerfall eine leere Zeichenkette.
function fw.getBestStatements( entity, p )
  • Liefert alle Statements als Tabelle zurück, im Fehlerfall die leere Tabelle {}.
function fw.getStatements( entity, p, count )
  • Liefert maximal die ersten count Statements als Tabelle zurück, im Fehlerfall die leere Tabelle {}.
function fw.getValues( entity, p, count )
  • Liefert maximal die ersten count Werte als Tabelle zurück, im Fehlerfall die leere Tabelle {}.
function fw.getValuesByLang( entity, p, count, lang )
  • Liefert maximal die ersten count Werte als Tabelle zurück, bei denen die Sprache lang gesetzt ist. Im Fehlerfall die leere Tabelle {}. Die Eigenschaft p muss vom Typ monolingual text sein.
function fw.getValuesWithQualifierIds( entity, p, qualifierP, defaultId )
  • Liefert eine Tabelle aller Werte als indizierte Tabelle zurück, im Fehlerfall die leere Tabelle {}. qualifierP ist eine Wikidata Property (P..., string) vom Typ Datenobjekt. Die Datenobjekt-Id stellt den Index in der Tabelle für den zugehörenden Wert dar. Falls keine Datenobjekt-Id gefunden wurde, wird, falls vorhanden, defaultId benutzt bzw. der Index 'unknown' benutzt. Es wird der jeweils erste Wert zu einem bestimmten Index geliefert.
  • Beispiel:
fw.getValuesWithQualifierIds( 'Q47429618', 'P969', 'P407' )
table#1 {
 ["Q13955"] = "٢ شارع قصر النيل ، ميدان التحرير ، القاهرة",
 ["Q1860"] = "2 Kasr El Nil St., El Tahrir Sq., Cairo",
}
function fw.getValuesWithLanguages( entity, p )
  • Liefert eine Tabelle aller Werte als indizierte Tabelle zurück, im Fehlerfall die leere Tabelle {}. Als Index wird die Sprachbezeichnung benutzt. Es wird der jeweils erste Wert zu einem bestimmten Sprache geliefert.
  • Beispiel:
function fw.getValuesWithLanguages( 'Q47429618', 'P6375' )
table#1 {
 ["ar"] = "٢ شارع قصر النيل ، ميدان التحرير ، القاهرة",
 ["en"] = "2 Kasr El Nil St., El Tahrir Sq., Cairo",
}
function fw.getValuesWithQualifiers( entity, p, qualifiers, count )
  • Liefert eine Tabelle, die für jedes Statement eine Tabelle mit dem Wert und den Qualifikatoren enthält. qualifiers kann nil für alle möglichen Qualifikatoren-Eigenschaften, eine Zeichenkete für eine einzelne Qualifikator-Eigenschaft oder eine Tabelle gewünschter Qualifikatoren-Eigenschaften sein. Es werden maximal die ersten count Statements zurückgeliefert.
  • Beispiel:
fw.getValuesWithQualifiers( 'Q183', 'P85', nil, nil )
table#1 {
 table#2 {
  ["P51"] = "National anthem of Germany - U.S. Army 1st Armored Division Band.ogg",
  ["P51-type"] = "string",
  ["P805"] = "Q4122341",
  ["P805-type"] = "wikibase-entityid",
  ["value"] = table#3 {
   ["entity-type"] = "item",
   ["id"] = "Q44042",
   ["numeric-id"] = 44042,
  },
  ["value-type"] = "wikibase-entityid",
 },
}
function fw.getAliases( entity, lang )
  • Liefert eine Tabelle mit Aliasen zur Wikidata-Entität entity. Wenn keine Aliase vorliegen, ist die Tabelle leer. Eine fehlende Sprache wird durch die Sprache des Wikis ersetzt.
function fw.getCategories( formatStr )
  • Liefert eine Zeichenkette mit den Kategorie-Links aller verwendeten Wikidata-Eigenschaften zurück.
Hinweise
-- documentation
local FastWikidata = {
	suite  = 'FastWikidata',
	serial = '2020-06-29',
	item   = 65439025
}

-- module variable
local fw = {}

-- table storing property ids used
local catTable = {
	P0 = ''
}

function fw.getEntity( id )
	local wrongQualifier = false
	local entity = nil
	
	if not id or id == '' then
		return '', entity, wrongQualifier
	end
	if mw.wikibase.isValidEntityId( id ) then
		-- expensive function call
		-- redirect ids marked false, too
		entity = mw.wikibase.getEntity( id )
	end
	if not entity then
		id = ''
		wrongQualifier = true
	end

	return id, entity, wrongQualifier
end

function fw.getEntityId( id )
	local wrongQualifier = false
	local entity = nil
	
	if not id or id == '' then
		return '', entity, wrongQualifier
	end
	if mw.wikibase.isValidEntityId( id ) and mw.wikibase.entityExists( id ) then
		-- expensive function call
		-- redirect ids marked false, too
		entity = id
	end
	if not entity then
		id = ''
		wrongQualifier = true
	end

	return id, entity, wrongQualifier
end

function fw.getLabel( entity, lang )
	local isString = type( entity ) == 'string'
	if not entity or ( isString and entity == '' ) then
		return nil
	end
	if isString then -- entity is id
		if lang and lang ~= '' then
			return mw.wikibase.getLabelByLang( entity, lang )
		else
			return mw.wikibase.getLabel( entity )
		end
	else -- entity is table
		if lang and lang ~= '' then
			return entity:getLabel( lang )
		else
			return entity:getLabel()
		end
	end
end

function fw.getSitelink( entity, globalSiteId )
	local isString = type( entity ) == 'string'
	if not entity or ( isString and entity == '' ) then
		return nil
	end
	if isString then -- entity is id
		if globalSiteId and globalSiteId ~= '' then
			return mw.wikibase.getSitelink( entity, globalSiteId )
		else
			return mw.wikibase.getSitelink( entity )
		end
	else -- entity is table
		if globalSiteId and globalSiteId ~= '' then
			return entity:getSitelink( globalSiteId )
		else
			return entity:getSitelink( )
		end
	end
end

local function getFirstValue( statements )
	if #statements == 0 then
		return nil
	end

	for i = 1, #statements, 1 do
		if statements[ i ].mainsnak.snaktype == 'value' then
			return statements[ i ].mainsnak.datavalue.value
		end
	end

	return nil
end

local function getNValues( statements, count )
	local ar = {}
	if count > #statements then
		count = #statements
	end
	if #statements == 0 or count <= 0 then
		return ar
	end

	local i = 0
	repeat
		i = i + 1
		if statements[ i ].mainsnak.snaktype == 'value' then
			table.insert( ar, statements[ i ].mainsnak.datavalue.value )
		end
	until i >= #statements or #ar >= count

	return ar
end

function fw.getBestStatements( entity, p )
	if type( entity ) == 'string' then
		return mw.wikibase.getBestStatements( entity, p )
	else
		return entity:getBestStatements( p )
	end
end

function fw.getStatements( entity, p, count )
	local ar = {}
	if not entity or entity == '' then
		return ar
	end

	local statements = fw.getBestStatements( entity, p )

	count = count or #statements
	if count > #statements then
		count = #statements
	end
	if #statements == 0 or count <= 0 then
		return ar
	end

	local i = 0
	repeat
		i = i + 1
		if statements[ i ].mainsnak.snaktype == 'value' then
			table.insert( ar, statements[ i ] )
		end
	until i >= #statements or #ar >= count

	return ar
end

function fw.getValue( entity, p )
	local value = ''
	if entity and entity ~= '' and p and p ~= '' then
		value = getFirstValue( fw.getBestStatements( entity, p ) )
		if value then
			catTable[ p ] = ''
		else
			value = ''
		end
	end
	return value
end

function fw.getId( entity, p )
	local value = ''
	if entity and entity ~= '' and p and p ~= '' then
		value = getFirstValue( fw.getBestStatements( entity, p ) )
		if value then
			catTable[ p ] = ''
			value = value.id
		else
			value = ''
		end
	end
	return value
end

function fw.getValues( entity, p, count )
	local values = ''
	if entity and entity ~= '' and p and p ~= '' then
		local statements = fw.getBestStatements( entity, p )
		values = getNValues( statements, count or #statements )
		if #values > 0 then
			catTable[ p ] = ''
		end
	end
	return values
end

function fw.getValuesByLang( entity, p, count, lang )
	local ar = ''
	if entity and entity ~= '' and p and p ~= '' then
		local statements = fw.getBestStatements( entity, p )
		ar = {}
		count = count or #statements
		if #statements > 0 and count > 0 then
			local i = 0
			local value
			repeat
				i = i + 1
				if statements[ i ].mainsnak.snaktype == 'value' then
					value = statements[ i ].mainsnak.datavalue.value
					if value.language and lang == value.language then
						table.insert( ar, statements[ i ].mainsnak.datavalue.value.text )
					end
				end
			until i >= #statements or #ar >= count
		end
		if #ar > 0 then
			catTable[ p ] = ''
		end
	end
	return ar
end

function fw.getValuesWithQualifierIds( entity, p, qualifierP, defaultId )
	local result = {}
	if entity and entity ~= '' and p and p ~= '' and qualifierP and qualifierP ~= '' then
		local statements = fw.getStatements( entity, p, nil )
		if #statements > 0 then
			-- defaultId is used if a qualifier is missing
			if not defaultId or defaultId == '' or type( defaultId ) ~= 'string' then
				defaultId = 'unknown'
			end

			catTable[ p ] = ''
			local id, value
			for i = 1, #statements, 1 do
				value = statements[ i ].mainsnak.datavalue.value
				id = defaultId
				if statements[ i ].qualifiers and statements[ i ].qualifiers[ qualifierP ]
					and ( #statements[ i ].qualifiers[ qualifierP ] > 0 ) then
					for j = 1, #statements[ i ].qualifiers[ qualifierP ], 1 do
						if statements[ i ].qualifiers[ qualifierP ][ j ].snaktype == 'value' then
							id = statements[ i ].qualifiers[ qualifierP ][ j ].datavalue.value.id
							break
						end
					end
				end
				result[ id ] = value
			end
		end
	end
	return result
end

-- get values array for monolingual text
function fw.getValuesWithLanguages( entity, p )
	local result = {}
	if entity and entity ~= '' and p and p ~= '' then
		local statements = fw.getStatements( entity, p, nil )
		local hyphen, lng, value
		if #statements > 0 and statements[ 1 ].mainsnak.datatype == 'monolingualtext' then
			catTable[ p ] = ''
			for i = 1, #statements, 1 do
				value = statements[ i ].mainsnak.datavalue.value
				lng = value.language
				hyphen = lng:find( '-' )
				if hyphen then
					lng = lng:sub( 1, hyphen - 1 )
				end
				if not result[ lng ] then
					result[ lng ] = value.text
				end
			end
		end
	end
	return result
end

local function getValueFromDatavalue( datavalue )
	local v = datavalue.value
	local t = datavalue.type
	if type( v ) == 'table' then
		-- items which can be reduced to a string
		if t == 'wikibase-entityid' then
			v = v.id
		elseif t == 'time' then
			v = v.time
		end
	end
	return v, t
end

-- The following function is an experimental one, not for extensive use
function fw.getValuesWithQualifiers( entity, p, qualifiers, count )
	local result = {}
	local statements = fw.getStatements( entity, p, count )
	if #statements == 0 then
		return result
	end

	if qualifiers and type( qualifiers ) == 'string' then
		qualifiers = { qualifiers }
	end

	local array
	for i = 1, #statements, 1 do
		array = { value = statements[ i ].mainsnak.datavalue.value,
			[ 'value-type' ] = statements[ i ].mainsnak.datavalue.type }
		if statements[ i ].qualifiers then
			if not qualifiers then -- all qualifier properties
				for key, value in pairs( statements[ i ].qualifiers ) do
					if #value > 0 then
						for j = 1, #value, 1 do
							if value[ j ].snaktype == 'value' then
								array[ key ], array[ key .. '-type' ] =
									getValueFromDatavalue( value[ j ].datavalue )
								break
							end
						end
					end
				end
			else -- table of selected qualifier properties
				for key, value in pairs( qualifiers ) do
					if statements[ i ].qualifiers[ value ] and
						#statements[ i ].qualifiers[ value ] > 0 then
						for j = 1, #statements[ i ].qualifiers[ value ], 1 do
							if statements[ i ].qualifiers[ value ][ j ].snaktype == 'value' then
								array[ value ], array[ value .. '-type' ] =
									getValueFromgetValueFromDatavalue( statements[ i ].qualifiers[ value ][ j ].datavalue )
								break
							end
						end
					end
				end
			end
		end
		table.insert( result, array )
	end
	return result
end

function fw.getAliases( entity, lang )
	if type( entity ) == 'string' then -- is Q id
		entity = mw.wikibase.getEntity( entity )
	end
	if not lang then
		lang = mw.getContentLanguage():getCode()
	end
	local aliases = {}
	if entity and entity.aliases and entity.aliases[ lang ] then
		for _, alias in ipairs( entity.aliases[ lang ] ) do
			table.insert( aliases, alias.value )
		end
	end
	return aliases
end

function fw.getCategories( formatStr )
	local result = ''

	if not formatStr or formatStr == '' then
		formatStr = '[[Category:%s]]'
	end

	catTable.P0 = nil
	for key, value in pairs( catTable ) do
		result = result .. string.format( formatStr, key )
	end
	return result
end

return fw