Модуль:Infocards
Зовнішній вигляд
Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]
Цей модуль Lua використовується на близько 151 000 сторінках. Для уникнення великомасштабних збоїв та непотрібного навантаження на сервер, будь-які зміни спочатку потрібно перевірити на підсторінках /пісочниці та /тестів цього модуля, або у вашій пісочниці модуля. Потім перевірені зміни можуть бути впроваджені на цій сторінці єдиним редагуванням. Будь ласка, обговорюйте будь-які зміни на сторінці обговорення перед їхнім впровадженням. |
Приклади визову функції 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)
Категорії підтримки
- Категорія:Вікіпедія:Статті з ручною вікіфікацією дат у картці (0 К, 12 891 С)
- Категорія:Статті про персоналії з великим поточним віком (0 К, 138 С)
Цей модуль містить код, запозичений з модуля «Infocards» російської Вікіпедії. |
Документація вище включена з Модуль:Infocards/документація. (ред. | історія) Дописувачі можуть експериментувати на підсторінках пісочниці (ред. | різн.) та тести (створити) цього модуля. Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки. |
local infocards = {};
local calculateAge = true;
--[[
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', '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.dateOfBirthImpl( dateOfBirth, dateOfDeath, nocat );
end
function infocards.dateOfBirthImpl( dateOfBirth, dateOfDeath, nocat )
local appendToCategory = infocards.isBlank( nocat );
if ( infocards.isBlank( dateOfBirth ) ) then
return ''
end
if ( mw.ustring.match( dateOfBirth, '^%s*невідом.%s*$' ) ~= nil
or mw.ustring.match( dateOfBirth, '^%s*%?%s*$' ) ~= nil ) then
return "''невідомо''"
end
local appendAge = calculateAge and infocards.isBlank( dateOfDeath );
local parsedDate = infocards.convertToDate ( dateOfBirth )
if ( parsedDate == nil ) then
if ( appendToCategory ) then
return dateOfBirth .. '[[Категорія:Вікіпедія:Статті з ручною вікіфікацією дат у картці]]'
else
return dateOfBirth
end
end
local result = infocards.formatDateImpl ( parsedDate, 'bday', appendToCategory and 'Народились' or nil )
if ( appendAge ) then
local age = infocards.age ( parsedDate, os.date("*t") )
if ( age > 0 and age < 125) then
result = result .. ' <span style="white-space:nowrap;">(' .. age .. ' ' .. mw.language.new( 'uk' ):plural( age, 'рік', 'роки', 'років') .. ')</span>'
end
if ( appendToCategory and ( age > 125 ) ) then
result = result .. '[[Категорія:Статті про персоналії з великим поточним віком]]'
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
return "''невідомо''"
end
local parsedDateOfBirth = infocards.convertToDate ( dateOfBirth )
local parsedDateOfDeath = infocards.convertToDate ( dateOfDeath )
if ( parsedDateOfDeath == nil ) then
if ( appendToCategory ) then
return dateOfDeath .. '[[Категорія:Вікіпедія:Статті з ручною вікіфікацією дат у картці]]'
else
return dateOfDeath
end
end
local result = infocards.formatDateImpl ( parsedDateOfDeath, 'dday', appendToCategory and 'Померли' or nil )
if ( calculateAge ) then
local age = infocards.age ( parsedDateOfBirth, parsedDateOfDeath )
if ( age > 0 ) then
result = result .. ' <span style="white-space:nowrap;">(' .. age .. ' ' .. mw.language.new( 'uk' ):plural( age, 'рік', 'роки', 'років') .. ')</span>'
end
if ( age > 125 ) then
result = result .. '[[Категорія:Статті про персоналії з великим поточним віком]]'
end
end
return result
end
function infocards.age( parsedBirthDate, parsedFinishDate )
if ( parsedBirthDate == nil or parsedFinishDate == nil ) then
return 0
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"]
local age;
if ( bd and bm and by and dd and dm and dy ) then
if (by < 0 and dy > 0) then
age = dy - by - 1
else
age = dy - by
end
if ( dm > bm or ( dm == bm and dd >= bd ) ) then
return age
else
age = age - 1
return age
end
else
return 0
end
end
local genitivusMonthes = {'січня', 'лютого', 'березня', 'квітня', 'травня', 'червня',
'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня'}
function infocards.formatDateImpl( parsedDate, infocardClass, categoryNamePrefix )
local nd = parsedDate["day"];
local nm = parsedDate["month"];
local ny = parsedDate["year"];
local od = parsedDate["osday"];
local om = parsedDate["osmonth"];
local oy = parsedDate["osyear"];
local template =
(nd ~= nil and "1" or "") .. (nm ~= nil and "2" or "") .. (ny ~= nil and "3" or "") ..
(od ~= nil and "4" or "") .. (om ~= nil and "5" or "") .. (oy ~= nil and "6" or "")
local datePart = '<span style="white-space:nowrap;">'
if (template == "12") then
datePart = datePart .. string.format( "[[%d %s]]", nd, genitivusMonthes[nm] )
elseif (template == "3") then
datePart = datePart .. infocards.nominativeYear( ny )
elseif (template == "123") then
datePart = datePart .. string.format( "[[%d %s]] %s",
nd, genitivusMonthes[nm], infocards.nominativeYear( ny ) )
elseif (template == "124") then
datePart = datePart .. string.format( "<span title=\"за юліанським календарем\" class=\"explain\">%d</span> [[%d %s|(%d) %s]]",
od, nd, genitivusMonthes[nm], nd, genitivusMonthes[nm] )
elseif (template == "1234") then
datePart = datePart .. string.format( "<span title=\"за юліанським календарем\" class=\"explain\">%d</span> [[%d %s|(%d) %s]] %s",
od, nd, genitivusMonthes[nm], nd, genitivusMonthes[nm], infocards.nominativeYear( ny ) )
elseif (template == "1245") then
datePart = datePart .. string.format( "<span title=\"за юліанським календарем\" class=\"explain\">%d %s</span> ([[%d %s]])",
od, genitivusMonthes[om], nd, genitivusMonthes[nm] )
elseif (template == "12345") then
datePart = datePart .. string.format( "<span title=\"за юліанським календарем\" class=\"explain\">%d %s</span> ([[%d %s]]) %s",
od, genitivusMonthes[om], nd, genitivusMonthes[nm], infocards.nominativeYear( ny ) )
elseif (template == "123456") then
datePart = datePart .. string.format( '<span title=\"за юліанським календарем\" class=\"explain\">%d %s %d</span></span> <span style="white-space:nowrap;">([[%d %s]] %s)',
od, genitivusMonthes[om], oy, nd, genitivusMonthes[nm], infocards.nominativeYear( ny ) )
else
datePart = datePart .. 'формат невірний'
end
datePart = datePart .. '</span>'
local infocardTemplate =
(nd ~= nil and "1" or "") .. (nm ~= nil and "2" or "") .. (ny ~= nil and "3" or "")
if (infocardTemplate == "123") then
datePart = datePart .. string.format('<span style="display:none">(<span class="%s">%04d-%02d-%02d</span>)</span>', infocardClass , ny , nm , nd )
elseif (infocardTemplate == "23") then
datePart = datePart .. string.format('<span style="display:none">(<span class="%s">%04d-%02d</span>)</span>', infocardClass , ny , nm )
elseif (infocardTemplate == "3") then
datePart = datePart .. string.format('<span style="display:none;">(<span class="%s">%04d</span>)</span>', infocardClass , ny )
end
if ( categoryNamePrefix ~= nil ) then
if ( nd ~= nil and nm ~= nil) then
datePart = datePart .. '[[Категорія:' .. categoryNamePrefix .. ' ' .. nd .. ' ' .. genitivusMonthes[nm] .. ']]'
end
if ( ny ~= nil) then
datePart = datePart .. '[[Категорія:' .. categoryNamePrefix .. ' ' .. infocards.inYear( ny ) .. ']]'
end
end
return datePart
end
function infocards.nominativeYear( year )
if ( year >= 0 ) then
return '[[' .. year .. ']]'
else
return '[[' .. ( 0 - year ) .. ' до н. е.]]'
end
end
function infocards.inYear( year )
if ( year >= 0 ) then
return '' .. year
else
return '' .. ( 0 - year) .. ' до н. е.'
end
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
-- Перевірка чи дата задана у форматі 00 назва_місяця 0000
-- якщо так, то ділимо рядок на окремі частини і перетворюємо місяць в числову форму
-- а для змінних day і year перетворюємо рядок у число через tonumber()
local day, month, year = mw.ustring.match(possibleDateString, "^([1-9]%d?)%s(%a+)%s(%d%d%d%d)$" , 0)
if (day and month and year) then
local numMonth = infocards.convertToNumericMonth (month)
return {
year = tonumber(year), month = numMonth, day = tonumber(day)
}
end
return nil
end
function infocards.convertToNumericMonth (aMonth)
-- Беремо список місяців із таблиці genitivusMonthes
-- та ітерумо в пошуку потрібного місяця
-- якщо знаходомо місяць, то повертаємо індекс елемента
-- якщо нічого не знайшли, то повертаємо nil
for n,v in ipairs( genitivusMonthes ) do
if v == aMonth then
return n;
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 nd, nm
= mw.ustring.match(possibleDateString, '^(%d?%d)%.(%d?%d)$', 0)
if (nd ~= nil and nm ~= nil) then
return {day = tonumber(nd), month = tonumber(nm)}
end
local nd, nm, ny
= mw.ustring.match(possibleDateString, '^(%d?%d)%.(%d?%d)%.(%-?%d+)$', 0)
if (nd ~= nil and nm ~= nil and ny ~= nil) then
local ndn = tonumber(nd)
local nmn = tonumber(nm)
local nyn = tonumber(ny)
if (ndn > 0 and ndn < 33 and nmn > 0 and nmn < 13) then
return {day = ndn, month = nmn, year = nyn}
end
end
return nil
end
return infocards