Модуль:Infocards
Арахьара хатӀ
Тергам бе! ХӀара йу уггар дукха лелош йолу модулех цхьаъ. ХӀора цуьнан хийцамо кхин тӀе ницкъбо проектан сервершна. Доьха, шеко дӀайаккха шайн хийцамаш нийса хиларх, талла уьш тестан агӀонаш тӀехь. |
ХӀара кеп 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}} → 3 шеран 24 декабрь
- {{#invoke:Infocards|dateOfBirth|23.09.-63|19.08.14}} → 63 в. э. хьалха 23 сентябрь
- {{#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|кхелхина терахь хууш дац}} → 1066 шеран 16 июнь
- {{#invoke:Infocards|dateOfBirth|8.2.1834 (27.1)|2.2.1907 (20.1)}} → 1834 шеран 27 январь (8 февраль)
- {{#invoke:Infocards|dateOfBirth|29.06.1844 (17)|28.10.1883 (16)}} → 1844 шеран 17 (29) июнь
- {{#invoke:Infocards|dateOfBirth|19.7.1893 (7)|}} → 1893 шеран 7 (19) июль
- {{#invoke:Infocards|dateOfBirth|3.10.1895 (21.9)|28.12.1925}} → 1895 шеран 21 сентябрь (3 октябрь)
- {{#invoke:Infocards|dateOfBirth|4.10.1916|8.11.2009}} → 1916 шеран 4 октябрь
- {{#invoke:Infocards|dateOfBirth|09.06.1942|}} → 1942 шеран 9 июнь (82 шо)
- {{#invoke:Infocards|dateOfBirth|1955|}} → 1955
- {{#invoke:Infocards|dateOfBirth|29.02.1984|}} → 1984 шеран 29 февраль (40 шо)
- {{#invoke:Infocards|dateOfBirth||}} →
- {{#invoke:Infocards|dateOfBirth|4.1.1885 (23.12.1884)|17.5.1951}} → 1884 23 декабрь (1885 шеран 4 январь)
- {{#invoke:Infocards|dateOfBirth|{{Адам/Вина терахь|24|12|3}}|{{Адам/Кхелхина терахь|15|01|69}}}} → 3 шеран 24 декабрехь
- {{#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 шо)}} → 1834 шеран 27 январехь (8 февралехь)
dateOfDeath функци кхайкхаран масала
[нисйан]- {{#invoke:Infocards|dateOfDeath|-382|−336}} → 336 в. э. хьалха
- {{#invoke:Infocards|dateOfDeath|24.12.3|15.01.69}} → 69 шеран 15 январь (65 шо)
- {{#invoke:Infocards|dateOfDeath|23.09.-63|19.08.14}} → 14 шеран 19 август (76 шо)
- {{#invoke:Infocards|dateOfDeath|42|9.6.42}} → 42 шеран 9 июнь
- {{#invoke:Infocards|dateOfDeath|870|13.8.900}} → 900 шеран 13 август
- {{#invoke:Infocards|dateOfDeath||22.01.984}} → 984 шеран 22 январь
- {{#invoke:Infocards|dateOfDeath|16.06.1066|кхелхина терахь хууш дац}} → кхелхина терахь хууш дац
- {{#invoke:Infocards|dateOfDeath|8.2.1834 (27.1)|2.2.1907 (20.1)}} → 1907 шеран 20 январь (2 февраль) (72 шо)
- {{#invoke:Infocards|dateOfDeath|29.06.1844 (17)|28.10.1883 (16)}} → 1883 шеран 16 (28) октябрь (39 шо)
- {{#invoke:Infocards|dateOfDeath|19.7.1893 (7)|}} → 1930 шеран 14 апрель (36 шо)
- {{#invoke:Infocards|dateOfDeath|3.10.1895 (21.9)|28.12.1925}} → 1925 шеран 28 декабрь (30 шо)
- {{#invoke:Infocards|dateOfDeath|4.10.1916|8.11.2009}} → 2009 шеран 8 ноябрь (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}}}} → 69 шеран 15 январехь
- {{#invoke:Infocards|dateOfDeath|[[5]] шо герг|24.01.41}} → 41 шеран 24 январь
- {{#invoke:Infocards|dateOfDeath|[[5]] шо герг|{{Адам/Кхелхина терахь|24|01|41}}}} → 41 шеран 24 январехь
- {{#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 шо)}} → 1907 шеран 20 январехь (2 февралехь) (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( 'ce' ):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( 'ce' ):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