ru>Putnik (для очень старых дат timestamp меньше 0, и это ломало логику) |
Admin (обсуждение | вклад) м (1 версия импортирована) |
(нет различий)
|
Текущая версия от 18:35, 21 июня 2023
Для документации этого модуля может быть создана страница Модуль:Wikidata/number/doc
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 = '<span style="color: #0c0; font-size: larger;">▲</span>' .. out else out = '<span style="color: red; font-size: larger;">▼</span>' .. 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<sup>ч</sup> %02d<sup>м</sup> %s<sup>с</sup>") 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