Το κύριο module για εργασία με τα δεδομένα των Wikidata. Η βασική μορφή προέρχεται από test2wiki:Module:Wikidata, και έχει επεκταθεί με νέες δυνατότητες.

Το module διαιρείται σε υπό modules:

Δείτε επίσης τη λίστα των προτύπων που χρησιμοποιούν αυτό το module.

Χρήση Επεξεργασία

Τοποθετείστε το πρότυπο {{#invoke:Wikidata|λειτουργία|παράμετρος}}.

Οι παράμετροι και οι λειτουργίες που σημειώνονται με έναν αστερίσκο (*) δεν υποστηρίζονται πλήρως και δεν συνιστάται η χρήση τους. Αντίθετα, οι παράμετροι ή οι λειτουργίες που σημειώνονται με ένα σταυρό (†) είναι ξεπερασμένα και μπορεί σύντομα να αφαιρεθούν.

Επισκόπηση όλων των χαρακτηριστικών και παραμέτρων
Λειτουργία Περιγραφή λειτουργίας Παράμετρος Απαιτείται Περιγραφή παραμέτρου
formatStatements ανακτά τα δεδομένα, επιλέγει αξιώσεις, φιλτράρει, ταξινομεί και μορφοποιεί τις τιμές τους και επιστρέφει τη λίστα τους id όχι ένα αναγνωριστικό του αντικειμένου (το γράμμα "q" που ακολουθείται από ψηφία) ή τις ιδιότητες (το γράμμα "p" ακολουθούμενο από ψηφία) στα Wikidata, ποια δεδομένα θα πρέπει να ληφθούν για περαιτέρω εργασία μαζί του (σιωπηρά ένα στοιχείο που συνδέεται με αυτή τη σελίδα)
of όχι το αναγνωριστικό των ιδιοτήτων στις Wikidata (το γράμμα "p" που ακολουθείται από ψηφία) από το οποίο η οντότητα που πραγματικά χρησιμοποιεί το στοιχείο αποκτάται χρησιμοποιώντας την πρώτη προτιμώμενη τιμή της ιδιότητας
page* όχι το όνομα της σελίδας της οποίας το αντικείμενο πρόκειται να χρησιμοποιηθεί για την ανάκτηση των δεδομένων
property ναι αναγνωριστικό ιδιότητας Wikidata (το γράμμα "p" που ακολουθείται από ψηφία) της οποίας οι τιμές θα μορφοποιηθούν και θα εμφανιστούν
value* όχι εάν αυτή η παράμετρος έχει οριστεί, εμφανίζονται τα περιεχόμενά της
over* όχι αν είναι «αληθής», η κενή τιμή του «value» δεν θεωρείται καταχωρημένη
compare* όχι εάν είναι «αληθής» και η παράμετρος «value» έχει καθοριστεί, το module συγκρίνει το περιεχόμενό της και τα δεδομένα στα Wikidata σύμφωνα με τις άλλες παραμέτρους που καθορίζονται για το φιλτράρισμα δεδομένων και τις επισημαίνει με την κλάση CSS σύμφωνα με τη συνέπεια των δεδομένων
addlink όχι αν «αληθής», ένα (e) εμφανίζεται απευθείας στην ιδιότητα στο τέλος των δεδομένων από το χώρο αποθήκευσης
addclass όχι αν είναι «ψευδής», καταστέλλει την ταξινόμηση δεδομένων της κλάσης CSS </ span> (χρήση μόνο σε σπάνιες περιπτώσεις)
value-formatter όχι το υπό module του Module:Wikidata/Formatters (της υποσελίδας) που χρησιμοποιείται για τη μορφοποίηση των τιμών εάν το προεπιλεγμένο υπό module δεν είναι ικανοποιητικό
limit όχι ο μέγιστος αριθμός τιμών που εμφανίζονται στη λίστα
rank όχι η απαιτούμενη κατάσταση της τιμής σε μια δήλωση:
μπορεί να είναι «all» - θα χρησιμοποιηθούν όλες οι δηλώσεις, best - θα χρησιμοποιηθούν είτε οι δηλώσεις που έχουν προτιμώμενη βαθμίδα είτε μόνο όσοι έχουν κανονική βαθμίδα αν δεν χρησιμοποιείται η προτιμώμενη. valid (προεπιλογή) - χρησιμοποιούνται τόσο οι δηλώσεις με προτιμώμενες όσο και με κανονικές βαθμίδες. preferred, normal, deprecated - μόνο δηλώσεις με την κατάλληλη βαθμίδα
withqualifier όχι Αναγνωριστικό ιδιότητας Wikidata (το γράμμα "p" που ακολουθείται από ψηφία), το οποίο πρέπει να αντιστοιχιστεί στη δεδομένη τιμή της δήλωσης ως ένας ορισμός
withlang όχι ο κώδικας γλώσσας, στον οποίο πρέπει να είναι οι τιμές του μονογλωσσικού κειμένου
date όχι ημερομηνίας σε μορφή ΕΕΕΕ-ΜΜ-ΗΗ ή #now (σημερινή ημερομηνία) στην οποία θα πρέπει να ισχύει η δήλωση
sort όχι ο τρόπος αλλαγής της προεπιλεγμένης σειράς κάθε τιμής. Η τιμή της παραμέτρου αντιστοιχεί σε δευτερεύουσες σελίδες που χωρίζονται με κόμματα του υπό module Module:Wikidata/Sorters
invert όχι αν έχει οριστεί «αληθής» και έχει οριστεί «sort», η ταξινόμηση θα είναι πτωτική, όχι η προεπιλεγμένη αύξουσα
pattern όχι αν ο τύπος συμβολοσειράς είναι string (κείμενο), αυτή η μορφή είναι για μορφοποίηση, με το "$1" να αντικαθιστά το string
autoformat† όχι εάν είναι «αληθής» και ο τύπος συμβολοσειράς είναι string (κείμενο), το module θα προσπαθήσει να βρει αντικαταστάτη για την ιδιότητα (P1630) στη σελίδα ιδιοτήτων και να την εφαρμόσει
precision όχι προσαρμογή της μορφής του χρόνου (εάν η πραγματική ακρίβεια είναι μικρότερη, η μορφή προσαρμόζεται σε αυτήν). 11 – 25. Απριλίου 2024, 10 – Απριλίου 2024, 9 – 2024 κ.λπ.
somevalue όχι εάν συμπληρωθεί, το module θα εμφανίσει επίσης την ειδική τιμή "άγνωστη τιμή" μαζί με το κείμενο
novalue όχι εάν συμπληρωθεί, το module θα εμφανίσει επίσης την ειδική τιμή "καμία τιμή" μαζί με το κείμενο
showqualifier όχι τα αναγνωριστικά των προσδιοριστών της ιδιότητας στα Wikidata (το γράμμα "p" που ακολουθείται από ψηφία ή "time"), τα οποία χωρίζονται με κόμματα, που εμφανίζονται σε παρένθεση μετά την εκχώρηση της τιμής στην τιμή αυτή ως ορισμός
showtargetdata* όχι παρόμοια με το "showqualifier", αλλά τα δεδομένα αντλούνται από το αντικείμενο στόχο
targetdate* όχι παρόμοια με την "date", αναφέρεται στα στοιχεία του αντικειμένου στόχου
showsource όχι αν είναι "αληθής", οι αναφορές προστίθενται στα δεδομένα
showmore όχι 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
separator όχι znaky, jimiž se v seznamu oddělí jednotlivé hodnoty, kromě předposlední a poslední (implicitně čárka)
conjunction όχι znaky, jimiž se v seznamu oddělí předposlední a poslední hodnota (implicitně spojka „a“)
formatStatementsFromLua funkce, kterou používají pouze jiné moduly a která je jinak shodná s „formatStatements“ entity όχι tabulka s entitou, s níž má modul pracovat
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 όχι 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)
getSitelink vrátí odkaz na článek daného projektu site / první nepojmenovaný όχι zkratka projektu (implicitně „cswiki“)
pattern όχι vzor pro zformátování odkazu, kde „$1“ je název odkazovaného článku (implicitně „$1“)
id όχι 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 όχι 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
addclass όχι pokud je „true“, odkaz bude obalen CSS třídou
getLabel vrátí štítek položky v daném jazyce lang όχι zkratka jazyka (implicitně „cs“)
id όχι 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 όχι 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
addclass όχι pokud je „true“, štítek bude obalen CSS třídou
getDescription vrátí popisek položky v daném jazyce lang όχι zkratka jazyka (implicitně „cs“)
id όχι 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 όχι 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
addclass όχι pokud je „true“, popisek bude obalen CSS třídou
getAliases vrátí aliasy položky v daném jazyce lang όχι zkratka jazyka (implicitně „cs“)
limit όχι maximální počet aliasů, který se má zobrazit
id όχι 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 όχι 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
separator όχι znaky, jimiž se v seznamu oddělí jednotlivé aliasy, kromě předposledního a posledního (implicitně čárka)
conjunction όχι znaky, jimiž se v seznamu oddělí předposlední a poslední alias (implicitně spojka „a“)
getBadges vrátí štítek odznaku přiřazeného danému odkazu na článek site ναι zkratka projektu
id όχι 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 όχι 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
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 Βικιπαίδεια:Ανακατεύθυνση, 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ě.

(funkčnost závisí na phab:T74815)

první, druhý, ... nepojmenovaný όχι název stránky na této wiki (implicitně aktuální stránka)
getRawValue použije stejná kritéria jako „formatStatements“, ovšem vrátí strojově čitelný (nezformátovaný) údaj všechny parametry pro filtrování
field όχι 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 όχι tabulka s entitou, s níž má modul pracovat
getQualifier* qualifier ναι
getRawQualifier* qualifier ναι
formatEntity lokalizuje položku zadanou pomocí jejího identifikátoru (pokusí se vytvořit lokální odkaz a zobrazit štítek) id όχι id položky, která se má zformátovat (jinak id položky, se kterou je stránka propojena)

Πρότυπο:Dlouhodobě polozamčeno Kategorie:Wikipedie:Moduly

--require "Module:No globals"

local p = {}

local lib = require 'Module:Wikidata/lib'
local i18n = mw.loadData('Module:Wikidata/i18n')

local getArgs = (require 'Module:Arguments').getArgs

local function getEntityIdFromStatements(statements)
	for _, statement in ipairs(statements) do
		if lib.IsSnakValue(statement.mainsnak) then
			if statement.mainsnak.datavalue.type ~= 'wikibase-entityid' then
				return error(lib.raiseInvalidDatatype('getEntityIdFromStatements',
					statement.mainsnak.datatype, {'wikibase-item', 'wikibase-property'}))
			end
			local Formatters = require 'Module:Wikidata/Formatters'
			return Formatters.getRawValue(statement.mainsnak)
		end
	end
	return nil
end

local function getEntityIdFromEntity(entity, prop)
	local prop = mw.ustring.upper(prop)
	local statements = entity:getBestStatements(prop)
	return getEntityIdFromStatements(statements)
end

local function getEntityIdFromId(id, prop)
	local prop = mw.ustring.upper(prop)
	local statements = mw.wikibase.getBestStatements(id, prop)
	return getEntityIdFromStatements(statements)
end

local function getIdFromTitle(titleString)
	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
	return nil
end

local function findEntityId(options)
	local id
	if options.entity and type(options.entity) == 'table' then
		id = options.entity.id
	end
	if not id and options.page then
		id = getIdFromTitle(options.page)
		if not id then
			return nil
		end
	end
	if not id then
		id = options.id or p.getCurrentId()
	end
	if id and options.of then
		id = getEntityIdFromId(id, options.of)
	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
			if options.page then
				local id = getIdFromTitle(options.page)
				if id then
					entity = mw.wikibase.getEntity(id)
				end
			else
				entity = mw.wikibase.getEntity()
			end
		end
	end
	if options.of then
		if entity then
			local id = getEntityIdFromEntity(entity, options.of)
			if id then
				return mw.wikibase.getEntity(id)
			end
		end
		return nil
	end
	return entity
end

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

	local site = options.site or options[1]
	local sitelink = mw.wikibase.sitelink(id, site)

	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 'Module:Wikidata/Filterers'
	local Formatters = require 'Module:Wikidata/Formatters'

	local mainsnak = Formatters.getFormattedValue(statement.mainsnak, options)
	if options.isQualifier == true then
		return mainsnak
	end
	local qualifiers, targetdata, references
	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,
				isQualifier = true,
				label = 'short',
                precision = options['qualifiers precision'] or 9,
				property = property
			}
			if statement.qualifiers[property] then
				local Qualifiers = mw.clone(statement.qualifiers[property])
				Filterers.filterQualifiers(Qualifiers, options)
				for _, snak in ipairs(Qualifiers) do
					if lib.IsSnakValue(snak) then
						table.insert(Values, Formatters.getFormattedValue(snak, {}))
					end
				end
			elseif property == 'TIME' then
				local Data = {}
				-- todo: factor out
				for key, array in pairs(lib.props) do
					for _, prop in ipairs(array) do
						for _, snak in ipairs(statement.qualifiers[prop] or {}) do
							Data[key] = snak
							break
						end
					end
				end
				if Data.begin or Data.ending then
					table.insert(Values, lib.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, options['qualifiers separator'] or i18n['qualifiers separator'])
		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 lib.isPropertyId(options.targetdate) then
					date = p.getRawValueFromLua{ entity = options.entity, property = options.targetdate }
				else
					date = options.targetdate
				end
				if date then
					rank = 'valid'
				end
			end
			local options = {
				addclass = false,
				autoformat = true,
				date = date,
				entity = entity,
				isQualifier = true,
				label = 'short',
				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] = statement.mainsnak
								break
							end
						end
					end
					if Data.begin or Data.ending then
						result = lib.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 options.delimiter then
			mainsnak = mainsnak .. options.delimiter .. (qualifiers or targetdata)
		else
			mainsnak = mainsnak .. ' (' .. (qualifiers or targetdata) .. ')'
		end
	end
	if references and references ~= '' then
		return mainsnak .. references .. lib.category('references')
	end
	return mainsnak
end

local function formatStatements(statements, options)
	local formattedStatements = {}
	for _, statement in ipairs(statements) do
		if not statement.type or statement.type ~= 'statement' then
			return error(lib.formatError('unknown-claim-type', statement.type or '[neznámý]')) -- fixme: i18n
		end
		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 -- not in_array
			table.insert(formattedStatements, formatted)
		end
	end
	return formattedStatements
end

local function getStatements(id, options)
	if not id then
		return {}
	end
	local statements = mw.wikibase.getAllStatements(id, options.property:upper())
	local Filterers = require 'Module:Wikidata/Filterers'
	Filterers.filterStatements(statements, options)
	return statements
end

local function prepareShowMore(options)
	if options.limit and lib.IsOptionTrue(options, 'showmore') then
		options.limit = options.limit + 1
		return true
	end
	return false
end

local function handleShowMore(values, limit, add_more)
	if add_more then
		if #values == limit then
			table.remove(values)
		else
			add_more = false
		end
	end
	return add_more
end

local function makeList(values, options, add_more)
	if add_more then
		table.insert(values, mw.ustring.format(i18n['more-on-Wikidata'], options.id, options.property))
	end
	return mw.text.listToText(values, options.separator, options.conjunction)
end

local function getFormattedStatements(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
	local options = lib.common.cleanArgs(options)

	options.limit = tonumber(options.limit) --TODO default?
	local add_more = false
	if not lib.IsOptionTrue(options, 'compare') then
		add_more = prepareShowMore(options)
	end

	local id = findEntityId(options)
	local statements = getStatements(id, options)

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

	if #statements == 0 then return nil end
	add_more = handleShowMore(statements, options.limit, add_more)

	options.id = id
	-- Format statements and concat them cleanly
	local formattedStatements = formatStatements(statements, options)
	value = makeList(formattedStatements, options, add_more)

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

local function getRawValue(options)
	if options.rank ~= 'best' and options.rank ~= 'preferred' then
		local byRank = mw.ustring.match(options.sort or '', 'rank') and true
		options.sort = lib.textToTable(options.sort or '')
		if not byRank then
			table.insert(options.sort, 1, 'rank')
		end
	end

	for _, statement in ipairs(p.getStatements(options)) do
		local Formatters = require 'Module:Wikidata/Formatters'
		return Formatters.getRawValue(statement.mainsnak, options)
	end
	return nil
end

local function getQualifiers(args)
	if not args.qualifier then
		return error(lib.formatError('param-not-provided', 'qualifier'))
	end
	local all_qualifiers = {}
	for _, statement in ipairs(p.getStatements(args)) do
		if statement.qualifiers then
			local qualifiers = mw.clone(statement.qualifiers[mw.ustring.upper(args.qualifier)] or {})
			local Filterers = require 'Module:Wikidata/Filterers'
			Filterers.filterQualifiers(qualifiers, args)
			for _, q in ipairs(qualifiers) do
				table.insert(all_qualifiers, q)
			end
		end
		if not lib.IsOptionTrue(args, 'all') then
			return all_qualifiers
		end
	end
	return all_qualifiers
end

----- API pro šablony -----

function p.dumpWikidataEntity(frame)
	local args = getArgs(frame, { removeBlanks = true })

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

function p.getBadges(frame)
	local args = getArgs(frame, { removeBlanks = true })
	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 Formatters = require 'Module:Wikidata/Formatters'
		for _, badge in ipairs(entity.sitelinks[site].badges) do
			table.insert(Badges, Formatters.formatRawValue(badge, 'wikibase-entityid'))
		end
	end
	return table.concat( Badges, ', ' )
end

function p.getLabel(frame)
	local args = getArgs(frame, { removeBlanks = true })
	local id = findEntityId(args)
	if not id then
		return nil
	end
	local lang = args.lang
	local code = mw.language.getContentLanguage():getCode()
	if not lang or lang == code then
		local label, _ = lib.getLabelInLanguage(id, { code })
		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 = getArgs(frame, { removeBlanks = true })
	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 = getArgs(frame, {
		removeBlanks = true,
		frameOnly = true,
	})
	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

	args.limit = tonumber(args.limit)
	local add_more = prepareShowMore(args)

	local Aliases = {}
	for i, alias in ipairs(entity.aliases[lang]) do
		if not args.limit or i <= args.limit then
			table.insert(Aliases, alias.value)
		else break end
	end
	add_more = handleShowMore(Aliases, args.limit, add_more)
	local list = makeList(Aliases, args, add_more)
	return lib.addWdClass(list)
end

function p.getId(frame)
	local args = getArgs(frame, {
		removeBlanks = true,
		frameOnly = false,
		parentFirst = false
	})

	if not args[1] then
		return mw.wikibase.getEntityIdForCurrentPage()
	end

	for _, titleString in ipairs(args) do
		local id = getIdFromTitle(titleString)
		if id then
			return id
		end
	end
	return nil
end

function p.getSitelink(frame)
	return getSitelink(getArgs(frame, {
		removeBlanks = true,
		frameOnly = true,
	}))
end

function p.formatStatements(frame)
	local args = getArgs(frame, {
		removeBlanks = false, -- todo
		frameOnly = true,
	})
	local parent_args = getArgs(frame:getParent(), { removeBlanks = true })
	local add
	if parent_args.item and not args.id then
		args.id = parent_args.item
		add = lib.category('arbitrary-data')
	end
	local value = getFormattedStatements(args)
	if add and value then
		return value .. add
	end
	return value
end

function p.formatStatementsFromTemplate(frame)
	local args = getArgs(frame, {
		frameOnly = false,
		parentOnly = false,
		parentFirst = false,
	})
	return getFormattedStatements(args)
end

function p.getCount(frame)
	local args = getArgs(frame, {
		removeBlanks = true,
		frameOnly = true,
	})
	args.limit = nil
	return #p.getStatements(args)
end

function p.getRawValue(frame)
	return getRawValue(getArgs(frame, {
		removeBlanks = true,
		frameOnly = true,
	}))
end

function p.getQualifier(frame)
	local args = getArgs(frame, {
		removeBlanks = true,
		frameOnly = true,
	})
	args.limit = tonumber(args.limit)
	local add_more = prepareShowMore(args)
	local limit = args.limit
	args.limit = 1
	args.isQualifier = true
	if not args['qualifiers limit'] then
		args['qualifiers limit'] = limit
	end
	local qualifiers = getQualifiers(args)
	if #qualifiers == 0 then
		return nil
	end

	add_more = handleShowMore(qualifiers, limit, add_more)
	local Formatters = require 'Module:Wikidata/Formatters'
	local formattedQualifiers = {}
	for _, qualifier in ipairs(qualifiers) do
		table.insert(formattedQualifiers, Formatters.getFormattedValue(qualifier, args))
	end

	local value = makeList(formattedQualifiers, args, add_more)
	return lib.addWdClass(value)
end

function p.getRawQualifier(frame)
	local args = getArgs(frame, {
		removeBlanks = true,
		frameOnly = true,
	})
	local limit = args.limit and tonumber(args.limit)
	args.limit = 1
	for _, qualifier in ipairs(getQualifiers(args)) do
		local Formatters = require 'Module:Wikidata/Formatters'
		return Formatters.getRawValue(qualifier)
	end
	return nil
end

function p.formatEntity(frame)
	local args = getArgs(frame, {
		removeBlanks = true,
		frameOnly = true,
	})
	args.id = args.id or p.getCurrentId()
	if args.id then
		local Formatters = require 'Module:Wikidata/Formatters'
		return Formatters.formatRawValue(args.id, 'wikibase-entityid', args)
	end
	return nil
end

function p.compareStatements(frame)
	local args = getArgs(frame, {
		removeBlanks = true,
		frameOnly = true,
	})
	if not args.value then
		return nil
	end
	local statements = p.getStatements(args)
	local compare = require 'Module:Wikidata/compare'
	return compare.compareValues(args.value, statements, args)
end

----- API pro moduly -----

p.getCurrentId = mw.wikibase.getEntityIdForCurrentPage

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

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

function p.getStatements(args)
	local id = findEntityId(args)
	return getStatements(id, args)
end

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

p.formatStatementsTable = formatStatements

return p