-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathicser.py
executable file
·95 lines (75 loc) · 3.32 KB
/
icser.py
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
from lxml import etree
from dateutil import parser
from icalendar import Calendar, Event
import time
xmlParser = etree.XMLParser(ns_clean=True, remove_blank_text=True)
tree = etree.parse('agenda.xhtml', xmlParser)
#print etree.tostring(tree.getroot())
parent = '//table/tbody/tr[last()]/td/'
r = tree.xpath(parent + 'span | '+ parent + 'div')
cal = Calendar()
cal.add('prodid', '-//My calendar product//mxm.dk//')
cal.add('version', '2.0')
mod = 0
for el in r:
if el.text != None:
try:
dateTmp = parser.parse(el.text)
#reset event specific variables
mod = 0
dayLong = False
event = Event()
#prevent that Lines like "Sabato" are parsed correctly
if len(el.text) < 15:
continue
date = dateTmp
dateText = el.text
print "DATA:"
print date
except:
if mod == 0: ## hour
hourText = el.text.replace('.', ':')
count = hourText.count(':')
#if exceptions have been raised, maybe it's not an hour (DAYLONG event)
try:
# there should always be at least one hour
pos = hourText.find(':')
textStartHour = hourText[pos-2:pos+3]
timeStart = parser.parse(textStartHour)
dateStart = date.replace(hour = timeStart.hour, minute = timeStart.minute)
#if there are more hours, then they are start and end time
if count == 2:
#find next hour
pos = hourText.find(':', pos + 1)
textEndHour = hourText[pos-2:pos+3]
timeEnd = parser.parse(textEndHour)
else:
from dateutil.relativedelta import relativedelta
#if no end hour specified, then set it to start + 2h
timeEnd = timeStart + relativedelta(hours = 2)
dateEnd = date.replace(hour = timeEnd.hour, minute = timeEnd.minute)
event.add('dtstart', dateStart)
event.add('dtstamp', dateStart) #maybe it's better to use NOW()
event.add('dtend', dateEnd)
event.add('location', el.tail)
#TODO: use UID to avoid duplication importing in the calendar manager
#print 'UID'
#event['uid'] = time.mktime(dateStart.timetuple())
#print event['uid']
except:
mod += 1
dayLong = True
if mod == 1:
event.add('summary', el.text)
print "Titolo: %s" %el.text
if mod == 2:
event.add('description', el.text)
event.add('priority', 5)
if dayLong:
event.add('dtstart;value=date', "%d%d%d" % (date.year, date.month, date.day))
cal.add_component(event)
print "Descrizione: %s" %el.text
mod += 1
f = open('abitarelaterra.ics', 'wb')
f.write(cal.as_string())
f.close()