lukkari/lukkari/__init__.py

83 lines
2.5 KiB
Python

import datetime
import sys
import os.path
from . import dsl
from . import daterange
from . import generate_timetable
from . import parse_coursefile
def parse_date(text):
split = text.split('-')
assert(len(split) == 3)
return tuple(map(int, split))
def main():
if len(sys.argv) == 2:
year, week, day = datetime.date.today().isocalendar()
if day >= 6: # on weekend, show next week
year, week, day = (datetime.date.today() + datetime.timedelta(2)).isocalendar()
dates = daterange.week(year, week)
filename = sys.argv[1]
elif len(sys.argv) == 3:
date = parse_date(sys.argv[1])
dates = daterange.between(date, date)
filename = sys.argv[2]
elif len(sys.argv) == 4:
start = parse_date(sys.argv[1])
end = parse_date(sys.argv[2])
dates = daterange.between(start, end)
filename = sys.argv[3]
else:
print('%s [start [end]] file' % (os.path.basename(sys.argv[0])))
print('start and end are in yyyy-mm-dd format')
sys.exit(1)
with open(filename, 'r') as f:
courses_parsed = parse_coursefile.parse(f.read())
courses = []
for name, time_range, info, parsed_filter in courses_parsed:
date_filter = dsl.compile(parsed_filter)
courses.append((name, time_range, info, date_filter))
timetable = generate_timetable.generate_timetable(dates, courses)
timetable_by_date = []
current_date = None
current_date_entries = []
for date, time_range, name, info in timetable:
if current_date is None:
current_date = date
if date == current_date:
current_date_entries.append((time_range, name, info))
else:
timetable_by_date.append((current_date, current_date_entries))
current_date = date
current_date_entries = []
current_date_entries.append((time_range, name, info))
if current_date is not None and current_date_entries != []:
timetable_by_date.append((current_date, current_date_entries))
print(dates)
print()
for date, entries in timetable_by_date:
entries.sort(key = lambda x: x[0].range()[0])
previous_time_range = None
print(date)
for time_range, name, info in entries:
print('\t%s %s: %s' % (time_range, name, info))
if previous_time_range is not None:
if time_range.overlaps(previous_time_range):
print('\t\tOverlap')
# If the current's ending time is before the previous's, don't change previous_time_range in case it overlaps with several
# If current's ending time after, it's safe to change
if time_range.range()[1] >= previous_time_range.range()[1]:
previous_time_range = time_range
else:
previous_time_range = time_range
else:
previous_time_range = time_range