календарь python.HTMLCalendar - PullRequest
6 голосов
/ 09 июля 2009

Я думаю, что я хочу использовать встроенные в календарь модули питонов для создания HTML-календаря с данными. Я говорю, что думаю, потому что я, вероятно, подумаю о лучшем пути, но сейчас это немного личное. Я не знаю, было ли это предназначено для такого использования, но кажется, что это немного бессмысленно, если вы не можете хотя бы превратить дни в <a hrefs>.

Это устанавливает календарь на этот месяц с воскресеньем в качестве первого дня.

import calendar
myCal = calendar.HTMLCalendar(calendar.SUNDAY)
print myCal.formatmonth(2009, 7)

печатает

<table border="0" cellpadding="0" cellspacing="0" class="month">\n<tr>
<th colspan="7" class="month">July 2009</th></tr>\n<tr><th class="sun">Sun</th>
<th class="mon">Mon</th><th class="tue">Tue</th><th class="wed">Wed</th>
<th class="thu">Thu</th><th class="fri">Fri</th><th class="sat">Sat</th></tr>\n
<tr><td class="noday">&nbsp;</td><td class="noday">&nbsp;</td>
<td class="noday">&nbsp;</td><td class="wed">1</td><td class="thu">2</td><td class="fri">3</td>
<td class="sat">4</td></tr>\n<tr><td class="sun">5</td><td class="mon">6</td><td class="tue">7</td>
<td class="wed">8</td><td class="thu">9</td><td class="fri">10</td>
<td class="sat">11</td></tr>\n<tr><td class="sun">12</td><td class="mon">13</td>
<td class="tue">14</td><td class="wed">15</td><td class="thu">16</td><td class="fri">17</td>
<td class="sat">18</td></tr>\n<tr><td class="sun">19</td><td class="mon">20</td>
<td class="tue">21</td><td class="wed">22</td><td class="thu">23</td><td class="fri">24</td>
<td class="sat">25</td></tr>\n<tr><td class="sun">26</td><td class="mon">27</td>
<td class="tue">28</td><td class="wed">29</td><td class="thu">30</td><td class="fri">31</td>
<td class="noday">&nbsp;</td></tr>\n</table>\n

Я хотел бы вставить некоторые данные в объект HTMLCalendar, прежде чем он отобразит строку html. Я просто не могу понять, как.

Например

<td class="tue">28<br />[my data]</td>

Ответы [ 5 ]

41 голосов
/ 22 сентября 2009

Создать новый класс, наследующий от HTMLCalendar. Переопределить метод formatday.

Тот, кто делает комментарии типа «эта библиотека бесполезна», явно не понимает Python.

class EmployeeScheduleCalendar(HTMLCalendar):
    def formatday(self, day, weekday):
        """
          Return a day as a table cell.
        """
        if day == 0:
            return '<td class="noday">&nbsp;</td>' # day outside month
        else:
            return '<td class="%s"><a href="%s">%d</a></td>' % (self.cssclasses[weekday], weekday, day)
16 голосов
/ 09 июля 2009

Модуль календаря обычно был бесполезен, но в 2.5 он представил объект Calendar. Это не будет отображать календарь HTML для вас, но у него есть множество методов, которые помогут вам отобразить календарь.

Например, monthdatescalendar (year, month) предоставит вам список всех недель в данном месяце, где каждая неделя по очереди является списком из семи дней. Таким образом, monthdatescalendar (2009,7) начинается с [[datetime.date(2009, 6, 29), datetime.date(2009, 6, 30), и заканчивается datetime.date(2009, 8, 1), datetime.date(2009, 8, 2)]]

При этом это становится тривиальным упражнением для генерации желаемого HTML.

3 голосов
/ 06 апреля 2011

Вы можете создать подкласс HTMLCalendar и переопределить его методы, чтобы делать что угодно, например: http://journal.uggedal.com/creating-a-flexible-monthly-calendar-in-django/

Если вы обратитесь к документации по HTMLCalendar (http://svn.python.org/view/python/branches/release27-maint/Lib/calendar.py?view=markup),), вы увидите, что метод formatday () очень прост. Просто переопределите его, как в приведенном выше примере, чтобы делать все, что вы хотите. Итак, HTMLCalendar не так уж и бессмысленно.;)

0 голосов
/ 09 июля 2009

Вы можете загрузить html, который кажется правильным XMl, в дерево XML, изменить его и снова вывести. например это добавляет <br/> cool к каждому узлу Tue td.

import calendar
import xml.etree.ElementTree as etree

myCal = calendar.HTMLCalendar(calendar.SUNDAY)
htmlStr = myCal.formatmonth(2009, 7)
htmlStr = htmlStr.replace("&nbsp;"," ")

root = etree.fromstring(htmlStr)
for elem in root.findall("*//td"):
    if elem.get("class") != "tue":
        continue
    elem.text += "!"

    br = etree.SubElement(elem, "br")
    br.tail = "cool!"

print etree.tostring(root)

Я пока не знаю, зачем вам нужно создавать HTML-календарь, но есть более эффективные способы сделать это в зависимости от потребностей и структуры, которую вы используете.

0 голосов
/ 09 июля 2009

Трудно сказать, не зная точно, чего вы пытаетесь достичь, но вот одна из идей.

Вместо того, чтобы печатать myCal.formatmonth (2009, 7), почему бы вам не присвоить его строке? Тогда вы можете манипулировать этим, возможно, с помощью регулярного выражения.

Вот очень плохой пример:

import calendar
import re

myCal = calendar.HTMLCalendar(calendar.SUNDAY)
myStr = myCal.formatmonth(2009, 7)

re.sub('28', '28<br/>[My Data]', myStr)

print myStr

Он делает то, что ты хочешь, но довольно уродливо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...