欄位感知閱讀順序(XY-Cut)

element_parse.reading_order 是平面的上到下 / 左到右排序——在任何多欄頁面都會交錯欄位 (眾所周知的 naive 排序失敗:它先讀 A 欄第 1 列、再讀 B 欄第 1 列、再讀 A 欄第 2 列…)。 reading_flow 以遞迴 XY-cut 還原正確順序:在最寬的留白谷反覆切分(垂直 gutter → 欄、 水平 gutter → 列 / 區塊),因此兩欄版面會*完整讀完*A 欄,再讀 B 欄。

公開的展平函式命名為 flow_order,以*並列*而非遮蔽 element_parse.reading_order;它回傳 相同的 index 標記元素契約,因此是欄位感知的直接升級。純標準函式庫幾何,作用於純框字典 (不需影像、不需 OCR 引擎);重用 table_grid_fill 的框邊界讀取器。不匯入 PySide6

無頭 API

from je_auto_control import flow_order, xy_cut, to_blocks

# 兩欄各兩列:讀作 A1, A2, B1, B2——而非 A1, B1, A2, B2
for element in flow_order(ocr_boxes, min_gap=12):
    print(element["index"], element["text"])

tree = xy_cut(ocr_boxes, min_gap=12)     # {type, axis, children|boxes}
blocks = to_blocks(tree)                  # 依閱讀順序的葉區塊

flow_order 以欄位感知閱讀順序回傳各框,每個帶 indexxy_cut 回傳遞迴區域樹 (每個節點為對 axis "x" / "y"split 或框的 leaf)。to_blocks 把樹 展平為依序的葉區塊。min_gap 為被視為欄 / 列分隔的最小留白谷。

執行器指令

AC_flow_order``(``boxes / min_gap{count, elements})與 AC_xy_cut (boxes / min_gap{tree})。兩者以 MCP 工具 ac_flow_order / ac_xy_cut (唯讀)及 Script Builder 指令 Reading Order (column-aware) / XY-Cut Region Tree (位於 OCR 分類下)形式提供。