From 2d954a14dddffdfddad1c2b04a473d3af1ff534b Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 5 Oct 2026 18:42:15 +0900 Subject: [PATCH] =?UTF-8?q?feat(M01):=2050-2=20=EC=9B=90=EB=AC=B8=20?= =?UTF-8?q?=ED=8C=A8=EB=84=90=20=E2=80=94=20=EB=A7=88=ED=81=AC=EB=8B=A4?= =?UTF-8?q?=EC=9A=B4=20=EA=B8=B0=ED=98=B8=20=EB=B2=97=EA=B9=80=20=C2=B7=20?= =?UTF-8?q?=EC=B6=9C=EC=B2=98=20=ED=95=AD=20=C2=B7=20=EC=A3=BC=20=EA=B0=95?= =?UTF-8?q?=EC=A1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 서버 원문 조각에서 역슬래시 · 인용 머리 · 글 안 주석 벗김(원본 자료 손 안 댐) - 출처 항 · 주 번호(3-4-2 1 · 9-7-1 주⑥)를 source() 답에 실음 — 그 조각 hit 표시 - 패널이 그 항을 옅은 바탕 + 막대로 강조 · 보이게 스크롤 · 머리에 「1항」 · 「주⑥」 - 시험 3 추가 · 화면 시나리오 50-2 Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01NPJGtfXo6GMbcpiboQC4uK --- M01_MasterData/M01_MasterData_Store_Make.py | 66 +++++++++++++++-- .../M01_MasterData_UI_LogicLab_Side.css | 6 ++ .../M01_MasterData_UI_LogicLab_Source.ts | 20 +++++- resources/tester/test_m01_logic_source.py | 43 +++++++++++ .../tester/ui_checks/50-2_원문_항강조.js | 71 +++++++++++++++++++ 5 files changed, 201 insertions(+), 5 deletions(-) create mode 100644 resources/tester/ui_checks/50-2_원문_항강조.js diff --git a/M01_MasterData/M01_MasterData_Store_Make.py b/M01_MasterData/M01_MasterData_Store_Make.py index 029ce0d35..13762011a 100644 --- a/M01_MasterData/M01_MasterData_Store_Make.py +++ b/M01_MasterData/M01_MasterData_Store_Make.py @@ -104,7 +104,16 @@ def sections(book: str, division: str = "", chapter: str = "", q: str = "", limi # ── 로직 원문(출처 글 → 품셈 본문 절) ────────────────────────────────── -_NUMBER = re.compile(r"(?~`])") # 마크다운 이스케이프 `\.` `\-` … +_COMMENT = re.compile(r"") # 글 안 주석(글자층 표시) — 글자만 남김 +_CIRCLED = "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳" + + +def _plain(text: str) -> str: + """원문 md 기호 벗김 — 주석 · 이스케이프 · 인용 머리 `> `.""" + text = _ESCAPE.sub(r"\1", _COMMENT.sub("", text)).strip() + return text[1:].strip() if text.startswith(">") else text def _blocks(lines: list[str]) -> list[dict]: @@ -117,10 +126,15 @@ def _blocks(lines: list[str]) -> list[dict]: if not text or text.startswith("