/usr/share/pyshared/vobject/hcalendar.py is in python-vobject 0.8.1c-4ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | """
hCalendar: A microformat for serializing iCalendar data
(http://microformats.org/wiki/hcalendar)
Here is a sample event in an iCalendar:
BEGIN:VCALENDAR
PRODID:-//XYZproduct//EN
VERSION:2.0
BEGIN:VEVENT
URL:http://www.web2con.com/
DTSTART:20051005
DTEND:20051008
SUMMARY:Web 2.0 Conference
LOCATION:Argent Hotel\, San Francisco\, CA
END:VEVENT
END:VCALENDAR
and an equivalent event in hCalendar format with various elements optimized appropriately.
<span class="vevent">
<a class="url" href="http://www.web2con.com/">
<span class="summary">Web 2.0 Conference</span>:
<abbr class="dtstart" title="2005-10-05">October 5</abbr>-
<abbr class="dtend" title="2005-10-08">7</abbr>,
at the <span class="location">Argent Hotel, San Francisco, CA</span>
</a>
</span>
"""
from base import foldOneLine, CRLF, registerBehavior
from icalendar import VCalendar2_0
from datetime import date, datetime, timedelta
import StringIO
class HCalendar(VCalendar2_0):
name = 'HCALENDAR'
@classmethod
def serialize(cls, obj, buf=None, lineLength=None, validate=True):
"""
Serialize iCalendar to HTML using the hCalendar microformat (http://microformats.org/wiki/hcalendar)
"""
outbuf = buf or StringIO.StringIO()
level = 0 # holds current indentation level
tabwidth = 3
def indent():
return ' ' * level * tabwidth
def out(s):
outbuf.write(indent())
outbuf.write(s)
# not serializing optional vcalendar wrapper
vevents = obj.vevent_list
for event in vevents:
out('<span class="vevent">' + CRLF)
level += 1
# URL
url = event.getChildValue("url")
if url:
out('<a class="url" href="' + url + '">' + CRLF)
level += 1
# SUMMARY
summary = event.getChildValue("summary")
if summary:
out('<span class="summary">' + summary + '</span>:' + CRLF)
# DTSTART
dtstart = event.getChildValue("dtstart")
if dtstart:
if type(dtstart) == date:
timeformat = "%A, %B %e"
machine = "%Y%m%d"
elif type(dtstart) == datetime:
timeformat = "%A, %B %e, %H:%M"
machine = "%Y%m%dT%H%M%S%z"
#TODO: Handle non-datetime formats?
#TODO: Spec says we should handle when dtstart isn't included
out('<abbr class="dtstart", title="%s">%s</abbr>\r\n' %
(dtstart.strftime(machine), dtstart.strftime(timeformat)))
# DTEND
dtend = event.getChildValue("dtend")
if not dtend:
duration = event.getChildValue("duration")
if duration:
dtend = duration + dtstart
# TODO: If lacking dtend & duration?
if dtend:
human = dtend
# TODO: Human readable part could be smarter, excluding repeated data
if type(dtend) == date:
human = dtend - timedelta(days=1)
out('- <abbr class="dtend", title="%s">%s</abbr>\r\n' %
(dtend.strftime(machine), human.strftime(timeformat)))
# LOCATION
location = event.getChildValue("location")
if location:
out('at <span class="location">' + location + '</span>' + CRLF)
description = event.getChildValue("description")
if description:
out('<div class="description">' + description + '</div>' + CRLF)
if url:
level -= 1
out('</a>' + CRLF)
level -= 1
out('</span>' + CRLF) # close vevent
return buf or outbuf.getvalue()
registerBehavior(HCalendar)
|