<?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%3AEdition</id>
	<title>Module:Edition - 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%3AEdition"/>
	<link rel="alternate" type="text/html" href="https://culturaitaliana.org/w/index.php?title=Module:Edition&amp;action=history"/>
	<updated>2026-04-10T09:18:18Z</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:Edition&amp;diff=8632&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://culturaitaliana.org/w/index.php?title=Module:Edition&amp;diff=8632&amp;oldid=prev"/>
		<updated>2020-11-05T22:35:47Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&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 22:35, 5 November 2020&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key wiki_redazione_en:diff::1.12:old-8631:rev-8632 --&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://culturaitaliana.org/w/index.php?title=Module:Edition&amp;diff=8631&amp;oldid=prev</id>
		<title>en&gt;Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://culturaitaliana.org/w/index.php?title=Module:Edition&amp;diff=8631&amp;oldid=prev"/>
		<updated>2020-08-01T13:12:27Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
-- Organisation of this module: the exports are listed at the bottom; their&lt;br /&gt;
-- direct functions are just above there, and supporting functions are higher&lt;br /&gt;
-- up.&lt;br /&gt;
--&lt;br /&gt;
-- Please add testcases before modifying anything.&lt;br /&gt;
--&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
instanceOfProp = 'P31'&lt;br /&gt;
authorProp = 'P50'&lt;br /&gt;
editionOrTranslationOfProp = 'P629'&lt;br /&gt;
equivalentClassProp = 'P1709'&lt;br /&gt;
topicsMainWikimediaPortalProp = 'P1151';&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Insert a value into a table, but not if it's already there.&lt;br /&gt;
function tableInsertUnique( theTable, value )&lt;br /&gt;
	for _, item in pairs( theTable ) do&lt;br /&gt;
		if item == value then&lt;br /&gt;
			-- Already present&lt;br /&gt;
			return&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Otherwise, add the new value.&lt;br /&gt;
	table.insert( theTable, value )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- For the given author item, find the Wikisource sitelink. If there isn't one,&lt;br /&gt;
-- check to see if there the author has a topicsMainWikimediaPortal statement,&lt;br /&gt;
-- and then see if that portal has a sitelink instead.&lt;br /&gt;
function get_author_sitelink( authorItem )&lt;br /&gt;
	local siteLink = authorItem:getSitelink( mw.language.getContentLanguage().code .. 'wikisource' )&lt;br /&gt;
	if ( siteLink ~= nil ) then&lt;br /&gt;
		return siteLink&lt;br /&gt;
	end&lt;br /&gt;
	portalStatements = authorItem:getBestStatements( topicsMainWikimediaPortalProp )&lt;br /&gt;
	for _, mainPortal in pairs( portalStatements ) do&lt;br /&gt;
		local mainPortalId = mainPortal['mainsnak']['datavalue']['value']['id']&lt;br /&gt;
		local mainPortalItem = mw.wikibase.getEntity( mainPortalId )&lt;br /&gt;
		siteLink = mainPortalItem:getSitelink( mw.language.getContentLanguage().code .. 'wikisource' )&lt;br /&gt;
	end&lt;br /&gt;
	return siteLink&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Create the HTML (including wikitext link) for all provided authors,&lt;br /&gt;
-- and add it to the given authorLinks table (for later concatenation).&lt;br /&gt;
function process_authors( authorLinks, authors )&lt;br /&gt;
	if authors == nil or #authors == 0 then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	for _, author in pairs( authors ) do&lt;br /&gt;
		local authorId = author['mainsnak']['datavalue']['value']['id']&lt;br /&gt;
		local authorItem =  mw.wikibase.getEntity( authorId )&lt;br /&gt;
		local siteLink = get_author_sitelink( authorItem )&lt;br /&gt;
		local authorName = authorItem:getLabel()&lt;br /&gt;
		if siteLink ~= nil then&lt;br /&gt;
			authorName = mw.title.new( siteLink ).text&lt;br /&gt;
		end&lt;br /&gt;
		local authorHtml = mw.html.create('span')&lt;br /&gt;
			:attr('itemprop', 'author')&lt;br /&gt;
			:attr('itemscope', '')&lt;br /&gt;
			:attr('itemtype', getSchemaorgItemtype( authorItem ) )&lt;br /&gt;
		local authorNameHtml = authorHtml:tag( 'span' )&lt;br /&gt;
		authorNameHtml:attr( 'itemprop', 'name' )&lt;br /&gt;
			:wikitext( authorName )&lt;br /&gt;
		local authorHtmlStr = tostring( authorHtml )&lt;br /&gt;
		if siteLink == nil then&lt;br /&gt;
			tableInsertUnique( authorLinks, authorHtmlStr )&lt;br /&gt;
		else&lt;br /&gt;
			tableInsertUnique( authorLinks, '[[' .. siteLink .. '|' .. authorHtmlStr .. ']]' )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Get the schema.org URL for the itemtype of the given item.&lt;br /&gt;
function getSchemaorgItemtype( item )&lt;br /&gt;
	local schemaPrefix = 'http://schema.org/'&lt;br /&gt;
	for _, instanceOf in pairs( item:getBestStatements( instanceOfProp ) ) do&lt;br /&gt;
		local instanceOfId = instanceOf['mainsnak']['datavalue']['value']['id']&lt;br /&gt;
		local instanceOfItem = mw.wikibase.getEntity( instanceOfId )&lt;br /&gt;
		-- Now go through each of the instance-of item's class statements,&lt;br /&gt;
		-- seeing if we can find a matching schema.org URL.&lt;br /&gt;
		for _, equivClass in pairs( instanceOfItem:getBestStatements( equivalentClassProp ) ) do&lt;br /&gt;
			local val = equivClass['mainsnak']['datavalue']['value']&lt;br /&gt;
			if string.sub( val, 1, #schemaPrefix ) == schemaPrefix then&lt;br /&gt;
				-- This is a schema.org URL.&lt;br /&gt;
				return val&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- If we've not figured it out by now, give up with the default.&lt;br /&gt;
	return schemaPrefix .. 'Thing'&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exported method.&lt;br /&gt;
--&lt;br /&gt;
function author_list( args )&lt;br /&gt;
	local item = getItem( args )&lt;br /&gt;
	if item == nil then&lt;br /&gt;
		return ''&lt;br /&gt;
	end&lt;br /&gt;
	local authorLinks = {}&lt;br /&gt;
&lt;br /&gt;
	-- Collect the authors of this item.&lt;br /&gt;
	local authors = item:getBestStatements( authorProp )&lt;br /&gt;
	process_authors( authorLinks, authors )&lt;br /&gt;
&lt;br /&gt;
	-- Also collect the authors of the parent work.&lt;br /&gt;
	local works = item:getBestStatements( editionOrTranslationOfProp )&lt;br /&gt;
	for _, work in pairs( works ) do&lt;br /&gt;
		local workId = work['mainsnak']['datavalue']['value']['id']&lt;br /&gt;
		local workItem = mw.wikibase.getEntity( workId )&lt;br /&gt;
		authors = workItem:getBestStatements( authorProp )&lt;br /&gt;
		if #authors &amp;gt; 0 then&lt;br /&gt;
			process_authors( authorLinks, authors )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Output the final list of links.&lt;br /&gt;
	local outHtml = mw.html.create()&lt;br /&gt;
	local separator = args.separator or ', '&lt;br /&gt;
	local last_separator = args.last_separator or ', and '&lt;br /&gt;
	local i = 1&lt;br /&gt;
	for _, link in pairs( authorLinks ) do&lt;br /&gt;
		outHtml:wikitext( link )&lt;br /&gt;
		if i == ( #authorLinks - 1 ) then&lt;br /&gt;
			outHtml:wikitext( last_separator )&lt;br /&gt;
		elseif #authorLinks &amp;gt; 1 and i ~= #authorLinks then&lt;br /&gt;
			outHtml:wikitext( separator )&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return tostring( outHtml )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exported method.&lt;br /&gt;
--&lt;br /&gt;
function inline( args )&lt;br /&gt;
	local item = getItem( args )&lt;br /&gt;
	local outHtml = mw.html.create()&lt;br /&gt;
	mw.logObject(args)&lt;br /&gt;
	mw.logObject(item)&lt;br /&gt;
	if ( item == nil ) then&lt;br /&gt;
		outHtml:wikitext( '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Unable to determine the Wikidata item to use&amp;lt;/span&amp;gt;' )&lt;br /&gt;
		return tostring( outHtml )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Make sure it's an edition.&lt;br /&gt;
	local editionOrTranslationOfStmts = item:getBestStatements( editionOrTranslationOfProp )&lt;br /&gt;
	if #editionOrTranslationOfStmts == 0 then&lt;br /&gt;
		outHtml:wikitext( '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;' .. item.id .. ' is not an edition or translation of a work (missing P629)&amp;lt;/span&amp;gt;' )&lt;br /&gt;
		return tostring( outHtml )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Title/label.&lt;br /&gt;
	local title = item:getSitelink( 'enwikisource' )&lt;br /&gt;
	local label = item:getLabel( 'en' )&lt;br /&gt;
	local hasWikisourcePage = false&lt;br /&gt;
	if title == nil or title == '' then&lt;br /&gt;
		title = label&lt;br /&gt;
	else&lt;br /&gt;
		hasWikisourcePage = true&lt;br /&gt;
		title = '[[' .. title .. '|' .. label .. ']]'&lt;br /&gt;
	end&lt;br /&gt;
	outHtml:wikitext( title .. ' ' );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Publication date&lt;br /&gt;
	local publicationDate = item:formatPropertyValues( 'P577' )&lt;br /&gt;
	outHtml:wikitext( '(' .. publicationDate.value .. ') ' )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Scanned file on Wikimedia Commons.&lt;br /&gt;
	if not hasWikisourcePage then&lt;br /&gt;
		-- Add links to Index page or Commons file.&lt;br /&gt;
		local hasIndexOrCommonsLink = false&lt;br /&gt;
		local scannedFileOnWikimediaCommons = 'P996'&lt;br /&gt;
		local scannedFileOnWikimediaCommonsStmts = item:getBestStatements( scannedFileOnWikimediaCommons )&lt;br /&gt;
		for _, stmt in pairs( scannedFileOnWikimediaCommonsStmts ) do&lt;br /&gt;
			local commonsFilename = stmt['mainsnak']['datavalue']['value']&lt;br /&gt;
			outHtml:wikitext( ' ' .. mw.getCurrentFrame():expandTemplate{ title = 'Small scan link', args = { commonsFilename } } )&lt;br /&gt;
			hasIndexOrCommonsLink = true;&lt;br /&gt;
		end&lt;br /&gt;
		-- Add link to the IA item if no links were added above.&lt;br /&gt;
		if not hasIndexOrCommonsLink then&lt;br /&gt;
			local internetArchiveIdProp = 'P724'&lt;br /&gt;
			local internetArchiveIdStmts = item:getBestStatements( internetArchiveIdProp )&lt;br /&gt;
			for _, stmt in pairs( internetArchiveIdStmts ) do&lt;br /&gt;
				local internetArchiveId = stmt['mainsnak']['datavalue']['value']&lt;br /&gt;
				outHtml:wikitext( ' ' .. mw.getCurrentFrame():expandTemplate{ title = 'IA small link', args = { internetArchiveId } } )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Wikidata and Wikipedia links.&lt;br /&gt;
	local img = '[[File:Wikidata-books-task-force-logo.svg|20px|alt=Wikidata books task force logo|link=d:' .. item.id .. '|View on Wikidata]]'&lt;br /&gt;
	outHtml:wikitext( img )&lt;br /&gt;
&lt;br /&gt;
	return tostring( outHtml )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exported method. Get wikitext for displaying an edition's badges from Wikidata.&lt;br /&gt;
-- To get an indicator, pass args.indicator = true&lt;br /&gt;
-- Testing: =p.badge({args={wikidata='Q75043199'}})&lt;br /&gt;
--&lt;br /&gt;
function badge( args )&lt;br /&gt;
	local item = getItem( args )&lt;br /&gt;
	if not ( item and item.sitelinks and item.sitelinks.enwikisource and item.sitelinks.enwikisource.badges ) then&lt;br /&gt;
		return ''&lt;br /&gt;
	end&lt;br /&gt;
	local badges = item.sitelinks.enwikisource.badges&lt;br /&gt;
	local out = ''&lt;br /&gt;
	for _, badge in pairs( badges ) do&lt;br /&gt;
		local badgeOut = ''&lt;br /&gt;
		local badgeItem = mw.wikibase.getEntity( badge )&lt;br /&gt;
		local badgeName = ''&lt;br /&gt;
		local wikisourceBadgeClass = 'Q75042035'&lt;br /&gt;
		if badgeItem.claims.P31[1].mainsnak.datavalue.value.id == wikisourceBadgeClass and badgeItem.claims.P18 ~= nil then&lt;br /&gt;
			local imageName = badgeItem.claims.P18[1].mainsnak.datavalue.value&lt;br /&gt;
			if mw.wikibase.getLabel( badge ) ~= nil then&lt;br /&gt;
				badgeName = mw.wikibase.getLabel( badge )&lt;br /&gt;
			end&lt;br /&gt;
			badgeOut = '&amp;lt;span class=&amp;quot;indicator-badge&amp;quot;&amp;gt;[[File:' .. imageName .. '|16px|link=Help:Text status|' .. badgeName .. ']]&amp;lt;/span&amp;gt;'&lt;br /&gt;
			if args.indicator ~= nil then&lt;br /&gt;
				badgeOut = '&amp;lt;indicator name=&amp;quot;wikisource-badge-' .. badgeName .. '&amp;quot;&amp;gt;' .. badgeOut .. '&amp;lt;/indicator&amp;gt;'&lt;br /&gt;
			end&lt;br /&gt;
			if args.category ~= nil and badgeItem.claims.P910 ~= nil then&lt;br /&gt;
				local categoryQid = badgeItem.claims.P910[1].mainsnak.datavalue.value.id&lt;br /&gt;
				local category = mw.wikibase.getEntity( categoryQid )&lt;br /&gt;
				badgeOut = badgeOut .. '[[' .. category.sitelinks.enwikisource.title .. ']]'&lt;br /&gt;
			end&lt;br /&gt;
			out = out .. badgeOut&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return mw.getCurrentFrame():preprocess( out )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Get an Item based on what's passed in the 'wikidata' or 'page' parameters of&lt;br /&gt;
-- the args, or the current page's ID otherwise.&lt;br /&gt;
function getItem( args )&lt;br /&gt;
	local id = nil&lt;br /&gt;
	-- If args is a table with an appropriate element, use it.&lt;br /&gt;
	if type( args ) == 'table' then&lt;br /&gt;
		if args.wikidata ~= '' and args.wikidata ~= nil then&lt;br /&gt;
			id = args.wikidata&lt;br /&gt;
		elseif args.wikidata_id ~= '' and args.wikidata_id ~= nil then&lt;br /&gt;
			id = args.wikidata_id&lt;br /&gt;
		elseif args.page ~= '' and args.page ~= nil then&lt;br /&gt;
			local title = mw.title.new( args.page )&lt;br /&gt;
			id = mw.wikibase.getEntityIdForTitle( title.nsText .. title.text )&lt;br /&gt;
			-- If no entity for this page, maybe it's a subpage and we should look for the root page's entity.&lt;br /&gt;
			if id == nil then&lt;br /&gt;
				id = mw.wikibase.getEntityIdForTitle( title.nsText .. title.rootText )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if type( args ) == 'string' and args ~= '' then&lt;br /&gt;
		id = args&lt;br /&gt;
	end&lt;br /&gt;
	return mw.wikibase.getEntity( id )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exported method.&lt;br /&gt;
function authority_control( args )&lt;br /&gt;
	local item = getItem( args )&lt;br /&gt;
	-- Gather every 'external-id' statement.&lt;br /&gt;
	local out = mw.html.create( '' )&lt;br /&gt;
	for propertyId,claims in pairs( item.claims) do&lt;br /&gt;
		local propItem = getItem( propertyId )&lt;br /&gt;
		for _,claim in pairs( claims ) do&lt;br /&gt;
			if claim.mainsnak.datatype == 'external-id' then&lt;br /&gt;
				local propLabel = propertyId&lt;br /&gt;
				if propItem.aliases.en[1].value then&lt;br /&gt;
					propLabel = propItem.aliases.en[1].value&lt;br /&gt;
				end&lt;br /&gt;
				-- mw.logObject(propItem)&lt;br /&gt;
				out:wikitext( '* [[' .. propLabel .. ']]: ' .. claim.mainsnak.datavalue.value .. '\n' )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring( out )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Export all public functions.&lt;br /&gt;
return {&lt;br /&gt;
	-- =p.author_list({args={wikidata='Q28913867'}})&lt;br /&gt;
	author_list = function( frame ) return author_list( frame.args ) end;&lt;br /&gt;
	-- =p.inline({args={wikidata_id='Q28913867'}})&lt;br /&gt;
	inline = function( frame ) return inline( frame.args ) end;&lt;br /&gt;
	-- =p.badge({args={wikidata='Q28020002'}})&lt;br /&gt;
	badge = function( frame ) return badge( frame.args ) end;&lt;br /&gt;
	-- =p.authority_control({args={wikidata='Q19035838'}})&lt;br /&gt;
	authority_control = function( frame ) return authority_control( frame.args ) end;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>en&gt;Admin</name></author>
	</entry>
</feed>