Изменения

fix
Строка 124: Строка 124:  
end
 
end
    +
---Внутренняя функции для получения границ временного диапазона
 
---@param time string
 
---@param time string
 
---@param precision number
 
---@param precision number
 
---@return table | nil
 
---@return table | nil
local function parseTimeBoundaries( time, precision )
+
function p._parseTimeBoundaries( time, precision )
 
     local s = splitISO8601( time )
 
     local s = splitISO8601( time )
 
     if not s then
 
     if not s then
Строка 174: Строка 175:     
     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
   Строка 420: Строка 434:  
             for _, claim in pairs( filteredClaims ) do
 
             for _, claim in pairs( filteredClaims ) do
 
                 if not boundaries then
 
                 if not boundaries then
                    table.insert( results, claim.mainsnak )
+
                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' )
Строка 440: Строка 456:     
     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
   Строка 467: Строка 528:  
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' }
Строка 478: Строка 539:     
     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
Строка 611: Строка 672:  
         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,
Строка 636: Строка 701:  
     context.formatRefs = function( options, statement ) return formatRefs( context, options, statement ) 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 then
  −
            return tonumber( os.time( splitISO8601( tostring( snak.datavalue.value.time ) ) ) ) * 1000
  −
        end
  −
        return nil
  −
    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
Строка 1327: Строка 1386:  
         -- красная ссылка
 
         -- красная ссылка
 
         -- 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 moduleRedLink = require( 'Module:Wikidata/redLink' )
   
             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)
Строка 1336: Строка 1395:  
                         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
             sup = '<sup class="plainlinks noprint">[//www.wikidata.org/wiki/' .. entityId .. '?uselang=' .. CONTENT_LANGUAGE_CODE .. ' [d&#x5d;]</sup>'
+
             addWdLink = true
 
         end
 
         end
    
         -- одноимённая статья уже существует - выводится текст и ссылка на ВД
 
         -- одноимённая статья уже существует - выводится текст и ссылка на ВД
         return '<span class="iw" data-title="' .. label .. '">' .. label
+
         return moduleRedLink.formatText(label, entityId, addWdLink) .. category
                .. sup
  −
                .. '</span>' .. category
   
     end
 
     end
 
     -- сообщение об отсутвии локализованного названия
 
     -- сообщение об отсутвии локализованного названия
Анонимный участник