<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://wiki.maoism.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ADates</id>
	<title>Модуль:Dates - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.maoism.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ADates"/>
	<link rel="alternate" type="text/html" href="http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Dates&amp;action=history"/>
	<updated>2026-04-10T14:45:20Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Dates&amp;diff=1249&amp;oldid=prev</id>
		<title>Maoism archivist: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Dates&amp;diff=1249&amp;oldid=prev"/>
		<updated>2020-10-15T08:07:11Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 11:07, 15 октября 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Maoism archivist</name></author>
	</entry>
	<entry>
		<id>http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Dates&amp;diff=1248&amp;oldid=prev</id>
		<title>wiki&gt;Helgo13: Изменил уровень защиты Модуль:Dates ([Редактирование=только администраторы] (бессрочно) [Переименование=только администраторы] (бессрочно))</title>
		<link rel="alternate" type="text/html" href="http://wiki.maoism.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Dates&amp;diff=1248&amp;oldid=prev"/>
		<updated>2020-04-15T16:14:55Z</updated>

		<summary type="html">&lt;p&gt;Изменил уровень защиты &lt;a href=&quot;/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Dates&quot; title=&quot;Модуль:Dates&quot;&gt;Модуль:Dates&lt;/a&gt; ([Редактирование=только администраторы] (бессрочно) [Переименование=только администраторы] (бессрочно))&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
 В это модуле собраны функции, связанные с работой с датами.&lt;br /&gt;
]]&lt;br /&gt;
local monthg = {'января', 'февраля', 'марта', 'апреля', 'мая', 'июня',&lt;br /&gt;
    'июля', 'августа', &amp;quot;сентября&amp;quot;, &amp;quot;октября&amp;quot;, &amp;quot;ноября&amp;quot;, &amp;quot;декабря&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
local monthd = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}&lt;br /&gt;
&lt;br /&gt;
local function DecodeDate(d)-- Ч, М, Г, СЧ, СМ, СГ, хвост&lt;br /&gt;
    --дата: &amp;quot;%-?%d+&amp;quot;=год, &amp;quot;%d+%.%d+&amp;quot;=число месяца, &amp;quot;%d+%.%d+%.%-?%d+&amp;quot;=ЧМГ,&lt;br /&gt;
    -- потом в скобках м.б. переопределено для старого стиля начиная с числа&lt;br /&gt;
    local nd=d:match(&amp;quot;^[%d.-]*&amp;quot;);&lt;br /&gt;
    local od=d:match(&amp;quot;^[%d.-]*%s*%(%s*([%d.-]*)%s*%)&amp;quot;);&lt;br /&gt;
    local tail = d:match(&amp;quot;^[%d.-]+%s*%(%s*[%d.-]+%s*%)%s*(%S.*)&amp;quot;) or d:match(&amp;quot;^[%d.-]+%s*([^%s%d].*)&amp;quot;);&lt;br /&gt;
    if nd:match('^%-?%d+$' ) then&lt;br /&gt;
        return nil, nil, tonumber(nd), nil, nil, od and tonumber(od:match(&amp;quot;%-?%d+$&amp;quot;)),tail&lt;br /&gt;
    else&lt;br /&gt;
        local j,m,y=nd:match(&amp;quot;^(%d+)%.(%d+)%.?(%-?%d*)&amp;quot;);&lt;br /&gt;
        if j then&lt;br /&gt;
            if od then&lt;br /&gt;
                local oj, om, oy = od:match(&amp;quot;^(%d+)%.?(%d*)%.?(%-?%d*)&amp;quot;);&lt;br /&gt;
                return j and tonumber(j),&lt;br /&gt;
                       m and tonumber(m),&lt;br /&gt;
                       y&amp;gt;'' and tonumber(y) or nil,&lt;br /&gt;
                      oj and tonumber(oj),&lt;br /&gt;
                      om&amp;gt;'' and tonumber(om) or nil,&lt;br /&gt;
                      oy&amp;gt;'' and tonumber(oy) or nil,&lt;br /&gt;
                      tail&lt;br /&gt;
            end&lt;br /&gt;
            return j and tonumber(j), m and tonumber(m), y&amp;gt;'' and tonumber(y) or nil, nil, nil, nil, tail&lt;br /&gt;
        else return nil&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function Diffy(d1,m1,y1,d0,m0,y0)--аналог Персона/Дата/Прошло лет&lt;br /&gt;
    return y1-y0 - ( y1*y0&amp;lt;=0 and 1 or 0 ) - ( (m1&amp;lt;m0 or m1==m0 and d1&amp;lt;d0) and 1 or 0 )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function Year0(y,t)-- аналог Год0&lt;br /&gt;
    if y&amp;gt;0 then return table.concat{&lt;br /&gt;
        '[[', tostring(y), ' год|', t and tostring(y)..'&amp;amp;nbsp;'..t or tostring(y), ']]'&lt;br /&gt;
    } else return table.concat{&lt;br /&gt;
        '[[', tostring(-y), ' год до н. э.|', &lt;br /&gt;
        t and tostring(-y)..'&amp;amp;nbsp;'..t or tostring(-y),&lt;br /&gt;
        '&amp;amp;nbsp;до&amp;amp;nbsp;н.&amp;amp;nbsp;э.]]'&lt;br /&gt;
    }&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function FormDate(j,m,y,oj,om,oy,mo)-- ~ Персона/Дата/Logic 4&lt;br /&gt;
    if j then&lt;br /&gt;
        if not m then return &amp;quot;''формат неверен''&amp;quot; end&lt;br /&gt;
        if y then return&lt;br /&gt;
         string.format(&lt;br /&gt;
            '&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%s&amp;lt;span style=&amp;quot;display:none&amp;quot;&amp;gt;(&amp;lt;span class=&amp;quot;%s&amp;quot;&amp;gt;%04i-%02i-%02i&amp;lt;/span&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;',&lt;br /&gt;
            table.concat(&lt;br /&gt;
                oj and (&lt;br /&gt;
                    om and (&lt;br /&gt;
                        oy and {-- ДД ММММ ГГГГ ([[ДД ММММ]] [[ГГГГ]])&lt;br /&gt;
                            oj,'&amp;amp;nbsp;',monthg[om],'&amp;amp;nbsp;',oy,&lt;br /&gt;
                            '&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;([[',&lt;br /&gt;
                            j, ' ', monthg[m],']] ',Year0(y),')'&lt;br /&gt;
                        } or {-- ДД ММММ ([[ДД ММММ]]) [[ГГГГ]]&lt;br /&gt;
                            oj,'&amp;amp;nbsp;',monthg[om],' ([[',j,'&amp;amp;nbsp;',monthg[m],']]) ',Year0(y)&lt;br /&gt;
                        }&lt;br /&gt;
                    ) or {-- ДД [[ДД ММММ|(ДД) ММММ]] [[ГГГГ]]&lt;br /&gt;
                        oj,'&amp;amp;nbsp;[[',j,' ',monthg[m],'|','(',j,')&amp;amp;nbsp;',monthg[m],']] ',Year0(y)&lt;br /&gt;
                    }&lt;br /&gt;
                ) or {'[[',j,'&amp;amp;nbsp;',monthg[m],']]&amp;amp;nbsp;',Year0(y)}&lt;br /&gt;
            ),--/table.concat&lt;br /&gt;
            ({['Рождения']='bday',['Смерти']='dday'})[mo] or '',&lt;br /&gt;
            y,m,j&lt;br /&gt;
         )--/string.format&lt;br /&gt;
        else return&lt;br /&gt;
            '&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;' .. table.concat(&lt;br /&gt;
                oj and (&lt;br /&gt;
                    om and {-- ДД ММММ ([[ДД ММММ]])&lt;br /&gt;
                            oj,'&amp;amp;nbsp;',monthg[om],' ([[',j,'&amp;amp;nbsp;',monthg[m],']])&amp;lt;/span&amp;gt;'&lt;br /&gt;
                    } or {-- ДД [[ДД ММММ|(ДД) ММММ]]&lt;br /&gt;
                        oj,'&amp;amp;nbsp;[[',j,' ',monthg[m],'|','(',j,')&amp;amp;nbsp;',monthg[m],']]&amp;lt;/span&amp;gt;'&lt;br /&gt;
                    }&lt;br /&gt;
                ) or {'[[',j,'&amp;amp;nbsp;',monthg[m],']]&amp;lt;/span&amp;gt;'}&lt;br /&gt;
            )&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        return y and string.format(&lt;br /&gt;
            '&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%s&amp;lt;span style=&amp;quot;display:none;&amp;quot;&amp;gt;(&amp;lt;span class=&amp;quot;bday&amp;quot;&amp;gt;%04i&amp;lt;/span&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;',&lt;br /&gt;
            Year0(y,'год'),y) or &amp;quot;''формат неверен''&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function GetDate(D)--dd.mm.-?yyyy или -?yyyy-mm-dd в три переменных d,m,y&lt;br /&gt;
    local d,m,y = d:match('^%s*(%d%d?)[/.]([01]?%d)[/.](%-?%d+)')&lt;br /&gt;
    if not d then y,m,d = D:match('^%s*(%-?%d+)[-\\]0*(1?%d)[-\\]0*(%d+)') end&lt;br /&gt;
    return tonumber(d),tonumber(m),tonumber(y)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function Cmp(a,b)--Сравнивает две даты, результат соответственно -1, 0 или 1 &lt;br /&gt;
    local d1,m1,y1 = GetDate(a)&lt;br /&gt;
    local d2,m2,y2 = GetDate(b)&lt;br /&gt;
    return d1 and d2 and (--nil, если формат не опознан&lt;br /&gt;
        y1==y2 and (&lt;br /&gt;
            m1==m2 and (&lt;br /&gt;
                d1==d2 and 0 or d1&amp;lt;d2 and -1 or 1&lt;br /&gt;
            ) or m1&amp;lt;m2 and -1 or 1&lt;br /&gt;
        ) or y1&amp;lt;y2 and -1 or 1&lt;br /&gt;
    )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function Yyyymmdd(r)--Переводит русскую дату в YYYY,MM,DD&lt;br /&gt;
    local d, m, y, M = mw.ustring.match(r, &amp;quot;^%s*(%d%d?)%s+([а-яА-Я]+)%s+(%d+)&amp;quot;)&lt;br /&gt;
    if not m then return nil end&lt;br /&gt;
    m = mw.ustring.lower(m)&lt;br /&gt;
&lt;br /&gt;
    --тупо перебор&lt;br /&gt;
    for i = 1, 12 do&lt;br /&gt;
    	if m == monthg[i] then&lt;br /&gt;
    		M = i&lt;br /&gt;
    		break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    if not M then&lt;br /&gt;
    	return nil&lt;br /&gt;
	end&lt;br /&gt;
    return tonumber(y), M, tonumber(d)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
p = {&lt;br /&gt;
&lt;br /&gt;
ifdate=function(f)-- Для шаблона &amp;quot;Если дата&amp;quot;, имитирует старое поведение&lt;br /&gt;
 -- Аргументы передаются шаблону &lt;br /&gt;
 return f:getParent().args[ mw.ustring.match(frame.args[1],&amp;quot;^[ %d.%-−%()]*$&amp;quot;) and 2 or 3 ]&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
DecodeDate = DecodeDate;&lt;br /&gt;
Diffy = Diffy;&lt;br /&gt;
Year0 = Year0;&lt;br /&gt;
GetDate = GetDate;&lt;br /&gt;
Cmp = Cmp;&lt;br /&gt;
Yyyymmdd = Yyyymmdd;&lt;br /&gt;
&lt;br /&gt;
diffy = function(f)-- принимает параметры #invoke в виде двух строк-дат&lt;br /&gt;
    local d1,m1,y1=DecodeDate(f.args[1]);&lt;br /&gt;
    local d0,m0,y0=DecodeDate(f.args[2])&lt;br /&gt;
    return Diffy(d1,m1,y1,d0,m0,y0)&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
monthg=function(f) return monthg[ f.args[1] or f:getParent().args[1] ] end;--realmonth&lt;br /&gt;
&lt;br /&gt;
persdate=function(f)-- Для шаблона Персона/Дата;{{#invoke:dates|persdate|nocat={{NAMESPACE}}}}&lt;br /&gt;
 local frame=f:getParent();&lt;br /&gt;
 local catpref,mo,d,d2={['Рождения']='Родившиеся',['Смерти']='Умершие'}, frame.args[1],frame.args[2],frame.args[3]&lt;br /&gt;
 local cat, j,m,y,oj,om,oy,tail, j2,m2,y2, age = ''&lt;br /&gt;
 if d then&lt;br /&gt;
     j,m,y,oj,om,oy,tail=DecodeDate(d:gsub('−','-'));&lt;br /&gt;
     if not (j or y) then&lt;br /&gt;
         return (frame.args.nocat and d or d..'[[Category:Википедия:Статьи с ручной викификацией дат в карточке]]')&lt;br /&gt;
     end&lt;br /&gt;
 end;&lt;br /&gt;
 if d2 then&lt;br /&gt;
     j2,m2,y2 = DecodeDate(d2:gsub('−','-'));&lt;br /&gt;
 end;&lt;br /&gt;
 return table.concat{&lt;br /&gt;
     FormDate(j,m,y,oj,om,oy,mo),&lt;br /&gt;
     ( (frame.args['nopersoncat'] or '')~='' or (f.args['nocat'] or '')~='' ) and '' or table.concat{&lt;br /&gt;
         '[[Category:Персоналии по алфавиту]]',&lt;br /&gt;
         j and string.format('[[Category:%s %i %s]]',catpref[mo],j,monthg[m]) or '',&lt;br /&gt;
         y and string.format('[[Category:%s в %s]]',catpref[mo],y,Year0(y,'году')) or ''&lt;br /&gt;
     },--/table.concat внутр.&lt;br /&gt;
     (function(F)--возраст&lt;br /&gt;
         if not F then return '' end;&lt;br /&gt;
         local n=F();&lt;br /&gt;
         return n and string.format(&amp;quot; (%i %s)%s&amp;quot;,&lt;br /&gt;
             n,&lt;br /&gt;
             mw.getLanguage('ru'):plural(n,'год','года','лет'),&lt;br /&gt;
             n&amp;gt;150 and '[[Category:Википедия:Статьи о персоналиях с большим текущим возрастом]]' or ''&lt;br /&gt;
         ) or ''&lt;br /&gt;
     end)( ({&lt;br /&gt;
         ['Рождения']=function()&lt;br /&gt;
             local now=os.date('*t');&lt;br /&gt;
             if (not d2 or d2=='') and j and m and y then&lt;br /&gt;
                 return Diffy(now.day,now.month,now.year,j,m,y)&lt;br /&gt;
             end&lt;br /&gt;
         end,&lt;br /&gt;
         ['Смерти']=function()&lt;br /&gt;
             return j and m and y and j2 and m2 and y2 and Diffy(j,m,y,j2,m2,y2);&lt;br /&gt;
         end,&lt;br /&gt;
     })[mo] ),--конец вызова функции возраста&lt;br /&gt;
     tail or '',&lt;br /&gt;
     cat&lt;br /&gt;
 }--/table.concat внеш.&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
formdate=function(f) -- Формирует дату по 3--6 параметрам #invoke или шаблона&lt;br /&gt;
    --не использовать с пустыми аргументами&lt;br /&gt;
    if (f.args[1] or '')~='' and (f.args[2] or '')~='' or (f.args[3] or '')~='' then&lt;br /&gt;
        return FormDate(f.args[1],f.args[2],f.args[3],f.args[4],f.args[5],f.args[6],f.args['m'])&lt;br /&gt;
    else&lt;br /&gt;
        local tf=f:getParent();&lt;br /&gt;
        return FormDate(tf.args[1],tf.args[2],tf.args[3],tf.args[4],tf.args[5],tf.args[6],tf.args['m'])&lt;br /&gt;
    end&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
cmp=function(f)--Сравнивает две даты, результат соответственно -1, 0 или 1&lt;br /&gt;
    return Cmp(f.args[1],f.args[2])&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
G2J=function(f)--перевод григорианских дат в юлианские, возврат DD.MM.YYYY&lt;br /&gt;
--Не знает про 15 октября 1582 года, не работает до нашей эры и после ???99 года&lt;br /&gt;
--Если есть второй аргумент, преобразует только ДО этой даты включительно&lt;br /&gt;
--Если есть третий аргумент, результат форматирует под Персона/Дата&lt;br /&gt;
    local d,m,y=GetDate(f.args[1])&lt;br /&gt;
    if f.args[2] and Cmp(f.args[1],f.args[2])==1 then&lt;br /&gt;
        return string.format(&amp;quot;%i.%i.%i&amp;quot;,d,m,y)&lt;br /&gt;
    end&lt;br /&gt;
    local shift=math.floor(y/100)-math.floor(y/400)-2&lt;br /&gt;
    if d-shift&amp;gt;0 then&lt;br /&gt;
        return f.args[3] and string.format(&amp;quot;%i.%i.%i (%i)&amp;quot;,d,m,y,d-shift)&lt;br /&gt;
        or string.format(&amp;quot;%i.%i.%i&amp;quot;,d-shift,m,y)&lt;br /&gt;
    else&lt;br /&gt;
        if m==1 then&lt;br /&gt;
            return f.args[3]&lt;br /&gt;
            and string.format(&amp;quot;%i.1.%i (%i.12.%i)&amp;quot;,d,y,31+d-shift,y-1)&lt;br /&gt;
            or string.format(&amp;quot;%i.12.%i&amp;quot;,31+d-shift,y-1)&lt;br /&gt;
        elseif m==3 then&lt;br /&gt;
            return f.args[3] and string.format(&amp;quot;%i.3.%i (%i.2)&amp;quot;, d,y,&lt;br /&gt;
                (y%4==0 and 29 or 28)+d-shift-(y%100==0 and y%400~=0 and 1 or 0)&lt;br /&gt;
            )&lt;br /&gt;
            or string.format(&amp;quot;%i.2.%i&amp;quot;,&lt;br /&gt;
                (y%4==0 and 29 or 28)+d-shift-(y%100==0 and y%400~=0 and 1 or 0)&lt;br /&gt;
            ,y)&lt;br /&gt;
        else&lt;br /&gt;
            return f.args[3] and string.format(&lt;br /&gt;
                &amp;quot;%i.%i.%i (%i.%i)&amp;quot;, d,m,y, monthd[m-1]+d-shift,m-1&lt;br /&gt;
            )&lt;br /&gt;
            or string.format(&amp;quot;%i.%i.%i&amp;quot;,monthd[m-1]+d-shift,m-1,y)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
-- Переводит русскую дату в YYYY-MM-DD. Возвращает входное значение, если дата уже в этом формате&lt;br /&gt;
yyyymmdd = function(f)&lt;br /&gt;
    local date, hourmin = f.args[1]&lt;br /&gt;
    if mw.ustring.match(date, &amp;quot;^%s*%d+\-%d+\-%d+&amp;quot;) then&lt;br /&gt;
    	return date&lt;br /&gt;
	end&lt;br /&gt;
    hourmin = mw.ustring.match(date, &amp;quot;%s+%d+:%d+$&amp;quot;)&lt;br /&gt;
    local y, m, d = Yyyymmdd(date)&lt;br /&gt;
    if not y then&lt;br /&gt;
    	return '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Ошибка: некорректный формат даты.&amp;lt;/span&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
    return string.format('%4i-%02i-%02i', y, m, d) .. (hourmin or '')&lt;br /&gt;
end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function table.val_to_str ( v )&lt;br /&gt;
  if &amp;quot;string&amp;quot; == type( v ) then&lt;br /&gt;
    v = string.gsub( v, &amp;quot;\n&amp;quot;, &amp;quot;\\n&amp;quot; )&lt;br /&gt;
    if string.match( string.gsub(v,&amp;quot;[^'\&amp;quot;]&amp;quot;,&amp;quot;&amp;quot;), '^&amp;quot;+$' ) then&lt;br /&gt;
      return &amp;quot;'&amp;quot; .. v .. &amp;quot;'&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return '&amp;quot;' .. string.gsub(v,'&amp;quot;', '\\&amp;quot;' ) .. '&amp;quot;'&lt;br /&gt;
  else&lt;br /&gt;
    return &amp;quot;table&amp;quot; == type( v ) and table.tostring( v ) or&lt;br /&gt;
      tostring( v )&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function table.key_to_str ( k )&lt;br /&gt;
  if &amp;quot;string&amp;quot; == type( k ) and string.match( k, &amp;quot;^[_%a][_%a%d]*$&amp;quot; ) then&lt;br /&gt;
    return k&lt;br /&gt;
  else&lt;br /&gt;
    return &amp;quot;[&amp;quot; .. table.val_to_str( k ) .. &amp;quot;]&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function table.tostring( tbl )&lt;br /&gt;
  local result, done = {}, {}&lt;br /&gt;
  for k, v in ipairs( tbl ) do&lt;br /&gt;
    table.insert( result, table.val_to_str( v ) )&lt;br /&gt;
    done[ k ] = true&lt;br /&gt;
  end&lt;br /&gt;
  for k, v in pairs( tbl ) do&lt;br /&gt;
    if not done[ k ] then&lt;br /&gt;
      table.insert( result,&lt;br /&gt;
        table.key_to_str( k ) .. &amp;quot;=&amp;quot; .. table.val_to_str( v ) )&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return &amp;quot;{&amp;quot; .. table.concat( result, &amp;quot;,&amp;quot; ) .. &amp;quot;}&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parseISO8601Date(str)&lt;br /&gt;
	local pattern = &amp;quot;(%-?%d+)%-(%d+)%-(%d+)T&amp;quot;&lt;br /&gt;
	local Y, M, D = mw.ustring.match( str, pattern )&lt;br /&gt;
	return tonumber(Y), tonumber(M), tonumber(D)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parseISO8601Time(str)&lt;br /&gt;
	local pattern = &amp;quot;T(%d+):(%d+):(%d+)%Z&amp;quot;&lt;br /&gt;
	local H, M, S = mw.ustring.match( str, pattern)&lt;br /&gt;
	return tonumber(H), tonumber(M), tonumber(S)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parseISO8601Offset(str)&lt;br /&gt;
	if str:sub(-1)==&amp;quot;Z&amp;quot; then return 0,0 end -- ends with Z, Zulu time&lt;br /&gt;
&lt;br /&gt;
	-- matches ±hh:mm, ±hhmm or ±hh; else returns nils &lt;br /&gt;
	local pattern = &amp;quot;([-+])(%d%d):?(%d?%d?)$&amp;quot;&lt;br /&gt;
	local sign, oh, om = mw.ustring.match( str, pattern) &lt;br /&gt;
	sign, oh, om = sign or &amp;quot;+&amp;quot;, oh or &amp;quot;00&amp;quot;, om or &amp;quot;00&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	return tonumber(sign .. oh), tonumber(sign .. om)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.parseISO8601(str)&lt;br /&gt;
	if 'table'==type(str) then&lt;br /&gt;
		if str.args and str.args[1] then&lt;br /&gt;
			str = '' .. str.args[1]&lt;br /&gt;
		else&lt;br /&gt;
			return 'unknown argument type: ' .. type( str ) .. ': ' .. table.tostring( str )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local Y,M,D = parseISO8601Date(str)&lt;br /&gt;
	local h,m,s = parseISO8601Time(str)&lt;br /&gt;
	local oh,om = parseISO8601Offset(str)&lt;br /&gt;
	return tonumber(os.time({year=Y, month=M, day=D, hour=(h+oh), min=(m+om), sec=s}))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local g2uBoundary1 = p.parseISO8601('1582-10-15T00:00:00Z')&lt;br /&gt;
local g2uBoundary2 = p.parseISO8601('1700-03-12T00:00:00Z')&lt;br /&gt;
local g2uBoundary3 = p.parseISO8601('1800-03-13T00:00:00Z')&lt;br /&gt;
local g2uBoundary4 = p.parseISO8601('1900-03-14T00:00:00Z')&lt;br /&gt;
local g2uBoundary5 = p.parseISO8601('1918-01-26T00:00:00Z') -- декрет Ленина&lt;br /&gt;
&lt;br /&gt;
-- Передаваемое время обязано быть по Григорианскому календарю (новому стилю)&lt;br /&gt;
function p.formatWiki( time, infocardClass, categoryNamePrefix )&lt;br /&gt;
	if 'table'==type( time ) then&lt;br /&gt;
		if time.args and time.args[1] then&lt;br /&gt;
			time = tonumber( time.args[1] )&lt;br /&gt;
		else&lt;br /&gt;
			return 'unknown argument type: ' .. type( time ) .. ': ' .. table.tostring( time )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local t = os.date(&amp;quot;*t&amp;quot;, time)&lt;br /&gt;
	if time &amp;lt; g2uBoundary1 then&lt;br /&gt;
		-- выводим просто юлианский календарь. Задавать тут григорианский некорректно&lt;br /&gt;
		return p.formatWikiImpl( t, t, infocardClass, categoryNamePrefix )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Специальные даты&lt;br /&gt;
	if t.year == 1700 and t.month == 3 and t.day == 11 then&lt;br /&gt;
		return p.formatWikiImpl( {year=1700, month=2, day=29}, t, infocardClass, categoryNamePrefix)&lt;br /&gt;
	end&lt;br /&gt;
	if t.year == 1800 and t.month == 3 and t.day == 12 then&lt;br /&gt;
		return p.formatWikiImpl( {year=1800, month=2, day=29}, t, infocardClass, categoryNamePrefix )&lt;br /&gt;
	end&lt;br /&gt;
	if t.year == 1900 and t.month == 3 and t.day == 13 then&lt;br /&gt;
		return p.formatWikiImpl( {year=1900, month=2, day=29}, t, infocardClass, categoryNamePrefix )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if g2uBoundary1 &amp;lt;= time and time &amp;lt; g2uBoundary2 then&lt;br /&gt;
		return p.formatWikiImpl( os.date(&amp;quot;*t&amp;quot;, time - 10 * 24 * 60 * 60), t, infocardClass, categoryNamePrefix )&lt;br /&gt;
	end&lt;br /&gt;
	if g2uBoundary2 &amp;lt;= time and time &amp;lt; g2uBoundary3 then&lt;br /&gt;
		return p.formatWikiImpl( os.date(&amp;quot;*t&amp;quot;, time - 11 * 24 * 60 * 60), t, infocardClass, categoryNamePrefix )&lt;br /&gt;
	end&lt;br /&gt;
	if g2uBoundary3 &amp;lt;= time and time &amp;lt; g2uBoundary4 then&lt;br /&gt;
		return p.formatWikiImpl( os.date(&amp;quot;*t&amp;quot;, time - 12 * 24 * 60 * 60), t, infocardClass, categoryNamePrefix )&lt;br /&gt;
	end&lt;br /&gt;
	if g2uBoundary4 &amp;lt;= time and time &amp;lt; g2uBoundary5 then&lt;br /&gt;
		return p.formatWikiImpl( os.date(&amp;quot;*t&amp;quot;, time - 13 * 24 * 60 * 60), t, infocardClass, categoryNamePrefix )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--только Григорианский календарь&lt;br /&gt;
	return p.formatWikiImpl( t, t, infocardClass, categoryNamePrefix )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ternary ( cond , T , F )&lt;br /&gt;
    if cond then return T else return F end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local nominativeMonthes = {'январь', 'февраль', 'март', 'апрель', 'май', 'июнь',&lt;br /&gt;
    'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'}&lt;br /&gt;
    &lt;br /&gt;
local genitivusMonthes = {'января', 'февраля', 'марта', 'апреля', 'мая', 'июня',&lt;br /&gt;
    'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'}&lt;br /&gt;
&lt;br /&gt;
local function nominativeYear( year )&lt;br /&gt;
    if ( year &amp;gt;= 0 ) then&lt;br /&gt;
        return '[[' .. year .. ' год|' .. year .. ']]'&lt;br /&gt;
    else&lt;br /&gt;
        return '[[' .. ( 0 - year ) .. ' год до н. э.|' .. ( 0 - year ) .. ' до н. э.]]'&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function inYear( year )&lt;br /&gt;
    if ( year &amp;gt;= 0 ) then&lt;br /&gt;
        return '' .. year .. ' году'&lt;br /&gt;
    else&lt;br /&gt;
        return '' .. ( 0 - year) .. ' году до н. э.'&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatWikiImpl( t1, t2, infocardClass, categoryNamePrefix, brts )&lt;br /&gt;
    local nd = t2.day;&lt;br /&gt;
    local nm = t2.month;&lt;br /&gt;
    local ny = t2.year;&lt;br /&gt;
    local od = ternary ( t1.day ~= t2.day , t1.day, nil );&lt;br /&gt;
    local om = ternary ( t1.month ~= t2.month , t1.month, nil );&lt;br /&gt;
    local oy = ternary ( t1.year ~= t2.year , t1.year, nil );&lt;br /&gt;
&lt;br /&gt;
	local bracket1 = &amp;quot;(&amp;quot;;&lt;br /&gt;
	local bracket2 = &amp;quot;)&amp;quot;;&lt;br /&gt;
	if ( brts == 1 ) then&lt;br /&gt;
		bracket1 = &amp;quot;&amp;amp;#91;&amp;quot;&lt;br /&gt;
		bracket2 = &amp;quot;&amp;amp;#93;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local JulianComment = function(s)&lt;br /&gt;
		return tostring(mw.html.create(&amp;quot;abbr&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;title&amp;quot;,&amp;quot;по юлианскому календарю&amp;quot;)&lt;br /&gt;
			:wikitext(s)&lt;br /&gt;
			:done())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
    local template =&lt;br /&gt;
        (nd ~= nil and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;) .. (nm ~= nil and &amp;quot;2&amp;quot; or &amp;quot;&amp;quot;) .. (ny ~= nil and &amp;quot;3&amp;quot; or &amp;quot;&amp;quot;) ..&lt;br /&gt;
        (od ~= nil and &amp;quot;4&amp;quot; or &amp;quot;&amp;quot;) .. (om ~= nil and &amp;quot;5&amp;quot; or &amp;quot;&amp;quot;) .. (oy ~= nil and &amp;quot;6&amp;quot; or &amp;quot;&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
    local datePart = '&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;'&lt;br /&gt;
    if (template == &amp;quot;12&amp;quot;) then&lt;br /&gt;
        datePart = datePart .. string.format( &amp;quot;[[%d %s]]&amp;quot;,&lt;br /&gt;
        								nd, genitivusMonthes[nm] )&lt;br /&gt;
    elseif (template == &amp;quot;23&amp;quot;) then&lt;br /&gt;
        datePart = datePart .. string.format( &amp;quot;%s %s&amp;quot;,&lt;br /&gt;
        								nominativeMonthes[nm], nominativeYear( ny ) )&lt;br /&gt;
    elseif (template == &amp;quot;3&amp;quot;) then&lt;br /&gt;
        datePart = datePart .. nominativeYear( ny )&lt;br /&gt;
    elseif (template == &amp;quot;123&amp;quot;) then&lt;br /&gt;
        datePart = datePart .. string.format( &amp;quot;[[%d %s]] %s&amp;quot;,&lt;br /&gt;
                                        nd, genitivusMonthes[nm], nominativeYear( ny ) )&lt;br /&gt;
    elseif (template == &amp;quot;124&amp;quot;) then&lt;br /&gt;
        datePart = datePart .. JulianComment(string.format( &amp;quot;%d&amp;quot;, od )&lt;br /&gt;
							).. string.format( &amp;quot; [[%d %s|&amp;quot; .. bracket1 .. &amp;quot;%d&amp;quot; .. bracket2 .. &amp;quot; %s]]&amp;quot;,&lt;br /&gt;
                                        nd, genitivusMonthes[nm], nd, genitivusMonthes[nm] )&lt;br /&gt;
    elseif (template == &amp;quot;1234&amp;quot;) then&lt;br /&gt;
        datePart = datePart .. JulianComment(string.format( &amp;quot;%d&amp;quot;, od )&lt;br /&gt;
							).. string.format( &amp;quot; [[%d %s|&amp;quot; .. bracket1 .. &amp;quot;%d&amp;quot; .. bracket2 .. &amp;quot; %s]] %s&amp;quot;,&lt;br /&gt;
                                        nd, genitivusMonthes[nm], nd, genitivusMonthes[nm], nominativeYear( ny ) )&lt;br /&gt;
    elseif (template == &amp;quot;1245&amp;quot;) then&lt;br /&gt;
        datePart = datePart .. JulianComment(string.format( &amp;quot;%d %s&amp;quot;, od, genitivusMonthes[om] )&lt;br /&gt;
							).. string.format(&amp;quot; &amp;quot; .. bracket1 .. &amp;quot;[[%d %s]]&amp;quot; .. bracket2 .. &amp;quot;&amp;quot;, nd, genitivusMonthes[nm] )										&lt;br /&gt;
    elseif (template == &amp;quot;12345&amp;quot;) then&lt;br /&gt;
        datePart = datePart .. JulianComment(string.format( &amp;quot;%d %s&amp;quot;, od, genitivusMonthes[om] )&lt;br /&gt;
							).. string.format(&amp;quot; &amp;quot; .. bracket1 .. &amp;quot;[[%d %s]]&amp;quot; .. bracket2 .. &amp;quot; %s&amp;quot;, nd, genitivusMonthes[nm], nominativeYear( ny ) )&lt;br /&gt;
    elseif (template == &amp;quot;123456&amp;quot;) then&lt;br /&gt;
        datePart = datePart .. JulianComment(string.format( &amp;quot;%d %s %d&amp;quot;, od, genitivusMonthes[om], oy ))&lt;br /&gt;
							.. '&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;'&lt;br /&gt;
							.. string.format(&amp;quot; &amp;quot; .. bracket1 .. &amp;quot;[[%d %s]] %s&amp;quot; .. bracket2 , nd, genitivusMonthes[nm], nominativeYear( ny ) )&lt;br /&gt;
    else&lt;br /&gt;
        datePart = datePart .. 'формат неверен'&lt;br /&gt;
    end&lt;br /&gt;
    datePart = datePart .. '&amp;lt;/span&amp;gt;'&lt;br /&gt;
 &lt;br /&gt;
    local infocardTemplate =&lt;br /&gt;
        (nd ~= nil and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;) .. (nm ~= nil and &amp;quot;2&amp;quot; or &amp;quot;&amp;quot;) .. (ny ~= nil and &amp;quot;3&amp;quot; or &amp;quot;&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
	if infocardClass then&lt;br /&gt;
	    if (infocardTemplate == &amp;quot;123&amp;quot;) then&lt;br /&gt;
	        datePart = datePart .. string.format('&amp;lt;span style=&amp;quot;display:none&amp;quot;&amp;gt;(&amp;lt;span class=&amp;quot;%s&amp;quot;&amp;gt;%04d-%02d-%02d&amp;lt;/span&amp;gt;)&amp;lt;/span&amp;gt;', infocardClass , ny , nm , nd )&lt;br /&gt;
	    elseif (infocardTemplate == &amp;quot;23&amp;quot;) then&lt;br /&gt;
	        datePart = datePart .. string.format('&amp;lt;span style=&amp;quot;display:none&amp;quot;&amp;gt;(&amp;lt;span class=&amp;quot;%s&amp;quot;&amp;gt;%04d-%02d&amp;lt;/span&amp;gt;)&amp;lt;/span&amp;gt;', infocardClass , ny , nm )&lt;br /&gt;
	    elseif (infocardTemplate == &amp;quot;3&amp;quot;) then&lt;br /&gt;
	        datePart = datePart .. string.format('&amp;lt;span style=&amp;quot;display:none;&amp;quot;&amp;gt;(&amp;lt;span class=&amp;quot;%s&amp;quot;&amp;gt;%04d&amp;lt;/span&amp;gt;)&amp;lt;/span&amp;gt;', infocardClass , ny )&lt;br /&gt;
	    end&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
    if categoryNamePrefix then&lt;br /&gt;
        if ( nd ~= nil and nm ~= nil) then&lt;br /&gt;
            datePart = datePart .. '[[Category:' .. categoryNamePrefix .. ' ' .. nd .. ' ' .. genitivusMonthes[nm] .. ']]'&lt;br /&gt;
        end&lt;br /&gt;
        if ( ny ~= nil) then&lt;br /&gt;
            datePart = datePart .. '[[Category:' .. categoryNamePrefix .. ' в ' .. inYear( ny ) .. ']]'&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    return datePart&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wiki&gt;Helgo13</name></author>
	</entry>
</feed>