try:
# check out the "N. poł X w." syntax
if isinstance(text, str): text = text.decode("utf-8")
- m = re.match(u"(?:([12]) *poł[.]? )?([MCDXVI]+) *w[.]?", text)
++
+ century_format = u"(?:([12]) *poł[.]? +)?([MCDXVI]+) *w[.,]*(?: *l[.]? *([0-9]+))?"
+ vague_format = u"(?:po *|ok. *)?([0-9]{4})(-[0-9]{2}-[0-9]{2})?"
+
+ m = re.match(century_format, text)
+ m2 = re.match(vague_format, text)
if m:
-
- half = m.groups()[0]
- if half is not None:
+ half = m.group(1)
+ decade = m.group(3)
+ century = roman_to_int(str(m.group(2)))
+ if half is not None:
+ if decade is not None:
+ raise ValueError("Bad date format. Cannot specify both half and decade of century")
half = int(half)
- else:
- half = 1
- century = roman_to_int(str(m.groups()[1]))
- t = ((century*100 + (half-1)*50), 1, 1)
+ t = ((century*100 + (half-1)*50), 1, 1)
+ else:
+ decade = int(decade or 0)
+ t = ((century*100 + decade), 1, 1)
+ elif m2:
+ year = m2.group(1)
+ mon_day = m2.group(2)
+ if mon_day:
+ t = time.strptime(year + mon_day, "%Y-%m-%d")
+ else:
+ t = time.strptime(year, '%Y')
else:
- text = re.sub(r"(po|ok[.]?) *", "", text)
- try:
- t = time.strptime(text, '%Y-%m-%d')
- except ValueError:
- t = time.strptime(re.split(r'[-/]', text)[0], '%Y')
- return date(t[0], t[1], t[2])
+ raise ValueError
+
+ return DatePlus(t[0], t[1], t[2])
except ValueError, e:
raise ValueError("Unrecognized date format. Try YYYY-MM-DD or YYYY.")