<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://www.podebrady.study/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ASources</id>
	<title>Модуль:Sources - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://www.podebrady.study/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ASources"/>
	<link rel="alternate" type="text/html" href="https://www.podebrady.study/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Sources&amp;action=history"/>
	<updated>2026-04-25T00:31:07Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>https://www.podebrady.study/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Sources&amp;diff=1741&amp;oldid=prev</id>
		<title>Ilya Rudomilov: Новая страница: «local p = {};  local i18nDefaultLanguage = 'Q7737'; local i18nEditors = { 	Q150	= '',			-- French 	Q1321	= '',			-- Spanish 	Q1860	= '',			-- English 	Q7737	= 'п…»</title>
		<link rel="alternate" type="text/html" href="https://www.podebrady.study/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Sources&amp;diff=1741&amp;oldid=prev"/>
		<updated>2015-02-15T13:22:40Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «local p = {};  local i18nDefaultLanguage = &amp;#039;Q7737&amp;#039;; local i18nEditors = { 	Q150	= &amp;#039;&amp;#039;,			-- French 	Q1321	= &amp;#039;&amp;#039;,			-- Spanish 	Q1860	= &amp;#039;&amp;#039;,			-- English 	Q7737	= &amp;#039;п…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {};&lt;br /&gt;
&lt;br /&gt;
local i18nDefaultLanguage = 'Q7737';&lt;br /&gt;
local i18nEditors = {&lt;br /&gt;
	Q150	= '',			-- French&lt;br /&gt;
	Q1321	= '',			-- Spanish&lt;br /&gt;
	Q1860	= '',			-- English&lt;br /&gt;
	Q7737	= 'под ред. ',	-- Russian&lt;br /&gt;
	Q188	= 'Hrsg.: ',		-- German&lt;br /&gt;
}&lt;br /&gt;
local i18nVolume = {&lt;br /&gt;
	Q150	= 'Vol.',	-- French&lt;br /&gt;
	Q1321	= 'Vol.',	-- Spanish&lt;br /&gt;
	Q1860	= 'Vol.',	-- English&lt;br /&gt;
	Q7737	= 'Т.',		-- Russian&lt;br /&gt;
}&lt;br /&gt;
local i18nPage = {&lt;br /&gt;
	Q150 = 'P.',	-- French&lt;br /&gt;
	Q188 = 'S.',	-- German&lt;br /&gt;
	Q1321 = 'P.',	-- Spanish&lt;br /&gt;
	Q1860 = 'P.',	-- English&lt;br /&gt;
	Q7737 = 'С.',	-- Russian&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local monthg = {'января', 'февраля', 'марта', 'апреля', 'мая', 'июня',&lt;br /&gt;
    'июля', 'августа', &amp;quot;сентября&amp;quot;, &amp;quot;октября&amp;quot;, &amp;quot;ноября&amp;quot;, &amp;quot;декабря&amp;quot;};&lt;br /&gt;
&lt;br /&gt;
local PREFIX_CITEREF = &amp;quot;CITEREF_&amp;quot;;&lt;br /&gt;
&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 pairs(orig) do&lt;br /&gt;
            copy[orig_key] = p.deepcopy( orig_value );&lt;br /&gt;
        end&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;
local options_commas = { separator = ', ', conjunction = ', ', format = function( src ) return src end, nolinks = false, preferids = false };&lt;br /&gt;
local options_commas_nolinks = { separator = ', ', conjunction = ', ', format = function( src ) return src end, nolinks = true, preferids = false };&lt;br /&gt;
local options_commas_it = { separator = ', ', conjunction = ', ', format = function( src ) return &amp;quot;''&amp;quot; .. src .. &amp;quot;''&amp;quot; end, nolinks = false, preferids = false };&lt;br /&gt;
local options_commas_it_nolinks = { separator = ', ', conjunction = ', ', format = function( src ) return &amp;quot;''&amp;quot; .. src .. &amp;quot;''&amp;quot; end, nolinks = true , preferids = false };&lt;br /&gt;
local options_citetypes = { separator = ' ', conjunction = ' ', format = function( src ) return 'citetype_' .. src end, nolinks = true , preferids = true };&lt;br /&gt;
&lt;br /&gt;
function renderSource( src )&lt;br /&gt;
	mw.logObject( src );&lt;br /&gt;
&lt;br /&gt;
	if ( src.code and not src.url ) then&lt;br /&gt;
		src.url = mw.wikibase.sitelink( src.code ) or ( 'd:' .. src.code )&lt;br /&gt;
		src.url = ':' .. src.url;&lt;br /&gt;
	end&lt;br /&gt;
	src.lang = getSingle( src.lang ) or i18nDefaultLanguage;&lt;br /&gt;
	src.title = src.title or getSingle( src.url ) or '\'\'(unspecified title)\'\''&lt;br /&gt;
&lt;br /&gt;
	if ( not src.year and src.date ) then&lt;br /&gt;
		local date = getSingle( src.date );&lt;br /&gt;
		src.year = mw.ustring.sub( date, 9, 12 );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result = '';&lt;br /&gt;
	if ( src.author ) then&lt;br /&gt;
		result = result .. toString( src.author, options_commas_it );&lt;br /&gt;
	end&lt;br /&gt;
	if ( string.len( result ) ~= 0 ) then&lt;br /&gt;
		result = result .. ' ';&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
 	if ( src.part ) then&lt;br /&gt;
 		if ( src.url ) then&lt;br /&gt;
			local url = getSingle( src.url );&lt;br /&gt;
			if ( string.sub( url, 1, 1 ) == ':' ) then&lt;br /&gt;
				result = result .. '[[' .. url .. '|' .. toString( src.part, options_commas_nolinks ) .. ']]';&lt;br /&gt;
			else&lt;br /&gt;
				result = result .. '[' .. url .. ' ' .. toString( src.part, options_commas_nolinks ) .. ']';&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		result = result .. ' // ' .. toString( src.title, options_commas );&lt;br /&gt;
	else&lt;br /&gt;
		-- title only&lt;br /&gt;
 		if ( src.url ) then&lt;br /&gt;
			local url = getSingle( src.url );&lt;br /&gt;
			if ( string.sub( url, 1, 1 ) == ':' ) then&lt;br /&gt;
				result = result .. '[[' .. url .. '|' .. toString( src.title, options_commas_nolinks ) .. ']]';&lt;br /&gt;
			else&lt;br /&gt;
				result = result .. '[' .. url .. ' ' .. toString( src.title, options_commas_nolinks ) .. ']';&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
 	end&lt;br /&gt;
&lt;br /&gt;
	if ( src.originaltitle ) then&lt;br /&gt;
		result = result .. ' = ' .. toString( src.originaltitle, options_commas );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( src.publication ) then&lt;br /&gt;
		result = result .. ' // ' .. toString( src.publication, options_commas_it );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( src.editor ) then&lt;br /&gt;
		local prefix = i18nEditors[ src.lang ] or i18nEditors[ i18nDefaultLanguage ];&lt;br /&gt;
		result = result .. ' / ' .. prefix .. toString( src.editor, options_commas );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( src.place or src.publisher or src.year ) then&lt;br /&gt;
		result = result .. ' — ';&lt;br /&gt;
		if ( src.place ) then&lt;br /&gt;
			result = result .. toString( src.place, options_commas );&lt;br /&gt;
			if ( src.publisher or src.year ) then&lt;br /&gt;
				result = result .. ': ';&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if ( src.publisher ) then&lt;br /&gt;
			result = result .. toString( src.publisher, options_commas );&lt;br /&gt;
			if ( src.year ) then&lt;br /&gt;
				result = result .. ', ';&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if ( src.year ) then&lt;br /&gt;
			result = result .. toString( src.year, options_commas );&lt;br /&gt;
		end&lt;br /&gt;
		result = result .. '.';&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	if ( src.volume ) then&lt;br /&gt;
		local letter = i18nVolume[ src.lang ] or i18nVolume[ i18nDefaultLanguage ];&lt;br /&gt;
		result = result .. ' — ' .. letter .. '&amp;amp;nbsp;' .. toString(src.volume, options_commas ) .. '.';&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	if ( src.issue ) then&lt;br /&gt;
		result = result .. ' — №&amp;amp;nbsp;' .. toString(src.issue, options_commas ) .. '.';&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	if ( src.page ) then&lt;br /&gt;
		local letter = i18nPage[ src.lang ] or i18nPage[ i18nDefaultLanguage ];&lt;br /&gt;
		result = result .. ' — ' .. letter .. '&amp;amp;nbsp;' .. toString(src.page, options_commas )  .. '.';&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	if ( src.isbn13 ) then&lt;br /&gt;
		result = result .. ' — ISBN ' .. toString( src.isbn13, options_commas );&lt;br /&gt;
	elseif ( src.isbn10 ) then&lt;br /&gt;
		result = result .. ' — ISBN ' .. toString( src.isbn10, options_commas );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( src.issn ) then&lt;br /&gt;
		result = result .. ' — ISSN ' .. toString( src.issn, options_commas );&lt;br /&gt;
	end&lt;br /&gt;
	if ( src.doi ) then&lt;br /&gt;
		result = result .. ' — [http://dx.doi.org/' .. mw.uri.encode( src.doi ) .. ' DOI&amp;amp;nbsp;' .. src.doi .. ']';&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( src.entityId ) then&lt;br /&gt;
		if ( src.type and src.entityId ) then&lt;br /&gt;
			-- wrap into span to target from JS&lt;br /&gt;
			result = '&amp;lt;span class=&amp;quot;' .. toString( src.type, options_citetypes ) .. '&amp;quot; data-entity-id=&amp;quot;' .. getSingle( src.entityId ) .. '&amp;quot;&amp;gt;' .. result .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
		else&lt;br /&gt;
			result = '&amp;lt;span class=&amp;quot;citetype_unknown&amp;quot; data-entity-id=&amp;quot;' .. getSingle( src.entityId ) .. '&amp;quot;&amp;gt;' .. result .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( src.accessdate ) then&lt;br /&gt;
			local date = getSingle( src.accessdate );&lt;br /&gt;
			local pattern = &amp;quot;(%-?%d+)%-(%d+)%-(%d+)T&amp;quot;;&lt;br /&gt;
			local y, m, d = mw.ustring.match( date , pattern );&lt;br /&gt;
			y,m,d = tonumber(y),tonumber(m),tonumber(d);&lt;br /&gt;
			result = result .. &amp;quot; &amp;lt;small&amp;gt;Проверено &amp;quot; .. tostring(d) .. &amp;quot; &amp;quot; .. monthg[m]  .. &amp;quot; &amp;quot; .. tostring(y) .. &amp;quot;.&amp;lt;/small&amp;gt;&amp;quot;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return {text = result, code = src.code};&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderShortReference( src )&lt;br /&gt;
	src.lang = getSingle( src.lang ) or i18nDefaultLanguage;&lt;br /&gt;
	src.title = src.title or '\'\'(unspecified title)\'\''&lt;br /&gt;
&lt;br /&gt;
	local result = '[[#' .. PREFIX_CITEREF .. src.code .. '|';&lt;br /&gt;
	if ( src.author ) then&lt;br /&gt;
		result = result .. toString( src.author, options_commas_it_nolinks );&lt;br /&gt;
	else&lt;br /&gt;
		result = result .. toString( src.title, options_commas_it_nolinks );&lt;br /&gt;
	end&lt;br /&gt;
	result = result .. ']]'&lt;br /&gt;
&lt;br /&gt;
	if ( src.year ) then&lt;br /&gt;
		result = result .. ', ' .. toString( src.year, options_commas );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( src.volume ) then&lt;br /&gt;
		local letter = i18nVolume[ src.lang ] or i18nVolume[ i18nDefaultLanguage ];&lt;br /&gt;
		result = result .. ' — ' .. letter .. '&amp;amp;nbsp;' .. toString(src.volume, options_commas ) .. '.';&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	if ( src.issue ) then&lt;br /&gt;
		result = result .. ' — №&amp;amp;nbsp;' .. toString(src.issue, options_commas ) .. '.';&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	if ( src.page ) then&lt;br /&gt;
		local letter = i18nPage[ src.lang ] or i18nPage[ i18nDefaultLanguage ];&lt;br /&gt;
		result = result .. ' — ' .. letter .. '&amp;amp;nbsp;' .. toString(src.page, options_commas )  .. '.';&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getSingle( value )&lt;br /&gt;
	if ( not value ) then&lt;br /&gt;
		return;&lt;br /&gt;
	end&lt;br /&gt;
	if ( type( value ) == 'string' ) then&lt;br /&gt;
		return value;&lt;br /&gt;
	elseif ( type( value ) == 'table' ) then&lt;br /&gt;
		if ( value.id ) then&lt;br /&gt;
			return value.id;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		for i, tableValue in pairs( value ) do&lt;br /&gt;
			return getSingle( tableValue );&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return '(unknown)';&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function toString( value, options )&lt;br /&gt;
	if ( type( value ) == 'string' ) then&lt;br /&gt;
		return options.format( value );&lt;br /&gt;
	elseif ( type( value ) == 'table' ) then&lt;br /&gt;
		if ( value.id ) then&lt;br /&gt;
			-- this is link&lt;br /&gt;
			if ( options.preferids ) then&lt;br /&gt;
				return options.format( value.id );&lt;br /&gt;
			else&lt;br /&gt;
				if ( options.nolinks ) then&lt;br /&gt;
					return options.format( value.label or mw.wikibase.label( value.id ) or '\'\'(untranslated title)\'\'' );&lt;br /&gt;
				else&lt;br /&gt;
					return options.format( renderLink( value.id, value.label ) );&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local resultList = {};&lt;br /&gt;
		for i, tableValue in pairs( value ) do&lt;br /&gt;
			table.insert( resultList, toString( tableValue, options ) );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return mw.text.listToText( resultList, options.separator, options.conjunction);&lt;br /&gt;
	else&lt;br /&gt;
		return options.format( '(unknown type)' );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return '';&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderLink( entityId, text )&lt;br /&gt;
	if ( not entityId ) then&lt;br /&gt;
		error(&amp;quot;entityId is not specified&amp;quot;);&lt;br /&gt;
	end&lt;br /&gt;
	local actualText = text or mw.wikibase.label( entityId ) or '\'\'(untranslated)\'\'';&lt;br /&gt;
	local link = mw.wikibase.sitelink( entityId ) or ( ':d:' .. entityId )&lt;br /&gt;
	return '[[' .. link .. '|' .. actualText .. ']]';&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Expand special types of references when additional data could be found in OTHER entity properties&lt;br /&gt;
function expandSpecials( currentEntity, reference, data )&lt;br /&gt;
	if ( reference.snaks.P248&lt;br /&gt;
			and reference.snaks.P248[1]&lt;br /&gt;
			and reference.snaks.P248[1].datavalue&lt;br /&gt;
			and reference.snaks.P248[1].datavalue.value[&amp;quot;numeric-id&amp;quot;]) then&lt;br /&gt;
		local sourceId = &amp;quot;Q&amp;quot; .. reference.snaks.P248[1].datavalue.value[&amp;quot;numeric-id&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
		-- Gemeinsame Normdatei -- specified by P227&lt;br /&gt;
		if ( sourceId == 'Q36578' ) then&lt;br /&gt;
			appendMainSnaks( currentEntity, 'P227', data, 'title', { format = function( gnd ) return 'Record #' .. gnd; end } );&lt;br /&gt;
			appendMainSnaks( currentEntity, 'P227', data, 'url', { format = function( gnd ) return 'http://d-nb.info/gnd/' .. gnd .. '/'; end } );&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- BNF -- specified by P268&lt;br /&gt;
		if ( sourceId == 'Q15222191' ) then&lt;br /&gt;
			appendMainSnaks( currentEntity, 'P268', data, 'title', { format = function( id ) return 'Record #' .. id; end } );&lt;br /&gt;
			appendMainSnaks( currentEntity, 'P268', data, 'url', { format = function( id ) return 'http://catalogue.bnf.fr/ark:/12148/cb' .. id; end } );&lt;br /&gt;
			expandSpecialsQualifiers( currentEntity, 'P268', data );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Find a Grave -- specified by P535&lt;br /&gt;
		if ( sourceId == 'Q63056' ) then&lt;br /&gt;
			appendMainSnaks( currentEntity, 'P535', data, 'url', { format = function( id ) return 'http://www.findagrave.com/cgi-bin/fg.cgi?page=gr&amp;amp;GRid=' .. id; end } );&lt;br /&gt;
			expandSpecialsQualifiers( currentEntity, 'P535', data );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Gran Enciclopèdia Catalana -- specified by P1296&lt;br /&gt;
		if ( sourceId == 'Q2664168' ) then&lt;br /&gt;
			appendMainSnaks( currentEntity, 'P1296', data, 'url', { format = function( id ) return 'http://www.enciclopedia.cat/enciclop%C3%A8dies/gran-enciclop%C3%A8dia-catalana/EC-GEC-' .. id .. '.xml'; end } );&lt;br /&gt;
			expandSpecialsQualifiers( currentEntity, 'P1296', data );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Encyclopædia Britannica online -- specified by P1417&lt;br /&gt;
		if ( sourceId == 'Q5375741' ) then&lt;br /&gt;
			appendMainSnaks( currentEntity, 'P1417', data, 'url', { format = function( id ) return 'http://global.britannica.com/EBchecked/topic/' .. id .. '/'; end } );&lt;br /&gt;
			expandSpecialsQualifiers( currentEntity, 'P1417', data );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Electronic Jewish Encyclopedia (Elektronnaja Evrejskaja Entsiklopedia) -- specified by P1438&lt;br /&gt;
		if ( sourceId == 'Q1967250' ) then&lt;br /&gt;
			appendMainSnaks( currentEntity, 'P1438', data, 'url', { format = function( id ) return 'http://www.eleven.co.il/article/' .. id; end } );&lt;br /&gt;
			expandSpecialsQualifiers( currentEntity, 'P1438', data );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- sports-reference.com -- specified by P1447&lt;br /&gt;
		if ( sourceId == 'Q18002875' ) then&lt;br /&gt;
			appendMainSnaks( currentEntity, 'P1447', data, 'url', { format = function( id ) return 'http://www.sports-reference.com/olympics/athletes/' .. id .. '.html'; end } );&lt;br /&gt;
			expandSpecialsQualifiers( currentEntity, 'P1447', data );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- do we have appropriate record in P1343 ?&lt;br /&gt;
		local claims = findClaimsByValue( currentEntity, 'P1343', sourceId );&lt;br /&gt;
		if ( claims and #claims ~= 0 ) then&lt;br /&gt;
			appendQualifiers( claims, 'P958', data, 'part', {} );&lt;br /&gt;
			appendQualifiers( claims, 'P854', data, 'url', {} );&lt;br /&gt;
			appendQualifiers( claims, 'P357', data, 'title', {} );&lt;br /&gt;
			appendQualifiers( claims, 'P478', data, 'volume', {} );&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function expandSpecialsQualifiers( entity, propertyId, result )&lt;br /&gt;
	if ( entity.claims and entity.claims[propertyId] ) then&lt;br /&gt;
		local claims = entity.claims[propertyId];&lt;br /&gt;
		appendQualifiers( claims, 'P958', result, 'part', {} );&lt;br /&gt;
		appendQualifiers( claims, 'P854', result, 'url', {} );&lt;br /&gt;
		appendQualifiers( claims, 'P357', result, 'title', {} );&lt;br /&gt;
		appendQualifiers( claims, 'P478', result, 'volume', {} );&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function findClaimsByValue( entity, propertyId, value )&lt;br /&gt;
	local result = {};&lt;br /&gt;
	if ( entity and entity.claims and entity.claims[propertyId] ) then&lt;br /&gt;
		for i, claim in pairs( entity.claims[propertyId] ) do&lt;br /&gt;
			if ( claim.mainsnak and claim.mainsnak.datavalue ) then&lt;br /&gt;
				local datavalue = claim.mainsnak.datavalue;&lt;br /&gt;
				if ( datavalue.type == &amp;quot;string&amp;quot; and datavalue.value == value &lt;br /&gt;
					or datavalue.type == &amp;quot;wikibase-entityid&amp;quot; and datavalue.value[&amp;quot;entity-type&amp;quot;] == &amp;quot;item&amp;quot; and tostring( datavalue.value[&amp;quot;numeric-id&amp;quot;] ) == mw.ustring.sub( value, 2 ) ) then&lt;br /&gt;
					table.insert( result, claim );&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function appendMainSnaks( entity, propertyId, result, property, options )&lt;br /&gt;
	if ( entity.claims and entity.claims[propertyId] ) then&lt;br /&gt;
		for i, claim in pairs( entity.claims[propertyId] ) do&lt;br /&gt;
			if ( claim.mainsnak and claim.mainsnak.datavalue ) then&lt;br /&gt;
				appendImpl( claim.mainsnak.datavalue, result, property, options );&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function appendSnaks( allSnaks, snakPropertyId, result, property, options )&lt;br /&gt;
	if ( allSnaks and allSnaks[ snakPropertyId ] ) then&lt;br /&gt;
		for k, snak in pairs( allSnaks[ snakPropertyId ] ) do&lt;br /&gt;
			if ( snak and snak.datavalue ) then&lt;br /&gt;
				appendImpl( snak.datavalue, result, property, options );&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function appendQualifiers( claims, qualifierPropertyId, result, property, options )&lt;br /&gt;
	for i, claim in pairs( claims ) do&lt;br /&gt;
		if ( claim.qualifiers and claim.qualifiers[ qualifierPropertyId ] ) then&lt;br /&gt;
			for k, qualifier in pairs( claim.qualifiers[ qualifierPropertyId ] ) do&lt;br /&gt;
				if ( qualifier and qualifier.datavalue ) then&lt;br /&gt;
					appendImpl( qualifier.datavalue, result, property, options );&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function appendImpl( datavalue, result, property, options )&lt;br /&gt;
	if ( datavalue.type == 'string' ) then&lt;br /&gt;
		local value = datavalue.value;&lt;br /&gt;
		if ( options.format ) then&lt;br /&gt;
			value = options.format( value );&lt;br /&gt;
		end&lt;br /&gt;
		if ( not result[property] ) then&lt;br /&gt;
			result[property] = {};&lt;br /&gt;
		elseif ( type( result[property] ) == 'string' or ( type( result[property] ) == 'table' and type( result[property].id ) == 'string' ) ) then&lt;br /&gt;
			result[property] = { result[property] };&lt;br /&gt;
		end&lt;br /&gt;
		table.insert( result[property], value);&lt;br /&gt;
	elseif ( datavalue.type == 'wikibase-entityid' ) then&lt;br /&gt;
		local value = datavalue.value;&lt;br /&gt;
		if ( not result[property] ) then&lt;br /&gt;
			result[property] = {};&lt;br /&gt;
		elseif ( type( result[property] ) == 'string' or ( type( result[property] ) == 'table' and type( result[property].id ) == 'string' ) ) then&lt;br /&gt;
			result[property] = { result[property] };&lt;br /&gt;
		end&lt;br /&gt;
		table.insert( result[property], { id = 'Q' .. value[&amp;quot;numeric-id&amp;quot;] });&lt;br /&gt;
	elseif datavalue.type == 'time' then&lt;br /&gt;
		local value = datavalue.value;&lt;br /&gt;
		if ( options.format ) then&lt;br /&gt;
			value = options.format( value );&lt;br /&gt;
		end&lt;br /&gt;
		if ( not result[property] ) then&lt;br /&gt;
			result[property] = {};&lt;br /&gt;
		elseif ( type( result[property] ) == 'string' or ( type( result[property] ) == 'table' and type( result[property].id ) == 'string' ) ) then&lt;br /&gt;
			result[property] = { result[property] };&lt;br /&gt;
		end&lt;br /&gt;
		table.insert( result[property], tostring( value.time ));&lt;br /&gt;
    end &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function expandPublication( data )&lt;br /&gt;
	local publication = data.publication;&lt;br /&gt;
&lt;br /&gt;
	-- use only first one&lt;br /&gt;
	if ( type( publication ) == 'table' and publication[1] and publication[1].id ) then&lt;br /&gt;
		data.publication = publication[1];&lt;br /&gt;
		publication = data.publication;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( publication and publication.id ) then&lt;br /&gt;
		populateSourceData( data, publication.id );&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function loadSafe( entityId )&lt;br /&gt;
	if ( entityId == nil ) then&lt;br /&gt;
		error('entityId to load is not specified');&lt;br /&gt;
	end&lt;br /&gt;
	local status, result = pcall( function() return mw.loadData( 'Module:Source/' .. entityId ) end );&lt;br /&gt;
	if ( status == true ) then&lt;br /&gt;
		return true, result;&lt;br /&gt;
	end&lt;br /&gt;
	return false, nil;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function populateSourceData( data, sourceId )&lt;br /&gt;
	local loaded, sourceData = loadSafe( sourceId );&lt;br /&gt;
	if ( loaded and sourceData ) then&lt;br /&gt;
		populateSourceDataImpl( data, sourceData );&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function populateSourceDataImpl( data, sourceData )&lt;br /&gt;
	for key, value in pairs( sourceData ) do&lt;br /&gt;
		if ( not data[key] and key ~= 'title' ) then&lt;br /&gt;
			data[key] = value;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- if we already have title, than it would be the current one, otherwise move it to publication&lt;br /&gt;
	if ( sourceData.title ) then&lt;br /&gt;
		if ( not data.title ) then&lt;br /&gt;
			data.title = sourceData.title;&lt;br /&gt;
		else&lt;br /&gt;
			if ( not data.publication ) then&lt;br /&gt;
				data.publication = sourceData.title;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function updateWithRef( reference, src )&lt;br /&gt;
	-- specified&lt;br /&gt;
	if ( reference.snaks.O662 ) then&lt;br /&gt;
		local cid = reference.snaks.P662[1].datavalue.value;&lt;br /&gt;
		src.code = src.code .. '-cid:' .. cid;&lt;br /&gt;
		src.title = 'Compound Summary for: CID ' .. cid;&lt;br /&gt;
		src.url = 'http://pubchem.ncbi.nlm.nih.gov/summary/summary.cgi?cid=' .. cid;&lt;br /&gt;
		src.publication = { id = 'Q278487', label = 'PubChem' };&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	appendSnaks( reference.snaks, 'P50', src, 'author', {} );&lt;br /&gt;
	appendSnaks( reference.snaks, 'P364', src, 'lang', {} );&lt;br /&gt;
	appendSnaks( reference.snaks, 'P958', src, 'part', {} ); -- part&lt;br /&gt;
	appendSnaks( reference.snaks, 'P357', src, 'title', {} ); -- title&lt;br /&gt;
	appendSnaks( reference.snaks, 'P854', src, 'url', {} );&lt;br /&gt;
	appendSnaks( reference.snaks, 'P1433', src, 'publication', {} );&lt;br /&gt;
	appendSnaks( reference.snaks, 'P123', src, 'publisher', {} );&lt;br /&gt;
	appendSnaks( reference.snaks, 'P304', src, 'page', {} );&lt;br /&gt;
	appendSnaks( reference.snaks, 'P478', src, 'volume', {} );&lt;br /&gt;
	appendSnaks( reference.snaks, 'P577', src, 'date', {} );&lt;br /&gt;
	appendSnaks( reference.snaks, 'P813', src, 'accessdate', {} );&lt;br /&gt;
	return src;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderSource( frame )&lt;br /&gt;
	local arg = frame.args[1];&lt;br /&gt;
	return p.renderSourceImpl( arg );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderSourceImpl( entityId )&lt;br /&gt;
	local value = {};&lt;br /&gt;
	value[&amp;quot;numeric-id&amp;quot;] = string.sub( entityId , 2);&lt;br /&gt;
	local snak = { datavalue = { value =value } };&lt;br /&gt;
	local properties = {};&lt;br /&gt;
	properties[1] = snak;&lt;br /&gt;
	return renderReferenceImpl( {}, { snaks = { P248 = properties } } ).text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderReference( frame, currentEntity, reference )&lt;br /&gt;
	&lt;br /&gt;
	-- template call&lt;br /&gt;
	if ( frame and not currentEntity and not reference ) then&lt;br /&gt;
		local value = {};&lt;br /&gt;
		value[&amp;quot;numeric-id&amp;quot;] = string.sub( frame.args[1] , 2);&lt;br /&gt;
		local snak = { datavalue = { value =value } };&lt;br /&gt;
		local properties = {};&lt;br /&gt;
		properties[1] = snak;&lt;br /&gt;
		&lt;br /&gt;
		currentEntity = mw.wikibase.getEntityObject();&lt;br /&gt;
		reference = { snaks = { P248 = properties } };&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rendered = renderReferenceImpl( currentEntity, reference );&lt;br /&gt;
&lt;br /&gt;
	if ( not rendered ) then&lt;br /&gt;
		return '';&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result;&lt;br /&gt;
	local code = rendered.code or mw.text.encode( rendered.text );&lt;br /&gt;
	result = frame:extensionTag( 'ref', rendered.text, {name = code} ) .. '[[К:Википедия:Статьи с источниками из Викиданных]]';&lt;br /&gt;
&lt;br /&gt;
	if ( not rendered.found ) then&lt;br /&gt;
		result = result .. '[[К:Википедия:Статьи с неоформленными источниками из Викиданных]]';&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderReferenceImpl( currentEntity, reference )&lt;br /&gt;
	if ( not reference.snaks ) then&lt;br /&gt;
		return nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local data = {};&lt;br /&gt;
	local entityId, found, sourceData;&lt;br /&gt;
	if ( reference.snaks.P248 ) then&lt;br /&gt;
		entityId = &amp;quot;Q&amp;quot; .. reference.snaks.P248[1].datavalue.value[&amp;quot;numeric-id&amp;quot;];&lt;br /&gt;
		found, sourceData = loadSafe( entityId );&lt;br /&gt;
		data.code = entityId;&lt;br /&gt;
		data.entityId = entityId;&lt;br /&gt;
	else&lt;br /&gt;
		found = true;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	updateWithRef( reference, data );&lt;br /&gt;
	expandSpecials( currentEntity, reference, data );&lt;br /&gt;
	if ( entityId ) then&lt;br /&gt;
		if ( found and sourceData ) then&lt;br /&gt;
			populateSourceDataImpl( data, sourceData );&lt;br /&gt;
		else&lt;br /&gt;
			if ( data.title ) then&lt;br /&gt;
				data.publication = data.publication or { id = entityId, label = mw.wikibase.label( entityId ) };&lt;br /&gt;
			else&lt;br /&gt;
				data.title = { id = entityId, label = mw.wikibase.label( entityId ) };&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	expandPublication( data );&lt;br /&gt;
&lt;br /&gt;
	local rendered;&lt;br /&gt;
	if ( p.short ) then&lt;br /&gt;
		local toStore = p.deepcopy( data );&lt;br /&gt;
		if (not p.list ) then&lt;br /&gt;
			p.list = {};&lt;br /&gt;
		end&lt;br /&gt;
		p.list[toStore.code] = toStore;&lt;br /&gt;
		rendered = renderShortReference( data );&lt;br /&gt;
	else&lt;br /&gt;
		rendered = renderSource( data );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( mw.ustring.len( rendered.text ) == 0 ) then&lt;br /&gt;
		return nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	rendered.found = found;&lt;br /&gt;
	return rendered;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>Ilya Rudomilov</name></author>
		
	</entry>
</feed>