Изменения
Перейти к навигации
Перейти к поиску
Строка 124:
Строка 124:
+
− local function parseTimeBoundaries( time, precision )+
Строка 174:
Строка 175:
+
+
+
+
+
+
+
+
+
+
+
+
+
Строка 420:
Строка 434:
− table.insert( results, claim.mainsnak )+
+
+
Строка 440:
Строка 456:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Строка 467:
Строка 528:
− +
− +
Строка 478:
Строка 539:
− +
Строка 611:
Строка 672:
+
+
+
+
Строка 636:
Строка 701:
− context.parseTimeFromSnak = function( snak )
− if snak and snak.datavalue and snak.datavalue.value and snak.datavalue.value.time then
− return tonumber( os.time( splitISO8601( tostring( snak.datavalue.value.time ) ) ) ) * 1000
− end
− return nil
− end
− +
Строка 1327:
Строка 1386:
+
− local moduleRedLink = require( 'Module:Wikidata/redLink' )
Строка 1336:
Строка 1395:
− +
− +
− sup = '<sup class="plainlinks noprint">[//www.wikidata.org/wiki/' .. entityId .. '?uselang=' .. CONTENT_LANGUAGE_CODE .. ' [d]]</sup>' +
− +
− .. sup
− .. '</span>' .. category
fix
end
end
---Внутренняя функции для получения границ временного диапазона
---@param time string
---@param time string
---@param precision number
---@param precision number
---@return table | nil
---@return table | nil
function p._parseTimeBoundaries( time, precision )
local s = splitISO8601( time )
local s = splitISO8601( time )
if not s then
if not s then
error( 'Unsupported precision: ' .. precision )
error( 'Unsupported precision: ' .. precision )
end
---Внутренняя функция для получения числового значения времени из snak'а
---@param table snak
---@return number | nil
function p._parseTimeFromSnak( snak )
if snak and snak.datavalue and snak.datavalue.value and snak.datavalue.value.time then
local timeData = splitISO8601( tostring( snak.datavalue.value.time ) )
timeData.month = math.max( timeData.month, 1 )
timeData.day = math.max( timeData.day, 1 )
return tonumber( os.time( timeData ) ) * 1000
end
return nil
end
end
for _, claim in pairs( filteredClaims ) do
for _, claim in pairs( filteredClaims ) do
if not boundaries then
if not boundaries then
if not claim.qualifiers or not claim.qualifiers.P582 then
table.insert( results, claim.mainsnak )
end
else
else
local startBoundaries = p.getTimeBoundariesFromQualifier( context.frame, context, claim, 'P580' )
local startBoundaries = p.getTimeBoundariesFromQualifier( context.frame, context, claim, 'P580' )
return results
return results
end
---@param context table
---@param propertyId string
---@return table | nil
function p.getTimeBoundariesFromProperty( context, propertyId )
local dateClaims = WDS.filter( context.entity.claims, propertyId )
if not dateClaims or #dateClaims == 0 then
return nil;
end
-- only support exact date so far, but need improvment
local left = nil
local right = nil
for _, claim in pairs( dateClaims ) do
if not claim.mainsnak then
return nil
end
local boundaries = context.parseTimeBoundariesFromSnak( claim.mainsnak )
if not boundaries then
return nil
end
left = min( left, boundaries[ 1 ] )
right = max( right, boundaries[ 2 ] )
end
if not left or not right then
return nil
end
return { left, right }
end
---@param context table
---@param propertyIds table<string>
---@return table | nil
function p.getTimeBoundariesFromProperties( context, propertyIds )
for _, propertyId in ipairs( propertyIds ) do
local result = p.getTimeBoundariesFromProperty( context, propertyId );
if result then
return result
end
end
return nil
end
end
end
end
---@param frame table
---@param _ table
---@param context table
---@param context table
---@param statement table
---@param statement table
---@param qualifierIds table<string>
---@param qualifierIds table<string>
---@return table | nil
---@return table | nil
function p.getTimeBoundariesFromQualifiers( frame, context, statement, qualifierIds )
function p.getTimeBoundariesFromQualifiers( _, context, statement, qualifierIds )
if not qualifierIds then
if not qualifierIds then
qualifierIds = { 'P582', 'P580', 'P585' }
qualifierIds = { 'P582', 'P580', 'P585' }
for _, qualifierId in pairs( qualifierIds ) do
for _, qualifierId in pairs( qualifierIds ) do
local result = p.getTimeBoundariesFromQualifier( frame, context, statement, qualifierId )
local result = p.getTimeBoundariesFromQualifier( _, context, statement, qualifierId )
if result then
if result then
return result
return result
formatStatementDefault = formatStatementDefault,
formatStatementDefault = formatStatementDefault,
getPropertyInBoundaries = getPropertyInBoundaries,
getPropertyInBoundaries = getPropertyInBoundaries,
getTimeBoundariesFromProperty = p.getTimeBoundariesFromProperty,
getTimeBoundariesFromProperties = p.getTimeBoundariesFromProperties,
getTimeBoundariesFromQualifier = p.getTimeBoundariesFromQualifier,
getTimeBoundariesFromQualifier = p.getTimeBoundariesFromQualifier,
getTimeBoundariesFromQualifiers = p.getTimeBoundariesFromQualifiers,
getTimeBoundariesFromQualifiers = p.getTimeBoundariesFromQualifiers,
parseTimeFromSnak = p._parseTimeFromSnak,
getLabelWithLang = getLabelWithLang,
wrapSnak = wrapSnak,
wrapSnak = wrapSnak,
wrapStatement = wrapStatement,
wrapStatement = wrapStatement,
context.formatRefs = function( options, statement ) return formatRefs( context, options, statement ) end
context.formatRefs = function( options, statement ) return formatRefs( context, options, statement ) end
context.parseTimeBoundariesFromSnak = function( snak )
context.parseTimeBoundariesFromSnak = function( snak )
if snak and snak.datavalue and snak.datavalue.value and snak.datavalue.value.time and snak.datavalue.value.precision then
if snak and snak.datavalue and snak.datavalue.value and snak.datavalue.value.time and snak.datavalue.value.precision then
return parseTimeBoundaries( snak.datavalue.value.time, snak.datavalue.value.precision )
return p._parseTimeBoundaries( snak.datavalue.value.time, snak.datavalue.value.precision )
end
end
return nil
return nil
-- красная ссылка
-- красная ссылка
-- TODO: разобраться, почему не всегда есть options.frame
-- TODO: разобраться, почему не всегда есть options.frame
local moduleRedLink = require( 'Module:Wikidata/redLink' )
local title = mw.title.new( label )
local title = mw.title.new( label )
if title and not title.exists and options.frame then
if title and not title.exists and options.frame then
local rawLabel = mw.wikibase.getLabel(entityId) or label -- без |text= и boundaries; or label - костыль
local rawLabel = mw.wikibase.getLabel(entityId) or label -- без |text= и boundaries; or label - костыль
local redLink = moduleRedLink.formatRedLinkWithInfobox(rawLabel, label, entityId)
local redLink = moduleRedLink.formatRedLinkWithInfobox(rawLabel, label, entityId)
getCategoryByCode( 'links-to-entities-with-missing-local-language-label' )
getCategoryByCode( 'links-to-entities-with-missing-local-language-label' )
end
end
return redLink .. '<sup>[[:d:' .. entityId .. '|[d]]]</sup>' .. category
return redLink .. category
end
end
-- TODO: перенести до проверки на существование статьи
-- TODO: перенести до проверки на существование статьи
local sup = ''
local addWdLink = false
if ( not options.format or options.format ~= 'text' )
if ( not options.format or options.format ~= 'text' )
and entityId ~= 'Q6581072' and entityId ~= 'Q6581097' -- TODO: переписать на format=text
and entityId ~= 'Q6581072' and entityId ~= 'Q6581097' -- TODO: переписать на format=text
then
then
addWdLink = true
end
end
-- одноимённая статья уже существует - выводится текст и ссылка на ВД
-- одноимённая статья уже существует - выводится текст и ссылка на ВД
return '<span class="iw" data-title="' .. label .. '">' .. label
return moduleRedLink.formatText(label, entityId, addWdLink) .. category
end
end
-- сообщение об отсутвии локализованного названия
-- сообщение об отсутвии локализованного названия