მოდული:Wikidata
გამოიყენება თარგში {{Wikidata}}.
local i18n = { ["errors"] = { ["property-param-not-provided"] = "თვისების პარამეტრი არ არის მითითებული", ["entity-not-found"] = "არსი ვერ მოიძებნა.", ["unknown-claim-type"] = "განცხადების უცნობი ტიპი.", ["unknown-snak-type"] = "სნეკის უცნობი ტიპი.", ["unknown-datavalue-type"] = "მონაცემთა მნიშვნელობის უცნობი ტიპი.", ["unknown-entity-type"] = "არსის უცნობი ტიპი.", ["unknown-property-module"] = "თქვენ უნდა დააყენოთ property-module და property-function.", ["unknown-claim-module"] = "თქვენ უნდა დააყენოთ claim-module და claim-function.", ["unknown-value-module"] = "თქვენ უნდა დააყენოთ value-module და value-function.", ["property-module-not-found"] = "თვისების გამომსახველი მოდული ვერ მოიძებნა", ["property-function-not-found"] = "თვისების გამომსახველი ფუნქცია ვერ მოიძებნა", ["claim-module-not-found"] = "დადასტურების გამომსახველი მოდული ვერ მოიძებნა.", ["claim-function-not-found"] = "დადასტურების გამომსახველი ფუნქცია ვერ მოიძებნა.", ["value-module-not-found"] = "მნიშვნელობის გამომსახველი მოდული ვერ მოიძებნა.", ["value-function-not-found"] = "მნიშვნელობის გამომსახველი ფუნქცია ვერ მოიძებნა.", ['see-wikidata-value'] = "ვიკიმონაცემების მნიშვნელობის ხილვა და შეცვლა" }, ["somevalue"] = "''უცნობი''", ["novalue"] = "", ["approximate"] = '<span style="border-bottom: 1px dotted; cursor: help;" title="დაახლოებით">დაახ. </span>', ["presumably"] = '<span style="border-bottom: 1px dotted; cursor: help;" title="სავარაუდოდ">სავარ. </span>',}-- settings, may differ from project to projectlocal categoryLinksToEntitiesWithMissingLabel = '[[კატეგორია:სტატიების ბმულები ვიკიმონაცემების ელემენტებზე ქართული წარწერის გარეშე]]';local categoryLocalValuePresent = '';local outputReferences = true;-- sources that shall be omitted if any preffered sources existslocal deprecatedSources = {Q36578 = true, -- Gemeinsame NormdateiQ63056 = true, -- Find a GraveQ15222191 = true, -- BNF};local preferredSources = {Q5375741 = true, -- Encyclopædia Britannica OnlineQ17378135 = true, -- Great Soviet Encyclopedia (1969—1978)};-- Ссылки на используемые модули, которые потребуются в 99% случаев загрузки страниц (чтобы иметь на виду при переименовании)local moduleSources = require('Module:Sources')local p = {}local formatDatavalue, formatEntityId, formatRefs, formatSnak, formatStatement, formatStatementDefault, formatProperty, getSourcingCircumstances, loadCacheSafe, throwError, toBoolean;local function copyTo( obj, target )for k, v in pairs( obj ) dotarget[k] = vendreturn target;endlocal function loadCacheSafe( entityId )local status, result = pcall( function() return mw.loadData( 'Module:WikidataCache/' .. entityId ) end );if ( status == true ) thenreturn result;endreturn nil;endlocal function parseISO8601(str)if 'table' == type(str) thenif str.args and str.args[1] thenstr = '' .. str.args[1]elsereturn 'unknown argument type: ' .. type( str ) .. ': ' .. table.tostring( str )endendlocal Y, M, D = (function(str) local pattern = "(%-?%d+)%-(%d+)%-(%d+)T"local Y, M, D = mw.ustring.match( str, pattern )return tonumber(Y), tonumber(M), tonumber(D)end) (str);local h, m, s = (function(str) local pattern = "T(%d+):(%d+):(%d+)%Z";local H, M, S = mw.ustring.match( str, pattern);return tonumber(H), tonumber(M), tonumber(S);end) (str);local oh,om = ( function(str)if str:sub(-1)=="Z" then return 0,0 end; -- ends with Z, Zulu time-- matches ±hh:mm, ±hhmm or ±hh; else returns nilslocal pattern = "([-+])(%d%d):?(%d?%d?)$";local sign, oh, om = mw.ustring.match( str, pattern);sign, oh, om = sign or "+", oh or "00", om or "00";return tonumber(sign .. oh), tonumber(sign .. om);end )(str)return tonumber(os.time({year=Y, month=M, day=D, hour=(h+oh), min=(m+om), sec=s})) * 1000;end--[[ Преобразует строку в булевое значение Принимает: строковое значение (может отсутствовать) Возвращает: булевое значение true или false, если получается распознать значение, или defaultValue во всех остальных случаях]]local function toBoolean( valueToParse, defaultValue ) if ( valueToParse ) then if valueToParse == '' or valueToParse == 'false' or valueToParse == '0' then return false end return true end return defaultValue;end--[[ Функция для получения сущности (еntity) для текущей страницы Подробнее о сущностях см. d:Wikidata:Glossary/ru Принимает: строковый индентификатор (типа P18, Q42) Возвращает: объект таблицу, элементы которой индексируются с нуля]]local function getEntityFromId( id ) if id then local cached = loadCacheSafe( id ); if ( cached ) then return cached; end return mw.wikibase.getEntityObject( id ) end local entity = mw.wikibase.getEntityObject(); if ( entity ) then local cached = loadCacheSafe( entity.id ); if ( cached ) then return cached; endend return entity;end--[[ Внутрення функция для формирования сообщения об ошибке Принимает: ключ элемента в таблице i18n (например entity-not-found) Возвращает: строку сообщения]]local function throwError( key ) error( i18n.errors[key] );end--[[ Функция для получения идентификатора сущностей Принимает: объект таблицу сущности Возвращает: строковый индентификатор (типа P18, Q42)]]local function getEntityIdFromValue( value ) local prefix = '' if value['entity-type'] == 'item' then prefix = 'Q' elseif value['entity-type'] == 'property' then prefix = 'P' else throwError( 'unknown-entity-type' ) end return prefix .. value['numeric-id']end-- проверка на наличие специилизированной функции в опцияхlocal function getUserFunction( options, prefix, defaultFunction ) -- проверка на указание специализированных обработчиков в параметрах, -- переданных при вызове if options[ prefix .. '-module' ] or options[ prefix .. '-function' ] then -- проверка на пустые строки в параметрах или их отсутствие if not options[ prefix .. '-module' ] or not options[ prefix .. '-function' ] then throwError( 'unknown-' .. prefix .. '-module' ); end -- динамическая загруза модуля с обработчиком указанным в параметре local formatter = require ('Module:' .. options[ prefix .. '-module' ]); if formatter == nil then throwError( prefix .. '-module-not-found' ) end local fun = formatter[ options[ prefix .. '-function' ] ] if fun == nil then throwError( prefix .. '-function-not-found' ) end return fun; end return defaultFunction;end-- Выбирает свойства по property id, дополнительно фильтруя их по рангуlocal function selectClaims( context, options, propertySelector )if ( not context ) then error( 'context not specified'); end;if ( not options ) then error( 'options not specified'); end;if ( not options.entity ) then error( 'options.entity is missing'); end;if ( not propertySelector ) then error( 'propertySelector not specified'); end;local WDS = require('Module:WikidataSelectors')result = WDS.filter(options.entity.claims, propertySelector) if ( not result or #result == 0 ) then return nil; end return result;end--[[ Функция для оформления утверждений (statement) Подробнее о утверждениях см. d:Wikidata:Glossary/ru Принимает: таблицу параметров Возвращает: строку оформленного текста, предназначенного для отображения в статье]]local function formatProperty( options ) -- Получение сущности по идентификатору local entity = getEntityFromId( options.entityId ) if not entity then return -- throwError( 'entity-not-found' ) end-- проверка на присутсвие у сущности заявлений (claim)-- подробнее о заявлениях см. d:Викиданные:Глоссарий if (entity.claims == nil) then return '' --TODO error? end-- improve optionsoptions.frame = g_frame;options.entity = entity;options.extends = function( self, newOptions )return copyTo( newOptions, copyTo( self, {} ) )endif ( options.i18n ) thenoptions.i18n = copyTo( options.i18n, copyTo( i18n, {} ) );elseoptions.i18n = i18n;end-- create contextlocal context = { formatSnak = formatSnak, formatPropertyDefault = formatPropertyDefault, formatStatementDefault = formatStatementDefault }context.formatProperty = function( options ) local func = getUserFunction( options, 'property', context.formatPropertyDefault );return func( context, options )end;context.formatStatement = function( options, statement ) return formatStatement( context, options, statement ) end;context.formatSnak = function( options, snak, circumstances ) return formatSnak( context, options, snak, circumstances ) end;context.formatRefs = function( options, statement ) return formatRefs( context, options, statement ) end;context.parseTimeFromSnak = function( snak )if ( snak and snak.datavalue and snak.datavalue.value and snak.datavalue.value.time ) thenlocal timeISO6801 = tostring( snak.datavalue.value.time )return parseISO8601( timeISO6801 );endreturn nil;endcontext.getSourcingCircumstances = function( statement ) return getSourcingCircumstances( statement ) end;context.selectClaims = function( options, propertyId ) return selectClaims( context, options, propertyId ) end;return context.formatProperty( options );endfunction formatPropertyDefault( context, options )if ( not context ) then error( 'context not specified' ); end;if ( not options ) then error( 'options not specified' ); end;if ( not options.entity ) then error( 'options.entity missing' ); end; local claims = context.selectClaims( options, options.property ); if (claims == nil) then return '' --TODO error? end -- Обход всех заявлений утверждения и с накоплением оформленых предпочтительных -- заявлений в таблице local formattedClaims = {} for i, claim in ipairs(claims) do local formattedStatement = context.formatStatement( options, claim ) -- здесь может вернуться либо оформленный текст заявления -- либо строка ошибки nil похоже никогда не возвращается if (formattedStatement) then formattedStatement = '<span class="wikidata-claim" data-wikidata-property-id="' .. string.upper( options.property ) .. '" data-wikidata-claim-id="' .. claim.id .. '">' .. formattedStatement .. '</span>' table.insert( formattedClaims, formattedStatement ) end end-- создание текстовой строки со списком оформленых заявлений из таблицы return mw.text.listToText( formattedClaims, options.separator, options.conjunction )end--[[ Функция для оформления одного утверждения (statement) Принимает: объект-таблицу утверждение и таблицу параметров Возвращает: строку оформленного текста с заявлением (claim)]]function formatStatement( context, options, statement )if ( not statement ) thenerror( 'statement is not specified or nil' );end if not statement.type or statement.type ~= 'statement' then throwError( 'unknown-claim-type' ) end local functionToCall = getUserFunction( options, 'claim', context.formatStatementDefault ); return functionToCall( context, options, statement );endfunction getSourcingCircumstances( statement )if (not statement) then error('statement is not specified') end;local circumstances = {};if ( statement.qualifiersand statement.qualifiers.P1480 ) thenfor i, qualifier in pairs( statement.qualifiers.P1480 ) doif ( qualifierand qualifier.datavalueand qualifier.datavalue.type == 'wikibase-entityid'and qualifier.datavalue.valueand qualifier.datavalue.value["entity-type"] == 'item' ) thenlocal circumstance = 'Q' .. qualifier.datavalue.value["numeric-id"];if ( 'Q18086598' == circumstance ) thencircumstances.approximate = true;endif ( 'Q18122778' == circumstance ) thencircumstances.presumably = true;endendendendreturn circumstances;end--[[ Функция для оформления одного утверждения (statement) Принимает: объект-таблицу утверждение, таблицу параметров, объект-функцию оформления внутренних структур утверждения (snak) и объект-функцию оформления ссылки на источники (reference) Возвращает: строку оформленного текста с заявлением (claim)]]function formatStatementDefault( context, options, statement )if (not context) then error('context is not specified') end;if (not options) then error('options is not specified') end;if (not statement) then error('statement is not specified') end;local circumstances = context.getSourcingCircumstances( statement );if ( options.references ) then return context.formatSnak( options, statement.mainsnak, circumstances ) .. context.formatRefs( options, statement ); else return context.formatSnak( options, statement.mainsnak, circumstances ); endend--[[ Функция для оформления части утверждения (snak) Подробнее о snak см. d:Викиданные:Глоссарий Принимает: таблицу snak объекта (main snak или же snak от квалификатора) и таблицу опций Возвращает: строку оформленного викитекста]]function formatSnak( context, options, snak, circumstances )circumstances = circumstances or {};local hash = '';local mainSnakClass = '';if ( snak.hash ) thenhash = ' data-wikidata-hash="' .. snak.hash .. '"';elsemainSnakClass = ' wikidata-main-snak';endlocal before = '<span class="wikidata-snak ' .. mainSnakClass .. '"' .. hash .. '>'local after = '</span>' if snak.snaktype == 'somevalue' then return before .. options.i18n['somevalue'] .. after; elseif snak.snaktype == 'novalue' then return before .. options.i18n['novalue'] .. after; elseif snak.snaktype == 'value' thenif ( circumstances.presumably ) thenbefore = before .. options.i18n.presumably;endif ( circumstances.approximate ) thenbefore = before .. options.i18n.approximate;end return before .. formatDatavalue( context, options, snak.datavalue ) .. after; else throwError( 'unknown-snak-type' ); endend--[[ Функция для оформления объектов-значений с географическими координатами Принимает: объект-значение и таблицу параметров, Возвращает: строку оформленного текста]]function formatGlobeCoordinate( value, options )-- проверка на требование в параметрах вызова на возврат сырого значения if options['subvalue'] == 'latitude' then -- широты return value['latitude'] elseif options['subvalue'] == 'longitude' then -- долготы return value['longitude'] else -- в противном случае формируются параметры для вызова шаблона {{coord}} -- нужно дописать в документации шаблона, что он отсюда вызывается, и что -- любое изменние его парамеров должно быть согласовано с кодом тут local eps = 0.0000001 -- < 1/360000 local globe = '' -- TODO local lat = {} lat['abs'] = math.abs(value['latitude']) lat['ns'] = value['latitude'] >= 0 and 'N' or 'S' lat['d'] = math.floor(lat['abs'] + eps) lat['m'] = math.floor((lat['abs'] - lat['d']) * 60 + eps) lat['s'] = math.max(0, ((lat['abs'] - lat['d']) * 60 - lat['m']) * 60) local lon = {} lon['abs'] = math.abs(value['longitude']) lon['ew'] = value['longitude'] >= 0 and 'E' or 'W' lon['d'] = math.floor(lon['abs'] + eps) lon['m'] = math.floor((lon['abs'] - lon['d']) * 60 + eps) lon['s'] = math.max(0, ((lon['abs'] - lon['d']) * 60 - lon['m']) * 60) local coord = '{{coord' if (value['precision'] == nil) or (value['precision'] < 1/60) then -- по умолчанию с точностью до секунды coord = coord .. '|' .. lat['d'] .. '|' .. lat['m'] .. '|' .. lat['s'] .. '|' .. lat['ns'] coord = coord .. '|' .. lon['d'] .. '|' .. lon['m'] .. '|' .. lon['s'] .. '|' .. lon['ew'] elseif value['precision'] < 1 then coord = coord .. '|' .. lat['d'] .. '|' .. lat['m'] .. '|' .. lat['ns'] coord = coord .. '|' .. lon['d'] .. '|' .. lon['m'] .. '|' .. lon['ew'] else coord = coord .. '|' .. lat['d'] .. '|' .. lat['ns'] coord = coord .. '|' .. lon['d'] .. '|' .. lon['ew'] end coord = coord .. '|globe:' .. globe if options['display'] then coord = coord .. '|display=' .. options.display else coord = coord .. '|display=title' end coord = coord .. '}}' return g_frame:preprocess(coord) endendlocal function getDefaultValueFunction( datavalue ) -- вызов обработчиков по умолчанию для известных типов значений if datavalue.type == 'wikibase-entityid' then -- идентификатор сущности return function( context, options, value ) return formatEntityId( getEntityIdFromValue( value ), options ) end; elseif datavalue.type == 'string' then -- строка return function( context, options, value ) return value end; elseif datavalue.type == 'monolingualtext' then -- моноязычный текст (строка с указанием языка) return function( context, options, value ) if ( options.monolingualLangTemplate == 'lang' ) then return options.frame:expandTemplate{ title = 'lang-' .. value.language, args = { value.text } }; elseif ( options.monolingualLangTemplate == 'ref' ) then return '<span class="lang" lang="' .. value.language .. '">' .. value.text .. '</span>' .. options.frame:expandTemplate{ title = 'ref-' .. value.language }; else return '<span class="lang" lang="' .. value.language .. '">' .. value.text .. '</span>'; end end; elseif datavalue.type == 'globecoordinate' then -- географические координаты return function( context, options, value ) return formatGlobeCoordinate( value, options ) end; elseif datavalue.type == 'quantity' then return function( context, options, value ) -- диапазон значений local amount = string.gsub(value['amount'], '^%+', '') local lang = mw.language.new( 'ka' ) return lang:formatNum( tonumber( amount ) ) end; elseif datavalue.type == 'time' then return function( context, options, value )local moduleDate = require('Module:Wikidata/date') return moduleDate.formatDate( context, options, value ); end; else -- во всех стальных случаях возвращаем ошибку throwError( 'unknown-datavalue-type' ) endend--[[ Функция для оформления значений (value) Подробнее о значениях см. d:Wikidata:Glossary/ru Принимает: объект-значение и таблицу параметров, Возвращает: строку оформленного текста]]function formatDatavalue( context, options, datavalue )if ( not context ) then error( 'context not specified' ); end;if ( not options ) then error( 'options not specified' ); end;if ( not datavalue ) then error( 'datavalue not specified' ); end;if ( not datavalue.value ) then error( 'datavalue.value is missng' ); end; -- проверка на указание специализированных обработчиков в параметрах, -- переданных при вызове context.formatValueDefault = getDefaultValueFunction( datavalue ); local functionToCall = getUserFunction( options, 'value', context.formatValueDefault ); return functionToCall( context, options, datavalue.value );end-- Небольшой словарь упрощенного отображения (TODO: надо сделать расширенный с учётом даты)local simpleReplaces = {Q30 = '[[ამერიკის შეერთებული შტატები|აშშ]]',Q148 = '[[ჩინეთის სახალხო რესპუბლიკა|ჩინეთი]]',Q183 = '[[გერმანია]]',Q258 = '[[სამხრეთ აფრიკის რესპუბლიკა|სარ]]',Q423 = '[[კორეის სახალხო დემოკრატიული რესპუბლიკა|ჩრდილოეთი კორეა]]',Q2184 = '[[რსფსრ]]',Q2895 = '[[ბელორუსიის საბჭოთა სოციალისტური რესპუბლიკა|ბელორუსიის სსრ]]',Q15180 = '[[საბჭოთა სოციალისტური რესპუბლიკების კავშირი|სსრკ]]',Q16957 = '[[გერმანიის დემოკრატიული რესპუბლიკა|გდრ]]',Q130229 = '[[საქართველოს საბჭოთა სოციალისტური რესპუბლიკა|საქართველოს სსრ]]',Q307022 = '[[აფხაზეთის ავტონომიური საბჭოთა სოციალისტური რესპუბლიკა|აფხაზეთის ასსრ]]',Q378203 = '[[აჭარის ავტონომიური საბჭოთა სოციალისტური რესპუბლიკა|აჭარის ასსრ]]',Q130280 = '[[ესტონეთის საბჭოთა სოციალისტური რესპუბლიკა|ესტონეთის სსრ]]',Q131337 = '[[აზერბაიჯანის საბჭოთა სოციალისტური რესპუბლიკა|აზერბაიჯანის სსრ]]',Q132856 = '[[სომხეთის საბჭოთა სოციალისტური რესპუბლიკა|სომხეთის სსრ]]',Q133356 = '[[უკრაინის საბჭოთა სოციალისტური რესპუბლიკა|უკრაინის სსრ]]',Q168811 = '[[ყაზახეთის საბჭოთა სოციალისტური რესპუბლიკა|ყაზახეთის სსრ]]',Q170895 = '[[მოლდავეთის საბჭოთა სოციალისტური რესპუბლიკა|მოლდავეთის სსრ]]',Q173761 = '[[ლიტვის საბჭოთა სოციალისტური რესპუბლიკა|ლიტვის სსრ]]',Q192180 = '[[ლატვიის საბჭოთა სოციალისტური რესპუბლიკა|ლატვიის სსრ]]',Q199707 = '[[თურქმენეთის საბჭოთა სოციალისტური რესპუბლიკა|თურქმენეთის სსრ]]',Q199711 = '[[ტაჯიკეთის საბჭოთა სოციალისტური რესპუბლიკა|ტაჯიკეთის სსრ]]',Q484578 = '[[უზბეკეთის საბჭოთა სოციალისტური რესპუბლიკა|უზბეკეთის სსრ]]',Q545205 = '[[ამიერკავკასიის სოციალისტური ფედერაციული საბჭოთა რესპუბლიკა|ასფსრ]]',Q809806 = '[[ბაშკირეთის ავტონომიური საბჭოთა სოციალისტური რესპუბლიკა|ბაშკირეთის ასსრ]]', Q1140829 = '[[თათრეთის ავტონომიური საბჭოთა სოციალისტური რესპუბლიკა|თათრეთის ასსრ]]',Q1157215 = '[[დაღესტანის ავტონომიური საბჭოთა სოციალისტური რესპუბლიკა|დაღესტანის ასსრ]]',}--[[ Функция для оформления идентификатора сущности Принимает: строку индентификатора (типа Q42) и таблицу параметров, Возвращает: строку оформленного текста]]function formatEntityId( entityId, options )-- получение локализованного названия local label = nil; if ( options.text and options.text ~= '' ) then label = options.text else if ( simpleReplaces[entityId] ) thenreturn simpleReplaces[entityId];endlabel = mw.wikibase.label( entityId ); end-- получение ссылки по идентификатору local link = mw.wikibase.sitelink( entityId ) if link then if label then return '[[' .. link .. '|' .. label .. ']]' else return '[[' .. link .. ']]' end end if label then return '[[:d:' .. entityId .. '|' .. label .. ']]' end -- сообщение об отсутвии локализованного названия -- not good, but better than nothing return '[[d:' .. entityId .. '|' .. entityId .. ']]<span style="border-bottom: 1px dotted; cursor: help; white-space: nowrap" title="ვიკიმონაცემებში ამ ელემენტის ქართული წარწერა არ არის. თქვენ შეგიძლიათ დახმარება, ქართული ვარიანტის დაწერით.">?</span>' .. categoryLinksToEntitiesWithMissingLabel;end-- getting sitelink of a given wikifunction p.getSiteLink(frame)local f = frame.args[1]local k = frame.args[2]local entity = mw.wikibase.getEntity( k )if not entity thenreturnendlocal link = entity:getSitelink( f )if not link thenreturnendreturn linkend--[[ Функция для оформления утверждений (statement) Подробнее о утверждениях см. d:Wikidata:Glossary/ru Принимает: таблицу параметров Возвращает: строку оформленного текста, предназначенного для отображения в статье]]-- устаревшее имя, не использоватьfunction p.formatStatements( frame )return p.formatProperty( frame );endfunction p.formatProperty( frame ) local args = frame.args local plain = toBoolean( frame.args.plain, false ); frame.args.nocat = toBoolean( frame.args.nocat, false ); frame.args.references = toBoolean( frame.args.references, true ); -- проверка на отсутствие обязательного параметра property if not frame.args.property then throwError( 'property-param-not-provided' ) end-- если значение передано в параметрах вызова то выводим только его if frame.args.value and frame.args.value ~= '' then if plain or frame.args.nocat or frame:callParserFunction( '#property', frame.args.property )=='' then -- опция, запрещающая оформление значения, поэтому никак не трогаем return frame.args.value else -- если трогать всё-таки можно, добавляем категорию-маркер return args.value .. categoryLocalValuePresent; end end if ( plain ) then -- вызова стандартного обработчика без оформления, если передана опция plain return frame:callParserFunction( '#property', frame.args.property ); endg_frame = frame-- после проверки всех аргументов -- вызов функции оформления для свойства (набора утверждений) return formatProperty( frame.args )end--[[ Функция оформления ссылок на источники (reference) Подробнее о ссылках на источники см. d:Wikidata:Glossary/ru Экспортируется в качестве зарезервированной точки для вызова из функций-расширения вида claim-module/claim-function через context Вызов из других модулей напрямую осуществляться не должен (используйте frame:expandTemplate вместе с одним из специлизированных шаблонов вывода значения свойства). Принимает: объект-таблицу утверждение Возвращает: строку оформленных ссылок для отображения в статье]]function formatRefs( context, options, statement )if ( not context ) then error( 'context not specified' ); end;if ( not options ) then error( 'options not specified' ); end;if ( not options.entity ) then error( 'options.entity missing' ); end;if ( not statement ) then error( 'statement not specified' ); end;if ( not outputReferences ) thenreturn '';endlocal result = '';if ( statement.references ) thenlocal allReferences = statement.references;local hasPreferred = false;for _, reference in pairs( statement.references ) doif ( reference.snaksand reference.snaks.P248and reference.snaks.P248[1]and reference.snaks.P248[1].datavalueand reference.snaks.P248[1].datavalue.value["numeric-id"] ) thenlocal entityId = "Q" .. reference.snaks.P248[1].datavalue.value["numeric-id"];if ( preferredSources[entityId] ) thenhasPreferred = true;endendendfor _, reference in pairs( statement.references ) dolocal display = true;if ( hasPreferred ) thenif ( reference.snaksand reference.snaks.P248and reference.snaks.P248[1]and reference.snaks.P248[1].datavalueand reference.snaks.P248[1].datavalue.value["numeric-id"] ) thenlocal entityId = "Q" .. reference.snaks.P248[1].datavalue.value["numeric-id"];if ( deprecatedSources[entityId] ) thendisplay = false;endendendif ( display ) thenresult = result .. moduleSources.renderReference( g_frame, options.entity, reference );endendendreturn resultendreturn p
🔥 Top keywords: მთავარი გვერდიევროპის საფეხბურთო ჩემპიონატი 2024სპეციალური:ძიებაევროპის საფეხბურთო ჩემპიონატიდიდგორის ბრძოლაკატეგორია:ქართული გვარებიმამის დღესლოვაკეთისეტყვასაქართველოქვეყნების სიასაჭმელი ტრიუფელითამარ მეფესლოვენიადავით IV აღმაშენებელისაქართველოს ეროვნული საფეხბურთო ნაკრებიმიხეილ მესხის სტადიონიყურბან-ბაირამიილია ჭავჭავაძემეორე მსოფლიო ომიგიორგი მიქაუტაძეჩუტყვავილახვიჩა კვარაცხელიამსოფლიო საფეხბურთო ჩემპიონატიკრიშტიანუ რონალდუპირველი მსოფლიო ომიბელგიარაბათის ციხერუმინეთიგერმანიაკარლეს პუჩდემონიიოანე-ზოსიმეთურქეთის ეროვნული საფეხბურთო ნაკრებივეფხისტყაოსანივახტანგ I გორგასალიქუნთრუშათბილისიზღვის დონექართული დამწერლობა