Wikidata/number

Материал из wikixw
Перейти к навигации Перейти к поиску

local p = {}


function p.formatVisualMagnitude ( context, options ) if ( not context ) then error( 'context not specified' ); end; if ( not options ) then error( 'options not specified' ); end;

min = context.selectClaims( options, 'P1215[P1227:Q76596947][rank:normal,rank:preferred]' ) max = context.selectClaims( options, 'P1215[P1227:Q76596417][rank:normal,rank:preferred]' ) if ( not min or not max) then -- показываем как обычно return context.formatPropertyDefault( context, options ) end

-- показываем Vmin-Vmax для переменной звезды local lang = mw.language.getContentLanguage(); for _, claim1 in ipairs(min) do for _, claim2 in ipairs(max) do return lang:formatNum(tonumber(claim1.mainsnak.datavalue.value.amount)) .. ' − ' .. lang:formatNum(tonumber(claim2.mainsnak.datavalue.value.amount)) end end end

function p.formatColorIndex( context, options ) if ( not context ) then error( 'context not specified' ); end; if ( not options ) then error( 'options not specified' ); end;

if ( options.property ) then -- Пролучаем все claims независимо от ранга claims = context.selectClaims( options, options.property .. '[rank:normal,rank:preferred]' ); end if ( claims ) then return context.formatPropertyDefault( context, options ) end -- Вычисляем B-V либо U-B из P1215 b = context.selectClaims( options, 'P1215[P1227:Q6746395][rank:normal,rank:preferred]' ) if ( not b ) then return end if string.find( options.property, 'Q17773035' ) then m1 = context.selectClaims( options, 'P1215[P1227:Q15977921][rank:normal,rank:preferred]' ) m2 = b if ( not m1 ) then return end else m1 = b m2 = context.selectClaims( options, 'P1215[P1227:Q4892529][rank:normal,rank:preferred]' ) if ( not m2 ) then return end end for _, claim1 in ipairs(m1) do for _, claim2 in ipairs(m2) do newClaim = { mainsnak = { snaktype = 'value', datavalue = { type = 'quantity', value = { unit = '1', amount = claim1.mainsnak.datavalue.value.amount - claim2.mainsnak.datavalue.value.amount }}}} return context.formatStatementDefault( context, options, newClaim ) end end end

function p.formatPropertyWithMostRecentClaimAndIndicator( 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; if options.property then -- Пролучаем все claims независимо от ранга claims = context.selectClaims( options, options.property .. '[rank:normal,rank:preferred]' ); end if claims == nil then return end

-- Ищем claim с максимальным значением P585 и форматируем его в out local maxTimestamp = nil; local mostRecentClaim; for i, claim in ipairs(claims) do if (claim.qualifiers and claim.qualifiers.P585) then -- обрабатываем только claims с указанным P585 local timestamp = context.parseTimeFromSnak( claim.qualifiers.P585[1] ); if timestamp ~= nil and ( maxTimestamp == nil or maxTimestamp < timestamp ) then maxTimestamp = timestamp; mostRecentClaim = claim end end end if (not mostRecentClaim) then -- нет ни одного claim с указанным P585 return context.formatPropertyDefault( context, options ) end

local out = context.formatStatement( options, mostRecentClaim ) if out ~= then -- Ищем claim со значением P585 сразу после максимального и запоминаем его в secondMostRecentValue local secondMostRecentTimestamp = 0; local secondMostRecentValue = 0; for i, claim in ipairs(claims) do if (claim.qualifiers and claim.qualifiers.P585) then -- обрабатываем только claims с указанным P585 local timestamp = context.parseTimeFromSnak( claim.qualifiers.P585[1] ) if (timestamp ~= nil and secondMostRecentTimestamp < timestamp and maxTimestamp > timestamp) then secondMostRecentTimestamp = timestamp secondMostRecentValue = tonumber( claim.mainsnak.datavalue.value.amount ) end end end if (secondMostRecentValue ~= 0) then -- если предыдущее значение нашлось if (secondMostRecentValue < tonumber( mostRecentClaim.mainsnak.datavalue.value.amount )) then out = '' .. out else out = '' .. out end end if options.before then out = options.before .. out end if options.after then out = out .. options.after end end

return out end

function p.formatQuantityWithDateClaim( context, options, statement ) local snak = context.formatSnak( options, statement.mainsnak ) if not snak then return end

   --Date
   if ( statement.qualifiers and statement.qualifiers.P585 ) then
       snak = snak .. ' (' .. context.formatSnak( options, statement.qualifiers.P585[1] ) .. ')'
   end

--References if ( options.references ) then

   	snak = snak .. context.formatRefs( options, statement );
   end
   return snak

end

function p.formatDMS( context, options, value ) if not value.amount then return value end if options and options.unit == '-' then return value.amount end local prefix = "+" if tonumber( value.amount ) < 0 then prefix = "−" end return p.formatAngle ( math.abs( tonumber( value.amount ) ), string.len( value.amount ) - string.find( value.amount, '.', 1, true ) - 5, prefix .. "%s° %02d′ %s″") end

function p.formatRA( context, options, value ) if not value.amount then return value end if options and options.unit == '-' then return value.amount end return p.formatAngle (tonumber( value.amount ) / 15, string.len( value.amount ) - string.find( value.amount, '.', 1, true ) - 4, "%sч %02dм %sс") end

function p.formatAngle ( angle, sig, format ) local d, angle = math.modf( angle ) local m, angle = math.modf( angle * 60 ) local mult = 10 ^ sig; local s = math.floor( angle * 60 * mult + 0.5 ) / mult; local lang = mw.language.getContentLanguage(); return string.format( format, d, m, lang:formatNum( s ) ) end

return p