Модуль:Infocards: различия между версиями
ru>Putnik (переиспользование функции форматирования из Module:Dates для унификации) |
Admin (обсуждение | вклад) м (1 версия импортирована) |
(нет различий)
|
Текущая версия от 18:34, 21 июня 2023
Внимание! Это один из самых используемых модулей. |
Прежде чем вносить какие-либо изменения в этот модуль, просьба оттестировать их в /песочнице и проверить результат на странице с /контрольными примерами. Вносить тестированные изменения в этот модуль следует ровно одной правкой. |
Файл:Lua-logo-nolabel.svg | Этот шаблон реализован на основе Lua с использованием модуля Infocards/dateCat. |
Примеры вызова функции dateOfBirthПравить
- {{#invoke:Infocards|dateOfBirth|-382|−336}} → 382 до н. э.
- {{#invoke:Infocards|dateOfBirth|11.1|}} → 11 января
- {{#invoke:Infocards|dateOfBirth|24.12.3|15.01.69}} → 24 декабря 3
- {{#invoke:Infocards|dateOfBirth|23.09.-63|19.08.14}} → 23 сентября 63 до н. э.
- {{#invoke:Infocards|dateOfBirth|42|9.6.42}} → 42
- {{#invoke:Infocards|dateOfBirth|870|13.8.900}} → 870
- {{#invoke:Infocards|dateOfBirth||22.01.984}} →
- {{#invoke:Infocards|dateOfBirth|16.06.1066|дата смерти неизвестна}} → 16 июня 1066
- {{#invoke:Infocards|dateOfBirth|8.2.1834 (27.1)|2.2.1907 (20.1)}} → 27 января (8 февраля) 1834
- {{#invoke:Infocards|dateOfBirth|29.06.1844 (17)|28.10.1883 (16)}} → 17 (29) июня 1844
- {{#invoke:Infocards|dateOfBirth|19.7.1893 (7)|}} → 7 (19) июля 1893
- {{#invoke:Infocards|dateOfBirth|3.10.1895 (21.9)|28.12.1925}} → 21 сентября (3 октября) 1895
- {{#invoke:Infocards|dateOfBirth|4.10.1916|8.11.2009}} → 4 октября 1916
- {{#invoke:Infocards|dateOfBirth|09.06.1942|}} → 9 июня 1942 (82 года)
- {{#invoke:Infocards|dateOfBirth|1955|}} → 1955
- {{#invoke:Infocards|dateOfBirth|29.02.1984|}} → 29 февраля 1984 (40 лет)
- {{#invoke:Infocards|dateOfBirth||}} →
- {{#invoke:Infocards|dateOfBirth|4.1.1885 (23.12.1884)|17.5.1951}} → 23 декабря 1884 (4 января 1885)
- {{#invoke:Infocards|dateOfBirth|{{ДатаРождения|24|12|3}}|{{ДатаСмерти|15|01|69}}}} → 24 декабря 3
- {{#invoke:Infocards|dateOfBirth|ок. [[5]] года|24.01.41}} → ок. 5 года
- {{#invoke:Infocards|dateOfBirth|ок. [[5]] года|{{ДатаСмерти|24|01|41}}}} → ок. 5 года
- {{#invoke:Infocards|dateOfBirth|[[868]]/[[872]]|[[15 сентября]]/[[15 ноября]] [[890]]}} → 868/872
- {{#invoke:Infocards|dateOfBirth|{{ДатаРождения|8|2|1834|27|1}}|{{ДатаСмерти|2|2|1907|20|1}} (72 года)}} → 27 января (8 февраля) 1834
Примеры вызова функции dateOfDeathПравить
- {{#invoke:Infocards|dateOfDeath|-382|−336}} → 336 до н. э.
- {{#invoke:Infocards|dateOfDeath|24.12.3|15.01.69}} → 15 января 69 (65 лет)
- {{#invoke:Infocards|dateOfDeath|23.09.-63|19.08.14}} → 19 августа 14 (76 лет)
- {{#invoke:Infocards|dateOfDeath|42|9.6.42}} → 9 июня 42
- {{#invoke:Infocards|dateOfDeath|870|13.8.900}} → 13 августа 900
- {{#invoke:Infocards|dateOfDeath||22.01.984}} → 22 января 984
- {{#invoke:Infocards|dateOfDeath|16.06.1066|дата смерти неизвестна}} → дата смерти неизвестна
- {{#invoke:Infocards|dateOfDeath|8.2.1834 (27.1)|2.2.1907 (20.1)}} → 20 января (2 февраля) 1907 (72 года)
- {{#invoke:Infocards|dateOfDeath|29.06.1844 (17)|28.10.1883 (16)}} → 16 (28) октября 1883 (39 лет)
- {{#invoke:Infocards|dateOfDeath|19.7.1893 (7)|}} → 14 апреля 1930 (36 лет)
- {{#invoke:Infocards|dateOfDeath|3.10.1895 (21.9)|28.12.1925}} → 28 декабря 1925 (30 лет)
- {{#invoke:Infocards|dateOfDeath|4.10.1916|8.11.2009}} → 8 ноября 2009 (93 года)
- {{#invoke:Infocards|dateOfDeath|09.06.1942|}} →
- {{#invoke:Infocards|dateOfDeath|1955|}} →
- {{#invoke:Infocards|dateOfDeath|29.02.1984|}} →
- {{#invoke:Infocards|dateOfDeath||}} →
- {{#invoke:Infocards|dateOfDeath|{{ДатаРождения|24|12|3}}|{{ДатаСмерти|15|01|69}}}} → 15 января 69
- {{#invoke:Infocards|dateOfDeath|ок. [[5]] года|24.01.41}} → 24 января 41
- {{#invoke:Infocards|dateOfDeath|ок. [[5]] года|{{ДатаСмерти|24|01|41}}}} → 24 января 41
- {{#invoke:Infocards|dateOfDeath|[[868]]/[[872]]|[[15 сентября]]/[[15 ноября]] [[890]]}} → 15 сентября/15 ноября 890
- {{#invoke:Infocards|dateOfDeath|{{ДатаРождения|8|2|1834|27|1}}|{{ДатаСмерти|2|2|1907|20|1}} (72 года)}} → 20 января (2 февраля) 1907 (72 года)
Примеры вызова функции isDateПравить
- {{#invoke:Infocards|isDate||TRUE|FALSE}} → FALSE
- {{#invoke:Infocards|isDate|-382|TRUE|FALSE}} → TRUE
- {{#invoke:Infocards|isDate|−336|TRUE|FALSE}} → TRUE
- {{#invoke:Infocards|isDate|24.12.3|TRUE|FALSE}} → TRUE
- {{#invoke:Infocards|isDate|19.7.1893 (7)|TRUE|FALSE}} → TRUE
- {{#invoke:Infocards|isDate|19.7.67.18/93 (7)|TRUE|FALSE}} → FALSE
- {{#invoke:Infocards|isDate|13 декабря 2005|TRUE|FALSE}} → FALSE
- {{#invoke:Infocards|isDate|дата смерти неизвестна|TRUE|FALSE}} → FALSE
- {{#invoke:Infocards|isDate|{{ДатаРождения|24|12|3}}|TRUE|FALSE}} → FALSE
local infocards = {} local calculateAge = true local dateCat = require( 'Module:Infocards/dateCat' ) local moduleDates = require( 'Module:Dates' ) --[[ Helper function that populates the argument list given that user may need to use a mix of named and unnamed parameters. This is relevant because named parameters are not identical to unnamed parameters due to string trimming, and when dealing with strings we sometimes want to either preserve or remove that whitespace depending on the application. ]] function infocards._getParameters( frame_args, arg_list ) local new_args = {} local index = 1 local value for i,arg in ipairs( arg_list ) do value = frame_args[arg] if value == nil then value = frame_args[index] index = index + 1 end new_args[arg] = value end return new_args end function infocards.isBlank( someString ) return someString == nil or mw.ustring.match(someString, '^%s*$') ~= nil end function infocards.isDate ( frame ) local new_args = infocards._getParameters( frame.args, {'s', 't', 'f'} ) local s = new_args['s'] or '' local t = new_args['t'] or '' local f = new_args['f'] or '' local result = infocards.isDateImpl ( s ) if (result) then return t else return f end end function infocards.isDateImpl ( s ) local converted = infocards.convertToDate ( s ) return converted ~= nil end function infocards.dateOfBirth( frame ) local new_args = infocards._getParameters( frame.args, {'dateOfBirth', 'dateOfDeath', 'suppressAge', 'nocat'} ) local dateOfBirth = new_args['dateOfBirth'] or '' local dateOfDeath = new_args['dateOfDeath'] or '' local suppressAge = new_args['suppressAge'] or '' local nocat = new_args['nocat'] or mw.title.getCurrentTitle().nsText return infocards.dateOfBirthImpl( dateOfBirth, dateOfDeath, suppressAge, nocat ) end function infocards.dateOfBirthImpl( dateOfBirth, dateOfDeath, suppressAge, nocat ) local appendToCategory = infocards.isBlank( nocat ) if ( infocards.isBlank( dateOfBirth ) ) then if ( appendToCategory ) then return dateCat.categoryNoBirthDate else return '' end end if ( mw.ustring.match( dateOfBirth, '^%s*неизвестн.%s*$' ) ~= nil or mw.ustring.match( dateOfBirth, '^%s*%?%s*$' ) ~= nil ) then if ( appendToCategory ) then return "''неизвестно''" .. dateCat.categoryUnknownBirthDate else return "''неизвестно''" end end local appendAge = not (suppressAge ~= '' or not calculateAge) and infocards.isBlank( dateOfDeath ) local parsedDate = infocards.convertToDate ( dateOfBirth ) if ( parsedDate == nil ) then --[[ Temporary hack in order to enable export dates to wikidata ]] local bDateStart = '<span class="no-wikidata" data-wikidata-property-id="P569">' local bDateEnd = '</span>' if ( appendToCategory ) then return bDateStart .. dateOfBirth .. bDateEnd .. dateCat.categoryManualWikification else return bDateStart .. dateOfBirth .. bDateEnd end end local result = infocards.formatDateImpl ( parsedDate, 'bday', appendToCategory and 'Родившиеся' or nil ) if ( appendAge ) then -- TODO: месяцы и дни для (нескольких) новорождённых (см. новейшие [[Категория:Родившиеся в ГГГГ году]]) local age = infocards.age ( parsedDate, os.date("*t") ) if ( age and age < 125) then result = result .. ' <span class="nowrap">(' .. age .. ' ' .. mw.language.new( 'ru' ):plural( age, 'год', 'года', 'лет') .. ')</span>' end if ( appendToCategory ) then if (not age and parsedDate and parsedDate.year ) then age = os.date('*t').year - parsedDate.year -- при неточной дате end if ( age ) then if ( age > 115 ) then result = result .. dateCat.categoryBigCurrentAge elseif ( age >= 0 ) then result = result .. dateCat.categoryBiographiesOfLivingPersons else result = result .. dateCat.categoryNegativeAge end end end end return result end function infocards.dateOfDeath( frame ) local new_args = infocards._getParameters( frame.args, {'dateOfBirth', 'dateOfDeath', 'nocat'} ) local dateOfBirth = new_args['dateOfBirth'] or '' local dateOfDeath = new_args['dateOfDeath'] or '' local nocat = new_args['nocat'] or mw.title.getCurrentTitle().nsText return infocards.dateOfDeathImpl( dateOfBirth, dateOfDeath, nocat ) end function infocards.dateOfDeathImpl( dateOfBirth, dateOfDeath, nocat ) if ( infocards.isBlank( dateOfDeath ) ) then return '' end local appendToCategory = infocards.isBlank( nocat ) if ( mw.ustring.match( dateOfDeath, '^%s*неизвестн.%s*$' ) ~= nil or mw.ustring.match( dateOfDeath, '^%s*%?%s*$' ) ~= nil ) then if ( appendToCategory ) then return "''неизвестно''" .. dateCat.categoryUnknownDeathDate else return "''неизвестно''" end end local parsedDateOfBirth = infocards.convertToDate ( dateOfBirth ) local parsedDateOfDeath = infocards.convertToDate ( dateOfDeath ) if ( parsedDateOfDeath == nil ) then --[[ Temporary hack in order to enable export dates to wikidata ]] local dDateStart = '<span class="no-wikidata" data-wikidata-property-id="P570">' local dDateEnd = '</span>' if ( appendToCategory ) then return dDateStart .. dateOfDeath .. dDateEnd .. dateCat.categoryManualWikification else return dDateStart .. dateOfDeath .. dDateEnd end end local result = infocards.formatDateImpl ( parsedDateOfDeath, 'dday', appendToCategory and 'Умершие' or nil ) if ( calculateAge ) then local age = infocards.age ( parsedDateOfBirth, parsedDateOfDeath ) if ( age and age > 0 ) then result = result .. ' <span class="nowrap">(' .. age .. ' ' .. mw.language.new( 'ru' ):plural( age, 'год', 'года', 'лет') .. ')</span>' end -- returns category to recently deceased persons local unixAvailable, unixDateOfDeath = pcall(function() local r = os.time(parsedDateOfDeath) if ( r ~= os.time() ) then return r end error() end) if (appendToCategory) then if ( unixAvailable and os.time() - unixDateOfDeath < 31536000 ) then result = result .. dateCat.categoryRecentlyDeceased elseif (age and age < 0) then result = result .. dateCat.categoryNegativeAge end end end return result end function infocards.age( parsedBirthDate, parsedFinishDate ) if ( parsedBirthDate == nil or parsedFinishDate == nil ) then return nil end local bd = parsedBirthDate["day"] local bm = parsedBirthDate["month"] local by = parsedBirthDate["year"] local dd = parsedFinishDate["day"] local dm = parsedFinishDate["month"] local dy = parsedFinishDate["year"] if ( bd and bm and by and dd and dm and dy ) then if ( dm > bm or ( dm == bm and dd >= bd ) ) then return dy - by else return dy - by - 1 end else return nil end end function infocards.formatDateImpl( parsedDate, infocardClass, categoryNamePrefix ) local datePart = '<span class="nowrap">' --Temporary hack in order to enable export dates to wikidata if infocardClass == "bday" then datePart = '<span class="no-wikidata" data-wikidata-property-id="P569">' elseif infocardClass == "dday" then datePart = '<span class="no-wikidata" data-wikidata-property-id="P570">' end local t1 = { day = parsedDate.osday, month = parsedDate.osmonth, year = parsedDate.osyear } local t2 = { day = parsedDate.day, month = parsedDate.month, year = parsedDate.year } datePart = datePart .. moduleDates.formatWikiImpl( t1, t2, infocardClass, categoryNamePrefix ) datePart = datePart .. '</span>' return datePart end function infocards.convertToDate( possibleDateString ) possibleDateString = mw.ustring.gsub( possibleDateString, '−', '-') local simpleDate = mw.ustring.match(possibleDateString, '^%s*([%-%d%.]+)%s*$', 0) if ( simpleDate ) then return infocards.convertToDateNewStylePart( simpleDate ) end local complexDate1, complexDate2 = mw.ustring.match(possibleDateString, '^%s*([%-%d%.]+)%s*%(([%-%d%.]+)%)%s*$', 0) if ( complexDate1 and complexDate2) then local table1 = infocards.convertToDateNewStylePart( complexDate1 ) local table2 = infocards.convertToDateOldStylePart( complexDate2 ) if ( table1 and table2 ) then return { year = table1["year"], month = table1["month"], day = table1["day"], osyear = table2["year"], osmonth = table2["month"], osday = table2["day"] } else return nil end end return nil end function infocards.convertToDateNewStylePart( possibleDateString ) local ny = mw.ustring.match(possibleDateString, '^(%-?%d+)$', 0) if (ny ~= nil) then return {year = tonumber(ny)} end return infocards.convertToDateCommonPart( possibleDateString ) end function infocards.convertToDateOldStylePart( possibleDateString ) local nd = mw.ustring.match(possibleDateString, '^(%-?%d+)$', 0) if (nd ~= nil) then return {day = tonumber(nd)} end return infocards.convertToDateCommonPart( possibleDateString ) end function infocards.convertToDateCommonPart( possibleDateString ) local sDay, sMonth, sYear local day, month, year sDay, sMonth, sYear = mw.ustring.match( possibleDateString, '^(%d?%d)%.(%d?%d)%.(%-?%d+)$', 0 ) if sDay ~= nil and sMonth ~= nil and sYear ~= nil then day = tonumber( sDay ) month = tonumber( sMonth ) year = tonumber( sYear ) if day >= 1 and day <= 32 and month >= 1 and month <= 12 then return { day = day, month = month, year = year } end end sDay, sMonth = mw.ustring.match( possibleDateString, '^(%d?%d)%.(%d?%d+)$', 0 ) if sDay ~= nil and sMonth ~= nil then day = tonumber( sDay ) month = tonumber( sMonth ) if day >= 1 and day <= 32 and month >= 1 and month <= 12 then return { day = day, month = month } end end sMonth, sYear = mw.ustring.match( possibleDateString, '^(%d?%d)%.(%-?%d+)$', 0 ) if sMonth ~= nil and sYear ~= nil then month = tonumber( sMonth ) year = tonumber( sYear ) if month >= 1 and month <= 12 then return { month = month, year = year } end end return nil end return infocards