Skip to main content

A PlantUML plugin for Markdown

Project description

Build Status

PlantUML Extension for Python-Markdown

This plugin implements a block extension which can be used to specify a PlantUML diagram which will be converted into an image and inserted in the document.


    ::uml:: [format="png|svg|txt"] [classes="class1 class2 ..."] [alt="text for alt"] [title="Text for title"] [width="300px"] [height="300px"]
      PlantUML script diagram


    ::uml:: format="png" classes="uml myDiagram" alt="My super diagram placeholder" title="My super diagram" width="300px" height="300px"
      Goofy ->  MickeyMouse: calls
      Goofy <-- MickeyMouse: responds

The GitLab/GitHub block syntax is also recognized. Example:

```plantuml format="png" classes="uml myDiagram" alt="My super diagram placeholder" title="My super diagram" width="300px" height="300px"
  Goofy ->  MickeyMouse: calls
  Goofy <-- MickeyMouse: responds

Options are optional (otherwise the wouldn't be options), but if present must be specified in the order format, classes, alt, title, width, height, and source. The option value may be enclosed in single or double quotes.

Supported values for format parameter are:

  • png: HTML img tag with embedded png image
  • svg: HTML img tag with embedded svg image (links are not navigable)
  • svg_object: HTML object tag with embedded svg image (links are navigable)
  • svg_inline: HTML5 svg tag with inline svg image source (links are navigable, can be manipulated with CSS rules)
  • txt: plain text diagrams.

The width and height options must include a CSS unit.

source parameter is used for inclusion of an external source diagram instead on an inline code. Here's an example in GitLab/GitHub block syntax.


title Authentication Sequence
    Alice->Bob: Authentication Request
    note right of Bob: Bob thinks about it
    Bob->Alice: Authentication Response

```plantuml source="basic.puml"
    '' This code is appended to the contents of basic.puml
    Goofy ->  MickeyMouse: calls
    Goofy <-- MickeyMouse: responds


To use the plugin with Python-Markdown you have these choices:

  • with pip, do a simple pip install plantuml-markdown, and the plugin should be ready to be used

  • on Windows you can use Chocolatey, a package manager for Windows: do a choco install plantuml and you are ready to work (this command will install all dependencies, Java and Graphviz included, see for details)

  • copy the file in the extensions folder of Python-Markdown. For example, for Python 2.7 you must do:

    $ sudo cp /usr/lib/python27/site-packages/markdown/extensions/
  • copy the file somewhere in your home. A good choice may be the user-site path, for example (bash syntax):

    $ export INSTALLPATH="`python -m site --user-site`/plantuml-markdown"
    $ mkdir -p "$INSTALLPATH"
    $ cp "$INSTALLPATH/"

    You must export PYTHONPATH before running markdown_py, or you can put the definition in ~/.bashrc.

After installed, you can use this plugin by activating it in the markdown_py command. For example:

markdown_py -x plantuml_markdown > out.html

But before to use it, you need to configure which PlantUML binary to use: a local binary, or a remote server.

Using a local PlantUML binary

You need to install PlantUML (see the site for details) and Graphviz 2.26.3 or later. The plugin expects a program plantuml in the classpath. If not installed by your package manager, you can create a shell script and place it somewhere in the classpath. For example, save te following into /usr/local/bin/plantuml (supposing PlantUML installed into /opt/plantuml):

    java $PLANTUML_JAVAOPTS -jar /opt/plantuml/plantuml.jar ${@}

The PLANTUML_JAVAOPTS variable can be used to set specific Java options, such as memory tuning options, or to set system variable used by PlantUML, such as then include search path. This would avoid modifications of the plantuml script. For example, with a diagram like:

    !include myDefs.puml

    A --> B

you can do:

    export PLANTUML_JAVAOPTS="-Dplantuml.include.path=$HOME/plantuml_defs"
    markdown_py -x plantuml_markdown > out.html

The same thing can be done using the environment variable _JAVA_OPTIONS, which is readed by default by the java executable.

On Windows can be used the following plantuml.bat (many thanks to henn1001):

    @echo off
    set mypath=%~dp0

    set GRAPHVIZ_DOT=%mypath%\Graphviz\bin\dot.exe

    java %PLANTUML_JAVAOPTS% -jar %mypath%\plantuml.jar %*

Make sure the plantuml.bat is on the path.

For Gentoo Linux there is an ebuild at you can download the ebuild and the files subfolder or you can add the zugaina repository with layman (recommended).

Using a PlantUML server

From version 2.0 a PlantUML server can be used for rendering diagrams. This speedups a lot the diagrams rendering but needs to send the diagram source to a server.

You can download the war and deploy in a servlet container, or you can run it as a docker container.

In either cases you need to specify the URL of the server in a configuration file like:

  server:  # PlantUML server, for remote rendering
  # other global options
  cachedir: /tmp                            # set a non-empty value to enable caching
  base_dir: .                               # where to search for diagrams to include
  format: png                               # default diagram image format
  classes: class1,class2                    # default diagram classes
  title: UML diagram                        # default title (tooltip) for diagram images
  alt: UML diagram image                    # default `alt` attribute for diagram images
  priority: 23                              # plugin priority; the higher, the sooner will be applied (default 23)

Then you need to specify the configuration file on the command line:

markdown_py -x plantuml_markdown -c myconfig.yml > out.html

Plugin options

The plugin has several configuration option:

  • classes: space separated list of classes for the generated image. Defaults to uml
  • format: format of image to generate (png, svg or txt). Defaults to png
  • alt: text to show when image is not available. Defaults to uml diagram
  • title: tooltip for the diagram
  • server: PlantUML server url, for remote rendering. Defaults to '', use local command
  • cachedir: directory for caching of diagrams. Defaults to '', no caching
  • priority: extension priority. Higher values means the extension is applied sooner than others. Defaults to 23
  • base_dir: path where to search for external diagrams files
  • encoding: character encoding for external files (see source parameter); default encoding is utf-8. Please note that on Windows text files may use the cp1252 as default encoding, so setting encoding: cp1252 may fix incorrect characters rendering.

For passing options to the plantuml_plugin see the documentation of the tool you are using.

For markdown_py, simply write a YAML file with the configurations and use the -c option on the command line. See the Using a PlantUML server section for an example.

Running tests

plantuml-markdown is tested with Python >= 3.6 and Markdown >= 3.0.1. Older versions of Python or Markdown may work, but if it doesn't I can't guarantee a fix as they are end-of-life versions.

The test execution requires a specific version of PlantUML (the image generated can be different with different PlantUML versions).

Before to run tests, install the required dependencies:

pip install -r test-requirements.txt

To run the tests, execute the following command:

PATH="$PATH:$PWD/test" python -m unittest discover -v -s test

This command uses a custom version of the plantuml command which will download the expected version of PlantUML for tests execution without clobbering the system.

Project details

Download files

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

Files for plantuml-markdown, version 3.4.3
Filename, size File type Python version Upload date Hashes
Filename, size plantuml_markdown-3.4.3-py3-none-any.whl (10.4 kB) File type Wheel Python version py3 Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring DigiCert DigiCert EV certificate Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page