30 lines
1001 B
Python
30 lines
1001 B
Python
"""DOC/DOCX parser: convert to PDF, then reuse PdfParser."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
from rag_cut.models import Block
|
|
from rag_cut.parsers.base import BaseParser
|
|
from rag_cut.parsers.office_to_pdf import convert_to_pdf
|
|
from rag_cut.parsers.pdf_parser import PdfParser
|
|
|
|
|
|
class WordParser(BaseParser):
|
|
"""Parse Word documents by converting to PDF and delegating to PdfParser."""
|
|
|
|
def __init__(self) -> None:
|
|
self._pdf_parser = PdfParser()
|
|
|
|
def parse(self, path: Path, assets_dir: Path) -> list[Block]:
|
|
assets_dir.mkdir(parents=True, exist_ok=True)
|
|
pdf_dir = assets_dir / "_conversion"
|
|
pdf_path = convert_to_pdf(path, pdf_dir)
|
|
|
|
blocks = self._pdf_parser.parse(pdf_path, assets_dir)
|
|
source_fmt = path.suffix.lower().lstrip(".")
|
|
for block in blocks:
|
|
block.meta.setdefault("source_format", source_fmt)
|
|
block.meta.setdefault("converted_from", source_fmt)
|
|
return blocks
|