diff --git a/resources/knowledge/original/_pipeline/pum_md_tool.py b/resources/knowledge/original/_pipeline/pum_md_tool.py index 17573dd4..ed755f49 100644 --- a/resources/knowledge/original/_pipeline/pum_md_tool.py +++ b/resources/knowledge/original/_pipeline/pum_md_tool.py @@ -419,6 +419,7 @@ def plan(book_name: str) -> list[Path]: # ── check ────────────────────────────────────────────────────────────── #: md 문법 — 글자 대조·수 대조에서 뺌(원문 글자가 아님) _COMMENT = re.compile(r"", re.S) +_REPEATED = re.compile(r"") _IMAGE = re.compile(r"!\[[^\]]*\]\([^)]*\)") _TABLE_RULE = re.compile(r"^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)*\|?\s*$") #: 막음표 — 원문 글자가 md 문법으로 읽히지 않게 앞에 `\` 를 붙인 것(`\*` `\-` `\#` `\>` `\|` …) @@ -442,7 +443,11 @@ def split_head(text: str) -> tuple[str, str]: def md_lines(body: str) -> list[tuple[int, str]]: - """몸의 (줄 번호, 원문 글자) — 주석 · 그림 · 표 구분 줄 · md 문법 글자를 뺌. 줄 번호는 몸 기준 1부터.""" + """몸의 (줄 번호, 원문 글자) — 주석 · 그림 · 표 구분 줄 · md 문법 글자를 뺌. 줄 번호는 몸 기준 1부터. + + `` 는 셈 — 쪽을 넘은 표가 PDF 에서 되풀이한 머리 줄(md 표에서는 뺌 · 규칙 4-5). + """ + body = _REPEATED.sub(r"\1", body) body = _COMMENT.sub(lambda m: "\n" * m.group(0).count("\n"), body) out = [] for number, line in enumerate(body.split("\n"), start=1): @@ -473,9 +478,14 @@ def pdf_lines(doc, head: dict[str, str], footer: re.Pattern) -> list[tuple[int, pass out = [] for number in range(start_page, min(end_page, last) + 1): - for index, row in enumerate(_body_rows(doc[number - 1], footer)): + rows = [row.strip() for row in _page_rows(doc[number - 1])] + if rows and footer.match(rows[-1]): + rows[-1] = "" # 쪽 꼬리 + for index, row in enumerate(rows): if (number, index) < (start_page, start_row) or (number, index) >= (end_page, end_row): continue + if not row or row == "→": # 이어짐 표지 + continue out.append((number, row)) return out diff --git a/resources/knowledge/original/원가계산/_품셈md_작성규칙.md b/resources/knowledge/original/원가계산/_품셈md_작성규칙.md index 63ed7a6a..38320209 100644 --- a/resources/knowledge/original/원가계산/_품셈md_작성규칙.md +++ b/resources/knowledge/original/원가계산/_품셈md_작성규칙.md @@ -63,7 +63,7 @@ PDF쪽: 135~136 3. 머리가 두 단 이상이면 **윗머리를 md 머리 줄로, 아랫머리는 몸 첫 줄(들)로** 적고 주석을 담. 윗머리를 아랫머리마다 되풀이해 펼치지 않음. `` 4. 빈 칸은 빈 칸. `〃` · `-` · `·` 는 그대로 적음(위 값으로 채우지 않음). -5. 한 표가 쪽을 넘어가면 **한 표로 이음.** 넘어간 쪽에서 되풀이된 머리 줄은 뺌. +5. 한 표가 쪽을 넘어가면 **한 표로 이음.** 넘어간 쪽에서 되풀이된 머리 줄은 뺌. 뺀 자리(넘어간 첫 줄 앞)에 `` 로 그 글자를 적음 — 기계검사가 그 글자를 PDF 의 되풀이 머리와 맞대 셈. 6. 표가 너무 넓어 PDF 가 두 표로 나눠 찍었으면 PDF 대로 두 표. ## 5. 그림 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/0-00_장머리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/0-00_장머리.md index c16f5cc7..f6d33832 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/0-00_장머리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/0-00_장머리.md @@ -5,8 +5,8 @@ PDF쪽: 192 인쇄쪽: 180 시작표지: 제13장 구조물 끝표지: 13-1. 석재 및 골재의 분류 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-01_석재_및_골재의_분류.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-01_석재_및_골재의_분류.md index 2555ffa2..c4a9c074 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-01_석재_및_골재의_분류.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-01_석재_및_골재의_분류.md @@ -5,8 +5,8 @@ PDF쪽: 192 인쇄쪽: 180 시작표지: 13-1. 석재 및 골재의 분류 끝표지: 13-2. 채집 및 세척 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-02_채집_및_세척.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-02_채집_및_세척.md index c127b3c8..3f289433 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-02_채집_및_세척.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-02_채집_및_세척.md @@ -5,8 +5,8 @@ PDF쪽: 192~193 인쇄쪽: 180~181 시작표지: 13-2. 채집 및 세척 끝표지: 13-3. 기초다짐 및 뒷채움 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-03_기초다짐_및_뒷채움.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-03_기초다짐_및_뒷채움.md index 1aa234b4..227d9044 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-03_기초다짐_및_뒷채움.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-03_기초다짐_및_뒷채움.md @@ -5,8 +5,8 @@ PDF쪽: 194 인쇄쪽: 182 시작표지: 13-3. 기초다짐 및 뒷채움 끝표지: 13-4. 돌쌓기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-04_돌쌓기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-04_돌쌓기.md index 95527a59..bf062e40 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-04_돌쌓기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-04_돌쌓기.md @@ -5,8 +5,8 @@ PDF쪽: 195~199 인쇄쪽: 183~187 시작표지: 13-4. 돌쌓기 끝표지: 13-5. 돌붙임 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-05_돌붙임.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-05_돌붙임.md index 21f92670..b71f0ee5 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-05_돌붙임.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-05_돌붙임.md @@ -5,8 +5,8 @@ PDF쪽: 199~200 인쇄쪽: 187~188 시작표지: 13-5. 돌붙임 끝표지: 13-6. 큰돌쌓기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-06_큰돌쌓기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-06_큰돌쌓기.md index a7fd9f66..7a527379 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-06_큰돌쌓기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-06_큰돌쌓기.md @@ -5,8 +5,8 @@ PDF쪽: 201~202 인쇄쪽: 189~190 시작표지: 13-6. 큰돌쌓기 끝표지: 13-7. 큰돌붙이기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-07_큰돌붙이기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-07_큰돌붙이기.md index 15147c5e..d653876c 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-07_큰돌붙이기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-07_큰돌붙이기.md @@ -5,8 +5,8 @@ PDF쪽: 203~204 인쇄쪽: 191~192 시작표지: 13-7. 큰돌붙이기 끝표지: 13-8. 막돌쌓기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-08_막돌쌓기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-08_막돌쌓기.md index f5918d54..37b3fc20 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-08_막돌쌓기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-08_막돌쌓기.md @@ -5,8 +5,8 @@ PDF쪽: 204 인쇄쪽: 192 시작표지: 13-8. 막돌쌓기 끝표지: 13-9. 서식지 조성 돌쌓기 및 놓기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-09_서식지_조성_돌쌓기_및_놓기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-09_서식지_조성_돌쌓기_및_놓기.md index e0ff189b..7f5c8007 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-09_서식지_조성_돌쌓기_및_놓기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-09_서식지_조성_돌쌓기_및_놓기.md @@ -5,8 +5,8 @@ PDF쪽: 204 인쇄쪽: 192 시작표지: 13-9. 서식지 조성 돌쌓기 및 놓기 끝표지: 13-10. 말뚝박기공 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-10_말뚝박기공.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-10_말뚝박기공.md index c0cbe632..e5ba4fcc 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-10_말뚝박기공.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-10_말뚝박기공.md @@ -5,8 +5,8 @@ PDF쪽: 205~207 인쇄쪽: 193~195 시작표지: 13-10. 말뚝박기공 끝표지: 13-11. 돌망태 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-11_돌망태.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-11_돌망태.md index 276d6a2c..e5a04116 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-11_돌망태.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-11_돌망태.md @@ -5,8 +5,8 @@ PDF쪽: 208~210 인쇄쪽: 196~198 시작표지: 13-11. 돌망태 끝표지: 13-12. 비탈다듬기 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-12_비탈다듬기.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-12_비탈다듬기.md index f2fdd6f8..b736b5a5 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-12_비탈다듬기.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-12_비탈다듬기.md @@ -5,8 +5,8 @@ PDF쪽: 210~211 인쇄쪽: 198~199 시작표지: 13-12. 비탈다듬기 끝표지: 13-13. 흙막이 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-13_흙막이.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-13_흙막이.md index 9591c608..eaf1d3a7 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-13_흙막이.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-13_흙막이.md @@ -5,8 +5,8 @@ PDF쪽: 211~212 인쇄쪽: 199~200 시작표지: 13-13. 흙막이 끝표지: 13-14. 식생토낭 및 포트 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-14_식생토낭_및_포트.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-14_식생토낭_및_포트.md index b3430e00..c1a6db9c 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-14_식생토낭_및_포트.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-14_식생토낭_및_포트.md @@ -5,8 +5,8 @@ PDF쪽: 212~213 인쇄쪽: 200~201 시작표지: 13-14. 식생토낭 및 포트 끝표지: 13-15. 목재공 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-15_목재공.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-15_목재공.md index ba9e7dd8..dd720680 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-15_목재공.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-15_목재공.md @@ -5,8 +5,8 @@ PDF쪽: 213~214 인쇄쪽: 201~202 시작표지: 13-15. 목재공 끝표지: 13-16. 매트부설 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-16_매트부설.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-16_매트부설.md index 92b0c896..7fb7f081 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-16_매트부설.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제13장_구조물/13-16_매트부설.md @@ -5,8 +5,8 @@ PDF쪽: 214 인쇄쪽: 202 시작표지: 13-16. 매트부설 끝표지: 제14장 부대공 -상태: 대기 -작성: +상태: 작성중 +작성: sub_laptop_1 검증: 원천: 글자층 기계검사: diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/0-00_장머리.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/0-00_장머리.md index fcd20402..d11ee1d5 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/0-00_장머리.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/0-00_장머리.md @@ -5,10 +5,12 @@ PDF쪽: 215 인쇄쪽: 203 시작표지: 제14장 부대공 끝표지: 14-1. 입목뿌리 밑막이 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +# 제14장 부대공 diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-01_입목뿌리_밑막이.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-01_입목뿌리_밑막이.md index 5803d688..eb762d10 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-01_입목뿌리_밑막이.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-01_입목뿌리_밑막이.md @@ -5,10 +5,23 @@ PDF쪽: 215 인쇄쪽: 203 시작표지: 14-1. 입목뿌리 밑막이 끝표지: 14-2. 근주이식 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 14-1. 입목뿌리 밑막이 + +(단위: 10본당) + +| 장비 | 단위 | 수량 | 비고 | +|---|---|---|---| +| 0.8㎥ 굴착기(우드그랩 부착) | h | 0.17 | 장비이동거리 50m이내 기준 | +| 보통인부 | h | 0.5 | | + + +[주] +입목뿌리 밑막이란 성토비탈면의 하부에 기존지장목의 근주를 밑막이 형태로 쌓는 것을 말한다. diff --git a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-02_근주이식.md b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-02_근주이식.md index c4db30ef..d2a7918d 100644 --- a/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-02_근주이식.md +++ b/resources/knowledge/original/원가계산/산림_표준품셈/본문/제14장_부대공/14-02_근주이식.md @@ -5,10 +5,25 @@ PDF쪽: 215 인쇄쪽: 203 시작표지: 14-2. 근주이식 끝표지: [부록 1]할인․할증 적용 공종표 -상태: 대기 -작성: +상태: 검증대기 +작성: sub_laptop_1 검증: 원천: 글자층 -기계검사: +기계검사: 통과 · ①수 결손 0 허구 0 · ②글자 빠짐 0 더함 0 확정지문: --- + +## 14-2. 근주이식 + +(단위: 10본당) + +| 장비 | 단위 | 수량 | 비고 | +|---|---|---|---| +| 0.8㎥ 굴착기 | h | 0.25 | 장비 이동거리 50m이내 기준 | +| 보통인부 | h | 0.66 | | + + +[주] +① 본 품은 맹아발생이 가능한 수종의 살아 있는 근주를 이식하는 데에 적용한다. +② 적용 대상 근주의 규격은 근원직경 10㎝∼30㎝ 사이를 기준으로 하며, 평균 근원직경은 20㎝이다. +③ 0.2㎥ 또는 0.4㎥ 용량의 굴착기를 사용하는 경우에는 「건설공사 표준품셈 공통부문, 8-2-3 굴착기(2025)」를 참조하여 적용계수를 달리 적용하도록 한다. diff --git a/resources/tester/test_pum_md_tool.py b/resources/tester/test_pum_md_tool.py index aed13087..c3e39efc 100644 --- a/resources/tester/test_pum_md_tool.py +++ b/resources/tester/test_pum_md_tool.py @@ -145,3 +145,28 @@ def test_const_toc_counts(): "유지관리부문", ] assert sum(e.ident.startswith("제") for e in entries) == 45 + + +def test_repeated_head_comment_counts_and_footer_dropped(): + """쪽을 넘은 표의 되풀이 머리 — md 표에선 빼고 `` 로 적으면 셈(규칙 4-5) · 쪽 꼬리는 뺌.""" + pymupdf = pytest.importorskip("pymupdf") + doc = pymupdf.open() + for lines in (["9-5. A", "NAME QTY", "X 1.0", "- 1 -"], ["NAME QTY", "Y 2.0", "- 2 -"]): + page = doc.new_page() + for n, text in enumerate(lines): + page.insert_text((72, 72 + 30 * n), text) + head = {"PDF쪽": "1~2", "시작표지": "9-5. A", "끝표지": "끝"} + pdf = tool.pdf_lines(doc, head, tool.BOOKS["산림"]["footer"]) + assert [row for _, row in pdf] == ["9-5. A", "NAME QTY", "X 1.0", "NAME QTY", "Y 2.0"] + md = "\n".join( + [ + "## 9-5. A", + "", + "| NAME | QTY |", + "|---|---|", + "| X | 1.0 |", + "", + "| Y | 2.0 |", + ] + ) + assert tool.verdict(tool.compare(pdf, tool.md_lines(md))).startswith("통과")