Skip to main content

Create a Mermaid graph from a NetworkX graph

Project description

networkx-mermaid

Create a Mermaid graph from a NetworkX graph

codecov Codacy Badge Codacy Badge CodeFactor Scrutinizer Code Quality

Quality Gate Status Bugs Code Smells Duplicated Lines (%)

Snyk

Example

import threading
import webbrowser
from tempfile import TemporaryDirectory

import networkx as nx

from networkx_mermaid import DiagramOrientation, DiagramNodeShape
from networkx_mermaid.builders import DiagramBuilder
from networkx_mermaid.formatters import html, markdown
from networkx_mermaid.typing import MermaidDiagram


# An example of a graph with multiple components
def create_graph():
    pastel_colors = ["#FFCCCC", "#CCFFCC", "#CCCCFF", "#FFFFCC", "#CCFFFF", "#FFCCFF"]
    graphs: list[nx.Graph] = [nx.tetrahedral_graph(), nx.dodecahedral_graph()]

    for i, g in enumerate(graphs):
        nx.set_node_attributes(g, {n: {"color": pastel_colors[i]} for n in g.nodes})

    graph: nx.Graph = nx.disjoint_union_all(graphs)

    graph.name = " + ".join(g.name for g in graphs)

    return graph


def create_builder():
    # Create a Mermaid Diagram Builder with custom settings

    builder = DiagramBuilder(
        orientation=DiagramOrientation.LEFT_RIGHT,
        node_shape=DiagramNodeShape.ROUND_RECTANGLE,
    )
    return builder


def create_server(port: int, root_directory: str, open_browser: bool = True) -> threading.Thread:
    import http.server
    import socketserver

    url = f"http://localhost:{port}"

    class Handler(http.server.SimpleHTTPRequestHandler):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, directory=root_directory, **kwargs)

    def serve():
        with socketserver.TCPServer(('', port), Handler) as httpd:
            print("Serving at:", url)
            httpd.serve_forever()

    server_thread = threading.Thread(target=serve)
    server_thread.daemon = True
    server_thread.start()

    if open_browser:
        webbrowser.open(url)


def main():
    graph = create_graph()
    builder = create_builder()

    # Build the Mermaid Diagram
    mermaid_diagram: MermaidDiagram = builder.build(graph)

    # Format the Mermaid Diagram for Markdown embedding
    markdown_diagram: str = markdown(mermaid_diagram)

    # or as single page HTML
    html_diagram: str = html(mermaid_diagram, title=graph.name)

    print('Mermaid Diagram:')
    print(mermaid_diagram)
    print(markdown_diagram)
    print(html_diagram)

    ## Save the HTML diagram to a file and serve it
    with TemporaryDirectory() as temp_dir:
        with open(f"{temp_dir}/index.html", 'w') as f:
            f.write(html_diagram)

        # Serve the HTML diagram
        create_server(port=8073, root_directory=temp_dir, open_browser=True)

        # Keep the main thread alive to allow the server to run
        try:
            while True:
                pass
        except KeyboardInterrupt:
            print("Server stopped")


if __name__ == "__main__":
    main()

Diagram

---
title: Platonic Tetrahedral Graph + Dodecahedral Graph
config:
  layout: dagre
  look: neo
  theme: neutral
---
graph LR
AAA([0])
style AAA fill:#FFCCCC, color:#000000
AAE([1])
style AAE fill:#FFCCCC, color:#000000
AAI([2])
style AAI fill:#FFCCCC, color:#000000
AAM([3])
style AAM fill:#FFCCCC, color:#000000
AAQ([4])
style AAQ fill:#CCFFCC, color:#000000
AAU([5])
style AAU fill:#CCFFCC, color:#000000
AAY([6])
style AAY fill:#CCFFCC, color:#000000
AAc([7])
style AAc fill:#CCFFCC, color:#000000
AAg([8])
style AAg fill:#CCFFCC, color:#000000
AAk([9])
style AAk fill:#CCFFCC, color:#000000
AAo([10])
style AAo fill:#CCFFCC, color:#000000
AAs([11])
style AAs fill:#CCFFCC, color:#000000
AAw([12])
style AAw fill:#CCFFCC, color:#000000
AA0([13])
style AA0 fill:#CCFFCC, color:#000000
AA4([14])
style AA4 fill:#CCFFCC, color:#000000
AA8([15])
style AA8 fill:#CCFFCC, color:#000000
ABA([16])
style ABA fill:#CCFFCC, color:#000000
ABE([17])
style ABE fill:#CCFFCC, color:#000000
ABI([18])
style ABI fill:#CCFFCC, color:#000000
ABM([19])
style ABM fill:#CCFFCC, color:#000000
ABQ([20])
style ABQ fill:#CCFFCC, color:#000000
ABU([21])
style ABU fill:#CCFFCC, color:#000000
ABY([22])
style ABY fill:#CCFFCC, color:#000000
ABc([23])
style ABc fill:#CCFFCC, color:#000000
AAA --> AAE
AAA --> AAI
AAA --> AAM
AAE --> AAI
AAE --> AAM
AAI --> AAM
AAQ --> AAU
AAQ --> ABc
AAQ --> AA4
AAU --> AAY
AAU --> AAw
AAY --> AAc
AAY --> AAo
AAc --> AAg
AAc --> ABc
AAg --> AAk
AAg --> ABU
AAk --> AAo
AAk --> ABM
AAo --> AAs
AAs --> AAw
AAs --> ABI
AAw --> AA0
AA0 --> AA4
AA0 --> ABE
AA4 --> AA8
AA8 --> ABA
AA8 --> ABY
ABA --> ABE
ABA --> ABQ
ABE --> ABI
ABI --> ABM
ABM --> ABQ
ABQ --> ABU
ABU --> ABY
ABY --> ABc

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

networkx_mermaid-0.1.2.tar.gz (10.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

networkx_mermaid-0.1.2-py3-none-any.whl (7.5 kB view details)

Uploaded Python 3

File details

Details for the file networkx_mermaid-0.1.2.tar.gz.

File metadata

  • Download URL: networkx_mermaid-0.1.2.tar.gz
  • Upload date:
  • Size: 10.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for networkx_mermaid-0.1.2.tar.gz
Algorithm Hash digest
SHA256 5a2b9bace55a99bf08d044b34a5f351d923e52bef148a3f5eb13fc08cf3e3aa7
MD5 32b97bae01b336ab5301661dd3572886
BLAKE2b-256 73c0eb212bce0871452ffa74beb9a44f8c70844673236e0a13803e4e483818a7

See more details on using hashes here.

File details

Details for the file networkx_mermaid-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for networkx_mermaid-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f6737ff08ed36422f682bd9796cd43ecac2a7d5adbed30f481074f6e8fd51489
MD5 7dc06b2851b82762a66b31aa377ffcf8
BLAKE2b-256 cd2870cb1392baa2d816b48c03af84b2d8aa14ec748cc40d13c0242e50363640

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page