"""Tests for block-level element renderers.""" import zipfile import xml.etree.ElementTree as ET from pathlib import Path from docx import Document from bs4 import BeautifulSoup from md2doc import STYLES, _render_table, _render_pre, _render_blockquote, _render_hr W_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" def get_doc_xml(doc): tmp = Path(__file__).parent / "_tmp_blocks.docx" doc.save(tmp) try: with zipfile.ZipFile(tmp) as z: return ET.fromstring(z.read("word/document.xml")) finally: tmp.unlink() def test_table_renders_with_header_shading(): html = """
NameValue
A1
""" doc = Document() node = BeautifulSoup(html, "html.parser").find("table") _render_table(doc, node, style=STYLES["elegant"]) root = get_doc_xml(doc) trs = list(root.iter(f"{{{W_NS}}}tr")) assert len(trs) == 2 shds = list(root.iter(f"{{{W_NS}}}shd")) assert len(shds) >= 2 # at least 2 header cells def test_pre_renders_with_shading(): html = '
print("hello")
' doc = Document() node = BeautifulSoup(html, "html.parser").find("pre") _render_pre(doc, node, style=STYLES["elegant"]) root = get_doc_xml(doc) shds = list(root.iter(f"{{{W_NS}}}shd")) assert len(shds) >= 1 texts = [t.text for t in root.iter(f"{{{W_NS}}}t")] assert any('print' in t for t in texts) def test_blockquote_renders_with_indent_and_italic(): html = "
A quoted passage
" doc = Document() node = BeautifulSoup(html, "html.parser").find("blockquote") _render_blockquote(doc, node, style=STYLES["elegant"]) root = get_doc_xml(doc) italic_el = list(root.iter(f"{{{W_NS}}}i")) assert len(italic_el) >= 1 indents = list(root.iter(f"{{{W_NS}}}ind")) assert len(indents) >= 1 def test_hr_renders_as_paragraph_with_bottom_border(): html = "
" doc = Document() node = BeautifulSoup(html, "html.parser").find("hr") _render_hr(doc, node, style=STYLES["elegant"]) root = get_doc_xml(doc) bottoms = list(root.iter(f"{{{W_NS}}}bottom")) assert len(bottoms) >= 1