def _parse_line_keytext(cls, line, text): words = text.split(None, 1) if len(words) == 2: line.key, line.text = str(words[0]), words[1] elif len(words) == 1: line.key, line.text = str(words[0]), '' else: raise ParseException(line, 'expecting <key> [value]')
def _parse_date(self, text, relative_to=None): d = None enforce = True if text.endswith("!"): enforce = False text = text[:-1] if relative_to is not None: dmy = text.split('/', 2) if len(dmy) == 3: if not dmy[0]: dmy[0] = '%u' % relative_to.day if not dmy[1]: dmy[1] = '%u' % relative_to.month if not dmy[2]: dmy[2] = '%04u' % relative_to.year text = '/'.join(dmy) try: d = datetime.datetime.strptime(text, '%d/%m/%Y').date() except ValueError: if self._period: enforce = True try: d = datetime.datetime.strptime(text + '/%04u' % self._period[0].year, '%d/%m/%Y').date() if d < self._period[0]: d = None except ValueError: pass if d is None and self._period[0].year != self._period[1].year: try: d = datetime.datetime.strptime(text + '/%04u' % self._period[1].year, '%d/%m/%Y').date() except ValueError: pass if d is not None: if enforce and self._period and (d < self._period[0] or d > self._period[1]): raise ParseException(text, 'date %s outside period' % text) return d if relative_to is not None and self._regex_relative.match(text): return relative_to + datetime.timedelta(int(text)) raise ParseException(text, 'invalid date %r' % text)
def _parse_date_edate(self, text): texts = text.split('=', 1) date = self._parse_date(texts[0]) edate = self._parse_date(texts[1], relative_to=date) if len(texts) > 1 else None return date, edate