Module:Infocards
Kórinis
Bul moduldiń hújjetin Module:Infocards/doc betinde jarata alasız
local infocards = {};
local calculateAge = true;
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
if ( appendToCategory ) then
return '[[Kategoriya:Tuwılǵan jılı belgisizler]]'
else
return ''
end
end
if ( mw.ustring.match( dateOfBirth, '^%s*belgisiz.%s*$' ) ~= nil
or mw.ustring.match( dateOfBirth, '^%s*%?%s*$' ) ~= nil ) then
if ( appendToCategory ) then
return "''belgisiz''[[Kategoriya:Tuwılǵan jılı belgisizler]]"
else
return "''belgisiz''"
end
end
local appendAge = calculateAge and infocards.isBlank( dateOfDeath );
local parsedDate = infocards.convertToDate ( dateOfBirth )
if ( parsedDate == nil ) then
local bDateStart = '<span class="no-wikidata" data-wikidata-property-id="P569">'
local bDateEnd = '</span>'
if ( appendToCategory ) then
return bDateStart .. dateOfBirth .. bDateEnd .. ''
else
return bDateStart .. dateOfBirth .. bDateEnd
end
end
local result = infocards.formatDateImpl ( parsedDate, 'bday', appendToCategory and 'tuwılǵanlar' or nil )
if ( appendAge ) then
local age = infocards.age ( parsedDate, os.date("*t") )
if ( age and age > 0 and age < 125) then
result = result .. ' <span class="nowrap">(' .. age .. ' ' .. mw.language.new( 'kaa' ):plural( age, 'jasta') .. ')</span>'
end
if ( appendToCategory ) then
if ( age and age > 100 ) then
result = result .. '[[Kategoriya:Uzaq ómir súrgenler]]'
elseif ( age or ( parsedDate and parsedDate.year and os.date('*t').year - parsedDate.year <= 100 ) ) then
result = result .. '[[Kategoriya:Tiri shaxslar]]'
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*belgisiz%s*$' ) ~= nil
or mw.ustring.match( dateOfDeath, '^%s*%?%s*$' ) ~= nil ) then
if ( appendToCategory ) then
return "''belgisiz''[[Kategoriya:Qaytıs bolǵan jılı belgisizler]]"
else
return "''belgisiz''"
end
end
local parsedDateOfBirth = infocards.convertToDate ( dateOfBirth)
local parsedDateOfDeath = infocards.convertToDate ( dateOfDeath)
if ( parsedDateOfDeath == nil ) then
local dDateStart = '<span class="no-wikidata" data-wikidata-property-id="P570">'
local dDateEnd = '</span>'
if ( appendToCategory ) then
return dDateStart .. dateOfDeath .. dDateEnd .. ''
else
return dDateStart .. dateOfDeath .. dDateEnd
end
end
local result = infocards.formatDateImpl ( parsedDateOfDeath, 'dday', appendToCategory and 'qaytıs bolǵanlar' 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( 'kaa' ):plural( age, 'jasta') .. ')</span>'
end
local unixAvailable, unixDateOfDeath = pcall(function()
local r = os.time(parsedDateOfDeath)
if ( r ~= os.time() ) then
return r
end
error()
end)
if ( unixAvailable and os.time() - unixDateOfDeath < 31536000 and appendToCategory ) then
result = result .. '[[Kategoriya:Aqırǵı jılı qaytıs bolǵanlar]]'
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
local genitivusMonthes = {'-yanvar', '-fevral', '-mart', '-aprel', '-may', '-iyun',
'-iyul', '-avgust', '-sentyabr','-oktyabr', '-noyabr', '-dekabr'}
local genitivusMonthes2 = {'-yanvarda','-fevralda','-martta','-aprelde','-mayda','-iyunda','-iyulda','-avgustta','-sentyabrde','-oktyabrde','-noyabrde','-dekabrde'}
function infocards.nominativeYear( year )
if ( year >= 0 ) then
return '[[' .. year ..'|' .. year .. '-jılı]]'
else
return '[[b. e. sh. ' .. ( 0 - year ) ..'|b. e. sh. ' .. ( 0 - year ) .. '-jılı]]'
end
end
local suffixes = {
"", "", "", "", "", "", "", "", "", [0] = "", [10] = "", [20] = "",
[30] = "", [40] = "", [50] = "", [60] = "", [70] = "", [80] = "", [90] = ""
}
local function ordinal(number)
local suffix
if number % 1000 == 0 then
suffix = ""
elseif number %100 == 0 then
suffix = ""
elseif number %10 == 0 then
local rem = number % 100
suffix = suffixes[rem]
end
if not suffix then
rem = number %10
suffix = suffixes[rem]
end
return number .. "" .. suffix
end
local function inYear( year )
if year >= 0 then
return ordinal(year)
else
year = -year
return 'b. e. sh. ' .. ordinal(year)
end
end
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 class="nowrap">'
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
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( "[[%d%s|%d (%d)%s]]",
nd,genitivusMonthes[nm], od, nd,genitivusMonthes[nm] )
elseif (template == "1234") then
datePart = datePart .. string.format( "[[%d%s|%d (%d)%s]] %s",
nd,genitivusMonthes[nm], od, nd,genitivusMonthes[nm], infocards.nominativeYear( ny ) )
elseif (template == "1245") then
datePart = datePart .. string.format( "%d%s ([[%d%s]])",
od,genitivusMonthes[om], nd,genitivusMonthes[nm] )
elseif (template == "12345") then
datePart = datePart .. string.format( "%d%s ([[%d%s]]) %s",
od,genitivusMonthes[om], nd,genitivusMonthes[nm], infocards.nominativeYear( ny ) )
elseif (template == "123456") then
datePart = datePart .. string.format( '%d%s %d</span> <span class="nowrap">([[%d%s]] %s)',
od,genitivusMonthes[om], oy, nd,genitivusMonthes[nm], infocards.nominativeYear( ny ) )
else
datePart = datePart .. 'nadurıs format'
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 .. '[[Kategoriya:' .. nd .. '' .. genitivusMonthes2[nm] .. ' ' .. categoryNamePrefix .. ']]'
end
if ( ny ~= nil) then
datePart = datePart .. '[[Kategoriya:' .. inYear (ny) ..'-jılı ' .. categoryNamePrefix .. ']]'
end
end
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 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