Модуль:Wikidata
Внимание! Это один из самых используемых модулей. |
Этот модуль относится к критическим. У него очень много включений или он используется с подстановкой. Из-за опасности вандализма или ошибочного редактирования он был защищён. |
Используется в {{Wikidata}} (см. описания параметров там же). Настраивается при помощи Модуль:Wikidata/config.
Прежде чем вносить какие-либо изменения в данный модуль, просьба оттестировать их в /песочнице. Обратите внимание, что не всё корректно работает в песочнице.
Общие сведения
Функции данного модуля не предназначены для прямого вызова из шаблонов карточек или других модулей, не являющихся функциями расширения данного. Для вызова из шаблонов карточек используйте шаблон {{wikidata}} или один из специализированных шаблонов для свойств. Для вызова функций Викиданных предназначенных для отображения чаще всего достаточно вызова frame:expandTemplate{}
с вызовом шаблона, ответственного за отрисовку свойства. С другой стороны, вызов определённых функций модуля (в основном это касается getEntityObject()
) может в будущем стать предпочтительным. Данный Lua-функционал в любом случае стоит рассматривать как unstable с точки зрения сохранения совместимости на уровне кода (вместе с соответствующими функциями API для Wikibase Client).
Далее описывается внутренняя документация. Названия функций и параметров могут изменяться. При их изменении автор изменений обязан обновить шаблон {{wikidata}} и специализированные шаблоны свойств. Изменения в других местах, если кто-то всё-таки вызывает функции модуля напрямую, остаются на совести автора «костыля». Итак, при вызове шаблона {{wikidata}} или специализированного шаблона свойства управление отдаётся на функцию formatStatements, которая принимает frame. Из frame достаются следующие опции, которые так или иначе передаются в остальные функции:
plain
— булевый переключатель (по умолчанию false). Если true, результат совпадает с обычным вызовом{{#property:pNNN}}
(по факту им и будет являться)references
— булевый переключатель (по умолчанию true). Если true, после вывода значения параметра дополнительно выводит ссылки на источники, указанные в Викиданных. Для вывода используется Модуль:Sources. Обычно отключается для тех свойств, которые являются «самоописываемыми», например, внешними идентификаторами или ссылками (когда такая ссылка является доказательством своей актуальности), например, идентификаторы IMDb.value
— значение, которое надо выводить вместо значений из Викиданных (используется, если что-то задано уже в карточке в виде т. н. локального свойства)
По умолчанию модуль поддерживает вывод следующих значений без дополнительных настроек:
- географические координаты (coordinates)
- количественные значения (quantity)
- моноязычный текст (monolingualtext)
- строки (string)
- даты (time)
Остальные типы данных требуют указания функции форматирования значения.
Кастомизация
Поддерживаются три типа параметров-функций, которые дополнительно указывают, как надо форматировать значения:
property-module
,property-function
— название модуля и функции модуля, которые отвечают за форматирование вывода массива значений свойства (statements, claims) с учётом квалификаторов, ссылок и прочего. Например, оформляет множество выводов в таблицу или график. Характерные примеры:- вывод таблицы и графика населения в {{wikidata/Population}} и Модуль:Wikidata/Population.
- Спецификация функции:
function p.…( context, options )
, поведение по умолчанию: Модуль:Wikidata#formatPropertyDefault.
claim-module
,claim-function
— название модуля и функции модуля, которые отвечают за форматирование вывода значения свойства (statement, claim) с учётом квалификаторов, ссылок и прочего. Может, например, дополнительно к основному значению (main snak) вывести значения квалификаторов. Характерные примеры:- вывод вышестоящих административных единиц и страны в Модуль:Wikidata/Places;
- вывод авторов латинского названия и даты публикации в Модуль:Wikidata/Biology;
- вывод операционной системы и даты релиза в Модуль:Wikidata/Software;
- вывод количества и даты, на которую оно верно, в Модуль:Wikidata/number;
- Спецификация функции:
function p.…( context, statement )
value-module
,value-function
— название модуля и функции модуля, которые отвечают за форматирование значения (snak, snak data value), в зависимости от контекста, как значений свойства, так и значений квалификатора (если вызывается изclaim-module/claim-function
). Необходимо для изменения отображения свойства, например, генерации викиссылки вместо простой строки или даже вставки изображения вместо отображения имени файла изображения (так как ссылки на изображения хранятся как строки). Характерные примеры:- вывод ссылки на Викисклад в Модуль:Wikidata/media
- вывод ссылок на внешние сайты в Модуль:Wikidata/link
- Спецификация функции:
function p.…( value, options )
Заготовки функций
function p.formatSomeProperty( context, options )
local claims = context.selectClaims( options, options.property );
if claims == nil then
return ''
end
local formattedStatements = {}
for _, claim in ipairs( claims ) do
local formattedStatement = context.formatStatement( options, claim )
-- local formattedStatement = p.formatSomeStatement( context, options, claim )
if ( formattedStatement and formattedStatement ~= '' ) then
formattedStatement = context.wrapStatement( formattedStatement, options.property, claim.id )
table.insert( formattedStatements, formattedStatement )
end
end
return mw.text.listToText( formattedStatements, options.separator, options.conjunction )
end
Также см. код метода formatPropertyDefault
ниже, в нём присутствует больше проверок и работа параметрами вызова.
function formatSomeClaim( context, options, statement )
local circumstances = context.getSourcingCircumstances( statement );
options.qualifiers = statement.qualifiers;
local result = context.formatSnak( options, statement.mainsnak, circumstances );
if ( result and result ~= '' and options.references ) then
result = result .. context.formatRefs( options, statement );
end
return result;
end
Также см. код метода formatStatementDefault
ниже, в нём есть пример работы с квалификаторами.
function formatSomeValue( context, options, value )
return value;
end
Также см. код метода formatUrlSingle
в модуле Модуль:URL.
Context API
Этот раздел не завершён. |
Переменные
entity
frame
Методы
cloneOptions( options )
getSourcingCircumstances( statement )
formatProperty( options )
formatPropertyDefault( context, options )
formatSnak( options, snak, circumstances )
formatStatement( options, statement )
formatStatementDefault( context, options, statement )
formatRefs( options, statement )
formatValueDefault( context, options, value )
parseTimeBoundariesFromSnak( snak )
parseTimeFromSnak( snak )
selectClaims( options, propertyId )
wrapSnak( value, hash, attributes )
wrapStatement( value, propertyId, claimId, attributes )
wrapQualifier( value, qualifierId, attributes )
Функции для форматирования
property-function
- Wikidata/date::formatDateIntervalProperty
- Wikidata/Medals::formatProperty
- Wikidata/Software::formatVersionProperty
- Wikidata/P512::formatAcademicDegree
- Wikidata/number::formatPropertyWithMostRecentClaimAndIndicator
- Wikidata/number::formatColorIndex
claim-function
- Wikidata/Places::formatCountryClaimWithFlag
- Wikidata/Places::formatPlaceWithQualifiers
- Wikidata/item::formatEntityWithGenderClaim
- Wikidata/Biology::formatTaxonNameClaim
- Wikidata/item::applyDefaultTemplate
- Wikidata/date::formatDateOfBirthClaim
- Wikidata/date::formatDateOfDeathClaim
value-function
- Wikidata::extractCategory
- Wikidata/link::fromModule
- Wikidata/Medals::formatValue
- Wikidata/media::formatCommonsCategory
- Wikidata/Software::formatExtension
- Wikidata/number::formatRA
- Wikidata/number::formatDMS
- Wikidata/url::formatUrlValue
- Wikidata/url::formatLangRefs
См. также
- Модуль:Wikibase
- Независимые иноязычные аналоги:
local i18n = { ["errors"] = { ["property-param-not-provided"] = "Не дан параметр свойства", ["entity-not-found"] = "Сущность не найдена.", ["unknown-claim-type"] = "Неизвестный тип заявления.", ["unknown-snak-type"] = "Неизвестный тип снэка.", ["unknown-datavalue-type"] = "Неизвестный тип значения данных.", ["unknown-entity-type"] = "Неизвестный тип сущности.", ["unknown-claim-module"] = "Вы должны установить и claim-module, и claim-function.", ["unknown-value-module"] = "Вы должны установить и value-module, и value-function.", ["claim-module-not-found"] = "Модуль, на который указывает утверждение, не найден.", ["claim-function-not-found"] = "Функция, на которую указывает утверждение, не найдена.", ["value-module-not-found"] = "Модуль, на который указывает значение, не найден.", ["value-function-not-found"] = "Функция, на которую указывает значение, не найдена." }, ["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 project local categoryLinksToEntitiesWithMissingLabel = '[[Категория:ЭАНМ:Статьи со ссылками на элементы Викиданных без русской подписи]]'; local categoryLocalValuePresent = '[[Категория:ЭАНМ:Статьи с переопределением значения из Викиданных]]'; local outputReferences = true; -- sources that shall be omitted if any preffered sources exists local deprecatedSources = { Q36578 = true, -- Gemeinsame Normdatei }; local preferredSources = { Q5375741 = true, -- Encyclopædia Britannica Online Q17378135 = true, -- Great Soviet Encyclopedia (1969—1978) }; -- Ссылки на используемые модули, которые потребуются в 99% случаев загрузки страниц (чтобы иметь на виду при переименовании) local moduleSources = require('Module:Sources') local p = {} --[[ Преобразует строку в булевое значение Принимает: строковое значение (может отсутствовать) Возвращает: булевое значение 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 function loadCacheSafe( entityId ) local status, result = pcall( function() return mw.loadData( 'Module:WikidataCache/' .. entityId ) end ); if ( status == true ) then return result; end return nil; end --[[ Функция для получения сущности (еntity) для текущей страницы Подробнее о сущностях см. d:Wikidata:Glossary/ru Принимает: строковый индентификатор (типа P18, Q42) Возвращает: объект таблицу, элементы которой индексируются с нуля ]] function getEntityFromId( id ) if id then local cached = loadCacheSafe( id ); if ( cached ) then return cached; end -- в документации [[Extension:Wikibase Client/Lua]] -- вызов mw.wikibase.getEntity считатеся устаревшей -- необходимо использовать mw.wikibase.getEntityObject return mw.wikibase.getEntity( id ) end -- TODO: replace with entityObject local entity = mw.wikibase.getEntity(); if ( entity ) then local cached = loadCacheSafe( entity.id ); if ( cached ) then return cached; end end return mw.wikibase.getEntity() end --[[ Функция для получения идентификатора сущностей Принимает: объект таблицу сущности Возвращает: строковый индентификатор (типа P18, Q42) ]] function getEntityIdFromValue( value ) local prefix = '' if value['entity-type'] == 'item' then prefix = 'Q' elseif value['entity-type'] == 'property' then prefix = 'P' else return formatError( 'unknown-entity-type' ) end return prefix .. value['numeric-id'] end --[[ Внутрення функция для формирования сообщения об ошибке Принимает: ключ элемента в таблице i18n (например entity-not-found) Возвращает: строку сообщения ]] local function formatError( key ) return '<span class="error">' .. i18n.errors[key] .. '</span>' end -- Выбирает свойства по property id, дополнительно фильтруя их по рангу local function selectClaims( context, propertyId ) local allPropertyClaims = context.entity.claims[ string.upper( propertyId ) ]; if ( not allPropertyClaims ) then return nil; end --Поиск предпочтительного ранга local requiredRank = 'normal' -- ранг по умолчанию (deprecated не используем) -- если есть хотя бы один preferred, используем только их if ( allPropertyClaims[0] ) then for i = 0, #allPropertyClaims do local statement = allPropertyClaims[i] if (statement.rank == 'preferred') then requiredRank = 'preferred'; break end end else for i, statement in pairs( allPropertyClaims ) do if (statement.rank == 'preferred') then requiredRank = 'preferred'; break end end end local result = {}; if ( allPropertyClaims[0] ) then for i = 0, #allPropertyClaims do local statement = allPropertyClaims[i] if (statement.rank == requiredRank) then result[ #result + 1 ] = statement; end end else for i, statement in pairs( allPropertyClaims ) do if (statement.rank == requiredRank) then result[ #result + 1 ] = statement; end end end if ( #result == 0 ) then return nil; end return result; end --[[ Функция для оформления утверждений (statement) Подробнее о утверждениях см. d:Wikidata:Glossary/ru Принимает: таблицу параметров Возвращает: строку оформленного текста, предназначенного для отображения в статье ]] function formatStatements( options ) -- Получение сущности по идентификатору local entity = getEntityFromId( options.entityId ) if not entity then return -- formatError( 'entity-not-found' ) end -- проверка на присутсвие у сущности заявлений (claim) -- подробнее о заявлениях см. d:Викиданные:Глоссарий if (entity.claims == nil) then return '' --TODO error? end local context = { frame = g_frame, entity = entity, options = options, formatSnak = formatSnak, formatStatementDefault = formatStatementDefault } context.formatSnak = function( snak, options, circumstances ) return formatSnak( context, snak, options, circumstances ) end; context.formatStatement = function( statement ) return formatStatement( context, statement ) end; context.formatRefs = function( statement ) return formatRefs( context, statement ) end; context.getSourcingCircumstances = function( statement ) return getSourcingCircumstances( statement ) end; context.selectClaims = function( propertyId ) return selectClaims( context, propertyId ) end; -- duplicate 18n constants to have an options to override them context.i18n = {}; for key, value in pairs( i18n ) do context.i18n[ key ] = value; end if ( options.i18n ) then for key, value in pairs( options.i18n ) do context.i18n[ key ] = value; end end local claims = context.selectClaims( options.property ); if (claims == nil) then return '' --TODO error? end -- Обход всех заявлений утверждения и с накоплением оформленых предпочтительных -- заявлений в таблице local formattedStatements = {} for i = 1, #claims do local statement = claims[i] local formattedStatement = formatStatement( context, statement ) -- здесь может вернуться либо оформленный текст заявления -- либо строка ошибки nil похоже никогда не возвращается if (formattedStatement) then formattedStatement = '<span class="wikidata-claim" data-wikidata-claim-id="' .. statement.id .. '">' .. formattedStatement .. '</span>' table.insert( formattedStatements, formattedStatement ) end end -- создание текстовой строки со списком оформленых заявлений из таблицы return mw.text.listToText( formattedStatements, options.separator, options.conjunction ) end --[[ Функция для оформления одного утверждения (statement) Принимает: объект-таблицу утверждение и таблицу параметров Возвращает: строку оформленного текста с заявлением (claim) ]] function formatStatement( context, statement ) if ( not statement ) then error( 'statement is not specified or nil' ); end if not statement.type or statement.type ~= 'statement' then return formatError( 'unknown-claim-type' ) end local options = context.options; local claim -- проверка на указание специализированных обработчиков в параметрах, -- переданных при вызове if options['claim-module'] or options['claim-function'] then -- проверка на пустые строки в параметрах или их отсутствие if not options['claim-module'] or not options['claim-function'] then return formatError( 'unknown-claim-module' ) end -- динамическая загруза модуля с обработчиком указанным в параметре local formatter = require ('Module:' .. options['claim-module']) -- тут следует заметить, что require может вернуть строку с ошибкой -- module %s not found, а не nil подробнее см. lualib/package.lua -- здесь нужно проверять тип вернувшегося значения, а не nil -- если вернулась строка, значит это ошибка if formatter == nil then return formatError( 'claim-module-not-found' ) end local fun = formatter[options['claim-function']] if fun == nil then return formatError( 'claim-function-not-found' ) end -- вызов внешнего обработчика -- тут следует заметить, что никто не застрахован от того, что -- внешний обработчик не вызовет исключение -- его вызов нужно делать через xpcall -- подробнее см. Extension:Scribunto/Lua reference manual claim = fun( context, statement ) else -- вызов обработчика по умолчанию claim = context.formatStatementDefault( context, statement ) end return claim end function getSourcingCircumstances( statement ) local circumstances = {}; if ( statement.qualifiers and statement.qualifiers.P1480 ) then for i, qualifier in pairs( statement.qualifiers.P1480 ) do if ( qualifier and qualifier.datavalue and qualifier.datavalue.type == 'wikibase-entityid' and qualifier.datavalue.value and qualifier.datavalue.value["entity-type"] == 'item' ) then local circumstance = 'Q' .. qualifier.datavalue.value["numeric-id"]; if ( 'Q18086598' == circumstance ) then circumstances.approximate = true; end if ( 'Q18122778' == circumstance ) then circumstances.presumably = true; end end end end return circumstances; end --[[ Функция для оформления одного утверждения (statement) Принимает: объект-таблицу утверждение, таблицу параметров, объект-функцию оформления внутренних структур утверждения (snak) и объект-функцию оформления ссылки на источники (reference) Возвращает: строку оформленного текста с заявлением (claim) ]] function formatStatementDefault( context, statement ) local circumstances = context.getSourcingCircumstances( statement ); if ( context.options.references ) then return context.formatSnak( statement.mainsnak, context.options, circumstances ) .. context.formatRefs( statement ); else return context.formatSnak( statement.mainsnak, context.options, circumstances ); end end --[[ Функция для оформления части утверждения (snak) Подробнее о snak см. d:Викиданные:Глоссарий Принимает: таблицу snak объекта (main snak или же snak от квалификатора) и таблицу опций Возвращает: строку оформленного викитекста ]] function formatSnak( context, snak, options, circumstances ) circumstances = circumstances or {}; local hash = ''; local mainSnakClass = ''; if ( snak.hash ) then hash = ' data-wikidata-hash="' .. snak.hash .. '"'; else mainSnakClass = ' wikidata-main-snak'; end local before = '<span class="wikidata-snak ' .. mainSnakClass .. '"' .. hash .. '>' local after = '</span>' if snak.snaktype == 'somevalue' then return before .. context.i18n['somevalue'] .. after; elseif snak.snaktype == 'novalue' then return before .. context.i18n['novalue'] .. after; elseif snak.snaktype == 'value' then if ( circumstances.presumably ) then before = before .. context.i18n.presumably; end if ( circumstances.approximate ) then before = before .. context.i18n.approximate; end return before .. formatDatavalue( snak.datavalue, options ) .. after; else return before .. formatError( 'unknown-snak-type' ) .. after; end end --[[ Функция для оформления объектов-значений с географическими координатами Принимает: объект-значение и таблицу параметров, Возвращает: строку оформленного текста ]] 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) end end --[[ Функция для оформления значений (value) Подробнее о значениях см. d:Wikidata:Glossary/ru Принимает: объект-значение и таблицу параметров, Возвращает: строку оформленного текста ]] function formatDatavalue( datavalue, options ) -- проверка на указание специализированных обработчиков в параметрах, -- переданных при вызове if options['value-module'] or options['value-function'] then if not options['value-module'] or not options['value-function'] then return formatError( 'unknown-value-module' ) end -- динамическая загруза модуля с обработчиком указанным в параметре local formatter = require ('Module:' .. options['value-module']) -- тут следует заметить, что require может вернуть строку с ошибкой -- module %s not found, а не nil подробнее см. lualib/package.lua -- здесь нужно проверять тип вернувшегося значения, а не nil -- если вернулась строка, значит это ошибка if formatter == nil then return formatError( 'value-module-not-found' ) end local fun = formatter[options['value-function']] if fun == nil then return formatError( 'value-function-not-found' ) end -- вызов внешнего обработчика -- тут следует заметить, что никто не застрахован от того, что -- внешний обработчик не вызовет исключение -- его вызов нужно делать через xpcall -- подробнее см. Extension:Scribunto/Lua reference manual return fun( datavalue.value, options ) end -- вызов обработчиков по умолчанию для известных типов значений if datavalue.type == 'wikibase-entityid' then -- идентификатор сущности return formatEntityId( getEntityIdFromValue( datavalue.value ), options ) elseif datavalue.type == 'string' then -- строка return datavalue.value --TODO ids + media elseif datavalue.type == 'monolingualtext' then -- моноязычный текст (строка с указанием языка) return '<span class="lang" lang="' .. datavalue.value.language .. '">' .. datavalue.value.text .. '</span>' elseif datavalue.type == 'globecoordinate' then -- географические координаты return formatGlobeCoordinate( datavalue.value, options ) elseif datavalue.type == 'quantity' then -- диапазон значений local value = string.gsub(datavalue.value['amount'], '^%+', '') local lang = mw.language.new( 'ru' ) return lang:formatNum( tonumber( value ) ) elseif datavalue.type == 'time' then local moduleDate = require('Module:Wikidata/date') return moduleDate.formatDate( datavalue.value, options ); else -- во всех стальных случаях возвращаем ошибку return formatError( 'unknown-datavalue-type' ) end end -- Небольшой словарь упрощенного отображения (TODO: надо сделать расширенный с учётом даты) local simpleReplaces = { Q30 = '[[Соединённые Штаты Америки|США]]', Q148 = '[[Китайская Народная Республика|КНР]]', Q258 = '[[Южно-Африканская Республика|ЮАР]]', Q423 = '[[Корейская Народно-Демократическая Республика|КНДР]]', Q2184 = '[[Российская Советская Федеративная Социалистическая Республика|РСФСР]]', Q15180 = '[[Союз Советских Социалистических Республик|СССР]]', Q130229 = '[[Грузинская Советская Социалистическая Республика|Грузинская ССР]]', Q133356 = '[[Украинская Советская Социалистическая Республика|Украинская ССР]]', } --[[ Функция для оформления идентификатора сущности Принимает: строку индентификатора (типа Q42) и таблицу параметров, Возвращает: строку оформленного текста ]] function formatEntityId( entityId, options ) -- получение локализованного названия local label = nil; if ( options.text and options.text ~= '' ) then label = options.text else if ( simpleReplaces[entityId] ) then return simpleReplaces[entityId]; end label = 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 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 --[[ Функция для оформления утверждений (statement) Подробнее о утверждениях см. d:Wikidata:Glossary/ru Принимает: таблицу параметров Возвращает: строку оформленного текста, предназначенного для отображения в статье ]] function p.formatStatements( 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 ); -- если значение передано в параметрах вызова то выводим только его if args.value and args.value ~= '' then if ( plain ) then -- опция, запрещающая оформление значения, поэтому никак не трогаем return args.value else -- если трогать всё-таки можно, добавляем категорию-маркер return args.value .. categoryLocalValuePresent; end end -- проверка на отсутствие обязательного параметра property if not frame.args.property then return formatError( 'property-param-not-provided' ); end if ( plain ) then -- вызова стандартного обработчика без оформления, если передана опция plain return frame:callParserFunction( '#property', frame.args.property ); end g_frame = frame -- после проверки всех аргументов -- вызов функции оформления для свойства (набора утверждений) return formatStatements( frame.args ) end --[[ Функция оформления ссылок на источники (reference) Подробнее о ссылках на источники см. d:Wikidata:Glossary/ru Экспортируется в качестве зарезервированной точки для вызова из функций-расширения вида claim-module/claim-function через context Вызов из других модулей напрямую осуществляться не должен (используйте frame:expandTemplate вместе с одним из специлизированных шаблонов вывода значения свойства). Принимает: объект-таблицу утверждение Возвращает: строку оформленных ссылок для отображения в статье ]] function formatRefs( context, statement ) if ( not outputReferences ) then return ''; end local result = ''; if ( statement.references ) then local allReferences = statement.references; local hasPreferred = false; for _, reference in pairs( statement.references ) do if ( reference.snaks and reference.snaks.p248 and reference.snaks.p248[0] and reference.snaks.p248[0].datavalue and reference.snaks.p248[0].datavalue.value["numeric-id"] ) then local entityId = "Q" .. reference.snaks.p248[0].datavalue.value["numeric-id"]; if ( preferredSources[entityId] ) then hasPreferred = true; end end end for _, reference in pairs( statement.references ) do local display = true; if ( hasPreferred ) then if ( reference.snaks and reference.snaks.p248 and reference.snaks.p248[0] and reference.snaks.p248[0].datavalue and reference.snaks.p248[0].datavalue.value["numeric-id"] ) then local entityId = "Q" .. reference.snaks.p248[0].datavalue.value["numeric-id"]; if ( deprecatedSources[entityId] ) then display = false; end end end if ( display ) then result = result .. moduleSources.renderReference( g_frame, context.entity, reference ); end end end return result end return p