Spaces:
Sleeping
Sleeping
| """reading_order_simple enricher — infers reading order from spatial position. | |
| If a page has no reading order, orders text regions top-to-bottom, | |
| left-to-right using the center of each region's bbox. | |
| """ | |
| from __future__ import annotations | |
| from typing import TYPE_CHECKING | |
| from src.app.enrichers import BaseEnricher | |
| from src.app.geometry.bbox import center | |
| if TYPE_CHECKING: | |
| from src.app.domain.models import CanonicalDocument | |
| from src.app.policies.document_policy import DocumentPolicy | |
| class ReadingOrderSimpleEnricher(BaseEnricher): | |
| def name(self) -> str: | |
| return "reading_order_simple" | |
| def enrich( | |
| self, doc: CanonicalDocument, policy: DocumentPolicy | |
| ) -> CanonicalDocument: | |
| if not policy.allow_reading_order_inference: | |
| return doc | |
| new_pages = [] | |
| changed = False | |
| for page in doc.pages: | |
| if page.reading_order or not page.text_regions: | |
| new_pages.append(page) | |
| continue | |
| # Sort regions by center-y then center-x (top-to-bottom, left-to-right) | |
| sorted_regions = sorted( | |
| page.text_regions, | |
| key=lambda r: (center(r.geometry.bbox)[1], center(r.geometry.bbox)[0]), | |
| ) | |
| new_order = [r.id for r in sorted_regions] | |
| new_pages.append(page.model_copy(update={"reading_order": new_order})) | |
| changed = True | |
| if changed: | |
| return doc.model_copy(update={"pages": new_pages}) | |
| return doc | |