XmLLM / src /app /viewer /overlays.py
Claude
Code quality: fix all ruff warnings, add CI/CD, improve test coverage
bbbfba8 unverified
Raw
History Blame Contribute Delete
3.93 kB
"""Overlay generation — converts canonical nodes to OverlayItems."""
from __future__ import annotations
from typing import TYPE_CHECKING
from src.app.domain.models.status import OverlayLevel
from src.app.domain.models.viewer_projection import InspectionData, OverlayItem
if TYPE_CHECKING:
from src.app.domain.models import (
NonTextRegion,
TextLine,
TextRegion,
Word,
)
def word_to_overlay(word: Word) -> OverlayItem:
"""Convert a Word to an OverlayItem."""
return OverlayItem(
id=word.id,
level=OverlayLevel.WORD,
bbox=word.geometry.bbox,
polygon=word.geometry.polygon,
label=word.text[:30] if word.text else None,
text=word.text,
confidence=word.confidence,
provenance_type=word.provenance.evidence_type,
geometry_status=word.geometry.status,
)
def line_to_overlay(line: TextLine) -> OverlayItem:
"""Convert a TextLine to an OverlayItem."""
return OverlayItem(
id=line.id,
level=OverlayLevel.LINE,
bbox=line.geometry.bbox,
polygon=line.geometry.polygon,
label=line.text[:50] if line.text else None,
text=line.text,
confidence=line.confidence,
provenance_type=line.provenance.evidence_type,
geometry_status=line.geometry.status,
)
def region_to_overlay(region: TextRegion) -> OverlayItem:
"""Convert a TextRegion to an OverlayItem."""
return OverlayItem(
id=region.id,
level=OverlayLevel.BLOCK,
bbox=region.geometry.bbox,
polygon=region.geometry.polygon,
label=region.role.value if region.role else "block",
text=region.text[:100] if region.text else None,
confidence=region.confidence,
provenance_type=region.provenance.evidence_type,
geometry_status=region.geometry.status,
)
def non_text_to_overlay(ntr: NonTextRegion) -> OverlayItem:
"""Convert a NonTextRegion to an OverlayItem."""
return OverlayItem(
id=ntr.id,
level=OverlayLevel.NON_TEXT,
bbox=ntr.geometry.bbox,
polygon=ntr.geometry.polygon,
label=ntr.kind.value,
confidence=ntr.confidence,
provenance_type=ntr.provenance.evidence_type,
geometry_status=ntr.geometry.status,
)
def word_to_inspection(word: Word) -> InspectionData:
"""Build inspection data for a word."""
return InspectionData(
id=word.id,
level=OverlayLevel.WORD,
text=word.text,
bbox=word.geometry.bbox,
polygon=word.geometry.polygon,
confidence=word.confidence,
lang=word.lang,
provenance_type=word.provenance.evidence_type,
provenance_provider=word.provenance.provider,
geometry_status=word.geometry.status,
)
def line_to_inspection(line: TextLine) -> InspectionData:
"""Build inspection data for a line."""
return InspectionData(
id=line.id,
level=OverlayLevel.LINE,
text=line.text,
bbox=line.geometry.bbox,
polygon=line.geometry.polygon,
confidence=line.confidence,
lang=line.lang,
provenance_type=line.provenance.evidence_type,
provenance_provider=line.provenance.provider,
geometry_status=line.geometry.status,
)
def region_to_inspection(region: TextRegion) -> InspectionData:
"""Build inspection data for a region."""
return InspectionData(
id=region.id,
level=OverlayLevel.BLOCK,
text=region.text[:200] if region.text else None,
bbox=region.geometry.bbox,
polygon=region.geometry.polygon,
confidence=region.confidence,
lang=region.lang,
provenance_type=region.provenance.evidence_type,
provenance_provider=region.provenance.provider,
geometry_status=region.geometry.status,
role=region.role.value if region.role else None,
)