Adresa
:
[go:
nahoru
,
domu
]
Ётамс сёрматфть няфтьфонц потмос (содержаниянцты)
Пря кочксема васта
Пря кочксема васта
ётафтомс боку няфтьф вастти
Кяшемс
Кочксема
Пря лопа
Пуромксонь васта
Тяниень кулят
Мекольце полафткст
Кода повсь лопа
Лезкс
Лезксонь максома
Вешендема
Вешендема
Тифнень-лядяфнень морафтомасна
Тиемс сёрматфкс
Сувамс
Эсь кядьёнкст
Тиемс сёрматфкс
Сувамс
Лопатне эсь прянь апак сёрматф петихненди
содамс сяда лама
Путфкст
Корхнема
Петнема
Модуль:Wikidata/date
Поладомс кяльхть
Модуль
Корхнема
English
Лувомс
Петнемс унксть
Ваномс эряма пингть
Кядьёнкст
Кядьёнкст
ётафтомс боку няфтьф вастти
Кяшемс
Тевтиемат
Лувомс
Петнемс унксть
Ваномс эряма пингть
Марстонь
Сюлмафксне тязк
Сюлмаф полафткст
Тонгомс файлать
Башка лопат
Лопать колга
Нюрьхкалгафтома URL-ть
QR тяшксть таргамс
Пялькс Викиданные
Иля теварьсефкснень эса
Тифнень-лядяфнень морафтомасна
ётафтомс боку няфтьф вастти
Кяшемс
Кардама:
Тон мзярс ашеть сува. Тонь IP-ащема вастце кармай няевома сембонди, кда тон кармат тиема эрь кодама полафткст. Кда тон
суват
эли
сёрматфтат одукс
, ся лемсь кармай нолневома тевс IP-тяштьксть вастс.
Спамть каршес ванома.
Иляк
пяшкотьк тянь!
--settings local categoryUnknownBirthDate = '[[Категория:Персоналии, чья дата рождения не установлена]]'; local categoryUnknownDeathDate = '[[Категория:Персоналии, чья дата смерти не установлена]]'; local categoryBigCurrentAge = '[[Категория:Википедия:Статьи о персоналиях с большим текущим возрастом]]' -- local categoryBigDeathAge = '[[Категория:Википедия:Статьи о персоналиях с большим возрастом во время смерти]]' //deleted -d.bratchuk 05-07-2016 local categoryBiographiesOfLivingPersons = '[[Категория:Википедия:Биографии современников]]' local categoryRecentlyDeceased = '[[Категория:Википедия:Персоналии, умершие менее года назад]]' local nowLabel = 'наст. время' local moduleDates = require( "Module:Dates" ) local moduleWikidata = require( "Module:Wikidata" ) function deepcopy(orig) local orig_type = type(orig) local copy if orig_type == 'table' then copy = {} for orig_key, orig_value in next, orig, nil do copy[deepcopy(orig_key)] = deepcopy(orig_value) end setmetatable(copy, deepcopy(getmetatable(orig))) else -- number, string, boolean, etc copy = orig end return copy end -- accepts table of time+precision values function ageCurrent ( bTable ) local possibleAge = "NYA" -- it meansm "Not Yet Assigned", not what you imagined! for bKey, bValue in pairs(bTable) do if ( bValue.unknown ) then return nil end local bStructure = bValue.structure local bPrecision = bValue.precision local dStructure = os.date( "*t" ) local calculatedAge = ageImpl ( bStructure, bPrecision, dStructure, 11 ) if ( possibleAge == "NYA" ) then possibleAge = calculatedAge else if ( possibleAge ~= calculatedAge ) then possibleAge = nil end end end return possibleAge end -- accepts tables of time+precision values function age ( bTable, dTable ) local possibleAge = "NYA" -- it meansm "Not Yet Assigned", not what you imagined! for bKey, bValue in pairs( bTable ) do if ( bValue.unknown ) then return nil end local bStructure = bValue.structure local bPrecision = bValue.precision for dKey, dValue in pairs( dTable ) do if ( dValue.unknown ) then return nil end local dStructure = dValue.structure local dPrecision = dValue.precision local calculatedAge = ageImpl ( bStructure, bPrecision, dStructure, dPrecision ) if ( possibleAge == "NYA" ) then possibleAge = calculatedAge else if ( possibleAge ~= calculatedAge ) then possibleAge = nil end end end end return possibleAge end function ageImpl ( bStructure, bPrecision, dStructure, dPrecision ) if ( not bStructure or not dStructure or bPrecision < 10 or dPrecision < 10 ) then return nil end local shift = 0; if ( bStructure.year < 0 and dStructure.year > 0 ) then shift = -1; end if ( bPrecision == 10 or dPrecision == 10 ) then if ( bStructure.month < dStructure.month ) then return dStructure.year - bStructure.year + shift end if ( bStructure.month == dStructure.month ) then return nil end if ( bStructure.month > dStructure.month ) then return dStructure.year - bStructure.year - 1 + shift end end if ( bStructure.month < dStructure.month ) then return dStructure.year - bStructure.year + shift end if ( bStructure.month == dStructure.month ) then if ( bStructure.day <= dStructure.day ) then return dStructure.year - bStructure.year + shift else return dStructure.year - bStructure.year - 1 + shift end end if ( bStructure.month > dStructure.month ) then return dStructure.year - bStructure.year - 1 + shift end return nil end -- returns table of time+precision values for specified property function parseProperty ( context, options, propertyId ) 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 is missing'); end; if ( not propertyId ) then error( 'propertyId not specified'); end; local claims = context.selectClaims( options, propertyId ); if not claims then return nil end local result = {} for key, claim in pairs( claims ) do table.insert ( result, parseClaim( claim ) ); end return result end function parseClaim ( claim ) if ( claim.mainsnak.snaktype == "value" ) then -- The calendar model used for saving the data is always the proleptic Gregorian calendar according to ISO 8601. local timeISO8601 = string.gsub( string.gsub( tostring( claim.mainsnak.datavalue.value.time ), '-00%-', '-01-' ), '-00T', '-01T' ) local unixtime = parseISO8601( timeISO8601 ) local structure = os.date("*t", unixtime) local precision = tonumber( claim.mainsnak.datavalue.value.precision ) local item = { structure=structure, precision=precision } return item; elseif ( claim.mainsnak.snaktype == "novalue" ) then -- novalue return { unknown="novalue" }; else --unknown return { unknown="unknown" }; end end -- проверка на совпадающие даты с разной моделью календаря function checkDupDates( t ) if #t > 1 then local removed = false; local j = 1; -- проверка на совпадающие даты с разной моделью календаря while (j <= #t) do local i = 1; while (i <= #t) do if i ~= j then if (os.time(t[j].structure) == os.time(t[i].structure)) then if ((t[j].calendarmodel == 'gregorian') and (t[i].calendarmodel == 'julian')) then removed = true; break; else table.remove(t, i) end else i = i + 1; end else i = i + 1; end end if removed then removed = false; table.remove(t, j); else j = j+1; end end end end -- returns first qualifier of specified propertyId function getQualifierDataValue( statement, qualifierPropertyId ) if ( statement.qualifiers and statement.qualifiers[qualifierPropertyId] ) then local qualifiers = statement.qualifiers[qualifierPropertyId]; for _, qualifier in ipairs( qualifiers ) do if (qualifier.datavalue) then return qualifier.datavalue; end end end return nil; end local p = {} function p.formatDateOfBirthClaim( context, options, statement ) 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 is missing'); end; if ( not statement ) then error( 'statement not specified'); end; if ( statement.mainsnak.snaktype == 'somevalue' ) then local qNotSoonerThan = getQualifierDataValue( statement, 'P1319' ); local qNotLaterThan = getQualifierDataValue( statement, 'P1326' ); if ( qNotSoonerThan or qNotLaterThan ) then local results = {}; if ( qNotSoonerThan ) then table.insert( results, 'не ранее ' .. formatDateImpl( qNotSoonerThan.value, {}, nil, nil ) ); end if ( qNotLaterThan ) then table.insert( results, 'не позднее ' .. formatDateImpl( qNotLaterThan.value, {}, nil, nil ) ); end return mw.text.listToText( results, ' и ' , ' и ' ) .. categoryUnknownBirthDate; end end options['conjunction'] = ' или '; options['value-module'] = 'Wikidata/date'; options['value-function'] = 'formatBirthDate'; options.i18n.somevalue = '\'\'неизвестно\'\'' .. categoryUnknownBirthDate; options.i18n.circa = '<span style="border-bottom: 1px dotted; cursor: help;" title="около">ок. </span>'; local result = context.formatStatementDefault( context, options, statement ); local bTable = { parseClaim( statement ) }; local dTable = parseProperty ( context, options, 'P570' ) if ( bTable and not dTable ) then local age = ageCurrent( bTable ) if ( age ) then result = result .. ' <span style="white-space:nowrap;">(' .. age .. ' ' .. mw.language.new( 'mdf' ):plural( age, 'кизонь', 'кизоня', 'к.') .. ')</span>' if ( not options.nocat ) then if ( age > 115 ) then result = result .. categoryBigCurrentAge; else result = result .. categoryBiographiesOfLivingPersons; end end end end return result; end function p.formatDateOfDeathClaim( context, options, statement ) 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 is missing'); end; if ( not statement ) then error( 'statement not specified'); end; if ( statement.mainsnak.snaktype == 'somevalue' ) then local qNotSoonerThan = getQualifierDataValue( statement, 'P1319' ); local qNotLaterThan = getQualifierDataValue( statement, 'P1326' ); if ( qNotSoonerThan or qNotLaterThan ) then local results = {}; if ( qNotSoonerThan ) then table.insert( results, 'не ранее ' .. formatDateImpl( qNotSoonerThan.value, {}, nil, nil ) ); end if ( qNotLaterThan ) then table.insert( results, 'не позднее ' .. formatDateImpl( qNotLaterThan.value, {}, nil, nil ) ); end return mw.text.listToText( results, ' и ' , ' и ' ) .. categoryUnknownDeathDate; end end options['conjunction'] = ' или '; options['value-module'] = 'Wikidata/date'; options['value-function'] = 'formatDeathDate'; options.i18n.somevalue = '\'\'неизвестно\'\'' .. categoryUnknownDeathDate; options.i18n.circa = '<span style="border-bottom: 1px dotted; cursor: help;" title="около">ок. </span>'; local result = context.formatStatementDefault( context, options, statement ); local bTable = parseProperty ( context, options, 'P569' ) local dTable = { parseClaim( statement ) }; if ( bTable and dTable ) then local age = age( bTable, dTable ) if ( age ) then result = result .. ' <span style="white-space:nowrap;">(' .. age .. ' ' .. mw.language.new( 'mdf' ):plural( age, 'кизонь', 'кизоня', 'к.') .. ')</span>' end -- returns category to recently deceased persons local unixAvailable, unixDateOfDeath = pcall(function() local r = os.time(dTable[1].structure) if ( r ~= os.time() ) then return r end error() end) if ( unixAvailable and os.time() - unixDateOfDeath < 31536000 and not options.nocat ) then result = result .. categoryRecentlyDeceased end end return result; end -- Reentry point for Wikidata Snak formatting function p.formatBirthDate( context, options, value ) if ( not context ) then error( 'context not specified'); end; if ( not options ) then error( 'options not specified'); end; if ( not value ) then error( 'value not specified'); end; if ( options.nocat ) then return formatDateImpl( value, options, 'bday', nil ) else return formatDateImpl( value, options, 'bday', 'шачсь' ) end end -- Reentry point for Wikidata Snak formatting function p.formatDeathDate( context, options, value ) if ( not context ) then error( 'context not specified'); end; if ( not options ) then error( 'options not specified'); end; if ( not value ) then error( 'value not specified'); end; if ( options.nocat and options.nocat ~= '' ) then return formatDateImpl( value, options, 'dday', nil ) else return formatDateImpl( value, options, 'dday', 'куласть' ) end end -- Reentry point for Wikidata Snak formatting -- default one function p.formatDate( context, options, value ) if ( not context ) then error( 'context not specified'); end; if ( not options ) then error( 'options not specified'); end; if ( not value ) then error( 'value not specified'); end; local microformatClass = options.microfortmat or nil; if ( options.nocat and options.nocat ~= '' ) then return formatDateImpl( value, options, microformatClass, nil ) else local categoryPrefix = options.categoryPrefix or nil; return formatDateImpl( value, options, microformatClass, categoryPrefix ) end end function p.formatDateIntervalProperty( 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 WDS = require( 'Module:WikidataSelectors' ); local fromProperty = options.property if options.from and options.from ~= '' then fromProperty = options.from end local fromClaims = WDS.filter( options.entity.claims, fromProperty ); local toClaims = WDS.filter( options.entity.claims, options.to ); if fromClaims == nil and toClaims == nil then return '' end local formattedFromClaims = {} if fromClaims then for i, claim in ipairs( fromClaims ) do local formattedStatement = context.formatStatement( options, claim ) if formattedStatement then formattedStatement = '<span class="wikidata-claim" data-wikidata-property-id="' .. string.upper( options.property ) .. '" data-wikidata-claim-id="' .. claim.id .. '">' .. formattedStatement .. '</span>' table.insert( formattedFromClaims, formattedStatement ) end end end local formattedToClaims = {} local toOptions = deepcopy( options ) toOptions.property = options.to toOptions.novalue = nowLabel if toClaims then for i, claim in ipairs( toClaims ) do local formattedStatement = context.formatStatement( toOptions, claim ) if formattedStatement then formattedStatement = '<span class="wikidata-claim" data-wikidata-property-id="' .. string.upper( toOptions.property ) .. '" data-wikidata-claim-id="' .. claim.id .. '">' .. formattedStatement .. '</span>' table.insert( formattedToClaims, formattedStatement ) end end end local out = '' local fromOut = mw.text.listToText( formattedFromClaims, options.separator, options.conjunction ) local toOut = mw.text.listToText( formattedToClaims, options.separator, options.conjunction ) if fromOut ~= '' or toOut ~= '' then if fromOut ~= '' then out = fromOut else out = '?' end out = out .. ' — ' if toOut ~= '' then out = out .. toOut else out = out .. nowLabel end end if out ~= '' then if options.before then out = options.before .. out end if options.after then out = out .. options.after end end return out end function formatDateImpl( value, options, microformatClass, categoryPrefix ) if ( not value ) then error( 'value not specified'); end; if ( not options ) then error( 'options not specified'); end; -- The calendar model used for saving the data is always the proleptic Gregorian calendar according to ISO 8601. local timeISO8601 = string.gsub( string.gsub( tostring( value.time ), '-00%-', '-01-' ), '-00T', '-01T' ) local unixtime = parseISO8601( timeISO8601 ) local structure = os.date("*t", unixtime) local precision = tonumber( value.precision ) if precision <= 6 then return formatMillenium(structure, categoryPrefix) end if precision == 7 then return formatCentury(structure, categoryPrefix) end if precision == 8 then return formatDecade(structure, categoryPrefix) end if precision == 9 then local tCopy = deepcopy( structure ) tCopy.day = nil tCopy.month = nil return moduleDates.formatWikiImpl(tCopy, tCopy, infoclass, categoryPrefix) end -- year and month only if precision == 10 then local tCopy = deepcopy( structure ) tCopy.day = nil return moduleDates.formatWikiImpl(tCopy, tCopy, infoclass, categoryPrefix) end local calendarmodel = 'gregorian'; if (mw.ustring.find(value.calendarmodel, 'Q1985786', 1, true)) then calendarmodel = 'julian'; end if (calendarmodel == 'gregorian') then return moduleDates.formatWikiImpl( structure, structure, microformatClass, categoryPrefix ) else return p.formatAsJulian( unixtime, infoclass, categoryPrefix ) end end function formatDecade( time, categoryNamePrefix ) if ( time.year < 0 ) then local year = math.floor( math.abs(time.year) / 10 ) * 10; if ( categoryNamePrefix ) then return year .. 'т м. п. и.[[Category:' .. categoryNamePrefix .. '' .. year .. 'т м. п. и.]]'; else return '' .. year .. ' м. п. и.'; end else local year = math.floor( time.year / 10 ) * 10; if ( categoryNamePrefix ) then return year .. 'т[[Category:' .. categoryNamePrefix .. '' .. year .. 'т]]'; else return '' .. year; end end end function formatCentury( time, categoryNamePrefix ) local moduleRoman = require( "Module:RomanNumber" ) if ( time.year < 0 ) then local century = math.floor( (math.abs( time.year) - 1) / 100 ) + 1; if ( moduleRoman ) then century = moduleRoman.toRomanNumber( century ); end if ( categoryNamePrefix ) then return '[[' .. century .. ' сядокиза м. п. и.]][[Category:' .. categoryNamePrefix .. ' ' .. century .. 'сядокиза м. п. и.]]' else return '[[' .. century .. ' сядокиза м. п. и.]]' end else local century = math.floor( (time.year - 1) / 100 ) + 1; if ( moduleRoman ) then century = moduleRoman.toRomanNumber( century ); end if ( categoryNamePrefix ) then return '[[' .. century .. ' сядокиза]][[Category:' .. categoryNamePrefix .. '' .. century .. ' сядокиза]]' else return '[[' .. century .. ' сядикиза]]' end end end function formatMillenium( time, categoryNamePrefix ) local moduleRoman = require( "Module:RomanNumber" ) if ( time.year < 0 ) then local millenium = math.floor( (math.abs( time.year) - 1) / 1000 ) + 1; if ( categoryNamePrefix ) then return '[[' .. millenium .. ' тёжанькиза м. п. и.]][[Category:' .. categoryNamePrefix .. '' .. millenium .. ' тёжанькиза м. п. и.]]' else return '[[' .. millenium .. ' тёжанькиза м. п. и.]]' end else local millenium = math.floor( (time.year - 1) / 1000 ) + 1; if ( moduleRoman ) then millenium = moduleRoman.toRomanNumber( millenium ); end if ( categoryNamePrefix ) then if ( millenium == 'II' ) then return '[[' .. millenium .. ' тёжанькиза]][[Category:' .. categoryNamePrefix .. ' ' .. millenium .. ' тёжанькиза]]' else return '[[' .. millenium .. ' тёжанькиза]][[Category:' .. categoryNamePrefix .. ' ' .. millenium .. ' тёжанькиза]]' end else return '[[' .. millenium .. 'тёжанькиза]]' end end end function parseISO8601Date(str) local pattern = "(%-?%d+)%-(%d+)%-(%d+)T" local Y, M, D = mw.ustring.match( str, pattern ) return tonumber(Y), tonumber(M), tonumber(D) end function parseISO8601Time(str) local pattern = "T(%d+):(%d+):(%d+)%Z" local H, M, S = mw.ustring.match( str, pattern) return tonumber(H), tonumber(M), tonumber(S) end function parseISO8601Offset(str) if str:sub(-1)=="Z" then return 0,0 end -- ends with Z, Zulu time -- matches ±hh:mm, ±hhmm or ±hh; else returns nils local pattern = "([-+])(%d%d):?(%d?%d?)$" local sign, oh, om = mw.ustring.match( str, pattern) sign, oh, om = sign or "+", oh or "00", om or "00" return tonumber(sign .. oh), tonumber(sign .. om) end function parseISO8601(str) if 'table'==type(str) then if str.args and str.args[1] then str = '' .. str.args[1] else return 'unknown argument type: ' .. type( str ) .. ': ' .. table.tostring( str ) end end local Y,M,D = parseISO8601Date(str) local h,m,s = parseISO8601Time(str) local oh,om = parseISO8601Offset(str) return tonumber(os.time({year=Y, month=M, day=D, hour=(h+oh), min=(m+om), sec=s})) end local lowestBoundary = parseISO8601('-900-02-20T00:00:00Z') local mainBoundary = parseISO8601('1582-10-05T00:00:00Z') local lastBoundary = parseISO8601('1918-01-31T00:00:00Z'); boundaries = { -- from (G) till next will be diff(G = J + diff), at current { lowestBoundary, -9 }, { parseISO8601('-700-02-29T00:00:00Z'), -8 }, { parseISO8601('-600-02-29T00:00:00Z'), -7 }, { parseISO8601('-500-02-29T00:00:00Z'), -6 }, { parseISO8601('-300-02-29T00:00:00Z'), -5 }, { parseISO8601('-200-02-29T00:00:00Z'), -4 }, { parseISO8601('-100-02-29T00:00:00Z'), -3 }, { parseISO8601('0000-00-00T00:00:00Z'), -2 }, { parseISO8601('0100-02-29T00:00:00Z'), -1 }, { parseISO8601('0200-02-29T00:00:00Z'), 0 }, { parseISO8601('0300-02-29T00:00:00Z'), 1 }, { parseISO8601('0500-02-29T00:00:00Z'), 2 }, { parseISO8601('0600-02-29T00:00:00Z'), 3 }, { parseISO8601('0700-02-29T00:00:00Z'), 4 }, { parseISO8601('0900-02-29T00:00:00Z'), 5 }, { parseISO8601('1000-02-29T00:00:00Z'), 6 }, { parseISO8601('1100-02-29T00:00:00Z'), 7 }, { parseISO8601('1300-02-29T00:00:00Z'), 8 }, { parseISO8601('1400-02-29T00:00:00Z'), 9 }, { parseISO8601('1500-02-29T00:00:00Z'), 10 }, { parseISO8601('1700-02-29T00:00:00Z'), 11 }, { parseISO8601('1800-02-29T00:00:00Z'), 12 }, { parseISO8601('1900-02-29T00:00:00Z'), 13 }, { lastBoundary, '' }, }; -- Передаваемое время обязано быть по Юлианскому календарю (старому стилю) function p.formatAsJulian( julTime, infocardClass, categoryNamePrefix ) if 'table' == type( julTime ) then if julTime.args and julTime.args[1] then julTime = tonumber( julTime.args[1] ) else return 'unknown argument type: ' .. type( julTime ) .. ': ' .. table.tostring( julTime ) end end local t = os.date( "*t", julTime ) if ( julTime <= lowestBoundary ) then return "''некорректная дата (недостижимая точность)''"; end if ( julTime >= lastBoundary ) then return "''некорректная дата (юлианский не используется после 1918-01-26)''"; end for i=1,#boundaries,1 do local b1 = boundaries[i][1]; local b2 = boundaries[i + 1][1]; if ( b1 <= julTime and julTime < b2 ) then local b1s = os.date( "*t", b1 ) if ( b1s.year == t.year and b1s.month == t.month and b1s.day == t.day) then if ( julTime < mainBoundary ) then -- only julian return moduleDates.formatWikiImpl( {year=t.year, month=2, day=29}, {year=t.year, month=2, day=29}, infocardClass, categoryNamePrefix ); else --julian and grigorian return moduleDates.formatWikiImpl( {year=t.year, month=2, day=29}, t, infocardClass, categoryNamePrefix ) end else local gregTime = os.date( "*t", julTime + boundaries[i][2] * 24 * 60 * 60 ); if ( julTime < mainBoundary ) then -- only julian return moduleDates.formatWikiImpl( t, t, infocardClass, categoryNamePrefix ); else --julian and grigorian return moduleDates.formatWikiImpl( t, gregTime, infocardClass, categoryNamePrefix ) end end end end if ( julTime >= lastBoundary ) then return "''ошибка в модуле Модуль:Wikidata/date (не найден сдвиг конвертации календаря)''"; end end return p
Лихтема:
Полафткснень ванфтозь тон кемокстат
латцемань тефнень мархта
, стане ина апак кафтолдок кемокстат нолдамань лихтемати кемокстаматнень коряс
CC BY-SA 4.0
ди
GFDL
. Тон тага кемокстат Creative Commons кемокстамань ладяматнень коряс лемонь лятфнеманди саты сёрмадомс лопать URL-адресонц эли гиперсюлмафксонц.
Валхтомс
Петнемань лезкс
(панжеви од вальмаса)
Показать предпросмотр страницы с этим шаблоном
Сущности Викиданные, используемые на этой странице
Модуль:Wikidata/date
: Ссылка на вики-проект, Описание: en
Тя лопаса =1Тевс нолдаф кепотькс:
Модуль:Wikidata/date/doc
(
петнемс
)