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\d+.\d+.\d+)\s\((?P.+)-(?P.+)\)" ) 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()