вторник, 15 июля 2008 г.

Календарь со ссылками на Python

Для моего текущего проекта потребовалось сделать небольшой HTML-календарик со ссылками.

В Питоне функции для этого нет. То есть, конечно, есть функция formatmonth из стандартного модуля calendar, но она делает календарик без ссылок. А мне надо именно со ссылками.

В интернете есть много разных вариантов календариков, разной степени навороченности. Но все они какие-то уж слишком навороченные.

Для меня самым лучшим вариантом оказалось написание своей функции.
Она форматирует календарик в виде HTML-таблицы и подсвечивает текущий день. Точнее, она добавляет к ячейке с текущей датой специальный CSS-класс, а "подсвечивать" придётся вам, в CSS вашего сайта.

Функция самостоятельно импортирует всё необходимое (функцию formatmonth из модуля calendar).

Нужно лишь вызвать её, например вот так:
format_month_in_html(2008, 7, 15)



А, чуть не забыл, вот сама функция:
# -*- coding: utf-8 -*-

def format_month_in_html(year, month, day):
'''

Форматирует HTML-календарь со ссылками.

Принимает в качестве аргументов год (year), месяц (month) и день (day).

'''

# Названия месяцев
_month_names = ['',
u'Январь',
u'Февраль',
u'Март',
u'Апрель',
u'Май',
u'Июнь',
u'Июль',
u'Август',
u'Сентябрь',
u'Октябрь',
u'Ноябрь',
u'Декабрь'
]

# Названия дней недели и их CSS-классы
_days_names = [# ('День_недели', 'CSS-класс'),
(u'Пн', 'mon'),
(u'Вт', 'tue'),
(u'Ср', 'wed'),
(u'Чт', 'thu'),
(u'Пт', 'fri'),
(u'Сб', 'sat'),
(u'Вс', 'sun')
]

year = int("%04i" % year)
month = int("%02i" % month)
smonth = int("%01i" % month)
day = int("%02i" % day)
sday = int("%01i" % day)

from calendar import monthcalendar

matrix = monthcalendar(year, month)

pre_str = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"month\">"

pre_str += "<tr><th colspan=\"7\" class=\"month\">" + _month_names[smonth] + "</th></tr>"

pre_str += "<tr>"
for day_name, class_name in _days_names:
pre_str += "<th class=\"%s\">%s</th>" % (class_name, day_name)

pre_str += "</tr>"

for list in matrix:
pre_str += "<tr>"

for nday in list:
if nday == 0:
pre_str += "<td class=\"cld noday\"> </td>"
elif nday == sday:
pre_str += "<td class=\"cld ac-\">" + str(nday) + "</td>"
else:
pre_str += "<td class=\"cld\"><a href=\"/events/" + str("%02i" % month) + "/" + str("%02i" % nday) + "/" + "\">" + str(nday) + "</a></td>"

pre_str += "</tr>"

pre_str += "</table>"

return pre_str