<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://culturaitaliana.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACommon</id>
	<title>Module:Common - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://culturaitaliana.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACommon"/>
	<link rel="alternate" type="text/html" href="https://culturaitaliana.org/w/index.php?title=Module:Common&amp;action=history"/>
	<updated>2026-04-30T18:33:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://culturaitaliana.org/w/index.php?title=Module:Common&amp;diff=7527&amp;oldid=prev</id>
		<title>Admin: una versione importata</title>
		<link rel="alternate" type="text/html" href="https://culturaitaliana.org/w/index.php?title=Module:Common&amp;diff=7527&amp;oldid=prev"/>
		<updated>2020-11-05T16:52:43Z</updated>

		<summary type="html">&lt;p&gt;una versione importata&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&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;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:52, 5 November 2020&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key wiki_redazione_en:diff::1.12:old-7526:rev-7527 --&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://culturaitaliana.org/w/index.php?title=Module:Common&amp;diff=7526&amp;oldid=prev</id>
		<title>en&gt;Candalua at 16:42, 15 June 2020</title>
		<link rel="alternate" type="text/html" href="https://culturaitaliana.org/w/index.php?title=Module:Common&amp;diff=7526&amp;oldid=prev"/>
		<updated>2020-06-15T16:42:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--modulo contenente funzioni di utilità generale&lt;br /&gt;
local p = {}&lt;br /&gt;
local item = mw.wikibase.getEntityObject()&lt;br /&gt;
local lang = mw.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
function p.setItem(newItem)&lt;br /&gt;
	item = newItem&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getItem()&lt;br /&gt;
	return item&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--ritorna true se l'item che stiamo usando e' quello collegato alla pagina attuale&lt;br /&gt;
function p.isOwnItem()&lt;br /&gt;
	return mw.wikibase.getEntityObject().id == item.id&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getEntityIdForTitle(frame)&lt;br /&gt;
	return mw.wikibase.getEntityIdForTitle(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- *** FUNZIONI DI UTILITA' PER LE TABELLE **&lt;br /&gt;
&lt;br /&gt;
-- numero di elementi in tabella&lt;br /&gt;
function p.size(T)&lt;br /&gt;
	local count = 0&lt;br /&gt;
	for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
	return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- la tabella è vuota?&lt;br /&gt;
function p.empty(T)&lt;br /&gt;
	return T == nil or next(T) == nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.first(T)&lt;br /&gt;
	if not p.empty(T) then return T[1] end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- la tabella contiene il dato elemento?&lt;br /&gt;
function p.contains(T, el)&lt;br /&gt;
    for key, value in pairs(T) do&lt;br /&gt;
        if value == el then return true end&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.set(list)&lt;br /&gt;
  local s = {}&lt;br /&gt;
  for _, l in ipairs(list) do s[l] = true end&lt;br /&gt;
  return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- stampa la tabella (per i log)&lt;br /&gt;
function p.printTable(T, depth)&lt;br /&gt;
	depth = depth or 0&lt;br /&gt;
	local out = ''&lt;br /&gt;
	for k, v in pairs(T) do &lt;br /&gt;
		out = out ..'\n' .. string.rep(' ', depth) .. k .. ' = ' .. p.printElement(v, depth)&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- stampa un elemento qualunque&lt;br /&gt;
function p.printElement(el, depth)&lt;br /&gt;
	depth = depth or 0&lt;br /&gt;
	if (type(el) == &amp;quot;table&amp;quot;) then return '{'..p.printTable(el, depth+1)..'}'&lt;br /&gt;
	else return tostring(el)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--copia profonda di una tabella&lt;br /&gt;
function p.deepcopy(orig)&lt;br /&gt;
    local orig_type = type(orig)&lt;br /&gt;
    local copy&lt;br /&gt;
    if orig_type == 'table' then&lt;br /&gt;
        copy = {}&lt;br /&gt;
        for orig_key, orig_value in next, orig, nil do&lt;br /&gt;
            copy[p.deepcopy(orig_key)] = p.deepcopy(orig_value)&lt;br /&gt;
        end&lt;br /&gt;
        setmetatable(copy, p.deepcopy(getmetatable(orig)))&lt;br /&gt;
    else -- number, string, boolean, etc&lt;br /&gt;
        copy = orig&lt;br /&gt;
    end&lt;br /&gt;
    return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--fonde due tabelle in una terza (aggiungendo alle chiavi un diverso prefisso, se specificato)&lt;br /&gt;
function p.mergeTables(T1, T2, prefix1, prefix2)&lt;br /&gt;
	local T = {}&lt;br /&gt;
	prefix1 = prefix1 or ''&lt;br /&gt;
	prefix2 = prefix2 or ''&lt;br /&gt;
	for k, v in pairs(T1) do T[prefix1..k] = v	end&lt;br /&gt;
	for k, v in pairs(T2) do T[prefix2..k] = v	end&lt;br /&gt;
	return T&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--sottrae dalla T1 gli elementi di T2&lt;br /&gt;
function p.subtractTable(T1, T2)&lt;br /&gt;
	for j, a in pairs(T2 or {}) do&lt;br /&gt;
		for k, v in pairs(T1) do&lt;br /&gt;
			if p.equalsIgnoreCase(a, v) then table.remove(T1, k) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--inverte l'ordine degli elementi nella tabella&lt;br /&gt;
function p.reverseTable(t)&lt;br /&gt;
    local reversedTable = {}&lt;br /&gt;
    local itemCount = #t&lt;br /&gt;
    for k, v in ipairs(t) do&lt;br /&gt;
        reversedTable[itemCount + 1 - k] = v&lt;br /&gt;
    end&lt;br /&gt;
    return reversedTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sublist(t, i, j)&lt;br /&gt;
	local result = {}&lt;br /&gt;
	for k, v in ipairs(t) do&lt;br /&gt;
		if k &amp;gt;= i and k &amp;lt;= j then&lt;br /&gt;
			table.insert(result, v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- *** FUNZIONI DI UTILITA' PER LE STRINGHE  **&lt;br /&gt;
function p.notEmpty(String)&lt;br /&gt;
	return String and mw.text.trim(String) ~= ''&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.startsWith(String,Start)&lt;br /&gt;
   return string.sub(String,1, string.len(Start))==Start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.endsWith(String,End)&lt;br /&gt;
   return End=='' or string.sub(String, -string.len(End))==End&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.equalsIgnoreCase(str1, str2)&lt;br /&gt;
	return str1 and str2 and str1:lower() == str2:lower()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.replace()&lt;br /&gt;
	frame = mw.getCurrentFrame()&lt;br /&gt;
	str = frame.args[1]&lt;br /&gt;
	fnd = frame.args[2]&lt;br /&gt;
	res = string.gsub(str, fnd:gsub(&amp;quot;[%(%)%.%%%+%-%*%?%[%^%$%]]&amp;quot;, &amp;quot;%%%1&amp;quot;), &amp;quot;&amp;quot;)&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--concatena la lista di stringhe fornita&lt;br /&gt;
function p.concat(list, separator, lastSeparator)&lt;br /&gt;
	separator = separator or ', '&lt;br /&gt;
	lastSeparator = lastSeparator or separator&lt;br /&gt;
	return mw.text.listToText(list or {}, separator, lastSeparator)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- *** FUNZIONI DI UTILITA' PER WIKISOURCE **&lt;br /&gt;
&lt;br /&gt;
--ritorna il namespace corrente&lt;br /&gt;
function p.getNamespace() &lt;br /&gt;
	return mw.title.getCurrentTitle().nsText&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--true se siamo nel ns 0&lt;br /&gt;
function p.isNS0() &lt;br /&gt;
	return mw.title.getCurrentTitle().namespace == 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--true se siamo nel ns Autore&lt;br /&gt;
function p.isNSAutore() &lt;br /&gt;
	return p.getNamespace() == 'Autore'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--true se siamo in Opera&lt;br /&gt;
function p.isNSOpera()&lt;br /&gt;
	return p.getNamespace() == 'Opera'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--true se siamo in una sottopagina&lt;br /&gt;
function p.isSubpage() &lt;br /&gt;
	return mw.title.getCurrentTitle().isSubpage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--costruisce una categoria (o un link ad essa se link = true)&lt;br /&gt;
function p.category(name, label, link)&lt;br /&gt;
	label = label and '|'..label or ''	--default: stringa vuota&lt;br /&gt;
	link = (link and ':') or ''			--default: stringa vuota&lt;br /&gt;
	return '[['..link..mw.site.namespaces[14].name..':'..name..label..']]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--costruisce un wikilink&lt;br /&gt;
function p.link(name, label, site)&lt;br /&gt;
	label = label or name&lt;br /&gt;
	site = site and ':'..site..':' or ''&lt;br /&gt;
	return '[['..site..name..'|'..label..']]'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--conta il numero di pagine in una data categoria&lt;br /&gt;
function p.pagesInCat(cat)&lt;br /&gt;
	return mw.site.stats.pagesInCategory(cat, 'pages')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- richiama il template richiesto&lt;br /&gt;
function p.template(title, args)&lt;br /&gt;
	--bonifichiamo gli argomenti (se expandTemplate riceve una table, si spacca)&lt;br /&gt;
	cleanArgs = {}&lt;br /&gt;
	for i, v in pairs(args or {}) do&lt;br /&gt;
		if type(v) ~= &amp;quot;table&amp;quot; then cleanArgs[i] = v end&lt;br /&gt;
	end&lt;br /&gt;
	return mw.getCurrentFrame():expandTemplate{ title = title, args = cleanArgs }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--recupera i parametri passati al template che ha invocato questo modulo&lt;br /&gt;
function p.getParameters(frame)&lt;br /&gt;
	args = {}&lt;br /&gt;
	for k, v in pairs(frame:getParent().args) do&lt;br /&gt;
		if v and mw.text.trim(v) ~= '' then&lt;br /&gt;
			args[k] = mw.text.trim(v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- *** FUNZIONI SPECIFICHE PER WIKIDATA **&lt;br /&gt;
&lt;br /&gt;
--ritorna la label per l'item corrente&lt;br /&gt;
function p.getLabel()&lt;br /&gt;
	if item and item.labels and item.labels.it then&lt;br /&gt;
		return  item.labels.it.value&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--ritorna la lista degli alias per l'item corrente&lt;br /&gt;
function p.getAliases()&lt;br /&gt;
	local aliasList = {}&lt;br /&gt;
	if item and item.aliases and item.aliases.it then&lt;br /&gt;
		for k, v in pairs(item.aliases.it) do&lt;br /&gt;
			if v and v.value then table.insert(aliasList, v.value) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return aliasList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--ritorna la label e tutti gli alias dell'item corrente&lt;br /&gt;
function p.getLabelAndAliases() &lt;br /&gt;
	local aliases = p.getAliases()&lt;br /&gt;
	if item then &lt;br /&gt;
		table.insert(aliases, 1, (item:getLabel())) &lt;br /&gt;
	end&lt;br /&gt;
	return aliases&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--ritorna il valore del claim escludendo i valori sconsigliati&lt;br /&gt;
function p.getClaimValue(claim)&lt;br /&gt;
	if claim and claim.mainsnak and claim.mainsnak.datavalue and claim.rank ~= 'deprecated' then&lt;br /&gt;
		dv = claim.mainsnak.datavalue&lt;br /&gt;
		v = dv.value&lt;br /&gt;
		if v then&lt;br /&gt;
			if dv.type == 'monolingualtext' then&lt;br /&gt;
				return v.text&lt;br /&gt;
			else&lt;br /&gt;
				return v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--filtra i claims ritornando solo i &amp;quot;preferred&amp;quot; se ce ne sono, oppure solo i &amp;quot;normal&amp;quot;, scartando in ogni caso i &amp;quot;deprecated&amp;quot;&lt;br /&gt;
function p.filterClaims(claims)&lt;br /&gt;
	local preferred = {}&lt;br /&gt;
	local normal = {}&lt;br /&gt;
	for index, claim in pairs(claims or {}) do&lt;br /&gt;
		if claim.rank == 'preferred' then&lt;br /&gt;
			table.insert(preferred, claim)&lt;br /&gt;
		elseif claim.rank == 'normal' then&lt;br /&gt;
			table.insert(normal, claim)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if p.empty(preferred) then return normal&lt;br /&gt;
	else return preferred end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--ordina i claim per data (ascendente/discendente)&lt;br /&gt;
function p.sortClaimsByDate(claims, order)&lt;br /&gt;
	order = order or 'asc'  --asc/desc&lt;br /&gt;
	sortedClaims = {}&lt;br /&gt;
	while p.size(claims) &amp;gt; 0 do&lt;br /&gt;
		firstIndex = 1&lt;br /&gt;
		&lt;br /&gt;
		for index, claim in pairs(claims or {}) do&lt;br /&gt;
			thisTime = p.getClaimValue(claim)&lt;br /&gt;
			firstTime = p.getClaimValue(claims[firstIndex])&lt;br /&gt;
			&lt;br /&gt;
			if thisTime and thisTime.time and firstTime and firstTime.time then&lt;br /&gt;
				thisTimeAC = (thisTime.time:sub(1, 1) == '-')&lt;br /&gt;
				firstTimeAC = (thisTime.time:sub(1, 1) == '-')&lt;br /&gt;
				&lt;br /&gt;
				if order == 'asc' then&lt;br /&gt;
					if (not thisTimeAC and not firstTimeAC and thisTime.time &amp;lt; firstTime.time)&lt;br /&gt;
					or (thisTimeAC and firstTimeAC and thisTime.time &amp;gt; firstTime.time)&lt;br /&gt;
					or (not thisTimeAC and firstTimeAC) then&lt;br /&gt;
						firstIndex = index&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					if (not thisTimeAC and not firstTimeAC and thisTime.time &amp;gt; firstTime.time)&lt;br /&gt;
					or (thisTimeAC and firstTimeAC and thisTime.time &amp;lt; firstTime.time)&lt;br /&gt;
					or (thisTimeAC and not firstTimeAC) then&lt;br /&gt;
						firstIndex = index&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
		table.insert(sortedClaims, claims[firstIndex])&lt;br /&gt;
		table.remove(claims, firstIndex)&lt;br /&gt;
	end&lt;br /&gt;
	return sortedClaims&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ritorna i claim presenti per la property fornita&lt;br /&gt;
function p.getClaimsByProperty(property)&lt;br /&gt;
	if item and item.claims and item.claims[property] and #item.claims[property] &amp;gt;= 1 then&lt;br /&gt;
		return p.filterClaims(item.claims[property])&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ritorna il primo claim trovato per la property fornita&lt;br /&gt;
function p.getSingleClaimByProperty(property)&lt;br /&gt;
	return p.first(p.getClaimsByProperty(property))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- ritorna il valore del primo claim trovato per la property fornita&lt;br /&gt;
function p.getSingleClaimValueByProperty(property)&lt;br /&gt;
	 return p.getClaimValue(p.getSingleClaimByProperty(property))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--data una property e l'item id di un elemento, ritorna il claim di quella property che ha come valore quell'elemento&lt;br /&gt;
function p.getClaimByPropertyAndValue(property, itemId)&lt;br /&gt;
	claims = p.getClaimsByProperty(property) or {}&lt;br /&gt;
	for i, claim in pairs(claims) do&lt;br /&gt;
		if 'Q'..claim.mainsnak.datavalue.value['numeric-id'] == itemId then&lt;br /&gt;
			return claim&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--recupera il valore di un qualificatore da un claim&lt;br /&gt;
function p.getQualifierValueFromClaim(claim, qid)&lt;br /&gt;
	if claim and claim.qualifiers then&lt;br /&gt;
		qualifiers = claim.qualifiers[qid]&lt;br /&gt;
		if qualifiers and #qualifiers &amp;gt;= 1 then&lt;br /&gt;
			return qualifiers[1].datavalue.value&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
--ritorna l'etichetta di un valore&lt;br /&gt;
function p.getLabelFromValue(value)&lt;br /&gt;
	if value and value[&amp;quot;numeric-id&amp;quot;] then return mw.wikibase.label('Q'..value[&amp;quot;numeric-id&amp;quot;]) end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--ritorna il sitelink di un valore&lt;br /&gt;
function p.getLinkFromValue(value, defaultLink)&lt;br /&gt;
	if value and value['numeric-id'] then return mw.wikibase.sitelink('Q'..value['numeric-id']) or defaultLink end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--ritorna la lista dei valori della property fornita&lt;br /&gt;
function p.getClaimValuesByProperty(property)&lt;br /&gt;
	claims = p.getClaimsByProperty(property) or {}&lt;br /&gt;
	values = {}&lt;br /&gt;
	for k, claim in pairs(claims) do&lt;br /&gt;
		value = p.getClaimValue(claim)&lt;br /&gt;
		if value then table.insert(values, value) end&lt;br /&gt;
	end&lt;br /&gt;
	return values&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--ritorna la lista delle etichette dei valori della property fornita&lt;br /&gt;
function p.getLabelsFromPropertyValues(property)&lt;br /&gt;
	claims = p.getClaimsByProperty(property) or {}&lt;br /&gt;
	labels = {}&lt;br /&gt;
	for k, claim in pairs(claims) do&lt;br /&gt;
		label = p.getLabelFromValue(p.getClaimValue(claim))&lt;br /&gt;
		if label then table.insert(labels, label) end&lt;br /&gt;
	end&lt;br /&gt;
	return labels&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--dal valore fornito, recupera sitelink e label e crea un link alla pagina&lt;br /&gt;
function p.getWikiLinkFromValue(value, defaultLink)&lt;br /&gt;
	local link = p.getLinkFromValue(value, defaultLink)&lt;br /&gt;
	local nome = p.getLabelFromValue(value) or link&lt;br /&gt;
	if link then return p.link(link, nome) &lt;br /&gt;
	else return nome or '' end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--data una lista di item autori, ritorna i link alle loro pagine separati da virgola&lt;br /&gt;
function p.getLinksAutori(autori)&lt;br /&gt;
	autoriLinkList = {}&lt;br /&gt;
	for k, autore in pairs(autori) do&lt;br /&gt;
		autoreNome = p.getLabelFromValue(autore)&lt;br /&gt;
		if autoreNome ~= nil and autoreNome ~= 'autore anonimo' then &lt;br /&gt;
			autoreNome = lang:ucfirst(autoreNome) &lt;br /&gt;
		else&lt;br /&gt;
			autoreNome = &amp;quot;Anonimo&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		autoreLink = p.getLinkFromValue(autore, 'Autore:'..autoreNome)&lt;br /&gt;
		table.insert(autoriLinkList, p.link(autoreLink, autoreNome))&lt;br /&gt;
	end&lt;br /&gt;
	return p.concat(autoriLinkList, ', ')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--data una lista di item, ritorna i link alle loro pagine separati da virgola&lt;br /&gt;
function p.getLinks(items, defaultNS, separator)&lt;br /&gt;
	local list = {}&lt;br /&gt;
	defaultNS = (defaultNS and (defaultNS .. ':')) or ''&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		local label = p.getLabelFromValue(v)&lt;br /&gt;
		local link = p.getLinkFromValue(v, defaultNS..label)&lt;br /&gt;
		table.insert(list, p.link(link, label))&lt;br /&gt;
	end&lt;br /&gt;
	return p.concat(list, separator)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--data una lista di item autori, ritorna l'elenco dei loro nomi&lt;br /&gt;
function p.getListaAutori(autori)&lt;br /&gt;
	autoriList = {}&lt;br /&gt;
	for k, autore in pairs(autori) do&lt;br /&gt;
		autoreNome = p.getLabelFromValue(autore)&lt;br /&gt;
		if autoreNome ~= nil and autoreNome ~= 'autore anonimo' then &lt;br /&gt;
			autoreNome = lang:ucfirst(autoreNome) &lt;br /&gt;
		else&lt;br /&gt;
			autoreNome = &amp;quot;Anonimo&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(autoriList, autoreNome)&lt;br /&gt;
	end&lt;br /&gt;
	return autoriList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--data una lista di item, ritorna la lista delle loro etichette&lt;br /&gt;
function p.getLabelsList(items)&lt;br /&gt;
	local list = {}&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		table.insert(list, p.getLabelFromValue(v))&lt;br /&gt;
	end&lt;br /&gt;
	return list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--true se questo elemento è un'istanza di arg&lt;br /&gt;
function p.instanceof(arg)&lt;br /&gt;
	claims = p.getClaimsByProperty('P31') or {}&lt;br /&gt;
	for index, claim in pairs(claims) do&lt;br /&gt;
		local val = p.getClaimValue(claim)&lt;br /&gt;
		if val and val['numeric-id'] and arg == val['numeric-id'] 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;
-- Restituisce il collegamento corrispondente al codice fornito&lt;br /&gt;
function p.sitelink(dbname)&lt;br /&gt;
	if item and item:getSitelink(dbname) then&lt;br /&gt;
		return item:getSitelink(dbname)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Wikipedia in italiano (o nelle lingue di fallback)&lt;br /&gt;
function p.wikipedia()&lt;br /&gt;
	local linkLang = nil&lt;br /&gt;
	local fallbackChain = {&lt;br /&gt;
		{'en', 'enwiki'},&lt;br /&gt;
		{'fr', 'frwiki'},&lt;br /&gt;
		{'de', 'dewiki'},&lt;br /&gt;
		{'es', 'eswiki'},&lt;br /&gt;
		{'pt', 'ptwiki'},&lt;br /&gt;
		{'ru', 'ruwiki'},&lt;br /&gt;
		{'el', 'elwiki'},&lt;br /&gt;
		{'nl', 'nlwiki'},&lt;br /&gt;
		{'rm', 'rmwiki'},&lt;br /&gt;
		{'ca', 'cawiki'},&lt;br /&gt;
		{'eml', 'emlwiki'},&lt;br /&gt;
		{'fur', 'furwiki'},&lt;br /&gt;
		{'lij', 'lijwiki'},&lt;br /&gt;
		{'lmo', 'lmowiki'},&lt;br /&gt;
		{'nap', 'napwiki'},&lt;br /&gt;
		{'pms', 'pmswiki'},&lt;br /&gt;
		{'roa-tara', 'roa_tarawiki'},&lt;br /&gt;
		{'sc', 'scwiki'},&lt;br /&gt;
		{'scn', 'scnwiki'},&lt;br /&gt;
		{'vec', 'vecwiki'}&lt;br /&gt;
	}&lt;br /&gt;
	local sl = p.sitelink('itwiki')&lt;br /&gt;
	if sl == nil then&lt;br /&gt;
		for _, site in pairs(fallbackChain) do&lt;br /&gt;
			if p.sitelink(site[2]) then&lt;br /&gt;
				linkLang = site[1]&lt;br /&gt;
				sl = p.sitelink(site[2])&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		linkLang=&amp;quot;it&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return linkLang, sl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Wikiquote in italiano&lt;br /&gt;
function p.wikiquote()&lt;br /&gt;
	return p.sitelink('itwikiquote')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Wikibooks&lt;br /&gt;
function p.wikibooks()&lt;br /&gt;
	return p.sitelink('itwikibooks')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Wikinotizie&lt;br /&gt;
function p.wikinews()&lt;br /&gt;
	return p.sitelink('itwikinews')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Wikizionario&lt;br /&gt;
function p.wiktionary()&lt;br /&gt;
	return p.sitelink('itwiktionary')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Wikiversità&lt;br /&gt;
function p.wikiversity()&lt;br /&gt;
	return p.sitelink('itwikiversity')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Wikivoyage&lt;br /&gt;
function p.wikivoyage()&lt;br /&gt;
	return p.sitelink('itwikivoyage')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Wikispecies&lt;br /&gt;
function p.wikispecies()&lt;br /&gt;
	return p.sitelink('specieswiki')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Commons (per gallerie)&lt;br /&gt;
function p.commons()&lt;br /&gt;
	return p.sitelink('commonswiki')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- collegamento a Commons (categorie)&lt;br /&gt;
function p.commonscat()&lt;br /&gt;
	return p.getSingleClaimValueByProperty('P373')&lt;br /&gt;
end&lt;br /&gt;
-- *** FUNZIONI VARIE **&lt;br /&gt;
&lt;br /&gt;
--converte il numero dato a numero romano&lt;br /&gt;
function p.toRoman(num)&lt;br /&gt;
    local t = {&lt;br /&gt;
        {1000, &amp;quot;M&amp;quot;},&lt;br /&gt;
        {900, &amp;quot;CM&amp;quot;}, {500, &amp;quot;D&amp;quot;}, {400, &amp;quot;CD&amp;quot;}, {100, &amp;quot;C&amp;quot;},&lt;br /&gt;
        {90, &amp;quot;XC&amp;quot;}, {50, &amp;quot;L&amp;quot;}, {40, &amp;quot;XL&amp;quot;}, {10, &amp;quot;X&amp;quot;},&lt;br /&gt;
        {9, &amp;quot;IX&amp;quot;}, {5, &amp;quot;V&amp;quot;}, {4, &amp;quot;IV&amp;quot;}, {1, &amp;quot;I&amp;quot;} &lt;br /&gt;
    }&lt;br /&gt;
    local ret = {}&lt;br /&gt;
    for _, v in ipairs(t) do&lt;br /&gt;
        local val, letter = unpack(v)&lt;br /&gt;
        while num &amp;gt;= val do&lt;br /&gt;
            num = num - val&lt;br /&gt;
            table.insert(ret, letter)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(ret), num&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--fa il parsing di una data per ottenere le sue componenti&lt;br /&gt;
--formati di input possibili: &lt;br /&gt;
--1° gennaio 2017&lt;br /&gt;
--25 dicembre 96 a.C.&lt;br /&gt;
--1877/1878&lt;br /&gt;
--format: anno, secolo, giornoMese&lt;br /&gt;
function p.parseDate(frame)&lt;br /&gt;
	date = frame.args[1]&lt;br /&gt;
	retFormat = frame.args[2]&lt;br /&gt;
	num = frame.args[3]&lt;br /&gt;
	return p.parseDateInternal(date, retFormat, num)&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
function p.parseDateInternal(date, retFormat, num)&lt;br /&gt;
	date = date:gsub(&amp;quot; %- &amp;quot;, &amp;quot;/&amp;quot;):gsub(&amp;quot;%-&amp;quot;, &amp;quot;/&amp;quot;)&lt;br /&gt;
	if num then&lt;br /&gt;
		index = 1&lt;br /&gt;
		for part in date:gmatch(&amp;quot;[^/]+&amp;quot;) do &lt;br /&gt;
    		if index == tonumber(num) then&lt;br /&gt;
    			return p.parseDateInternal(part, retFormat)&lt;br /&gt;
    		end&lt;br /&gt;
    		index = index + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	day, month, year = date:match(&amp;quot;([%d]+.*) (%w+) (%d+.*)&amp;quot;)&lt;br /&gt;
	if not day then&lt;br /&gt;
		year = date:match(&amp;quot;(%d+.*)&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if year then&lt;br /&gt;
		yearDigits, yearBC = year:match(&amp;quot;(%d+)(.*)&amp;quot;)&lt;br /&gt;
		century = p.toRoman(math.ceil(yearDigits / 100)) .. ' secolo' .. yearBC&lt;br /&gt;
		&lt;br /&gt;
		if retFormat == 'anno' then&lt;br /&gt;
			return year&lt;br /&gt;
		elseif retFormat == 'secolo' then&lt;br /&gt;
			return century&lt;br /&gt;
		elseif retFormat == 'giornoMese' and day and month then&lt;br /&gt;
			return day .. ' ' .. month&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--per stripAccents()&lt;br /&gt;
local tableAccents = {}&lt;br /&gt;
	tableAccents[&amp;quot;à&amp;quot;] = &amp;quot;a&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;á&amp;quot;] = &amp;quot;a&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;â&amp;quot;] = &amp;quot;a&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ã&amp;quot;] = &amp;quot;a&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ä&amp;quot;] = &amp;quot;a&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ç&amp;quot;] = &amp;quot;c&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;è&amp;quot;] = &amp;quot;e&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;é&amp;quot;] = &amp;quot;e&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ê&amp;quot;] = &amp;quot;e&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ë&amp;quot;] = &amp;quot;e&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ì&amp;quot;] = &amp;quot;i&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;í&amp;quot;] = &amp;quot;i&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;î&amp;quot;] = &amp;quot;i&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ï&amp;quot;] = &amp;quot;i&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ñ&amp;quot;] = &amp;quot;n&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ò&amp;quot;] = &amp;quot;o&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ó&amp;quot;] = &amp;quot;o&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ô&amp;quot;] = &amp;quot;o&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;õ&amp;quot;] = &amp;quot;o&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ö&amp;quot;] = &amp;quot;o&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ø&amp;quot;] = &amp;quot;o&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ù&amp;quot;] = &amp;quot;u&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ú&amp;quot;] = &amp;quot;u&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;û&amp;quot;] = &amp;quot;u&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ü&amp;quot;] = &amp;quot;u&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ý&amp;quot;] = &amp;quot;y&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;ÿ&amp;quot;] = &amp;quot;y&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;À&amp;quot;] = &amp;quot;A&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Á&amp;quot;] = &amp;quot;A&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Â&amp;quot;] = &amp;quot;A&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ã&amp;quot;] = &amp;quot;A&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ä&amp;quot;] = &amp;quot;A&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Č&amp;quot;] = &amp;quot;C&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ç&amp;quot;] = &amp;quot;C&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;È&amp;quot;] = &amp;quot;E&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;É&amp;quot;] = &amp;quot;E&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ê&amp;quot;] = &amp;quot;E&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ë&amp;quot;] = &amp;quot;E&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ì&amp;quot;] = &amp;quot;I&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Í&amp;quot;] = &amp;quot;I&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Î&amp;quot;] = &amp;quot;I&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ï&amp;quot;] = &amp;quot;I&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ñ&amp;quot;] = &amp;quot;N&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ò&amp;quot;] = &amp;quot;O&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ó&amp;quot;] = &amp;quot;O&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ô&amp;quot;] = &amp;quot;O&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Õ&amp;quot;] = &amp;quot;O&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ö&amp;quot;] = &amp;quot;O&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ø&amp;quot;] = &amp;quot;O&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ù&amp;quot;] = &amp;quot;U&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ú&amp;quot;] = &amp;quot;U&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Û&amp;quot;] = &amp;quot;U&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ü&amp;quot;] = &amp;quot;U&amp;quot;&lt;br /&gt;
	tableAccents[&amp;quot;Ý&amp;quot;] = &amp;quot;Y&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
-- Strip accents from a string&lt;br /&gt;
function p.stripAccents(str)&lt;br /&gt;
	local normalizedString = &amp;quot;&amp;quot;&lt;br /&gt;
	for strChar in string.gfind(str, &amp;quot;([%z\1-\127\194-\244][\128-\191]*)&amp;quot;) do&lt;br /&gt;
		normalizedString = normalizedString .. (tableAccents[strChar] or strChar)&lt;br /&gt;
	end&lt;br /&gt;
	return normalizedString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--dato il PID di una proprietà Wikidata, mostra un link ad essa e l'etichetta associata&lt;br /&gt;
function p.propertyDetails(frame)&lt;br /&gt;
	pid = frame:getParent().args[1]&lt;br /&gt;
	item = mw.wikibase.getEntity(pid)&lt;br /&gt;
	label = ''&lt;br /&gt;
	if item and item.labels and item.labels.it then&lt;br /&gt;
		label = ' (&amp;quot;'..item.labels.it.value..'&amp;quot;)'&lt;br /&gt;
	end&lt;br /&gt;
	return '[[:d:Property:'..pid..'|'..pid..']]'..label&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- rimuovi eventuali parentesi dal titolo&lt;br /&gt;
function p.stripTitolo(frame)&lt;br /&gt;
	titolo = frame:getParent().args[1]&lt;br /&gt;
	titolo = titolo:gsub(&amp;quot;.*/&amp;quot;, &amp;quot;&amp;quot;):gsub(&amp;quot;_&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
		-- mantieni la parentesi se seguita da una lettera minuscola&lt;br /&gt;
		:gsub(&amp;quot;%((%l)&amp;quot;, &amp;quot;_%1&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot; %(.*%)&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		:gsub(&amp;quot;_&amp;quot;, &amp;quot;(&amp;quot;)&lt;br /&gt;
	return titolo&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>en&gt;Candalua</name></author>
	</entry>
</feed>