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,rankreferred]' ) max = context.selectClaims( options, 'P1215[P1227:Q76596417][rank:normal,rankreferred]' ) if ( not min or not max) then return context.formatPropertyDefault( context, options ) end 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 = context.selectClaims( options, options.property .. '[rank:normal,rankreferred]' ); end if ( claims ) then return context.formatPropertyDefault( context, options ) end b = context.selectClaims( options, 'P1215[P1227:Q6746395][rank:normal,rankreferred]' ) if ( not b ) then return end if string.find( options.property, 'Q17773035' ) then m1 = context.selectClaims( options, 'P1215[P1227:Q15977921][rank:normal,rankreferred]' ) m2 = b if ( not m1 ) then return end else m1 = b m2 = context.selectClaims( options, 'P1215[P1227:Q4892529][rank:normal,rankreferred]' ) 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 = context.selectClaims( options, options.property .. '[rank:normal,rankreferred]' ); end if claims nil then return end local maxTimestamp nil; local mostRecentClaim; for i, claim in ipairs(claims) do if (claim.qualifiers and claim.qualifiers.P585) then 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 return context.formatPropertyDefault( context, options ) end local out = context.formatStatement( options, mostRecentClaim ) if out ~= then 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 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