diff --git a/calendar/teachingdates/calendars/basecalendar.py b/calendar/teachingdates/calendars/basecalendar.py index bf84bae..9c121d0 100644 --- a/calendar/teachingdates/calendars/basecalendar.py +++ b/calendar/teachingdates/calendars/basecalendar.py @@ -2,6 +2,7 @@ import datetime import jinja2 +from num2words import num2words from teachingdates import PROG @@ -14,6 +15,34 @@ "xml": "xml", } +filters = { + "isteaching": lambda w: isinstance(w, TeachingWeek), + "isbreak": lambda w: isinstance(w, BreakWeek), + "eow": lambda d, o: d + datetime.timedelta(days=o), + "pad": lambda s, n: str(s).rjust(n), + "num2words": lambda s: num2words(str(s)).title().replace("-", "") +} + +env = jinja2.Environment( + loader=jinja2.PackageLoader("teachingdates", "templates"), + autoescape=jinja2.select_autoescape(["html", "xml"])) + +latex_env = jinja2.Environment( + block_start_string="\\BLOCK{", + block_end_string="}", + variable_start_string="\\VAR{", + variable_end_string="}", + comment_start_string="\\#{", + comment_end_string="}", + line_statement_prefix="%%", + line_comment_prefix="%#", + trim_blocks=True, + autoescape=False, + loader=jinja2.PackageLoader("teachingdates", "templates")) + +env.filters.update(filters) +latex_env.filters.update(filters) + class TeachingCalendar(): """This class generates teaching-related dates for a specific paper @@ -26,31 +55,26 @@ skipped_lectures = [] mondays = [] period = None + period_name = None paper = None end_of_week = None year = datetime.date.today().year - env = jinja2.Environment( - loader=jinja2.PackageLoader("teachingdates", "templates"), - autoescape=jinja2.select_autoescape(["html", "xml"])) def __init__(self, year, period, paper, + period_name="ISO", end_of_week=None, period_config=None, paper_config=None): self.year = year self.period = period + self.period_name = period_name.replace(" ", "") self.paper = paper self.end_of_week = end_of_week - self.env.filters.update({ - "isteaching": lambda w: isinstance(w, TeachingWeek), - "isbreak": lambda w: isinstance(w, BreakWeek), - "eow": lambda d: d + datetime.timedelta(days=self.end_of_week), - "pad": lambda s, n: str(s).rjust(n) - }) + # self.env.filters.update(filters) # This is likely to end up with one week too many at the end, # but that doesn't matter as there will never be any teaching @@ -70,9 +94,13 @@ @classmethod def from_configuration(cls, config): if config: - return cls(config.year, config.period, config.paper, - config.end_of_week, config.get_period_config(), - config.get_paper_config()) + return cls(config.year, + config.period, + config.paper, + period_name=config.period_name, + end_of_week=config.end_of_week, + period_config=config.get_period_config(), + paper_config=config.get_paper_config()) else: return None @@ -148,8 +176,12 @@ def render(self, style, fmt): suffix = suffix_map[fmt] - template = self.env.get_template("{style}.{suffix}.j2".format( - style=style, suffix=suffix)) + if fmt == "latex": + template = latex_env.get_template("{style}.{suffix}.j2".format( + style=style, suffix=suffix)) + else: + template = env.get_template("{style}.{suffix}.j2".format( + style=style, suffix=suffix)) if style in ["calendar", "iso"]: data = self.calendar() elif style == "lecture": @@ -157,6 +189,8 @@ else: pass return template.render(period=self.period, + period_name=self.period_name, year=self.year, paper=self.paper, + end_of_week=self.end_of_week, data=data)