{{i}} Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]


Приклади визову функції dateOfBirth ред.

  • {{#invoke:Infocards|dateOfBirth|-382|−336}} → 382 до н. е.(-382)
  • {{#invoke:Infocards|dateOfBirth|11.1|}} → 11 січня
  • {{#invoke:Infocards|dateOfBirth|24.12.3|15.01.69}} → 24 грудня 3(0003-12-24)
  • {{#invoke:Infocards|dateOfBirth|23.09.-63|19.08.14}} → 23 вересня 63 до н. е.(-063-09-23)
  • {{#invoke:Infocards|dateOfBirth|42|9.6.42}} → 42(0042)
  • {{#invoke:Infocards|dateOfBirth|870|13.8.900}} → 870(0870)
  • {{#invoke:Infocards|dateOfBirth||22.01.984}} →
  • {{#invoke:Infocards|dateOfBirth|16.06.1066|дата смерти неизвестна}} → 16 червня 1066(1066-06-16)
  • {{#invoke:Infocards|dateOfBirth|8.2.1834 (27.1)|2.2.1907 (20.1)}} → 27 січня (8 лютого) 1834(1834-02-08)
  • {{#invoke:Infocards|dateOfBirth|29.06.1844 (17)|28.10.1883 (16)}} → 17 (29) червня 1844(1844-06-29)
  • {{#invoke:Infocards|dateOfBirth|19.7.1893 (7)|}} → 7 (19) липня 1893(1893-07-19)
  • {{#invoke:Infocards|dateOfBirth|3.10.1895 (21.9)|28.12.1925}} → 21 вересня (3 жовтня) 1895(1895-10-03)
  • {{#invoke:Infocards|dateOfBirth|4.10.1916|8.11.2009}} → 4 жовтня 1916(1916-10-04)
  • {{#invoke:Infocards|dateOfBirth|09.06.1942|}} → 9 червня 1942(1942-06-09) (81 рік)
  • {{#invoke:Infocards|dateOfBirth|1955|}} → 1955(1955)
  • {{#invoke:Infocards|dateOfBirth|29.02.1984|}} → 29 лютого 1984(1984-02-29) (40 років)
  • {{#invoke:Infocards|dateOfBirth||}} →
  • {{#invoke:Infocards|dateOfBirth|4.1.1885 (23.12.1884)|17.5.1951}} → 23 грудня 1884 (4 січня 1885)(1885-01-04)


Категорії підтримки ред.


Цей модуль містить код, запозичений з модуля «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