Календарь авторов: месяцы и текущая дата в днях рождения и днях памяти
 
Календарь авторов: месяцы и текущая дата в днях рождения и днях памяти
Строка 33: Строка 33:
         local function marker()
         local function marker()
             list:tag('li'):addClass('bw-dates-today'):attr('id','today-'..kind)
             list:tag('li'):addClass('bw-dates-today'):attr('id','today-'..kind)
                 :tag('strong'):text('Сегодня — ' .. todayLabel)
                 :tag('strong'):wikitext(mw.text.nowiki('Сегодня — ' .. todayLabel))
             marked = true
             marked = true
         end
         end
Строка 41: Строка 41:
                 local item = list:tag('li'):addClass('bw-dates-row')
                 local item = list:tag('li'):addClass('bw-dates-row')
                 if row[key] == today then item:addClass('bw-dates-on-today') end
                 if row[key] == today then item:addClass('bw-dates-on-today') end
                 item:tag('span'):addClass('bw-dates-date'):text((row[dates] or ''):sub(1,5))
                 item:tag('span'):addClass('bw-dates-date'):wikitext(mw.text.nowiki((row[dates] or ''):sub(1,5)))
                 local body = item:tag('span'):addClass('bw-dates-person')
                 local body = item:tag('span'):addClass('bw-dates-person')
                 body:wikitext(personLink(row.page))
                 body:wikitext(personLink(row.page))
Строка 51: Строка 51:
                     lifespan = 'род. ' .. born
                     lifespan = 'род. ' .. born
                 end
                 end
                 body:tag('span'):addClass('bw-dates-lifespan'):text(' (' .. lifespan .. ')')
                 body:tag('span'):addClass('bw-dates-lifespan'):wikitext(mw.text.nowiki(' (' .. lifespan .. ')'))
                 count = count + 1
                 count = count + 1
             end
             end
         end
         end
         if month == currentMonth and not marked then marker() end
         if month == currentMonth and not marked then marker() end
         if count == 0 then list:tag('li'):addClass('bw-dates-empty'):text('Нет указанных дат.') end
         if count == 0 then list:tag('li'):addClass('bw-dates-empty'):wikitext('Нет указанных дат.') end
         out[#out+1] = tostring(list) .. '\n'
         out[#out+1] = tostring(list) .. '\n'
     end
     end

Версия от 09:51, 15 октября 2026

Для документации этого модуля может быть создана страница Модуль:Даты авторов/doc

-- Calendar for [[Дни рождения все]]. One read-only Cargo query, no data writes.
local p = {}
local months = {'Январь','Февраль','Март','Апрель','Май','Июнь',
    'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'}

local function personLink(name)
    local title = mw.title.new(name)
    if not title then return mw.text.nowiki(name) end
    return tostring(mw.html.create('a'):attr('href', title:localUrl()):wikitext(mw.text.nowiki(name)))
end

local function calendar(rows, kind, heading, today, todayLabel)
    local key = kind == 'birth' and 'birthkey' or 'deathkey'
    local dates = kind == 'birth' and 'birthdate' or 'deathdate'
    local events = {}
    for _, row in ipairs(rows) do
        local value = row[key] or ''
        if value:match('^%d%d%-%d%d$') and value >= '01-01' and value <= '12-31' then
            events[#events + 1] = row
        end
    end
    table.sort(events, function(a,b)
        if a[key] == b[key] then return a.page < b.page end
        return a[key] < b[key]
    end)
    local out = {'\n== ' .. heading .. ' ==\n'}
    local currentMonth = tonumber(today:sub(1,2))
    for month = 1,12 do
        out[#out+1] = '\n=== ' .. months[month] .. ' ===\n'
        local list = mw.html.create('ul'):addClass('bw-dates-list')
        local marked = false
        local count = 0
        local function marker()
            list:tag('li'):addClass('bw-dates-today'):attr('id','today-'..kind)
                :tag('strong'):wikitext(mw.text.nowiki('Сегодня — ' .. todayLabel))
            marked = true
        end
        for _, row in ipairs(events) do
            if tonumber(row[key]:sub(1,2)) == month then
                if month == currentMonth and not marked and row[key] >= today then marker() end
                local item = list:tag('li'):addClass('bw-dates-row')
                if row[key] == today then item:addClass('bw-dates-on-today') end
                item:tag('span'):addClass('bw-dates-date'):wikitext(mw.text.nowiki((row[dates] or ''):sub(1,5)))
                local body = item:tag('span'):addClass('bw-dates-person')
                body:wikitext(personLink(row.page))
                local born, died = row.birthdate or '', row.deathdate or ''
                local lifespan
                if died ~= '' then
                    lifespan = (born ~= '' and born or '?') .. ' — ' .. died
                else
                    lifespan = 'род. ' .. born
                end
                body:tag('span'):addClass('bw-dates-lifespan'):wikitext(mw.text.nowiki(' (' .. lifespan .. ')'))
                count = count + 1
            end
        end
        if month == currentMonth and not marked then marker() end
        if count == 0 then list:tag('li'):addClass('bw-dates-empty'):wikitext('Нет указанных дат.') end
        out[#out+1] = tostring(list) .. '\n'
    end
    return table.concat(out)
end

function p.main(frame)
    -- #timel follows the wiki timezone (Europe/Moscow) and marks time dependency.
    local today = frame:callParserFunction('#timel', {'m-d'})
    local label = frame:callParserFunction('#timel', {'j xg Y', 'now', 'ru'})
    local rows = mw.ext.cargo.query('Persona',
        "Persona._pageName=page,DATE_FORMAT(Persona.DateBirth, '%m-%d')=birthkey,"
        .. "DATE_FORMAT(Persona.DateBirth, '%d.%m.%Y')=birthdate,"
        .. "DATE_FORMAT(Persona.DateDeath, '%m-%d')=deathkey,"
        .. "DATE_FORMAT(Persona.DateDeath, '%d.%m.%Y')=deathdate",
        {limit=5000, orderBy='Persona._pageName'})
    return '<div class="bw-dates-calendar">\n'
        .. calendar(rows,'birth','Дни рождения',today,label)
        .. calendar(rows,'death','Дни памяти',today,label)
        .. '</div>'
end

return p