Files
md-to-docx/src/core/renderer.py

43 lines
1.7 KiB
Python
Raw Normal View History

2025-12-08 16:57:25 +03:00
import mistune
from .style_registry import StyleRegistry
from ..handlers import get_handler
import logging
logger = logging.getLogger(__name__)
log_handlers = set()
2025-12-08 16:57:25 +03:00
def render_markdown_to_docx(doc, md_content: str, images_dir, style_reg: StyleRegistry):
# Включаем плагины: таблицы, переносы строк
markdown = mistune.create_markdown(renderer=None, plugins=['table'])
2025-12-08 16:57:25 +03:00
ast = markdown(md_content)
def walk(node):
2025-12-08 17:18:30 +03:00
if isinstance(node, list):
for item in node:
walk(item)
elif isinstance(node, dict):
node_type = node["type"]
# Игнорируем вспомогательные узлы без логирования
if node_type in ("text", "blank_line", "table_head", "table_body", "table_row", "table_cell"):
if node.get("children"):
for child in node["children"]:
walk(child)
return
if node_type not in log_handlers:
logger.debug(f"Обрабатываем узел: {node_type}")
handler = get_handler(node_type)
2025-12-08 17:18:30 +03:00
if handler:
if node_type not in log_handlers:
logger.debug(f" → найден обработчик для {node_type}")
2025-12-08 17:18:30 +03:00
handler(node, doc, images_dir, style_reg)
elif node_type not in log_handlers:
logger.warning(f" → нет обработчика для {node_type}")
log_handlers.add(node_type)
if node.get("children"):
2025-12-08 17:18:30 +03:00
for child in node["children"]:
walk(child)
2025-12-08 16:57:25 +03:00
walk(ast)