41 lines
1.4 KiB
Python
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()
|