diff --git a/src/mdx_normalizer.py b/src/mdx_normalizer.py
index 05d43fc..d5a2e43 100644
--- a/src/mdx_normalizer.py
+++ b/src/mdx_normalizer.py
@@ -73,6 +73,44 @@ class _CodeBlockProtector:
# Layer 2: MDX 전용 패턴 처리
# ══════════════════════════════════════
+def _convert_md_list_to_html(text: str) -> str:
+ """마크다운 리스트(* item, - item)를 HTML
- 로 변환.
+
+ 들여쓰기 수준(2-4칸)을 감지하여 중첩
을 생성한다.
+ """
+ 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("")
+ list_stack.append(indent)
+ elif indent > list_stack[-1]:
+ result.append("")
+ list_stack.append(indent)
+ else:
+ while len(list_stack) > 1 and indent < list_stack[-1]:
+ result.append("
")
+ list_stack.pop()
+ result.append(f"- {content}")
+ else:
+ while list_stack:
+ result.append("
")
+ list_stack.pop()
+ result.append(line)
+
+ while list_stack:
+ result.append("")
+ list_stack.pop()
+
+ return "\n".join(result)
+
+
def _convert_md_table_to_html(text: str) -> str:
"""마크다운 테이블(| col | col |)을 HTML 로 변환.
@@ -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 생성 — 셀 내
→
유지 (줄바꿈 역할)
header_html = "".join(f"{h} | " for h in headers)
rows_html = ""
for row in rows:
- cells = "".join(f"{c} | " for c in row)
+ cells = ""
+ for c in row:
+ c = re.sub(r"
", "
", c)
+ cells += f"{c} | "
rows_html += f"{cells}
\n"
return f""
@@ -147,8 +188,11 @@ def _process_mdx_patterns(text: str) -> tuple[str, list[dict]]:
content = content.replace("", "")
# 마크다운 테이블 → HTML 테이블 (br 치환보다 먼저 — 셀 내
로 행이 쪼개지는 것 방지)
content = _convert_md_table_to_html(content)
- content = re.sub(r"
", "\n", content)
+ # 테이블 밖
→ \n (테이블 안은 이미
로 변환 완료)
+ content = re.sub(r"
", "\n", content)
content = re.sub(r"\*\*(.+?)\*\*", r"\1", content)
+ # 마크다운 리스트(* item) → HTML -
+ content = _convert_md_list_to_html(content)
popups.append({"title": title, "content": content})
return f"[팝업: {title}]"