Source code for figrecipe._diagram._shared._render

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Shared render dispatch for diagrams."""

from pathlib import Path
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from ._graph import Diagram


def render_diagram(
    diagram: "Diagram",
    path,
    format: str = "png",
    backend: str = "auto",
    scale: float = 2.0,
) -> Path:
    """
    Render a diagram to an image file.

    Parameters
    ----------
    diagram : Diagram
        The diagram to render.
    path : str or Path
        Output file path.
    format : str
        Output format: png, svg, pdf.
    backend : str
        Rendering backend: 'mermaid-cli', 'graphviz', 'mermaid.ink', 'auto'.
    scale : float
        Scale factor for output.

    Returns
    -------
    Path
        Path to the rendered file.
    """
    from .._graphviz._render import _check_graphviz, _render_with_graphviz
    from .._mermaid._render import (
        _check_mermaid_cli,
        _render_with_mermaid_cli,
        _render_with_mermaid_ink,
    )

    output_path = Path(path)
    format = format.lower()

    # Auto-detect backend
    if backend == "auto":
        if _check_mermaid_cli():
            backend = "mermaid-cli"
        elif _check_graphviz():
            backend = "graphviz"
        else:
            backend = "mermaid.ink"

    # Render based on backend
    if backend == "mermaid-cli":
        if not _check_mermaid_cli():
            raise RuntimeError(
                "mermaid-cli (mmdc) not found. Install with: npm install -g @mermaid-js/mermaid-cli"
            )
        mermaid_content = diagram.to_mermaid()
        return _render_with_mermaid_cli(mermaid_content, output_path, format, scale)

    elif backend == "graphviz":
        if not _check_graphviz():
            raise RuntimeError(
                "graphviz (dot) not found. Install with: apt install graphviz"
            )
        dot_content = diagram.to_graphviz()
        return _render_with_graphviz(dot_content, output_path, format)

    elif backend == "mermaid.ink":
        if format == "pdf":
            raise ValueError("mermaid.ink does not support PDF format")
        mermaid_content = diagram.to_mermaid()
        return _render_with_mermaid_ink(mermaid_content, output_path, format)

    else:
        raise ValueError(f"Unknown backend: {backend}")


[docs] def get_available_backends() -> dict: """Get available rendering backends and their status.""" from .._graphviz._render import _check_graphviz from .._mermaid._render import _check_mermaid_cli return { "mermaid-cli": { "available": _check_mermaid_cli(), "install": "npm install -g @mermaid-js/mermaid-cli", "formats": ["png", "svg", "pdf"], }, "graphviz": { "available": _check_graphviz(), "install": "apt install graphviz", "formats": ["png", "svg", "pdf"], }, "mermaid.ink": { "available": True, # Always available (online) "install": "No installation needed (online API)", "formats": ["png", "svg"], }, }
__all__ = ["render_diagram", "get_available_backends"]