/usr/lib/python3/dist-packages/vobject/hcalendar.py is in python3-vobject 0.9.3-3.
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 126 127 128 129 130 | """
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>
"""
import six
from datetime import date, datetime, timedelta
from .base import CRLF, registerBehavior
from .icalendar import VCalendar2_0
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 six.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="{0!s}">{1!s}</abbr>\r\n'
.format(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="{0!s}">{1!s}</abbr>\r\n'
.format(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)
|