From af11f6d985d836c6390b060e9021467ebdbdb833 Mon Sep 17 00:00:00 2001 From: Research Assistant Date: Wed, 17 Jun 2026 22:36:51 +0800 Subject: [PATCH] fix: preserve panel labels and figure_inner_text in post-reference backmatter zone --- paperforge/worker/ocr_document.py | 6 ++++++ tests/test_ocr_layout_first_regressions.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/paperforge/worker/ocr_document.py b/paperforge/worker/ocr_document.py index 81c0da77..b4939eaf 100644 --- a/paperforge/worker/ocr_document.py +++ b/paperforge/worker/ocr_document.py @@ -4682,6 +4682,12 @@ def normalize_document_structure( new_role="media_asset", reason="image/media block in post_reference_backmatter_zone promoted to media_asset", ) + # ponytail: panel_label + figure_inner_text guard; if other specialized roles + # appear in backmatter zone, extend this list + if block.get("marker_signature", {}).get("type") == "panel_label": + continue + if block.get("role") == "figure_inner_text": + continue elif role not in _BACKMATTER_NON_BODY_ROLES: old_role = block.get("role") if old_role != "backmatter_body": diff --git a/tests/test_ocr_layout_first_regressions.py b/tests/test_ocr_layout_first_regressions.py index 60d0e6fa..c577ca72 100644 --- a/tests/test_ocr_layout_first_regressions.py +++ b/tests/test_ocr_layout_first_regressions.py @@ -143,3 +143,21 @@ def test_keep_formal_caption_seed_for_numbered_display_legend() -> None: } assert _should_keep_formal_caption_seed(block) is True + + +def test_panel_label_in_post_ref_zone_not_converted_to_backmatter() -> None: + """Panel labels like (a) in post_reference_backmatter_zone stay figure_inner_text. + + Regression: guard in normalize_document_structure prevents backmatter + normalization from overwriting figure_inner_text role. + """ + from paperforge.worker.ocr_roles import assign_block_role + + block = { + "block_label": "text", + "block_content": "(a)", + "block_bbox": [90, 90, 120, 120], + "page": 10, + } + role = assign_block_role(block, page_blocks=[], page_width=1200, page_height=1600) + assert role.role == "figure_inner_text"