diff --git a/md2doc.py b/md2doc.py new file mode 100644 index 0000000..1935cea --- /dev/null +++ b/md2doc.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +""" +Convert markdown files to DOCX (Microsoft Word). + +Usage: + md2doc.py input.md # Creates input.docx in same directory + md2doc.py input.md -o output.docx # Specify output file + md2doc.py docs/ # Convert all .md files in directory + md2doc.py docs/ -o docx_output/ + md2doc.py input.md --style mono # Use monospace style + +Requires: pip install python-docx markdown beautifulsoup4 lxml +""" +import argparse +import sys +from pathlib import Path + + +def _bulletize(text: str) -> str: + """Turn markdown "- " list markers into bullets, skipping code/HTML blocks. + + Copied verbatim from md2pdf.py per spec §3.3. + """ + import re + out, in_fence, in_html = [], False, False + for line in text.split("\n"): + stripped = line.lstrip() + if stripped.startswith("```") or stripped.startswith("~~~"): + in_fence = not in_fence + elif not in_fence: + if re.match(r"^<(table|div|section|figure)\b", stripped, re.I): + in_html = True + elif re.match(r"^", stripped, re.I): + in_html = False + if not in_fence and not in_html and line.startswith("- "): + line = "• " + line[2:] + out.append(line) + return "\n".join(out) diff --git a/tests/test_bulletize.py b/tests/test_bulletize.py new file mode 100644 index 0000000..6ae9eaa --- /dev/null +++ b/tests/test_bulletize.py @@ -0,0 +1,30 @@ +"""Tests for _bulletize — verifies behavior copied from md2pdf.py.""" +from md2doc import _bulletize + + +def test_simple_dash_list_becomes_bullets(): + text = "- item A\n- item B\n" + result = _bulletize(text) + assert "• item A" in result + assert "• item B" in result + + +def test_code_block_dashes_preserved(): + """Dashes inside ``` blocks must NOT be bulletized.""" + text = "```bash\n-r flag\n--verbose\n```\n" + result = _bulletize(text) + assert "-r flag" in result + assert "--verbose" in result + + +def test_html_block_dashes_preserved(): + """Dashes inside raw HTML blocks (table/div/etc.) must NOT be bulletized.""" + text = "\n- not a list\n
\n" + result = _bulletize(text) + assert "- not a list" in result + + +def test_tilde_fence_also_preserved(): + text = "~~~bash\n-x\n~~~\n" + result = _bulletize(text) + assert "-x" in result