knowledge(품셈md): 도구 check — 가로로 눕힌 쪽 옆 띠 쪽 번호를 쪽 꼬리로 뺌
- 건설 813~817쪽(책에서 유일한 가로 쪽)은 쪽 번호만 글자층 맨 끝(홀수)·맨 앞(짝수) 줄로 남아 결손으로 뜸 - 가로 쪽이고 그 줄이 수만일 때만 뺌 · 세로 쪽은 그대로 · 시험 1개 추가 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V1MKKZKpUHTPKb513FneU8
This commit is contained in:
@@ -193,10 +193,21 @@ _SLOT = re.compile(r"(?:([^/]+)/)?제(\d+)장_[^/]*/(\d+-\d+(?:-\d+)?)_")
|
||||
_MAX_PAGES = 40
|
||||
|
||||
|
||||
def _side_number(page, row: str) -> bool:
|
||||
"""가로로 눕힌 쪽(건설 813~817)의 옆 띠 쪽 번호 — 맨 끝(홀수 쪽) 또는 맨 앞(짝수 쪽) 줄에 수만 남음."""
|
||||
return page.rect.width > page.rect.height and row.isdigit()
|
||||
|
||||
|
||||
def _is_footer(page, row: str, footer: re.Pattern) -> bool:
|
||||
return bool(footer.match(row)) or _side_number(page, row)
|
||||
|
||||
|
||||
def _body_rows(page, footer: re.Pattern) -> list[str]:
|
||||
"""쪽의 줄 — 맨 아래 쪽 꼬리(쪽 번호 · 장 이름)와 이어짐 표지 「→」 는 뺌."""
|
||||
rows = [row.strip() for row in _page_rows(page)]
|
||||
if rows and footer.match(rows[-1]):
|
||||
if rows and _side_number(page, rows[0]):
|
||||
rows = rows[1:]
|
||||
if rows and _is_footer(page, rows[-1], footer):
|
||||
rows = rows[:-1]
|
||||
return [row for row in rows if row != "→"]
|
||||
|
||||
@@ -385,8 +396,10 @@ def pdf_lines(doc, head: dict[str, str], footer: re.Pattern) -> list[tuple[int,
|
||||
out = []
|
||||
for number in range(start_page, min(end_page, last) + 1):
|
||||
rows = [row.strip() for row in read_rows(doc[number - 1])]
|
||||
if rows and footer.match(rows[-1]):
|
||||
if rows and _is_footer(doc[number - 1], rows[-1], footer):
|
||||
rows[-1] = "" # 쪽 꼬리
|
||||
if rows and _side_number(doc[number - 1], rows[0]):
|
||||
rows[0] = "" # 눕힌 쪽 옆 띠 쪽 번호
|
||||
for index, row in enumerate(rows):
|
||||
if (number, index) < (start_page, start_row) or (number, index) >= (end_page, end_row):
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user