f1tness_parser/backend/app/core/parsers/obsidian.py

41 lines
1.4 KiB
Python

import re
from typing import List, Optional
from app.core.dto.training import TrainingDTO
from app.core.parsers.obsidian_mapper import obsidian_unique_exercies_mapping
from app.core.parsers.base import BaseNotesParser, TrainingHeader
class ObsidianNotesParser(BaseNotesParser):
"""Parser for Obsidian Notes format training data."""
HEADER_PATTERN = re.compile(
r"#\s(?P<date>\d+.\d+.\d+)\s\((?P<trainer>.+)-(?P<year_counter>.+)\)"
)
def __init__(self):
super().__init__(
data_file_name="complete_data/obsidian.md",
exercise_mapper=obsidian_unique_exercies_mapping,
)
def filter_training_data(self, training_data: str) -> str:
"""Filter Obsidian-specific training data format."""
cleaned_text = re.sub(r"^\s*?\n", "", training_data, flags=re.MULTILINE)
return cleaned_text
def parse_training_header(self, training_data_line: str) -> Optional[TrainingHeader]:
"""Parse Obsidian Notes training header format."""
match = self.HEADER_PATTERN.search(training_data_line)
if not match:
return None
return TrainingHeader(
date=match.group("date").strip(),
trainer=match.group("trainer").strip(),
year_counter=match.group("year_counter").strip(),
)
def parse_training_data() -> List[TrainingDTO]:
"""Parse Obsidian Notes training data."""
return ObsidianNotesParser().parse_file()