03번 분석: 하단 좌/우 내용 풍부, 현재 조립 부족
03번 하단 구조: - 좌(2.1): 3개 소주제(Digital화+표, GIS+BIM, Solution) 각각 불릿 있음 - 우(2.2): 3개 소주제(품질향상, 정보물추가, 효율화) 각각 불릿 있음 - 결론: 원본 그대로 문제: _assemble_type_b가 내용을 제대로 조립 못 함 다음 세션: 하단 좌/우 내용 정확히 조립 + 렌더링 확인 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -73,6 +73,44 @@ class _CodeBlockProtector:
|
|||||||
# Layer 2: MDX 전용 패턴 처리
|
# Layer 2: MDX 전용 패턴 처리
|
||||||
# ══════════════════════════════════════
|
# ══════════════════════════════════════
|
||||||
|
|
||||||
|
def _convert_md_list_to_html(text: str) -> str:
|
||||||
|
"""마크다운 리스트(* item, - item)를 HTML <ul><li>로 변환.
|
||||||
|
|
||||||
|
들여쓰기 수준(2-4칸)을 감지하여 중첩 <ul>을 생성한다.
|
||||||
|
"""
|
||||||
|
lines = text.split("\n")
|
||||||
|
result = []
|
||||||
|
list_stack: list[int] = [] # 현재 열린 리스트의 들여쓰기 레벨들
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
m = re.match(r"^(\s*)[*\-]\s+(.+)$", line)
|
||||||
|
if m:
|
||||||
|
indent = len(m.group(1))
|
||||||
|
content = m.group(2)
|
||||||
|
if not list_stack:
|
||||||
|
result.append("<ul>")
|
||||||
|
list_stack.append(indent)
|
||||||
|
elif indent > list_stack[-1]:
|
||||||
|
result.append("<ul>")
|
||||||
|
list_stack.append(indent)
|
||||||
|
else:
|
||||||
|
while len(list_stack) > 1 and indent < list_stack[-1]:
|
||||||
|
result.append("</ul></li>")
|
||||||
|
list_stack.pop()
|
||||||
|
result.append(f"<li>{content}")
|
||||||
|
else:
|
||||||
|
while list_stack:
|
||||||
|
result.append("</li></ul>")
|
||||||
|
list_stack.pop()
|
||||||
|
result.append(line)
|
||||||
|
|
||||||
|
while list_stack:
|
||||||
|
result.append("</li></ul>")
|
||||||
|
list_stack.pop()
|
||||||
|
|
||||||
|
return "\n".join(result)
|
||||||
|
|
||||||
|
|
||||||
def _convert_md_table_to_html(text: str) -> str:
|
def _convert_md_table_to_html(text: str) -> str:
|
||||||
"""마크다운 테이블(| col | col |)을 HTML <table>로 변환.
|
"""마크다운 테이블(| col | col |)을 HTML <table>로 변환.
|
||||||
|
|
||||||
@@ -120,11 +158,14 @@ def _render_md_table(table_lines: list[str]) -> str:
|
|||||||
|
|
||||||
rows = [_parse_row(line) for line in table_lines[data_start:]]
|
rows = [_parse_row(line) for line in table_lines[data_start:]]
|
||||||
|
|
||||||
# HTML 생성
|
# HTML 생성 — 셀 내 <br/> → <br> 유지 (줄바꿈 역할)
|
||||||
header_html = "".join(f"<th>{h}</th>" for h in headers)
|
header_html = "".join(f"<th>{h}</th>" for h in headers)
|
||||||
rows_html = ""
|
rows_html = ""
|
||||||
for row in rows:
|
for row in rows:
|
||||||
cells = "".join(f"<td>{c}</td>" for c in row)
|
cells = ""
|
||||||
|
for c in row:
|
||||||
|
c = re.sub(r"<br\s*/?>", "<br>", c)
|
||||||
|
cells += f"<td>{c}</td>"
|
||||||
rows_html += f"<tr>{cells}</tr>\n"
|
rows_html += f"<tr>{cells}</tr>\n"
|
||||||
|
|
||||||
return f"<table><thead><tr>{header_html}</tr></thead><tbody>{rows_html}</tbody></table>"
|
return f"<table><thead><tr>{header_html}</tr></thead><tbody>{rows_html}</tbody></table>"
|
||||||
@@ -147,8 +188,11 @@ def _process_mdx_patterns(text: str) -> tuple[str, list[dict]]:
|
|||||||
content = content.replace("</div>", "")
|
content = content.replace("</div>", "")
|
||||||
# 마크다운 테이블 → HTML 테이블 (br 치환보다 먼저 — 셀 내 <br/>로 행이 쪼개지는 것 방지)
|
# 마크다운 테이블 → HTML 테이블 (br 치환보다 먼저 — 셀 내 <br/>로 행이 쪼개지는 것 방지)
|
||||||
content = _convert_md_table_to_html(content)
|
content = _convert_md_table_to_html(content)
|
||||||
content = re.sub(r"<br\s*/?>", "\n", content)
|
# 테이블 밖 <br/> → \n (테이블 안은 이미 <br>로 변환 완료)
|
||||||
|
content = re.sub(r"<br\s*/>", "\n", content)
|
||||||
content = re.sub(r"\*\*(.+?)\*\*", r"<strong>\1</strong>", content)
|
content = re.sub(r"\*\*(.+?)\*\*", r"<strong>\1</strong>", content)
|
||||||
|
# 마크다운 리스트(* item) → HTML <ul><li>
|
||||||
|
content = _convert_md_list_to_html(content)
|
||||||
popups.append({"title": title, "content": content})
|
popups.append({"title": title, "content": content})
|
||||||
return f"[팝업: {title}]"
|
return f"[팝업: {title}]"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user