Modul:Wikidata: Porovnání verzí

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
getId - drobná chybka
m oprava c&p překlepu
Řádek 98: Řádek 98:
end
end
if lib.IsOptionTrue(options, 'addclass') then
if lib.IsOptionTrue(options, 'addclass') then
sitelink = lib.addClass(sitelink)
sitelink = lib.addWdClass(sitelink)
end
end
return sitelink
return sitelink
Řádek 370: Řádek 370:
local label = mw.wikibase.label(id)
local label = mw.wikibase.label(id)
if label and lib.IsOptionTrue(args, 'addclass') then
if label and lib.IsOptionTrue(args, 'addclass') then
label = lib.addClass(label)
label = lib.addWdClass(label)
end
end
return label
return label
Řádek 378: Řádek 378:
local label = entity.labels[lang].value
local label = entity.labels[lang].value
if label and lib.IsOptionTrue(args, 'addclass') then
if label and lib.IsOptionTrue(args, 'addclass') then
label = lib.addClass(label)
label = lib.addWdClass(label)
end
end
return label
return label
Řádek 395: Řádek 395:
local description = mw.wikibase.description(id)
local description = mw.wikibase.description(id)
if description and lib.IsOptionTrue(args, 'addclass') then
if description and lib.IsOptionTrue(args, 'addclass') then
description = lib.addClass(description)
description = lib.addWdClass(description)
end
end
return description
return description
Řádek 403: Řádek 403:
local description = entity.descriptions[lang].value
local description = entity.descriptions[lang].value
if description and lib.IsOptionTrue(args, 'addclass') then
if description and lib.IsOptionTrue(args, 'addclass') then
description = lib.addClass(description)
description = lib.addWdClass(description)
end
end
return description
return description
Řádek 431: Řádek 431:
local list = mw.text.listToText(Aliases, args.separator, args.conjunction)
local list = mw.text.listToText(Aliases, args.separator, args.conjunction)
if lib.IsOptionTrue(args, 'addclass') then
if lib.IsOptionTrue(args, 'addclass') then
list = lib.addClass(list)
list = lib.addWdClass(list)
end
end
return list
return list

Verze z 6. 6. 2017, 22:14

Hlavní modul pro práci s daty na Wikidatech. Jeho základ byl převzat z test2wiki:Module:Wikidata, postupně je rozšiřován o nové funkce.

Modul je rozdělen do submodulů:

Viz též seznam šablon, které tento modul využívají.

Použití

Podrobnější nápovědu naleznete na stránce Wikipedie:Wikidata/Přebírání do infoboxů.

Do šablony vložte {{#invoke:Wikidata|funkce|parametry = jako v šablonách}}.

Parametry a funkce označené hvězdičkou (*) nejsou plně podporované a není zatím doporučeno je využívat. Naopak parametry či funkce označené křížkem (†) jsou zastaralé a mohou být v brzké době odstraněny.

Přehled všech funkcí a parametrů
Funkce Popis funkce Parametr Povinný Popis parametru
formatStatements získá data, vybere tvrzení, přefiltruje, seřadí a zformátuje jejich hodnoty a vrátí jejich seznam id ne identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou)
of ne identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti
page ne název stránky, jejíž položka se má použít pro získání údajů
wiki ne zkratka projektu (např. enwiki), z něhož uvedená stránka pochází
property ano identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), jejíž hodnoty se mají zformátovat a zobrazit
addlink ne pokud je „true“, na konci dat z repozitáře se objeví (e) odkazující přímo na vlastnost
addclass ne pokud je „false“, potlačí obalení údajů CSS třídou (používat jen ve výjimečných případech)
value-formatter ne submodul modulu Wikidata/Formatters (jeho podstránka), která se použije pro formátování hodnot, pokud výchozí submodul není vyhovující (seznam, návod)
limit ne maximální počet hodnot, které se v seznamu zobrazí
rank ne nutné postavení hodnoty v rámci tvrzení;
může být all – použijí se všechna tvrzení; best – použijí se buď pouze tvrzení, která mají preferované postavení, nebo pouze ta s normálním postavením, pokud žádné preferované není; valid (implicitní) – použijí se jak preferovaná, tak normálně postavená tvrzení; preferred, normal, deprecated – použijí se pouze tvrzení s odpovídajícím postavením
withtarget ne hodnota, jíž mají nabývat hledaná tvrzení (užitečné zejména pro funkce getCount a getQualifier)
withqualifier ne identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), která musí být přiřazena dané hodnotě v tvrzení jako vymezení
withqualifiervalue ne hodnota, jíž má nabývat vlastnost vymezení daná parametrem „withqualifier“
withoutqualifier ne identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), která nesmí být přiřazena dané hodnotě v tvrzení jako vymezení
withoutqualifiervalue ne hodnota, jíž nemá nabývat vlastnost vymezení daná parametrem „withoutqualifier“
withunit ne identifikátor položky na Wikidatech
withlabel*
withsitelink*
withlang ne kód jazyka, ve kterém mají být hodnoty jednojazyčného textu
date ne datum ve formátu YYYY-MM-DD nebo „#now“ (dnešní datum), ke kterému mají být tvrzení platná
sort ne způsob, jakým změnit implicitní pořadí jednotlivých hodnot; hodnota parametru odpovídá čárkou odděleným podstránkám modulu Wikidata/Sorters
invert ne pokud je „true“ a je zadán způsob řazení („sort“), řazení bude sestupné, nikoliv výchozí vzestupné
pattern ne pokud je typ hodnoty řetězec, je toto vzor pro zformátování, přičemž „$1“ nahrazuje daný řetězec
autoformat ne pokud je „true“ a typ hodnoty řetězec, modul se na stránce dotyčné vlastnosti pokusí najít náhradu za pattern (URL pro zformátování (P1630)) a aplikuje ji
precision ne přizpůsobení formátu časových údajů (pokud je skutečná přesnost nižší, formát se přizpůsobí jí); 11 – 13. května 2024, 10 – květen 2024, 9 – 2024 atd.
somevalue ne pokud je vyplněný, modul bude zobrazovat i speciální hodnotu „neznámá hodnota“ s tímto textem
novalue ne pokud je vyplněný, modul bude zobrazovat i speciální hodnotu „bez hodnoty“ s tímto textem
showqualifier ne čárkou oddělené identifikátory vlastností na Wikidatech (písmeno „p“ následované číslicemi nebo „time“), které se zobrazí v závorce za hodnotou, pokud jsou dané hodnotě jako vymezení přiřazeny
showsource ne pokud je „true“, k datům z repozitáře se přidají reference
max_ref ne maximální počet referencí, které se mají zobrazit
showmore ne pokud je hodnota „true“, tak se v případě, že existuje více hodnot, než kolik povoluje limit, zobrazí na konci jejich seznamu text „… více na Wikidatech“ s odkazem přímo na vlastnost
list ne pokud je hodnota „ul“ nebo „ol“, hodnoty budou vráceny jako HTML seznam („ol“ – číslovaný, „ul“ – odrážkový)
separator ne znaky, jimiž se v seznamu oddělí jednotlivé hodnoty, kromě předposlední a poslední (implicitně čárka, neplatí pro HTML seznam)
conjunction ne znaky, jimiž se v seznamu oddělí předposlední a poslední hodnota (implicitně spojka „a“, neplatí pro HTML seznam)
qualifiers ... ne takto uvozený argument (např. „qualifiers precision“) bude použit pro výběr a formátování vymezení
showtargetdata* ne podobné jako „showqualifier“, ovšem data se místo z vymezení získávají z cílové položky
targetdate* ne podobné jako „date“, vztahuje se k údajům cílové položky
formatStatementsFromLua funkce, kterou používají pouze jiné moduly a která je jinak shodná s formatStatements entity ne tabulka s entitou, s níž má modul pracovat
getSitelink vrátí odkaz na článek daného projektu site / první nepojmenovaný ne zkratka projektu (implicitně „cswiki“)
pattern ne vzor pro zformátování odkazu, kde „$1“ je název odkazovaného článku (implicitně „$1“)
id ne identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou)
of ne identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti
page ne název stránky, jejíž položka se má použít pro získání údajů
wiki ne zkratka projektu (např. enwiki), z něhož uvedená stránka pochází
addclass ne pokud je „true“, odkaz bude obalen CSS třídou
getLabel vrátí štítek položky v daném jazyce lang ne zkratka jazyka (implicitně „cs“)
id ne identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou)
of ne identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti
page ne název stránky, jejíž položka se má použít pro získání údajů
wiki ne zkratka projektu (např. enwiki), z něhož uvedená stránka pochází
addclass ne pokud je „true“, štítek bude obalen CSS třídou
getDescription vrátí popisek položky v daném jazyce lang ne zkratka jazyka (implicitně „cs“)
id ne identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou)
of ne identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti
page ne název stránky, jejíž položka se má použít pro získání údajů
wiki ne zkratka projektu (např. enwiki), z něhož uvedená stránka pochází
addclass ne pokud je „true“, popisek bude obalen CSS třídou
getAliases vrátí aliasy položky v daném jazyce lang ne zkratka jazyka (implicitně „cs“)
limit ne maximální počet aliasů, který se má zobrazit
id ne identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou)
of ne identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti
page ne název stránky, jejíž položka se má použít pro získání údajů
wiki ne zkratka projektu (např. enwiki), z něhož uvedená stránka pochází
showmore ne jako u formatStatements
list ne
separator ne
conjunction ne
getBadges vrátí štítek odznaku přiřazeného danému odkazu na článek site ano zkratka projektu
id ne identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž data se mají získat pro další práci s nimi (implicitně je to položka propojená s danou stránkou)
of ne identifikátor vlastnosti na Wikidatech (písmeno „p“ následované číslicemi), ze kterého se získá entita, kterou modul skutečně využije, tak, že se použije první nejlepší hodnota vlastnosti
page ne název stránky, jejíž položka se má použít pro získání údajů
wiki ne zkratka projektu (např. enwiki), z něhož uvedená stránka pochází
getCount vrátí počet tvrzení podle daných kritérií všechny parametry pro filtrování
getCurrentId vrátí id položky, se kterou je stránka propojena
getId Vrátí id položky propojené se zadanou stránkou. Není-li propojená a jedná se o přesměrování, následuje jej (i rekurzivně). Nepodaří-li se, zkusí další stránky, pokud jich bylo zadáno víc. Nedostane-li parametry přímo, zpracuje parametry předané volající šabloně. první, druhý, ... nepojmenovaný ne název stránky na dané wiki (implicitně aktuální stránka)
wiki ne zkratka projektu (např. enwiki), z něhož uvedená stránka pochází
getRawValue použije stejná kritéria jako formatStatements, ovšem vrátí strojově čitelný (nezformátovaný) údaj všechny parametry pro filtrování
field ne pokud je typ hodnoty souřadnice, toto je její část, která se zobrazí; jedno z „latitude“, „longitude“, „precision“ a „globe“
getRawValueFromLua jako getRawValue, pro použití v jiném modulu entity ne tabulka s entitou, s níž má modul pracovat
getQualifier vrací hodnoty vymezení nalezeného tvrzení qualifier ano vlastnost vymezení, jejíž hodnoty mají být vráceny
qualifiers ... ne takto uvozený argument (např. „qualifiers withlang“) bude použit pro výběr (při filtrování) vymezení
stejné jako u funkce formatStatements
getRawQualifier aplikuje chování funkce getRawValue na getQualifier stejné jako u funkce getQualifier
formatEntity lokalizuje položku zadanou pomocí jejího identifikátoru (pokusí se vytvořit lokální odkaz a zobrazit štítek) id ne id položky, která se má zformátovat (jinak id položky, se kterou je stránka propojena)
entityExists zjistí, zda entita (položka, vlastnost atd.) s daným identifikátorem existuje (přesměrování se považuje za existující) id / první nepojmenovaný ano id položky, jejíž existenci zjišťujeme
ifexpr ne pokud je „true“, negativní hodnota bude vrácena jako „0“, jinak (výchozí chování) jako prázdný řetězec (užitečné, pokud ve wikitextu používáme funkci #ifexpr:, a ne #if:)
isValidEntityId zjistí, zda zadaný řetězec je platný identifikátor entity (položky, vlastnosti atd.) id / první nepojmenovaný ano řetězec, jehož validitu testujeme
ifexpr ne jako u entityExists
dumpWikidataEntity zobrazí entitu v čitelné podobě, užitečná pro ladění a zavádění nových funkcí, nepoužívá se v šablonách nebo článcích id ne identifikátor položky (písmeno „q“ následované číslicemi) nebo vlastnosti (písmeno „p“ následované číslicemi) na Wikidatech, jejíž entita se zobrazí (implicitně je to položka propojená s danou stránkou)

require "Modul:No globals"

local p = {}

local lib = require "Modul:Wikidata/lib"
local i18n = mw.loadData("Modul:Wikidata/i18n")

local function getIdFromStatements(entity, prop)
	local prop = mw.ustring.upper(prop)
	local Statements = entity:getBestStatements(prop)
	for _, statement in ipairs(Statements) do
		if lib.IsSnakValue(statement.mainsnak) then
			if statement.mainsnak.datavalue.type ~= 'wikibase-entityid' then
				return error(lib.raiseInvalidDatatype('findEntity',
					statement.mainsnak.datatype, {'wikibase-item', 'wikibase-property'}))
			end
			local Formatters = require 'Modul:Wikidata/Formatters'
			return Formatters.getRawValue(statement.mainsnak)
		end
	end
	return nil
end

local function findEntityId(options)
	local id, entity
	if options.entity and type(options.entity) == "table" then
		entity = options.entity
		id = entity.id
	end
	if not entity then
		id = options.id or p.getCurrentId()
	end
	if options.of then
		if not entity then
			entity = mw.wikibase.getEntity(id)
		end
		if entity then
			return getIdFromStatements(entity, options.of)
		end
		return nil
	end
	return id
end

local function findEntity(options)
	local entity
	if options.entity and type(options.entity) == "table" then
		entity = options.entity
	end
	if not entity then
		if options.id then
			local id = options.id:upper()
			entity = mw.wikibase.getEntity(id)
			if entity and entity.id ~= id then
				mw.log(id .. ' je přesměrování na ' .. entity.id)
			end
		else
			entity = mw.wikibase.getEntity()
		end
	end
	if options.of then
		if entity then
			local id = getIdFromStatements(entity, options.of)
			if id then
				return mw.wikibase.getEntity(id)
			end
		end
		return nil
	end
	return entity
end

local function getSitelink(options)
	local options = lib.common.cleanArgs(options)

	local id = findEntityId(options)
	if not id then
		return nil
	end

	local site = options.site or options[1]
	local sitelink
	if not site or site == 'cswiki' then
		sitelink = mw.wikibase.sitelink(id)
	else
		local entity = mw.wikibase.getEntity(id)
		if entity and entity.sitelinks then
			sitelink = entity:getSitelink(site)
		end
	end

	if not sitelink then
		return nil
	end

	if options.pattern then
		sitelink = lib.formatFromPattern(sitelink, options.pattern)
	end
	if lib.IsOptionTrue(options, 'addclass') then
		sitelink = lib.addWdClass(sitelink)
	end
	return sitelink
end

local function formatStatement(statement, options)
	if not statement.type or statement.type ~= 'statement' then
		return error(lib.formatError('unknown-claim-type', statement.type or '[neznámý]'))
	end
	local Filterers = require 'Modul:Wikidata/Filterers'
	local Formatters = require 'Modul:Wikidata/Formatters'

	local mainsnak, qualifiers, targetdata, references
	if not lib.IsOptionTrue(options, 'qualifiersOnly') then
		mainsnak = Formatters.getFormattedValue(statement.mainsnak, options)
	end
	if options.isQualifier == true then
		return mainsnak
	end
	if statement.qualifiers and options.showqualifier then
		local PropList = lib.textToTable(options.showqualifier)
		local Snaks = {}
		for _, property in ipairs(PropList) do
			local Values = {}
			local property = mw.ustring.upper(property)
			local format_options = {
				autoformat = true,
				precision = 9,
				property = property,
				isQualifier = true
			}
			if statement.qualifiers[property] then
				local Qualifiers = Filterers.filterQualifiers(statement.qualifiers[property], options)
				for _, snak in ipairs(Qualifiers) do
					if lib.IsSnakValue(snak) then
						table.insert(Values, Formatters.getFormattedValue(snak, format_options))
					end
				end
			elseif property == "TIME" then
				local Data = {}
				for key, array in pairs(lib.props) do
					for _, prop in ipairs(array) do
						if statement.qualifiers[prop] then
							for _, snak in ipairs(statement.qualifiers[prop]) do
								if lib.IsSnakValue(snak) then
									Data[key] = Formatters.getRawValue(snak)
									break
								end
							end
						end
					end
				end
				local Date = require 'Modul:Wikidata/datum'
				if Data.point then
					table.insert(Values, Date.formatDateFromTimevalue(Data.point, format_options))
				elseif Data.begin or Data.ending then
					table.insert(Values, Date.formatDateRange(Data, format_options))
				end
			end
			if #Values > 0 then
				table.insert(Snaks, mw.text.listToText(Values))
			end
		end
		if #Snaks > 0 then
			qualifiers = table.concat(Snaks, '; ')
		end
	end
	if not qualifiers and options.showtargetdata then
		local entity
		if lib.IsSnakValue(statement.mainsnak) then
			if statement.mainsnak.datavalue.type == 'wikibase-entityid' then
				entity = mw.wikibase.getEntity(Formatters.getRawValue(statement.mainsnak))
			else
				return error(lib.formatError('invalid-datatype', statement.mainsnak.property, statement.mainsnak.datatype, 'wikibase-item/wikibase-property'))
			end
		end
		if entity then
			local PropList = lib.textToTable(options.showtargetdata)
			local date
			local rank = 'best'
			if options.targetdate then
				if mw.ustring.match(options.targetdate, '^[Pp][1-9]%d-$') then
					date = p.getRawValueFromLua{ entity = options.entity, property = options.targetdate }
				else
					date = options.targetdate
				end
				if date then
					rank = 'valid'
				end
			end
			local options = {
				autoformat = true,
				date = date,
				entity = entity,
				isQualifier = true,
				precision = 9,
				rank = rank,
				sort = 'date',
			}
			local Snaks = {}
			for _, property in ipairs(PropList) do
				local result
				if mw.ustring.lower(property) == 'time' then
					local Data = {}
					for key, array in pairs(lib.props) do
						for _, prop in ipairs(array) do
							options.property = prop
							local Statements = Filterers.filterStatementsFromEntity(entity, options)
							for _, statement in ipairs(Statements) do
								Data[key] = Formatters.getRawValue(statement.mainsnak)
								break
							end
						end
					end
					local Date = require 'Modul:Wikidata/datum'
					if Data.point then
						result = Date.formatDateFromTimevalue(Data.point, options)
					elseif Data.begin or Data.ending then
						result = Date.formatDateRange(Data, options)
					end
				else
					options.property = property
					result = p.formatStatementsFromLua(options)
				end
				if result then
					table.insert(Snaks, result)
				end
			end
			if #Snaks > 0 then
				targetdata = table.concat(Snaks, '; ')
			end
		end
	end
	if statement.references and lib.IsOptionTrue(options, 'showsource') then
		local Module = require 'Module:Wikidata/cite'
		references = Module.formatReferences(statement.references, options)
	end

	if qualifiers or targetdata then
		if lib.IsOptionTrue(options, 'qualifiersOnly') then
			mainsnak = qualifiers or targetdata
		else
			if options.delimiter then
				mainsnak = mainsnak .. options.delimiter .. (qualifiers or targetdata)
			else
				mainsnak = mainsnak .. ' (' .. (qualifiers or targetdata) .. ')'
			end
		end
	end
	if references then
		mainsnak = mainsnak .. references
	end
	return mainsnak
end

local function formatStatements(options)
	local value = options.value
	if value then
		if value == '' and lib.IsOptionTrue(options, 'over') then
			value = nil
		end
		if value and not lib.IsOptionTrue(options, 'compare') then
			return value
		end
	end

	--Get entity
	options = lib.common.cleanArgs(options)
	local entity = findEntity(options)

	options.limit = tonumber(options.limit) --TODO default?
	local add_more = false
	if not lib.IsOptionTrue(options, 'compare') then
		if options.limit and lib.IsOptionTrue(options, 'showmore') then
			options.limit = options.limit + 1
			add_more = true
		end
	end

	local Filterers = require 'Modul:Wikidata/Filterers'
	local Statements = Filterers.filterStatementsFromEntity(entity, options)

	options.property = mw.ustring.upper(options.property)
	if value then
		local compare = require 'Modul:Wikidata/compare'
		local marked, category = compare.compareValues(value, Statements, {
			catbase = options.catbase,
			property = options.of or options.property
		})
		if lib.IsOptionTrue(options, 'addclass') and marked then
			value = marked
		end
		if lib.IsOptionTrue(options, 'addcat') and category then
			value = value .. category
		end
		return value
	end

	if #Statements == 0 then return nil end
	if add_more then
		if #Statements == options.limit then
			table.remove(Statements)
		else
			add_more = false
		end
	end
	-- Format statements and concat them cleanly
	local formattedStatements = {}
	options.entity = entity
	for _, statement in ipairs(Statements) do
		local formatted = formatStatement(statement, options)
		local add = true
		for _, fmt in ipairs(formattedStatements) do
			if formatted == fmt then
				add = false
				break
			end
		end
		if add then
			table.insert(formattedStatements, formatted)
		end
	end
	if add_more then
		table.insert(formattedStatements, mw.ustring.format(i18n["more-on-Wikidata"], entity.id, options.property))
	end
	value = mw.text.listToText(formattedStatements, options.separator, options.conjunction)

	if lib.IsOptionTrue(options, 'addlink') then
		value = mw.ustring.format('%s <sup class="wd-link">([[d:%s#%s|e]])</sup>', value, entity.id, options.property)
	end
	if lib.IsOptionTrue(options, 'addcat') then
		value = value .. lib.category('used-property', options.catbase or 'Vlastnost ' .. options.property)
	end
	if lib.IsOptionTrue(options, 'addclass') then
		value = lib.addWdClass(value)
	end
	return value
end

function p.dumpWikidataEntity( frame )
	local args = frame and frame.args or {}

	return mw.dumpObject( mw.wikibase.getEntity( args.id or nil ) )
end

function p.getBadges( frame )
	local args = lib.common.cleanArgs((frame and frame.args) or {})
	local site = args.site
	if not site then
		return error(lib.formatError('param-not-provided', 'site'))
	end
	local entity = findEntity( args )
	local Badges = {}
	if entity and entity.sitelinks and entity.sitelinks[site] then
		local ItemFormatter = require 'Modul:Wikidata/item'
		for _, badge in ipairs(entity.sitelinks[site].badges) do
			table.insert(Badges, ItemFormatter.formatEntityId(badge))
		end
	end
	return table.concat( Badges, ', ' )
end

function p.getLabel( frame )
	local args = lib.common.cleanArgs((frame and frame.args) or {})
	local id = findEntityId(args)
	if not id then
		return nil
	end
	local lang = args.lang
	if not lang or lang == mw.language.getContentLanguage():getCode() then
		local label = mw.wikibase.label(id)
		if label and lib.IsOptionTrue(args, 'addclass') then
			label = lib.addWdClass(label)
		end
		return label
	end
	local entity = mw.wikibase.getEntity(id)
	if entity and entity.labels and entity.labels[lang] then
		local label = entity.labels[lang].value
		if label and lib.IsOptionTrue(args, 'addclass') then
			label = lib.addWdClass(label)
		end
		return label
	end
	return nil
end

function p.getDescription( frame )
	local args = lib.common.cleanArgs((frame and frame.args) or {})
	local id = findEntityId(args)
	if not id then
		return nil
	end
	local lang = args.lang
	if not lang or lang == mw.language.getContentLanguage():getCode() then
		local description = mw.wikibase.description(id)
		if description and lib.IsOptionTrue(args, 'addclass') then
			description = lib.addWdClass(description)
		end
		return description 
	end
	local entity = mw.wikibase.getEntity(id)
	if entity and entity.descriptions and entity.descriptions[lang] then
		local description = entity.descriptions[lang].value
		if description and lib.IsOptionTrue(args, 'addclass') then
			description = lib.addWdClass(description)
		end
		return description 
	end
	return nil
end

function p.getAliases( frame )
	local args = lib.common.cleanArgs((frame and frame.args) or {})
	local lang = args.lang
	local entity = findEntity( args )
	if not lang then
		lang = mw.language.getContentLanguage():getCode()
	end
	if not entity or not entity.aliases or not entity.aliases[lang] then
		return nil
	end

	local limit = tonumber(args.limit)

	local Aliases = {}
	for i, alias in ipairs( entity.aliases[lang] ) do
		if not limit or (limit and i <= limit) then
			table.insert( Aliases, alias.value )
		else break end
	end
	local list = mw.text.listToText(Aliases, args.separator, args.conjunction)
	if lib.IsOptionTrue(args, 'addclass') then
		list = lib.addWdClass(list)
	end
	return list
end

function p.getCount( frame )
	local args = lib.common.cleanArgs((frame and frame.args) or {})
	if not args.property then
		return error(lib.formatError('param-not-provided', 'property'))
	end
	args.limit = nil

	local entity = findEntity( args )
	local Filterers = require 'Modul:Wikidata/Filterers'
	local Statements = Filterers.filterStatementsFromEntity(entity, args)

	return #Statements
end

p.getCurrentId = mw.wikibase.getEntityIdForCurrentPage

function p.getId( frame )
	local args = frame.args[1] and frame.args or frame:getParent().args
	
	if not args[1] then
		return mw.wikibase.getEntityIdForCurrentPage()
	end
	
	for _, titleString in ipairs(args) do
		local title = mw.title.new(titleString)
		while title do
			local id = mw.wikibase.getEntityIdForTitle(title.prefixedText)
			if id then
				return id
			end
			title = title.redirectTarget
		end
	end
end

function p.getSitelink( frame )
	return getSitelink( frame.args or {} )
end

function p.getSitelinkFromLua( options )
	return getSitelink( options or {} )
end

-- @deprecated
function p.filterStatementsFromLua(...)
	local Filterers = require 'Modul:Wikidata/Filterers'
	return Filterers.filterStatementsFromEntity(...)
end

function p.formatStatements(frame)
	local args = frame and frame.args or {}
	return formatStatements(args)
end

function p.formatStatementsFromLua(options)
	return formatStatements(options)
end

local function getRawValue(options)
	local entity = findEntity(options)
	if options.showspecial == nil then -- may be false
		options.showspecial = true
	end
	if options.rank ~= 'best' and options.rank ~= 'preferred' then
		if options.sort then
			if not mw.ustring.match(options.sort, 'rank') then
				options.sort = 'rank,' .. options.sort
			end
		else
			options.sort = 'rank'
		end
	end

	local Filterers = require 'Modul:Wikidata/Filterers'
	local Statements = Filterers.filterStatementsFromEntity(entity, options)
	for _, statement in ipairs(Statements) do
		local Formatters = require 'Modul:Wikidata/Formatters'
		return Formatters.getRawValue(statement.mainsnak, options)
	end
	return nil
end

function p.getRawValue(frame)
	return getRawValue(lib.common.cleanArgs((frame and frame.args) or {}))
end

function p.getRawValueFromLua(options)
	return getRawValue(options)
end

function p.formatEntity(frame)
	local formatter = require 'Modul:Wikidata/item'
	local args = lib.common.cleanArgs((frame and frame.args) or {})
	local id = args.id or p.getCurrentId()
	args.id = nil
	if id then
		return formatter.formatEntityId(id, args)
	end
	return nil
end

return p