Модуль:Infocards for Ivan A. Krestinin

Документация
-- Специальная версия модуля Inforcards для поддержки Шаблон:Персона/Дата2local infocards = {}--[[Helper function that populates the argument list given that user may need to use a mix ofnamed and unnamed parameters.  This is relevant because named parameters are notidentical to unnamed parameters due to string trimming, and when dealing with stringswe 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;endfunction 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    endendfunction infocards.isDateImpl ( s )    local converted = infocards.convertToDate ( s );    return converted ~= nilendfunction 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 );endfunction infocards.dateOfBirthImpl( dateOfBirth, dateOfDeath, nocat )    local appendToCategory = infocards.isBlank( nocat );    if ( infocards.isBlank( dateOfBirth ) ) then        if ( appendToCategory ) then            return '[[Категория:Википедия:Персоны без указанной даты рождения]]'        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 "''неизвестно''[[Категория:Персоналии, чья дата рождения не установлена]]"        else            return "''неизвестно''"        end    end    local appendAge = 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 ) then            result = result .. ' <span style="white-space:nowrap;">(' .. age .. ' ' .. mw.language.new( 'ru' ):plural( age, 'год', 'года', 'лет') .. ')</span>'        end        if ( age > 150 and appendToCategory ) then            result = result .. '[[Категория:Википедия:Статьи о персоналиях с большим текущим возрастом]]'        end    end    return resultendfunction 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 );endfunction 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 "''неизвестно''[[Категория:Персоналии, чья дата смерти не установлена]]"        else            return "''неизвестно''"        end    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 )    local age = infocards.age ( parsedDateOfBirth, parsedDateOfDeath )    if ( age > 0 ) then        result = result .. ' <span style="white-space:nowrap;">(' .. age .. ' ' .. mw.language.new( 'ru' ):plural( age, 'год', 'года', 'лет') .. ')</span>'    end    if ( age > 150 and appendToCategory ) then        result = result .. '[[Категория:Википедия:Статьи о персоналиях с большим возрастом во время смерти]]'    end    return resultendfunction 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"];    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 0    endendlocal 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( "[[%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 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 datePartendfunction infocards.nominativeYear( year )    if ( year >= 0 ) then        return '[[' .. year .. ' год|' .. year .. ']]'    else        return '[[' .. ( 0 - year ) .. ' год до н. э.|' .. ( 0 - year ) .. ' до н. э.]]'    endendfunction infocards.inYear( year )    if ( year >= 0 ) then        return '' .. year .. ' году'    else        return '' .. ( 0 - year) .. ' году до н. э.'    endendfunction 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 nilendfunction infocards.convertToDateNewStylePart( possibleDateString )    local ny = mw.ustring.match(possibleDateString, '^(%-?%d+)$', 0)    if (ny ~= nil) then        return {year = tonumber(ny)}    end    return infocards.convertToDateCommonPart( possibleDateString )endfunction infocards.convertToDateOldStylePart( possibleDateString )    local nd = mw.ustring.match(possibleDateString, '^(%-?%d+)$', 0)    if (nd ~= nil) then        return {day = tonumber(nd)}    end    return infocards.convertToDateCommonPart( possibleDateString )endfunction 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 nilendreturn infocards