<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ACenturyMetaCat</id>
	<title>Модуль:CenturyMetaCat - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ACenturyMetaCat"/>
	<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:CenturyMetaCat&amp;action=history"/>
	<updated>2026-05-06T02:38:02Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:CenturyMetaCat&amp;diff=13775&amp;oldid=prev</id>
		<title>Dzmuh: Новая страница: «---*- mode: lua; coding: utf-8; -*-  local p = {}  -- константы local ROMAN = {     I = 1,     IV = 4,     V = 5,     IX = 9,     X = 10,     --XL = 40,     --L = 50, }  -- переменные local cent -- век, положительное число local roman_cent -- век римскими цифрами local BC   -- 0 == н.э. 1 == до н.э. local templ -- строка-шаблон вида 'Мир в %s веке%s' local title = mw.titl...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:CenturyMetaCat&amp;diff=13775&amp;oldid=prev"/>
		<updated>2024-04-17T17:50:52Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «---*- mode: lua; coding: utf-8; -*-  local p = {}  -- константы local ROMAN = {     I = 1,     IV = 4,     V = 5,     IX = 9,     X = 10,     --XL = 40,     --L = 50, }  -- переменные local cent -- век, положительное число local roman_cent -- век римскими цифрами local BC   -- 0 == н.э. 1 == до н.э. local templ -- строка-шаблон вида &amp;#039;Мир в %s веке%s&amp;#039; local title = mw.titl...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;---*- mode: lua; coding: utf-8; -*-&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- константы&lt;br /&gt;
local ROMAN = {&lt;br /&gt;
    I = 1,&lt;br /&gt;
    IV = 4,&lt;br /&gt;
    V = 5,&lt;br /&gt;
    IX = 9,&lt;br /&gt;
    X = 10,&lt;br /&gt;
    --XL = 40,&lt;br /&gt;
    --L = 50,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- переменные&lt;br /&gt;
local cent -- век, положительное число&lt;br /&gt;
local roman_cent -- век римскими цифрами&lt;br /&gt;
local BC   -- 0 == н.э. 1 == до н.э.&lt;br /&gt;
local templ -- строка-шаблон вида 'Мир в %s веке%s'&lt;br /&gt;
local title = mw.title.getCurrentTitle().text&lt;br /&gt;
&lt;br /&gt;
-- опции&lt;br /&gt;
local cent_min -- число, по умолчанию -39, 0 == только н.э.&lt;br /&gt;
local cent_max -- число, по умолчанию 21 (XXI век)&lt;br /&gt;
local range = 5&lt;br /&gt;
&lt;br /&gt;
-- экспортируемые функции&lt;br /&gt;
local getArgs = require('Module:Arguments').getArgs&lt;br /&gt;
local sparseIpairs = require('Module:TableTools').sparseIpairs&lt;br /&gt;
local toroman = require('Module:Roman').convert&lt;br /&gt;
local gsub = mw.ustring.gsub&lt;br /&gt;
&lt;br /&gt;
function roman_to_int(s)&lt;br /&gt;
    local i = 1&lt;br /&gt;
    local num = 0&lt;br /&gt;
    while i &amp;lt;= s:len() do&lt;br /&gt;
        local c&lt;br /&gt;
        if i &amp;lt; s:len() then&lt;br /&gt;
            c = ROMAN[s:sub(i, i+1)]&lt;br /&gt;
        end&lt;br /&gt;
        if c then&lt;br /&gt;
            num = num + c&lt;br /&gt;
            i = i + 2&lt;br /&gt;
        else&lt;br /&gt;
            num = num + ROMAN[s:sub(i, i)]&lt;br /&gt;
            i = i + 1&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return num&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_templ(s)&lt;br /&gt;
    -- формируем строку-шаблон вида:&lt;br /&gt;
    -- 'Мир в XI веке до н. э.' -&amp;gt; 'Мир в %s веке%s'&lt;br /&gt;
    -- определяем BC &lt;br /&gt;
    local t&lt;br /&gt;
    t, BC = gsub(s, '[IVX]+ (век[еа]?) до н%. э%.', '%%s %1%%s')&lt;br /&gt;
    local n = BC&lt;br /&gt;
    if BC ~= 1 then&lt;br /&gt;
        t, n = gsub(s, '[IVX]+ (век[еа]?)', '%%s %1%%s')&lt;br /&gt;
    end&lt;br /&gt;
    if n ~= 1 then&lt;br /&gt;
        -- не найдено или найдено больше одного&lt;br /&gt;
        error('Век не найден')&lt;br /&gt;
    end&lt;br /&gt;
    -- в/во, о/об&lt;br /&gt;
    t = gsub(t, 'во %%s веке', 'в %%s веке')&lt;br /&gt;
    templ = gsub(t, 'об %%s веке', 'о %%s веке')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_cent(t)&lt;br /&gt;
    _, _, roman_cent = mw.ustring.find(t, '([IVX]+) век')&lt;br /&gt;
    if not roman_cent then error('век не найден') end&lt;br /&gt;
    cent = roman_to_int(roman_cent)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function format(c, wiki)&lt;br /&gt;
    local bcs, t&lt;br /&gt;
    if c &amp;lt; 1 then&lt;br /&gt;
        c = 1 - c&lt;br /&gt;
        bcs = ' до н. э.'&lt;br /&gt;
        --t = toroman(c)..' до н. э.'&lt;br /&gt;
        t = '-'..toroman(c)&lt;br /&gt;
    else&lt;br /&gt;
        bcs = ''&lt;br /&gt;
        t = toroman(c)&lt;br /&gt;
    end&lt;br /&gt;
    local s&lt;br /&gt;
    if wiki then&lt;br /&gt;
        -- в/во, о/об&lt;br /&gt;
        local tt = templ&lt;br /&gt;
        if c == 2 then&lt;br /&gt;
            tt = gsub(tt, 'в %%s веке', 'во %%s веке')&lt;br /&gt;
        end&lt;br /&gt;
        if c == 11 then&lt;br /&gt;
            tt = gsub(tt, 'о %%s веке', 'об %%s веке')&lt;br /&gt;
        end&lt;br /&gt;
        s = string.format(tt, toroman(c), bcs)&lt;br /&gt;
        s = string.format('[[:К:%s|%s]]', s, t)&lt;br /&gt;
    else&lt;br /&gt;
        s = t&lt;br /&gt;
    end&lt;br /&gt;
    return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function navbox()&lt;br /&gt;
    local c&lt;br /&gt;
    c = cent&lt;br /&gt;
    if BC == 1 then&lt;br /&gt;
        -- пропускаем 0&lt;br /&gt;
        -- I до н.э. c == 0, II до н.э. c == -1 и т.д.&lt;br /&gt;
        c = 1 - cent&lt;br /&gt;
    end&lt;br /&gt;
    local wt = mw.html.create('table'):addClass('standard'):attr('align', 'center')&lt;br /&gt;
    local row = wt:tag('tr')&lt;br /&gt;
    local cstart&lt;br /&gt;
    if cent_min &amp;lt; 1 then&lt;br /&gt;
        cstart = math.max(cent_min+1, c - range)&lt;br /&gt;
    else&lt;br /&gt;
        cstart = math.max(cent_min, c - range)&lt;br /&gt;
    end&lt;br /&gt;
    local cend = math.min(cent_max, c + range) -- FIXME: до н.э.&lt;br /&gt;
    for i = cstart, cend do&lt;br /&gt;
        if i == 1 and i ~= cstart then row:tag('th'):wikitext('') end -- разд. до н.э./н.э.&lt;br /&gt;
        if i == c then&lt;br /&gt;
            row:tag('th'):wikitext(format(i, false))&lt;br /&gt;
        else&lt;br /&gt;
            row:tag('td'):wikitext(format(i, true))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(wt)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function do_expand(s)&lt;br /&gt;
-- &amp;lt;век&amp;gt; - век римскими цифрами без слова &amp;quot;век&amp;quot; (XVII)&lt;br /&gt;
-- &amp;lt;тысячелетие&amp;gt; - тысячелетие числом (без добавления -е/-м/-го)&lt;br /&gt;
-- &amp;lt;ключ&amp;gt; - ключ сортировки, н.э. - номер века числом,&lt;br /&gt;
-- до н.э. - отрицательное число начиная с -99 (-99 == I век до н.э. -98 == II век до н.э. и т.д.)&lt;br /&gt;
    local mil = math.floor((cent-1)/10)+1 -- тысячелетие&lt;br /&gt;
    -- в/во, о/об ?&lt;br /&gt;
    if mil == 2 then&lt;br /&gt;
        s = gsub(s, ' в &amp;lt;тысячелетие&amp;gt;', ' во &amp;lt;тысячелетие&amp;gt;')&lt;br /&gt;
    end&lt;br /&gt;
    if BC == 1 then&lt;br /&gt;
        s = gsub(s, '&amp;lt;век&amp;gt; (век[еа]?)', roman_cent .. ' %1 до н. э.')&lt;br /&gt;
        s = gsub(s, '&amp;lt;тысячелетие&amp;gt;(-[емг][о]? тысячелети[еия])', mil..'%1 до н. э.') -- 2-е/2-м/2-го&lt;br /&gt;
        s = gsub(s, '&amp;lt;ключ&amp;gt;', cent-100)&lt;br /&gt;
    else&lt;br /&gt;
        s = gsub(s, '&amp;lt;век&amp;gt;', roman_cent)&lt;br /&gt;
        s = gsub(s, '&amp;lt;тысячелетие&amp;gt;', mil)&lt;br /&gt;
        s = gsub(s, '&amp;lt;ключ&amp;gt;', cent)&lt;br /&gt;
    end&lt;br /&gt;
    return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function cats(args)&lt;br /&gt;
    local c, t&lt;br /&gt;
    local ret = ''&lt;br /&gt;
    for _, c in sparseIpairs(args) do&lt;br /&gt;
        t = mw.text.split(c, '!', true)&lt;br /&gt;
        -- диапазон веков для кат.&lt;br /&gt;
        local cmin = -99&lt;br /&gt;
        if t[3] and t[3] ~= '' then&lt;br /&gt;
            cmin = tonumber(t[3])&lt;br /&gt;
        end&lt;br /&gt;
        local cmax = 99&lt;br /&gt;
        if t[4] and t[4] ~= '' then&lt;br /&gt;
            cmax = tonumber(t[4])&lt;br /&gt;
        end&lt;br /&gt;
        local cc = cent&lt;br /&gt;
        if BC == 1 then cc = -cent end&lt;br /&gt;
        if cc &amp;gt;= cmin and cc &amp;lt;= cmax then&lt;br /&gt;
            -- в/во, о/об&lt;br /&gt;
            local tt = t[1]&lt;br /&gt;
            if cent == 2 then&lt;br /&gt;
                tt = gsub(tt, 'в &amp;lt;век&amp;gt; веке', 'во &amp;lt;век&amp;gt; веке')&lt;br /&gt;
            end&lt;br /&gt;
            if cent == 11 then&lt;br /&gt;
                tt = gsub(tt, 'о &amp;lt;век&amp;gt; веке', 'об &amp;lt;век&amp;gt; веке')&lt;br /&gt;
            end&lt;br /&gt;
            if t[2] and t[2] ~= '' then&lt;br /&gt;
                ret = ret .. string.format('[[К:%s|%s]]', tt, t[2])&lt;br /&gt;
            else&lt;br /&gt;
                ret = ret .. string.format('[[К:%s]]', tt)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return do_expand(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    title = args['title'] or title&lt;br /&gt;
    -- разбор аргументов&lt;br /&gt;
    range = tonumber(args['range'] or 5)&lt;br /&gt;
    cent_min = tonumber(args['min'] or -39)&lt;br /&gt;
    cent_max = tonumber(args['max'] or 21)&lt;br /&gt;
    -- нахождение текушего века&lt;br /&gt;
    get_cent(title)&lt;br /&gt;
    -- создание шаблона-строки&lt;br /&gt;
    get_templ(title)&lt;br /&gt;
    -- создание навбокса и категорий&lt;br /&gt;
    return navbox(title) .. cats(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.expand(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    title = args['title'] or title&lt;br /&gt;
    get_cent(title)&lt;br /&gt;
    BC = mw.ustring.find(title, '[IVX]+ век[еа]? до н%. э%.')&lt;br /&gt;
    if BC then&lt;br /&gt;
        BC = 1&lt;br /&gt;
    else&lt;br /&gt;
        BC = 0&lt;br /&gt;
    end&lt;br /&gt;
    -- в/во, о/об&lt;br /&gt;
    local tt = args[1]&lt;br /&gt;
    if cent == 2 then&lt;br /&gt;
        tt = gsub(args[1], 'в &amp;lt;век&amp;gt; веке', 'во &amp;lt;век&amp;gt; веке')&lt;br /&gt;
    end&lt;br /&gt;
    if cent == 11 then&lt;br /&gt;
        tt = gsub(tt, 'о &amp;lt;век&amp;gt; веке', 'об &amp;lt;век&amp;gt; веке')&lt;br /&gt;
    end&lt;br /&gt;
    return do_expand(tt)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.century_from_title(frame)&lt;br /&gt;
    local args = getArgs(frame)&lt;br /&gt;
    title = args['title'] or title&lt;br /&gt;
    BC = mw.ustring.find(title, '[IVX]+ век[еа]? до н%. э%.')&lt;br /&gt;
    get_cent(title)&lt;br /&gt;
    if BC then&lt;br /&gt;
        return -cent&lt;br /&gt;
    end&lt;br /&gt;
    return cent&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Dzmuh</name></author>
	</entry>
</feed>