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 전용 패턴 처리
|
||||
# ══════════════════════════════════════
|
||||
|
||||
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:
|
||||
"""마크다운 테이블(| 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:]]
|
||||
|
||||
# HTML 생성
|
||||
# HTML 생성 — 셀 내 <br/> → <br> 유지 (줄바꿈 역할)
|
||||
header_html = "".join(f"<th>{h}</th>" for h in headers)
|
||||
rows_html = ""
|
||||
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"
|
||||
|
||||
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>", "")
|
||||
# 마크다운 테이블 → HTML 테이블 (br 치환보다 먼저 — 셀 내 <br/>로 행이 쪼개지는 것 방지)
|
||||
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)
|
||||
# 마크다운 리스트(* item) → HTML <ul><li>
|
||||
content = _convert_md_list_to_html(content)
|
||||
popups.append({"title": title, "content": content})
|
||||
return f"[팝업: {title}]"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user