Source code for officiumdivinum.parsers.K2obj
"""Parse Divinumofficium's calendar tabulae into feast objects."""
from pathlib import Path
from ..DSL import months
from ..objects import Celebration
from ..objects import Commemoration
from ..objects import Date
from ..objects import Feast
from ..objects import Rank
from ..objects import rank_table_by_calendar
[docs]def parse_line(line: str, calendar: str) -> Feast:
"""
Parse a line of a divinumofficium calendar file.
Parameters
----------
line: str : The line to parse.
calendar: str : The Calendar to use (for feast names, etc.)
Returns
-------
A Feast object representing the day.
"""
line = line.strip()
if line.startswith("*"):
return None
rank_table = rank_table_by_calendar[calendar]
parts = line.split("=")
date, duplicate_date, name, rank = parts[:4]
try:
rank = Rank(rank_table[int(rank)])
except ValueError:
rank = Rank(rank_table[int(float(rank) + 0.5)], defeatable=True)
commemorations = None
if len(parts) > 5 and parts[4]:
commemorations = []
commemoration_rank = None
for part in parts[4:]:
try:
commemoration_rank = float(part)
try:
commemoration_rank = Rank(rank_table[int(part)])
except ValueError:
commemoration_rank = Rank(
rank_table[int(float(part) + 0.5)],
defeatable=True,
)
break
except ValueError:
commemorations.append(part)
commemorations = [Commemoration(x, commemoration_rank) for x in commemorations]
qualifiers = None
if date != duplicate_date:
qualifiers = duplicate_date[:-1]
month, day = (int(x) for x in date.split("-"))
if day == 0:
Type = "de Tempore"
datestr = "Sun between 2 Jan 5 Jan OR 2 Jan"
else:
Type = "Sanctorum"
datestr = f"{day} {months[month - 1]}"
return Feast(
rank,
Date(datestr),
calendar,
Type,
celebration=Celebration(name),
commemorations=commemorations,
qualifiers=qualifiers,
)
[docs]def parse_file(fn: Path, calendar: str):
"""
Parse a divinumofficium calendar file.
Parameters
----------
fn: Path : The file to parse.
calendar: str : The calendar to use to generate feast names, etc.
Returns
-------
A list of Feast objects.
"""
year = []
with fn.open() as f:
for line in f.readlines():
parsed = parse_line(line, calendar)
if parsed:
year.append(parsed)
return year
if __name__ == "__main__":
print(
"Do not run this parser directly."
"A helper script is ../run_parser.py, or use it in a python shell"
)