<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ml">
	<id>https://schoolwiki.in/index.php?action=history&amp;feed=atom&amp;title=%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82%3AWikidata</id>
	<title>ഘടകം:Wikidata - നാൾവഴി</title>
	<link rel="self" type="application/atom+xml" href="https://schoolwiki.in/index.php?action=history&amp;feed=atom&amp;title=%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82%3AWikidata"/>
	<link rel="alternate" type="text/html" href="https://schoolwiki.in/index.php?title=%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82:Wikidata&amp;action=history"/>
	<updated>2026-05-13T12:41:32Z</updated>
	<subtitle>വിക്കിയിൽ ഈ താളിന്റെ നാൾവഴി</subtitle>
	<generator>MediaWiki 1.43.4</generator>
	<entry>
		<id>https://schoolwiki.in/index.php?title=%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82:Wikidata&amp;diff=2507737&amp;oldid=prev</id>
		<title>Ranjithsiji: ഒരു പതിപ്പ് ഇറക്കുമതി ചെയ്തു</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.in/index.php?title=%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82:Wikidata&amp;diff=2507737&amp;oldid=prev"/>
		<updated>2024-06-27T12:02:34Z</updated>

		<summary type="html">&lt;p&gt;ഒരു പതിപ്പ് ഇറക്കുമതി ചെയ്തു&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ml&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←പഴയ രൂപം&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;17:32, 27 ജൂൺ 2024-നു നിലവിലുണ്ടായിരുന്ന രൂപം&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;ml&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(വ്യത്യാസം ഇല്ല)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key schoolwiki_db-sch_:diff:1.41:old-2507736:rev-2507737 --&gt;
&lt;/table&gt;</summary>
		<author><name>Ranjithsiji</name></author>
	</entry>
	<entry>
		<id>https://schoolwiki.in/index.php?title=%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82:Wikidata&amp;diff=2507736&amp;oldid=prev</id>
		<title>en&gt;MusikBot II: Changed protection settings for &quot;Module:Wikidata&quot;: High-risk template or module (more info) ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://schoolwiki.in/index.php?title=%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82:Wikidata&amp;diff=2507736&amp;oldid=prev"/>
		<updated>2024-02-18T18:04:55Z</updated>

		<summary type="html">&lt;p&gt;Changed protection settings for &amp;quot;&lt;a href=&quot;/%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82:Wikidata&quot; title=&quot;ഘടകം:Wikidata&quot;&gt;Module:Wikidata&lt;/a&gt;&amp;quot;: High-risk template or module (&lt;a href=&quot;/index.php?title=%E0%B4%89%E0%B4%AA%E0%B4%AF%E0%B5%8B%E0%B4%95%E0%B5%8D%E0%B4%A4%E0%B4%BE%E0%B4%B5%E0%B5%8D:MusikBot_II/TemplateProtector&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;ഉപയോക്താവ്:MusikBot II/TemplateProtector (ഇതുവരെ എഴുതപ്പെട്ടിട്ടില്ല)&quot;&gt;more info&lt;/a&gt;) ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;പുതിയ താൾ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--script that retrieves basic data stored in Wikidata, for the datamodel, see https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local linguistic = require(&amp;#039;Module:Linguistic&amp;#039;)&lt;br /&gt;
--local formatDate = require(&amp;#039;Module:Complex date&amp;#039;) only loaded when needed to save memory in large pages like Wikidata:List of properties/all&lt;br /&gt;
local fb = require(&amp;#039;Module:Fallback&amp;#039;)&lt;br /&gt;
local i18nmessages = mw.loadData(&amp;#039;Module:i18n/wikidata&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Wiki-specific parameters&lt;br /&gt;
local defaultlang = mw.getCurrentFrame():preprocess(&amp;quot;{{int:lang}}&amp;quot;)&lt;br /&gt;
local defaultlink = &amp;#039;wikidata&amp;#039;&lt;br /&gt;
&lt;br /&gt;
local function i18n(str)&lt;br /&gt;
	local message = i18nmessages[str]&lt;br /&gt;
	if type(message) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		return message&lt;br /&gt;
	end&lt;br /&gt;
	return fb._langSwitch(message, defaultlang) .. &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatError( key, text )&lt;br /&gt;
	return error(i18n(key) .. (text or &amp;#039;&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addTrackingCat(prop, cat)&lt;br /&gt;
	if not prop and not cat then&lt;br /&gt;
		return error(&amp;quot;no property provided&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if not cat then&lt;br /&gt;
		cat = i18nmessages.trackingcat .. &amp;#039;/&amp;#039; .. string.upper(prop)&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;[[Category:&amp;#039; .. cat .. &amp;#039;]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removeBlanks(args)&lt;br /&gt;
	for i, j in pairs(args) do -- does not work ??&lt;br /&gt;
		if (j == &amp;#039;&amp;#039;) or (j == &amp;#039;-&amp;#039;) then args[i] = nil end&lt;br /&gt;
	end&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatTheUnknown() -- voir si on peut accorder/adapter l&amp;#039;usage de &amp;quot;inconnu&amp;quot;&lt;br /&gt;
	return i18n(&amp;#039;somevalue&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isSpecial(snak)&lt;br /&gt;
	return snak.snaktype ~= &amp;#039;value&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function sameValue(snak, target)&lt;br /&gt;
	return not isSpecial(snak) and p.getRawvalue(snak) == target&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function showLang(statement, str) -- TODO (not yet in proper format)&lt;br /&gt;
	--adds a lang indication at the start of the string, based on data in statement&lt;br /&gt;
	local mainsnak = statement.mainsnak&lt;br /&gt;
	if isSpecial(mainsnak) then&lt;br /&gt;
		return str&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local langlist = {}&lt;br /&gt;
	if mainsnak.datavalue.type == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
		langlist = {mainsnak.datavalue.value.language}&lt;br /&gt;
	elseif statement.qualifiers and statement.qualifiers.P407 then&lt;br /&gt;
		local convertlangcode = mw.loadData(&amp;#039;Module:Dictionary/lang codes&amp;#039;)&lt;br /&gt;
		for i, j in pairs( statement.qualifiers.P407 ) do&lt;br /&gt;
			if not isSpecial(j) then&lt;br /&gt;
				local val = convertlangcode[j.datavalue.value[&amp;#039;numeric-id&amp;#039;]]&lt;br /&gt;
				table.insert(langlist, val)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #langlist == 0 then&lt;br /&gt;
		return str&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;(&amp;#039; .. table.concat(langlist) .. &amp;#039;)&amp;#039; .. str&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getEntity( val )&lt;br /&gt;
	if type(val) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
	return mw.wikibase.getEntityObject(val)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- DATE FUNCTIONS&lt;br /&gt;
local function splitTimestamp(timestamp, calendar)&lt;br /&gt;
	local pattern = &amp;quot;(%W)(%d+)%-(%d+)%-(%d+)&amp;quot;&lt;br /&gt;
	local era, year, month, day = timestamp:match(pattern)&lt;br /&gt;
&lt;br /&gt;
	if calendar == &amp;#039;julian&amp;#039; then&lt;br /&gt;
	--todo  year, month, day = formatdate.gregorianToJulian( era .. year, month, day )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return {day = day, month = month, year = year, era = era, timestamp = timestamp, type = &amp;#039;dateobject&amp;#039;}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rangeObject(begin, ending)&lt;br /&gt;
	local timestamp&lt;br /&gt;
	if begin then&lt;br /&gt;
		timestamp = begin.timestamp&lt;br /&gt;
	elseif ending then&lt;br /&gt;
		timestamp = ending.timestamp&lt;br /&gt;
	end&lt;br /&gt;
	return {begin = begin, ending = ending, timestamp = timestamp, type = &amp;#039;rangeobject&amp;#039;}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function dateObject(orig, params) -- transforme un snak en un nouvel objet utilisable par Module:Date complexe&lt;br /&gt;
	if not params then&lt;br /&gt;
		params = {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local newobj = splitTimestamp(orig.time, orig.calendar) -- initalise l&amp;#039;object en mettant la valeur des dates&lt;br /&gt;
&lt;br /&gt;
	newobj.precision = params.precision or orig.precision&lt;br /&gt;
	newobj.type = &amp;#039;dateobject&amp;#039;&lt;br /&gt;
	return newobj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatDatepoint(obj, params) -- TO IMPROVE&lt;br /&gt;
	if not obj then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local formatDate = require(&amp;#039;Module:Complex date&amp;#039;)&lt;br /&gt;
	local lang = params.lang or defaultlang&lt;br /&gt;
	local precision = math.min(obj.precision, params.precision or 15) -- if we don&amp;#039;t want to show the value to its full detail&lt;br /&gt;
	if precision &amp;gt;= 11 then&lt;br /&gt;
		return formatDate.complex_date{args={date1 = obj.year .. &amp;#039;-&amp;#039; .. obj.month .. &amp;#039;-&amp;#039; .. obj.day, lang= lang}}&lt;br /&gt;
	elseif precision == 10 then&lt;br /&gt;
		return formatDate.complex_date{args={date1 = obj.year .. &amp;#039;-&amp;#039; .. obj.month, lang= lang}}&lt;br /&gt;
	elseif precision == 9 then&lt;br /&gt;
		return formatDate.complex_date{args={date1 = tostring(obj.year), lang= lang}}&lt;br /&gt;
	elseif precision == 8 then&lt;br /&gt;
		return formatDate.complex_date{args={date1 = string.sub(tostring(obj.year), 1, 3) .. &amp;#039;0&amp;#039;, lang = lang, precision = &amp;#039;decade&amp;#039;}}&lt;br /&gt;
	elseif precision == 7 then&lt;br /&gt;
		return formatDate.complex_date{args={date1 = string.sub(tostring(obj.year + 100), 1, 2), lang = lang, precision = &amp;#039;century&amp;#039;}}&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatDaterange(obj, params) --TODO&lt;br /&gt;
	local begin = formatDatepoint(obj.begin, params) or &amp;#039;&amp;#039;&lt;br /&gt;
	local ending = formatDatepoint(obj.ending, params) or &amp;#039;&amp;#039;&lt;br /&gt;
	return begin .. &amp;#039;-&amp;#039; .. ending&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function objectToText(obj, params)&lt;br /&gt;
	if obj.type == &amp;#039;dateobject&amp;#039; then&lt;br /&gt;
		return formatDatepoint(obj, params)&lt;br /&gt;
	elseif obj.type == &amp;#039;rangeobject&amp;#039; then&lt;br /&gt;
		return formatDaterange(obj, params)&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tableToText(values, params) -- takes a list of already formatted values and make them a text&lt;br /&gt;
	if not values then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return linguistic.conj(values, params.lang or defaultlang, params.conjtype)--linguistic.conj( values, params.lang, params.conjtype )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getDate(obj)&lt;br /&gt;
--[[&lt;br /&gt;
returns an object containing a timestamp for easy sorting, and other data&lt;br /&gt;
	possible types of object:&lt;br /&gt;
		dateobject&lt;br /&gt;
			{timestamp = string, year = number, month = number, day = number, calendar = string}&lt;br /&gt;
		rangeobject&lt;br /&gt;
			{timestamp = string, begin = dateobject, ending = dateobject}&lt;br /&gt;
]]--&lt;br /&gt;
	if not obj then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if type(obj) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		obj = p.getEntity(obj)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- if obj is a statement with date, get it&lt;br /&gt;
	if obj.mainsnak and not isSpecial(obj.mainsnak) and obj.mainsnak.datatype == &amp;#039;time&amp;#039; then&lt;br /&gt;
		return dateObject(obj.mainsnak.datavalue.value)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- else preload relevant data&lt;br /&gt;
	local qualifs = obj.qualifiers -- when obj is a statement, look in qualifiers&lt;br /&gt;
	local claims = obj.claims -- when obj is an item, look in claims&lt;br /&gt;
&lt;br /&gt;
	local pointprop = {&amp;#039;P585&amp;#039;, &amp;#039;P571&amp;#039;} -- dates corresponding to a punctual fact&lt;br /&gt;
	local beginprop = {&amp;#039;P580&amp;#039;, &amp;#039;P569&amp;#039;} -- start date, birth date == start of a date range&lt;br /&gt;
	local endingprop = {&amp;#039;P582&amp;#039;, &amp;#039;P570&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
	local function getval(prop)&lt;br /&gt;
		local val&lt;br /&gt;
		if claims and claims[prop] and not isSpecial(claims[prop][1].mainsnak) then&lt;br /&gt;
			val = claims[prop][1].mainsnak.datavalue.value&lt;br /&gt;
		elseif qualifs and qualifs[prop] and not isSpecial(qualifs[prop][1]) then&lt;br /&gt;
			val = qualifs[prop][1].datavalue.value&lt;br /&gt;
		end&lt;br /&gt;
		if val then&lt;br /&gt;
			return dateObject(val)&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i, prop in pairs(pointprop) do&lt;br /&gt;
		local val = getval(prop)&lt;br /&gt;
		if val then return val end&lt;br /&gt;
	end&lt;br /&gt;
	--if no date has not been found, look for startdate or enddate&lt;br /&gt;
	local begin, ending&lt;br /&gt;
	for i, prop in pairs(beginprop) do&lt;br /&gt;
		begin = getval(prop)&lt;br /&gt;
		if begin then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for i, prop in pairs(endingprop) do&lt;br /&gt;
		ending = getval(prop)&lt;br /&gt;
		if ending then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if begin or ending then&lt;br /&gt;
		return rangeObject(begin, ending)&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getFormattedDate(statement, params)&lt;br /&gt;
	local datetable = p.getDate(statement)&lt;br /&gt;
	if not datetable then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return objectToText(datetable, params)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasTargetValue(claim, target)&lt;br /&gt;
	if target == nil then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return sameValue(claim.mainsnak, target)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasRank(claim, target)&lt;br /&gt;
	if target == &amp;#039;valid&amp;#039; then&lt;br /&gt;
		return hasRank(claim, &amp;#039;preferred&amp;#039;) or hasRank(claim, &amp;#039;normal&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return claim.rank == target&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function bestRanked(claims)&lt;br /&gt;
	if not claims then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local preferred, normal = {}, {}&lt;br /&gt;
	for _, j in ipairs(claims) do&lt;br /&gt;
		if j.rank == &amp;#039;preferred&amp;#039; then&lt;br /&gt;
			table.insert(preferred, j)&lt;br /&gt;
		elseif j.rank == &amp;#039;normal&amp;#039; then&lt;br /&gt;
			table.insert(normal, j)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #preferred &amp;gt; 0 then&lt;br /&gt;
		return preferred&lt;br /&gt;
	else&lt;br /&gt;
		return normal&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasQualifier(claim, qualifier, qualifiervalues)&lt;br /&gt;
	if not qualifier then -- si aucun qualificatif est demandé, ça passe&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	qualifier = string.upper(qualifier)&lt;br /&gt;
	if not claim.qualifiers or not claim.qualifiers[qualifier] then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if type(qualifiervalues) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		qualifiervalues = mw.text.split(qualifiervalues, &amp;#039;,&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (not qualifiervalues) or (qualifiervalues == {}) then&lt;br /&gt;
		return true -- si aucune valeur spécifique n&amp;#039;est exigée&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for _, j in ipairs(claim.qualifiers[qualifier]) do&lt;br /&gt;
		for _, l in ipairs(qualifiervalues) do&lt;br /&gt;
			if p.sameValue(j, l) then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
local function hasSource(statement, source, sourceproperty)&lt;br /&gt;
	if not statement.references then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	sourceproperty = string.upper(sourceproperty or &amp;#039;P248&amp;#039;)&lt;br /&gt;
	local sourcevalue = string.upper(source or &amp;#039;&amp;#039;)&lt;br /&gt;
	for _, ref in ipairs(statement.references) do&lt;br /&gt;
		for prop, content in pairs(ref.snaks) do&lt;br /&gt;
			if prop == sourceproperty then&lt;br /&gt;
				if sourcevalue == &amp;#039;&amp;#039; then&lt;br /&gt;
					return true&lt;br /&gt;
				else&lt;br /&gt;
					for _, k in ipairs(content) do&lt;br /&gt;
						if sameValue(k, source) then&lt;br /&gt;
							return true&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasDate(statement)&lt;br /&gt;
	if not statement.qualifiers then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local dateprops = {&amp;#039;P580&amp;#039;, &amp;#039;P585&amp;#039;, &amp;#039;P582&amp;#039;}&lt;br /&gt;
	for i, prop in pairs(dateprops) do&lt;br /&gt;
		if statement.qualifiers[prop] then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isInLanguage(snak, lang) -- ne fonctionne que pour les monolingualtext / étendre aux autres types en utilisant les qualifiers ?&lt;br /&gt;
	return not isSpecial(snak) and snak.datavalue.type == &amp;#039;monolingualtext&amp;#039; and snak.datavalue.value.language == lang&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function numval(claims, numval) -- retourn les numval premières valeurs de la table claims&lt;br /&gt;
	local numval = tonumber(numval) or 0 -- raise an error if numval is not a positive integer ?&lt;br /&gt;
	if #claims &amp;lt;= numval then&lt;br /&gt;
		return claims&lt;br /&gt;
	end&lt;br /&gt;
	local newclaims = {}&lt;br /&gt;
	while #newclaims &amp;lt; numval do&lt;br /&gt;
		table.insert(newclaims, claims[#newclaims + 1])&lt;br /&gt;
	end&lt;br /&gt;
	return newclaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function wikipediaLink(entity, lang)&lt;br /&gt;
	local link&lt;br /&gt;
&lt;br /&gt;
	local lg = string.gsub(lang, &amp;#039;-&amp;#039;, &amp;#039;_&amp;#039;)&lt;br /&gt;
	if (lg == &amp;#039;be_tarask&amp;#039;) then lg = &amp;#039;be_x_old&amp;#039; end&lt;br /&gt;
	if (lg == &amp;#039;nb&amp;#039;) then lg = &amp;#039;no&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
	if type(entity) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		link = entity:getSitelink(lg .. &amp;#039;wiki&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		link = mw.wikibase.getSitelink(entity, lg .. &amp;#039;wiki&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if link then&lt;br /&gt;
		return &amp;#039;:&amp;#039; .. lang .. &amp;#039;:&amp;#039; .. link&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLink(entity, typelink, lang)&lt;br /&gt;
	if typelink == &amp;#039;wikidata&amp;#039; then&lt;br /&gt;
		if type(entity) == &amp;#039;table&amp;#039; then&lt;br /&gt;
			if entity.type == &amp;#039;property&amp;#039; then&lt;br /&gt;
				return &amp;#039;d:P:&amp;#039; .. entity.id&lt;br /&gt;
			elseif entity.type == &amp;#039;lexeme&amp;#039; then&lt;br /&gt;
				return &amp;#039;d:L:&amp;#039; .. entity.id&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;#039;d:&amp;#039; .. entity.id&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if string.sub(entity, 1, 1) == &amp;#039;P&amp;#039; then&lt;br /&gt;
				return &amp;#039;d:P:&amp;#039; .. entity&lt;br /&gt;
			elseif string.sub(entity, 1, 1) == &amp;#039;L&amp;#039; then&lt;br /&gt;
				return &amp;#039;d:L:&amp;#039; .. entity&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;#039;d:&amp;#039; .. entity&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif typelink == &amp;#039;wikipedia&amp;#039; then&lt;br /&gt;
		return wikipediaLink(entity, lang or defaultlang)&lt;br /&gt;
&lt;br /&gt;
	elseif typelink == &amp;#039;anywikipedia&amp;#039; then&lt;br /&gt;
		for _, lg in ipairs(fb.fblist(lang or defaultlang, true)) do&lt;br /&gt;
			local link = wikipediaLink(entity, lg)&lt;br /&gt;
			&lt;br /&gt;
			if link then&lt;br /&gt;
				return link&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- Last fallback language is ever &amp;#039;en&amp;#039;. For entities which don’t have&lt;br /&gt;
		-- English Wikipedia pages, we should return any siteLink here, but&lt;br /&gt;
		-- `getSiteLinkList()` is not exposed in Lua API.&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.comparedate(a, b) -- returns true if a is earlier than B or if a has a date but not b&lt;br /&gt;
	if a and b then&lt;br /&gt;
		return a.timestamp &amp;lt; b.timestamp&lt;br /&gt;
	elseif a then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.chronosort(objs, inverted)&lt;br /&gt;
	table.sort(objs, function(a, b)&lt;br /&gt;
		local timeA = p.getDate(a)&lt;br /&gt;
		local timeB = p.getDate(b)&lt;br /&gt;
		if inverted then&lt;br /&gt;
			return p.comparedate(timeB, timeA)&lt;br /&gt;
		else&lt;br /&gt;
			return p.comparedate(timeA, timeB)&lt;br /&gt;
		end&lt;br /&gt;
	end)&lt;br /&gt;
&lt;br /&gt;
	return objs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sortclaims(claims, sorttype)&lt;br /&gt;
	if type(sorttype) == &amp;#039;function&amp;#039; then&lt;br /&gt;
		table.sort(claims, sorttype)&lt;br /&gt;
	elseif sorttype == &amp;#039;chronological&amp;#039; then&lt;br /&gt;
		return p.chronosort(claims)&lt;br /&gt;
	elseif sorttype == &amp;#039;inverted&amp;#039; then&lt;br /&gt;
		return p.chronosort(claims, true)&lt;br /&gt;
	end&lt;br /&gt;
	return claims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getRawvalue(snak)&lt;br /&gt;
	return p.getDatavalue(snak, { displayformat = &amp;#039;raw&amp;#039; })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.showentity(entity, lang)&lt;br /&gt;
	if not entity then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local label, link, id = p._getLabel(entity, lang), getLink(entity, &amp;#039;wikidata&amp;#039;)&lt;br /&gt;
	if type(entity) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		id = entity.id&lt;br /&gt;
	else&lt;br /&gt;
		id = entity&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;#039;[[&amp;#039; .. link .. &amp;#039;|&amp;#039; .. label .. &amp;#039;]] &amp;lt;small&amp;gt;(&amp;#039; .. id .. &amp;#039;)&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getDatavalue(snak, params)&lt;br /&gt;
	if isSpecial(snak) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not params then&lt;br /&gt;
		params = {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local displayformat = params.displayformat&lt;br /&gt;
	local datatype = snak.datavalue.type&lt;br /&gt;
	local value = snak.datavalue.value&lt;br /&gt;
&lt;br /&gt;
	if datatype == &amp;#039;wikibase-entityid&amp;#039; then&lt;br /&gt;
		if type(displayformat) == &amp;#039;function&amp;#039; then&lt;br /&gt;
			return displayformat(snak, params)&lt;br /&gt;
		end&lt;br /&gt;
		local id = snak.datavalue.value.id&lt;br /&gt;
		if displayformat == &amp;#039;raw&amp;#039; then&lt;br /&gt;
			return id&lt;br /&gt;
		elseif displayformat == &amp;#039;wikidatastyle&amp;#039; then&lt;br /&gt;
			return p.showentity(id, params.lang)&lt;br /&gt;
		else&lt;br /&gt;
			return p.formatEntity(id, params)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif datatype == &amp;#039;string&amp;#039; then&lt;br /&gt;
		local showntext = params.showntext&lt;br /&gt;
		if displayformat == &amp;#039;weblink&amp;#039; then&lt;br /&gt;
			if showntext then&lt;br /&gt;
				return &amp;#039;[&amp;#039; .. value .. &amp;#039; &amp;#039; .. showntext .. &amp;#039;]&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				return value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if snak.datatype == &amp;#039;math&amp;#039; and displayformat ~= &amp;#039;raw&amp;#039; then&lt;br /&gt;
			value = mw.getCurrentFrame():extensionTag(&amp;#039;math&amp;#039;, value)&lt;br /&gt;
		else&lt;br /&gt;
			if params.urlpattern then&lt;br /&gt;
				showntext = mw.text.nowiki(showntext or value)&lt;br /&gt;
				value = mw.ustring.gsub(value, &amp;#039;%%&amp;#039;, &amp;#039;%%%%&amp;#039;) -- escape &amp;#039;%&amp;#039;&lt;br /&gt;
				value = &amp;#039;[&amp;#039; .. mw.ustring.gsub(mw.ustring.gsub(params.urlpattern, &amp;#039;$1&amp;#039;, value), &amp;#039; &amp;#039;, &amp;#039;%%20&amp;#039;) .. &amp;#039; &amp;#039; .. showntext .. &amp;#039;]&amp;#039;&lt;br /&gt;
			elseif params.pattern then&lt;br /&gt;
				local pattern = mw.ustring.gsub(params.pattern, &amp;#039;%%&amp;#039;, &amp;#039;%%%%&amp;#039;)&lt;br /&gt;
				value = mw.ustring.gsub(value, &amp;#039;%%&amp;#039;, &amp;#039;%%%%&amp;#039;)&lt;br /&gt;
				value = mw.ustring.gsub(pattern, &amp;#039;$1&amp;#039;, value)&lt;br /&gt;
			else&lt;br /&gt;
				if displayformat ~= &amp;#039;raw&amp;#039; then&lt;br /&gt;
					value = mw.text.nowiki(value)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return value&lt;br /&gt;
&lt;br /&gt;
	elseif datatype == &amp;#039;time&amp;#039; then -- format example: +00000001809-02-12T00:00:00Z&lt;br /&gt;
		if displayformat == &amp;#039;raw&amp;#039; then&lt;br /&gt;
			return value.time&lt;br /&gt;
		else&lt;br /&gt;
			return objectToText(dateObject(value), params)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif datatype == &amp;#039;globecoordinate&amp;#039; then&lt;br /&gt;
		-- retourne une table avec clés latitude, longitude, précision et globe à formater par un autre module (à changer ?)&lt;br /&gt;
		if displayformat == &amp;#039;latitude&amp;#039; then&lt;br /&gt;
			return value.latitude&lt;br /&gt;
		elseif displayformat == &amp;#039;longitude&amp;#039; then&lt;br /&gt;
			return value.longitude&lt;br /&gt;
		elseif displayformat == &amp;#039;qualifier&amp;#039; then&lt;br /&gt;
			local coord = require &amp;#039;Module:Coordinates&amp;#039;&lt;br /&gt;
			value.globe = mw.loadData(&amp;#039;Module:Wikidata/Globes&amp;#039;)[value.globe]&lt;br /&gt;
			value.precision = nil&lt;br /&gt;
			return coord._coord(value)&lt;br /&gt;
		else&lt;br /&gt;
			value.globe = mw.loadData(&amp;#039;Module:Wikidata/Globes&amp;#039;)[value.globe] -- transforme l&amp;#039;ID du globe en nom anglais utilisable par geohack&lt;br /&gt;
			return value -- note : les coordonnées Wikidata peuvent être utilisée depuis Module:Coordinates. Faut-il aussi autoriser à appeler Module:Coordiantes ici ?&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif datatype == &amp;#039;quantity&amp;#039; then -- todo : gérer les paramètre précision&lt;br /&gt;
		if displayformat == &amp;#039;raw&amp;#039; then&lt;br /&gt;
			return tonumber(value.amount)&lt;br /&gt;
		else&lt;br /&gt;
			local formatNum = require &amp;#039;Module:Formatnum&amp;#039;&lt;br /&gt;
			local number = formatNum.formatNum(value.amount, params.lang)&lt;br /&gt;
			local unit = mw.ustring.match(value.unit, &amp;#039;(Q%d+)&amp;#039;)&lt;br /&gt;
			if unit then&lt;br /&gt;
				number = number .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. p.formatEntity(unit, params)&lt;br /&gt;
			end&lt;br /&gt;
			return number&lt;br /&gt;
		end&lt;br /&gt;
	elseif datatype == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;lt;span lang=&amp;quot;&amp;#039; .. value.language .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; .. value.text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return formatError( &amp;#039;unknown-datavalue-type&amp;#039;, datatype )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getMultipleClaims(args)&lt;br /&gt;
	local newargs = args&lt;br /&gt;
	local claims = {}&lt;br /&gt;
	for i, j in pairs(args.property) do&lt;br /&gt;
		newargs.property = j&lt;br /&gt;
		local newclaims = p.getClaims(args)&lt;br /&gt;
		if newclaims then&lt;br /&gt;
			for k, l in pairs(newclaims) do&lt;br /&gt;
				table.insert(claims, l)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return claims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getClaims( args ) -- returns a table of the claims matching some conditions given in args&lt;br /&gt;
	args = removeBlanks(args)&lt;br /&gt;
	if not args.property then&lt;br /&gt;
		return formatError( &amp;#039;property-param-not-provided&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	if type(args.property) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		return getMultipleClaims(args)&lt;br /&gt;
	end&lt;br /&gt;
	--Get entity&lt;br /&gt;
	if args.item then -- synonyms&lt;br /&gt;
		args.entity = args.item&lt;br /&gt;
	end&lt;br /&gt;
	local property = string.upper(args.property)&lt;br /&gt;
	local allClaims&lt;br /&gt;
	local entity = args.entity&lt;br /&gt;
	if type(entity) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		allClaims = (entity and entity.claims and entity.claims[property]) or {}&lt;br /&gt;
	else&lt;br /&gt;
		allClaims = mw.wikibase.getAllStatements(entity, property)&lt;br /&gt;
	end&lt;br /&gt;
	if #allClaims == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not args.rank then&lt;br /&gt;
		args.rank = &amp;#039;best&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local claims = {}&lt;br /&gt;
	for _, statement in ipairs(allClaims) do&lt;br /&gt;
		if&lt;br /&gt;
			(&lt;br /&gt;
			not args.excludespecial&lt;br /&gt;
			or&lt;br /&gt;
			not (isSpecial(statement.mainsnak))&lt;br /&gt;
		)&lt;br /&gt;
		and&lt;br /&gt;
		(&lt;br /&gt;
			not args.targetvalue&lt;br /&gt;
			or&lt;br /&gt;
			hasTargetValue(statement, args.targetvalue)&lt;br /&gt;
		)&lt;br /&gt;
		and&lt;br /&gt;
		(&lt;br /&gt;
			not args.qualifier&lt;br /&gt;
			or&lt;br /&gt;
			hasQualifier(statement, args.qualifier, args.qualifiervalues or args.qualifiervalue)&lt;br /&gt;
		)&lt;br /&gt;
		and&lt;br /&gt;
		(&lt;br /&gt;
			not args.withsource or args.withsource == &amp;#039;-&amp;#039;&lt;br /&gt;
			or&lt;br /&gt;
			hasSource(statement, args.withsource, args.sourceproperty)&lt;br /&gt;
		)&lt;br /&gt;
		and&lt;br /&gt;
		(&lt;br /&gt;
			not args.isinlanguage&lt;br /&gt;
			or&lt;br /&gt;
			isInLanguage(statement.mainsnak, args.isinlanguage)&lt;br /&gt;
		)&lt;br /&gt;
		and&lt;br /&gt;
		(&lt;br /&gt;
			args.rank == &amp;#039;best&amp;#039; -- rank == best est traité à a fin&lt;br /&gt;
			or&lt;br /&gt;
			hasRank(statement, args.rank)&lt;br /&gt;
		)&lt;br /&gt;
		then&lt;br /&gt;
			table.insert(claims, statement)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #claims == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if args.rank == &amp;#039;best&amp;#039; then&lt;br /&gt;
		claims = bestRanked(claims)&lt;br /&gt;
	end&lt;br /&gt;
	if args.sorttype then&lt;br /&gt;
		claims = p.sortclaims(claims, args.sorttype)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.numval then&lt;br /&gt;
		return numval(claims, args.numval)&lt;br /&gt;
	end&lt;br /&gt;
	return claims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatClaimList(claims, args)&lt;br /&gt;
	if not claims then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	for i, j in pairs(claims) do&lt;br /&gt;
		claims[i] = p.formatStatement(j, args)&lt;br /&gt;
	end&lt;br /&gt;
	return claims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.stringTable(args) -- like getClaims, but get a list of string rather than a list of snaks, for easier manipulation&lt;br /&gt;
	local claims = p.getClaims(args)&lt;br /&gt;
	return p.formatClaimList(claims, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getQualifiers(statement, qualifs, params)&lt;br /&gt;
	if not statement.qualifiers then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for i, j in pairs(qualifs) do&lt;br /&gt;
		j = string.upper(j)&lt;br /&gt;
		if statement.qualifiers[j] then&lt;br /&gt;
			local inserted = false&lt;br /&gt;
			if statement.qualifiers[j][1].datatype == &amp;#039;monolingualtext&amp;#039; then&lt;br /&gt;
				local in_preferred_lang&lt;br /&gt;
				for _, language in ipairs(fb.fblist(params.lang or defaultlang, true)) do&lt;br /&gt;
					for _, snak in ipairs(statement.qualifiers[j]) do&lt;br /&gt;
						if isInLanguage(snak, language) then&lt;br /&gt;
							in_preferred_lang = snak&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					if in_preferred_lang then&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if in_preferred_lang then&lt;br /&gt;
					table.insert(vals, in_preferred_lang)&lt;br /&gt;
					inserted = true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not inserted then&lt;br /&gt;
				for _, snak in pairs(statement.qualifiers[j]) do&lt;br /&gt;
					table.insert(vals, snak)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #vals == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return vals&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getFormattedQualifiers(statement, qualifs, params)&lt;br /&gt;
	if not params then params = {} end&lt;br /&gt;
	local qualiftable = getQualifiers(statement, qualifs, params)&lt;br /&gt;
	if not qualiftable then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	for i, j in pairs(qualiftable) do&lt;br /&gt;
		local params = params&lt;br /&gt;
		if j.datatype == &amp;#039;globe-coordinate&amp;#039; then&lt;br /&gt;
			params.displayformat = &amp;#039;qualifier&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		qualiftable[i] = p.formatSnak(j, params)&lt;br /&gt;
	end&lt;br /&gt;
	return linguistic.conj(qualiftable, params.lang or defaultlang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatStatement( statement, args )&lt;br /&gt;
	if not statement.type or statement.type ~= &amp;#039;statement&amp;#039; then&lt;br /&gt;
		return formatError( &amp;#039;unknown-claim-type&amp;#039;, statement.type )&lt;br /&gt;
	end&lt;br /&gt;
	if not args then args = {} end&lt;br /&gt;
	local lang = args.lang or defaultlang&lt;br /&gt;
	local str = p.formatSnak( statement.mainsnak, args )&lt;br /&gt;
	if args.showlang == true then&lt;br /&gt;
		str = showLang(statement, str)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local qualifs = args.showqualifiers&lt;br /&gt;
	if qualifs then&lt;br /&gt;
		if type(qualifs) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			qualifs = mw.text.split(qualifs, &amp;#039;,&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local foundvalues = p.getFormattedQualifiers(statement, qualifs, args)&lt;br /&gt;
		if foundvalues then&lt;br /&gt;
			if args.delimiter then&lt;br /&gt;
				str = str .. args.delimiter .. foundvalues&lt;br /&gt;
			else&lt;br /&gt;
				str = str .. linguistic.inparentheses(foundvalues, lang)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.showdate then -- when &amp;quot;showdate and p.chronosort are both set, date retrieval is performed twice&lt;br /&gt;
		local timedata = p.getDate(statement)&lt;br /&gt;
		if timedata then&lt;br /&gt;
			local formatteddate = objectToText(timedata, args)&lt;br /&gt;
			formatteddate = linguistic.inparentheses(formatteddate, lang)&lt;br /&gt;
			str = str .. &amp;#039;&amp;lt;small&amp;gt;&amp;#039; .. formatteddate ..&amp;#039;&amp;lt;/small&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args.showsource and statement.references then&lt;br /&gt;
		local cite = require &amp;#039;Module:Cite&amp;#039;&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local sourcestring = &amp;#039;&amp;#039;&lt;br /&gt;
		for _, ref in ipairs(statement.references) do&lt;br /&gt;
			if ref.snaks.P248 then&lt;br /&gt;
				for j, source in pairs(ref.snaks.P248) do&lt;br /&gt;
					if not isSpecial(source) then&lt;br /&gt;
						local page&lt;br /&gt;
						if ref.snaks.P304 and not isSpecial(ref.snaks.P304[1]) then&lt;br /&gt;
							page = ref.snaks.P304[1].datavalue.value&lt;br /&gt;
						end&lt;br /&gt;
						local s = cite.citeitem(source.datavalue.value.id, lang, page)&lt;br /&gt;
						s = frame:extensionTag( &amp;#039;ref&amp;#039;, s )&lt;br /&gt;
						sourcestring = sourcestring .. s&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			elseif ref.snaks.P854 and not isSpecial(ref.snaks.P854[1]) then&lt;br /&gt;
				s = frame:extensionTag( &amp;#039;ref&amp;#039;, p.getDatavalue(ref.snaks.P854[1]) )&lt;br /&gt;
				sourcestring = sourcestring .. s&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		str = str .. sourcestring&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getmainid(claim)&lt;br /&gt;
	if claim and not isSpecial(claim.mainsnak) then&lt;br /&gt;
		return claim.mainsnak.datavalue.value.id&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatSnak(snak, params)&lt;br /&gt;
	--local params = params or {} pour faciliter l&amp;#039;appel depuis d&amp;#039;autres modules&lt;br /&gt;
	if snak.snaktype == &amp;#039;value&amp;#039; then&lt;br /&gt;
		return p.getDatavalue(snak, params)&lt;br /&gt;
	elseif snak.snaktype == &amp;#039;somevalue&amp;#039; then&lt;br /&gt;
		return formatTheUnknown()&lt;br /&gt;
	elseif snak.snaktype == &amp;#039;novalue&amp;#039; then&lt;br /&gt;
		return i18n(&amp;#039;novalue&amp;#039;) --todo&lt;br /&gt;
	else&lt;br /&gt;
		return formatError( &amp;#039;unknown-snak-type&amp;#039;, snak.snaktype )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function defaultLabel(entity, displayformat) -- label when no label is available&lt;br /&gt;
	if displayformat == &amp;#039;id&amp;#039; then&lt;br /&gt;
		if type(entity) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
			return entity&lt;br /&gt;
		else&lt;br /&gt;
			return entity.id&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return i18n(&amp;#039;no-label&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._getLabel(entity, lang, default, fallback)&lt;br /&gt;
	if not entity then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if not lang then&lt;br /&gt;
		lang = defaultlang&lt;br /&gt;
	end&lt;br /&gt;
	if type(entity) ~= &amp;#039;table&amp;#039; and lang == defaultlang then&lt;br /&gt;
		local label, lg = mw.wikibase.getLabelWithLang(entity)&lt;br /&gt;
		if label and (fallback ~= &amp;#039;-&amp;#039; or lg == lang) then&lt;br /&gt;
			return label&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		entity = p.getEntity(entity)&lt;br /&gt;
		if entity and entity.labels then&lt;br /&gt;
			if fallback ~= &amp;#039;-&amp;#039; then&lt;br /&gt;
				for _, lg in ipairs(fb.fblist(lang, true)) do&lt;br /&gt;
					if entity.labels[lg] then&lt;br /&gt;
						return entity.labels[lg].value&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				if entity.labels[lang] then&lt;br /&gt;
					return entity.labels[lang].value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return defaultLabel(entity, default)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._getDescription(entity, lang, fallback)&lt;br /&gt;
	if not entity then&lt;br /&gt;
		return i18n(&amp;#039;no description&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if not lang then&lt;br /&gt;
		lang = defaultlang&lt;br /&gt;
	end&lt;br /&gt;
	if type(entity) ~= &amp;#039;table&amp;#039; and lang == defaultlang then&lt;br /&gt;
		local description, lg = mw.wikibase.getDescriptionWithLang(entity)&lt;br /&gt;
		if description and (fallback ~= &amp;#039;-&amp;#039; or lg == lang) then&lt;br /&gt;
			return description&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		entity = p.getEntity(entity)&lt;br /&gt;
		if entity and entity.descriptions then&lt;br /&gt;
			if fallback ~= &amp;#039;-&amp;#039; then&lt;br /&gt;
				for _, lg in ipairs(fb.fblist(lang, true)) do&lt;br /&gt;
					if entity.descriptions[lg] then&lt;br /&gt;
						return entity.descriptions[lg].value&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				if entity.descriptions[lang] then&lt;br /&gt;
					return entity.descriptions[lang].value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return i18n(&amp;#039;no description&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formattedLabel(label, entity, args)&lt;br /&gt;
	local link = getLink(entity, args.link, args.lang)&lt;br /&gt;
	if not link then&lt;br /&gt;
		link = getLink(entity, defaultlink, args.lang)&lt;br /&gt;
	end&lt;br /&gt;
	if not link then&lt;br /&gt;
		return label&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;[[&amp;#039; .. link .. &amp;#039;|&amp;#039; .. label .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatEntity( entity, args )&lt;br /&gt;
	if not entity then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if not args then&lt;br /&gt;
		args = {}&lt;br /&gt;
	end&lt;br /&gt;
	local label = p._getLabel(entity, args.lang, &amp;#039;id&amp;#039;, args.fallback)&lt;br /&gt;
	return formattedLabel(label, entity, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getLabel(frame) -- simple for simple templates like {{Q|}}}&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local entity = args.entity&lt;br /&gt;
	local lang = args.lang&lt;br /&gt;
	if not entity then&lt;br /&gt;
		return i18n(&amp;#039;invalid-id&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if string.sub(entity, 1, 10) == &amp;#039;Property:P&amp;#039; then&lt;br /&gt;
		entity = string.sub(entity, 10)&lt;br /&gt;
	elseif string.sub(entity, 1, 8) == &amp;#039;Lexeme:L&amp;#039; then&lt;br /&gt;
		entity = string.sub(entity, 8)&lt;br /&gt;
	elseif not ({L = 1, P = 1, Q = 1})[string.sub(entity, 1, 1)] or not tonumber(string.sub(entity, 2)) then&lt;br /&gt;
		return i18n(&amp;#039;invalid-id&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not args.link or args.link == &amp;#039;&amp;#039; or args.link == &amp;#039;-&amp;#039; then -- by default: no link&lt;br /&gt;
		if lang == &amp;#039;&amp;#039; then&lt;br /&gt;
			lang = defaultlang&lt;br /&gt;
		end&lt;br /&gt;
		return p._getLabel(entity, lang, args.default, args.fallback)&lt;br /&gt;
	else&lt;br /&gt;
		return p.formatEntity(entity, args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._formatStatements( args )--Format statements and concat them cleanly&lt;br /&gt;
	if args.value == &amp;#039;-&amp;#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	--If a value is already set, use it&lt;br /&gt;
	if args.value and args.value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		return args.value&lt;br /&gt;
	end&lt;br /&gt;
	local valuetable = p.stringTable(args)&lt;br /&gt;
	return tableToText(valuetable, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.showQualifier( args )&lt;br /&gt;
	local qualifs = args.qualifiers or args.qualifier&lt;br /&gt;
	if type(qualifs) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		qualifs = mw.text.split(qualifs, &amp;#039;,&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if not qualifs then&lt;br /&gt;
		return formatError( &amp;#039;property-param-not-provided&amp;#039; )&lt;br /&gt;
	end&lt;br /&gt;
	local claims = p.getClaims(args)&lt;br /&gt;
	if not claims then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local str = &amp;#039;&amp;#039;&lt;br /&gt;
	local new&lt;br /&gt;
	for _, cl in ipairs(claims) do&lt;br /&gt;
		new = p.getFormattedQualifiers(cl, qualifs, args) or &amp;#039;&amp;#039;&lt;br /&gt;
		str = str .. new&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._formatAndCat(args)&lt;br /&gt;
	local val = p._formatStatements(args)&lt;br /&gt;
	if val then&lt;br /&gt;
		return val .. addTrackingCat(args.property)&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getTheDate(args)&lt;br /&gt;
	local claims = p.getClaims(args)&lt;br /&gt;
	if not claims then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local formattedvalues = {}&lt;br /&gt;
	for _, cl in ipairs(claims) do&lt;br /&gt;
		table.insert(formattedvalues, p.getFormattedDate(cl))&lt;br /&gt;
	end&lt;br /&gt;
	local val = linguistic.conj(formattedvalues)&lt;br /&gt;
	if val and args.addcat == true then&lt;br /&gt;
		return val .. addTrackingCat(args.property)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Returns a Wikipedia page name (with interwiki prefix) which is equivalent page&lt;br /&gt;
	to given page in given language.&lt;br /&gt;
	&lt;br /&gt;
	Args:&lt;br /&gt;
	* sourceTitle: wiki page title which exists on sourceLang Wikipedia.&lt;br /&gt;
	* sourceLang: language code of Wikipedia where `sourceTitle` is an&lt;br /&gt;
	article. Defaults to `en`.&lt;br /&gt;
	* targetLang: language code of Wikipedia from which you want to get&lt;br /&gt;
	equivalent article to `sourceTitle`. Defaults to `defaultlang`.&lt;br /&gt;
	&lt;br /&gt;
	Bug: return value should not start with a colon because of T14974&lt;br /&gt;
]]&lt;br /&gt;
function p._getEquivalentWPArticle(sourceTitle, sourceLang, targetLang)&lt;br /&gt;
	if not sourceLang or sourceLang == &amp;#039;&amp;#039; then&lt;br /&gt;
		sourceLang = &amp;#039;en&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not targetLang or targetLang == &amp;#039;&amp;#039; then&lt;br /&gt;
		targetLang = defaultlang&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local sourceLink = &amp;#039; :&amp;#039; .. sourceLang .. &amp;#039;:&amp;#039; .. sourceTitle&lt;br /&gt;
	&lt;br /&gt;
	if sourceLang == targetLang then&lt;br /&gt;
		return sourceLink&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local sourceWiki = sourceLang .. &amp;#039;wiki&amp;#039; -- e.g. &amp;quot;enwiki&amp;quot; is global site id for English Wikipedia&lt;br /&gt;
	local id = mw.wikibase.getEntityIdForTitle( sourceTitle, sourceWiki )&lt;br /&gt;
	&lt;br /&gt;
	if not id then&lt;br /&gt;
		return sourceLink --source page has no linked Wikidata element, let’s keep it&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local fallbackLangs = mw.language.getFallbacksFor(targetLang)&lt;br /&gt;
	table.insert(fallbackLangs, 1, targetLang) --keeps targetLang as first lang to try&lt;br /&gt;
	&lt;br /&gt;
	for _, fallbackLang in ipairs(fallbackLangs) do&lt;br /&gt;
		local existingEquivalent = getLink(id, &amp;#039;anywikipedia&amp;#039;, fallbackLang)&lt;br /&gt;
		if existingEquivalent then&lt;br /&gt;
			return &amp;#039; &amp;#039; .. existingEquivalent&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return sourceLink --source page has no interwiki, let’s keep it&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatStatements( args )&lt;br /&gt;
	return p._formatStatements( args )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getEntityFromId(id)&lt;br /&gt;
	return p.getEntity(id)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------&lt;br /&gt;
-- Functions callable from a template --&lt;br /&gt;
----------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.getaDate(frame)&lt;br /&gt;
	return p.getTheDate(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getQualifier(frame)&lt;br /&gt;
	return p.showQualifier(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getDescription(frame) -- simple for simple templates like {{Q|}}}&lt;br /&gt;
	local entity = frame.args.entity&lt;br /&gt;
	if not entity then&lt;br /&gt;
		return i18n(&amp;#039;invalid-id&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local lang = frame.args.lang&lt;br /&gt;
	local fallback = frame.args.fallback&lt;br /&gt;
&lt;br /&gt;
	return p._getDescription(entity, lang, fallback)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatStatementsE(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	if frame == mw.getCurrentFrame() then&lt;br /&gt;
		args = frame:getParent().args -- paramètres du modèle appelant (est-ce vraiment une bonne idée ?)&lt;br /&gt;
		for k, v in pairs(frame.args) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		args = frame&lt;br /&gt;
	end&lt;br /&gt;
	return p._formatStatements( args )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatAndCat(frame)&lt;br /&gt;
	local args = {}&lt;br /&gt;
	if frame == mw.getCurrentFrame() then&lt;br /&gt;
		args = frame:getParent().args -- paramètres du modèle appelant (est-ce vraiment une bonne idée ?)&lt;br /&gt;
		for k, v in pairs(frame.args) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		args = frame&lt;br /&gt;
	end&lt;br /&gt;
	return p._formatAndCat( args )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.labelOf(frame)&lt;br /&gt;
	local id = frame.args[1]&lt;br /&gt;
	-- returns the label of the given entity/property id&lt;br /&gt;
	-- if no id is given, the one from the entity associated with the calling Wikipedia article is used&lt;br /&gt;
	if not id then&lt;br /&gt;
		local entity = mw.wikibase.getEntity()&lt;br /&gt;
		if not entity then return printError(&amp;quot;entity-not-found&amp;quot;) end&lt;br /&gt;
		id = entity.id&lt;br /&gt;
	end&lt;br /&gt;
	return mw.wikibase.label(id)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Returns a wikilink (or only target) to the Wikipedia page with which the&lt;br /&gt;
	provided entity is linked.&lt;br /&gt;
	&lt;br /&gt;
	Args:&lt;br /&gt;
	* entity: Wikidata item id. e.g. Q220&lt;br /&gt;
	* lang: language code of Wikipedia which the link will target.&lt;br /&gt;
	* fallback: (optional) empty string or &amp;#039;-&amp;#039; to disable fallbacking to another &lt;br /&gt;
	Wikipedia when no article is linked for Wikipedia in requested language.&lt;br /&gt;
	* label: (optional) link label. Defaults to entity label.&lt;br /&gt;
	* nolink: if set and different from empty string, only target page title is&lt;br /&gt;
	returned without any formatting.&lt;br /&gt;
]]&lt;br /&gt;
function p.getLink(frame)&lt;br /&gt;
	local entity = frame.args.entity&lt;br /&gt;
	if not entity then&lt;br /&gt;
		return i18n(&amp;#039;invalid-id&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local fallback = frame.args.fallback&lt;br /&gt;
	local lang = frame.args.lang&lt;br /&gt;
	local label = frame.args.label&lt;br /&gt;
	local typelink = &amp;#039;anywikipedia&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	if (fallback == &amp;#039;&amp;#039;) or (fallback == &amp;#039;-&amp;#039;) then typelink = &amp;#039;wikipedia&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
	if (not label) or (label == &amp;#039;&amp;#039;) or (label == &amp;#039;-&amp;#039;) then&lt;br /&gt;
		label = p._getLabel(entity, lang, &amp;#039;id&amp;#039;, fallback)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If no Wikipedia page could be found as fallback, we use the label as a&lt;br /&gt;
	-- non-existing page title (red link style).&lt;br /&gt;
	local target = getLink(entity, typelink, lang) or lang .. &amp;#039;:&amp;#039; .. label&lt;br /&gt;
&lt;br /&gt;
	local noLink = frame.args.nolink&lt;br /&gt;
	if (not noLink) or (noLink == &amp;#039;&amp;#039;) then&lt;br /&gt;
		return &amp;#039;[[&amp;#039; .. target .. &amp;#039;|&amp;#039; .. label .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;amp;#32;&amp;#039; .. target -- &amp;amp;#32; workarrounds T14974 issue&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Returns a Wikipedia page name with interwiki prefix which is equivalent page&lt;br /&gt;
	to given page in given language.&lt;br /&gt;
	&lt;br /&gt;
	Args:&lt;br /&gt;
	* sourceTitle: wiki page title which exists on `sourceLang` Wikipedia.&lt;br /&gt;
	* sourceLang: language code of Wikipedia where `sourceTitle` is an&lt;br /&gt;
	article. Defaults to `en`.&lt;br /&gt;
	* targetLang: language code of Wikipedia from which you want to get&lt;br /&gt;
	equivalent article to `sourceTitle`. Defaults to `defaultlang`.&lt;br /&gt;
]]&lt;br /&gt;
function p.getEquivalentWPArticle(frame)&lt;br /&gt;
	return p._getEquivalentWPArticle(&lt;br /&gt;
		frame.args.sourceTitle,&lt;br /&gt;
		frame.args.sourceLang,&lt;br /&gt;
		frame.args.targetLang&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>en&gt;MusikBot II</name></author>
	</entry>
</feed>