forge: DRY collapse duplicate fence-tracking in queue_index.parse

This commit is contained in:
forge committed 2026-10-22 14:02:24 +00:00
1 parent e0019ea158
commit 40f1095590
1 file changed
+21 -10
+21 -10
View File
@@ -195,19 +195,34 @@ def status_value(raw):
return raw return raw
def fence_mask(lines):
"""1-based line numbers to skip: fence delimiters and every line they hide.
A fenced block is quoted material, not document structure -- headings inside
it are not sections, and id tokens inside it are not records. Stated once
here and reused by parse(), rather than restated verbatim in each scan loop.
"""
out = set()
in_fence = False
for i, ln in enumerate(lines, 1):
if FENCE.match(ln.strip()):
in_fence = not in_fence
out.add(i)
elif in_fence:
out.add(i)
return out
def parse(text): def parse(text):
"""Return the structural parse: sections, nested ids, id map, byte accounting.""" """Return the structural parse: sections, nested ids, id map, byte accounting."""
lines, trailing_newline = split_lines(text) lines, trailing_newline = split_lines(text)
n = len(lines) n = len(lines)
sizes = [line_bytes(ln, i == n - 1, trailing_newline) for i, ln in enumerate(lines)] sizes = [line_bytes(ln, i == n - 1, trailing_newline) for i, ln in enumerate(lines)]
fenced = fence_mask(lines)
headings = [] # (line_no, id, rest) headings = [] # (line_no, id, rest)
in_fence = False
for i, ln in enumerate(lines, 1): for i, ln in enumerate(lines, 1):
if FENCE.match(ln.strip()): if i in fenced:
in_fence = not in_fence
continue
if in_fence:
continue continue
m = HEADING.match(ln) m = HEADING.match(ln)
if m: if m:
@@ -261,12 +276,8 @@ def parse(text):
# (Q54/Q55/Q56/Q58 as artifact filenames, Q62 inside `Q31-Q62`, Q77/Q99 inside # (Q54/Q55/Q56/Q58 as artifact filenames, Q62 inside `Q31-Q62`, Q77/Q99 inside
# a quoted `--outside` list) is not an item at all. # a quoted `--outside` list) is not an item at all.
mentioned = {} mentioned = {}
in_fence = False
for i, ln in enumerate(lines, 1): for i, ln in enumerate(lines, 1):
if FENCE.match(ln.strip()): if i in fenced:
in_fence = not in_fence
continue
if in_fence:
continue continue
for m in ID_TOKEN.finditer(ln): for m in ID_TOKEN.finditer(ln):
qid = m.group(0) qid = m.group(0)