sphinx-plantuml 简介

PlantUML 是可以用纯文本语言绘制图表的开源软件. PlantUML 支持许多统一建模语言, 也支持其他软件开发相关的格式, 比如 C4 模型/电脑网络图/ER 模型/甘特图/心智图和工作分解结构图等, 也可以用在 JSON 及 YAML 文档的可视化.

在 Sphinx 中, 你可以使用 sphinx-contrib/plantuml 在文档中插入 PlantUML 图片. 但是构建环境需要配置 Java 以及 PlantUML 相关 jar 包, 配置起来比较麻烦. 此外, 本地编译也比较慢, 拖慢整个构建过程.

因此我开发了 sphinx-plantuml 库, sphinx-plantuml 的优点有:

  • 纯 Python 库, 无需配置任何环境或者依赖, 开箱即用.

  • 快速的构建速度, 因为构建过程无需编译 PlantUML.

  • 兼容内置 figure 命令大部分参数, 容易上手.

  • 支持 .uml 文件的引用, 便于项目管理.

sphinx-plantuml 原理

sphinx-plantuml 工作原理如 图 1 所示.

https://www.plantuml.com/plantuml/svg/SoWkIImgAStDuIhEpimhI2nAp5L8IapEJY_AByrBSSxFoIzIA2bAp2i6IgNcbN1nWTLpMRrOl_jf_pI5Wfp4F91kXQSJzpxPlUJ9ZhNFPxKysRtu-O96XUJyb5HhBgkd7IkVJrcXu9AQbfDOaghmVDtqPvkdFbs_4ooly6B_x1SBUvxsTJ_Vir97uUc-wKyxDa1uJoVq0SrwkdRwypNBdkpO15IUMr2KMboScXAFQd96IKb1iPM-FimjUa2L2izsR7esVp8MJI_sJNxQlWjeYq9mGKPcNeN2isdjpnOk1hhS6kYt_08kXzIy5A0f00==

图 1 sphinx-plantuml 工作原理

sphinx-plantuml 利用 https://plantuml.com 网站对 PlantUML 代码进行渲染. 构建的时候不需要渲染, 也不需要联网. 只有在文档被浏览时才会渲染, 因此浏览的时候需要联网. 由于是利用官方网站进行渲染, 因此构建环境无需配置 PlantUML 相关依赖.

sphinx-plantuml 安装

使用 python3 -m pip install sphinx-plantuml 安装 sphinx-plantuml.

然后在你的 conf.py 文件中添加插件的引用, 如下代码所示.

extensions = [
    ...
    'sphinxcontrib.plantuml',
    ...
]

sphinx-plantuml 使用

sphinx-plantuml 提供了 plantuml 命令. 你可以直接在 plantuml 中写 UML 语言, 比如 列表 1 所示的 reST 代码.

列表 1 可以直接 plantuml 环境中写 UML 代码
.. plantuml::
    :align: center

    @startuml
    Alice -> Bob: test
    @enduml

其渲染结果如下图所示.

https://www.plantuml.com/plantuml/svg/SoWkIImgAStDuNBCoKnELT2rKt3AJx9IA4ajBk5oICrB0Ke100==

图 2 列表 1 渲染效果

sphinx-plantuml 默认将图片渲染成 .svg, 如果你想渲染成 .png, 可以使用 :format: 参数指定渲染格式, 比如 列表 2 所示的 reST 代码.

列表 2 指定图片渲染格式
.. plantuml::
    :align: center
    :format: png

    @startuml
    Alice -> Bob: test
    @enduml

其渲染结果如下图所示.

https://www.plantuml.com/plantuml/png/SoWkIImgAStDuNBCoKnELT2rKt3AJx9IA4ajBk5oICrB0Ke100==

图 3 png 渲染效果

如果你想给图片添加标题, 可以使用 :caption: 参数指定标题, 如 列表 3 所示的 reST 代码.

列表 3 指定图片标题
.. plantuml::
    :align: center
    :format: png
    :caption: 苟利国家生死以, 岂因祸福避趋之

    @startuml
    Alice -> Bob: test
    @enduml

其渲染结果如下图所示.

https://www.plantuml.com/plantuml/png/SoWkIImgAStDuNBCoKnELT2rKt3AJx9IA4ajBk5oICrB0Ke100==

图 4 苟利国家生死以, 岂因祸福避趋之

Sphinx 内置的 figure 命令的大部分参数 plantuml 都支持, 比如你可以使用 :width: 参数来设置图片的大小, 如 列表 4 所示.

列表 4 指定图片宽度
.. plantuml::
    :align: center
    :format: png
    :width: 50%

    @startuml
    Alice -> Bob: test
    @enduml

其渲染结果如下图所示.

https://www.plantuml.com/plantuml/png/SoWkIImgAStDuNBCoKnELT2rKt3AJx9IA4ajBk5oICrB0Ke100==

图 5 50% 宽度的图片

备注

不是所有的 figure 的参数都支持, 因为无法提前获取图片的尺寸, :scale: 参数就无法支持.

如果你的 PlantUML 代码是在另一个文件中, 可以采用如 列表 5 所示代码实现.

列表 5 引用 PlantUML 代码文件
.. plantuml:: /umls/insert_html.uml
    :align: center
    :width: 50%
    :caption: 内嵌 HTML 示例

.. plantuml:: /umls/aws_demo.uml
    :align: center
    :width: 50%
    :caption: AWS 示例

.. plantuml:: /umls/c4_demo.uml
    :caption: C4 模型示例
    :format: svg
    :width: 50%
    :align: center

列表 5 中的代码的渲染效果如下所示.

https://www.plantuml.com/plantuml/svg/bP5DImCn48Rl-oi2tWIRBY98J8U2K3pepOl7QNP8GxF9aWzQ5V-xazKYVboSGuRClFEyGxBE1LEfe-_oteK94uvYYsPlKwnXk8q-9b4IXimj2gLJv-8fLc4m2BF3O4beqqGgqG25ZaNCLotd1DrlUQChWmELhQy4NsQdoLRvQp2x5rBzDRIiPJjFgfgvNS6JHVEiPGLsWRl7XtkX7HIqMZfWxdVvlF6dPPl8oYQY02w8DieEN3oeioN7PlE1EK1tmS4SDoBlT5mkheHYbz6gNIcJadBo6DfxBamSfOysNYwcO5-pGKyhbh_zHFJ_G_GpugPRKnZQjxq3

图 6 内嵌 HTML 示例

https://www.plantuml.com/plantuml/svg/bLNVRzem47xtN-6z1GHK7TiUgWdLIMX5ou-gWLMT-c8SZvacTcGxZTYq_UqxXq2Z54IN1_jyzzrtvozsScairJPF4sIUXSoefYbUKlQyqYgNSQ0IfR7LL1e8SMaH-Y0aI_AOvph1NsbXpfXAKoLx6N0CtaP9bYM2KIkKZBX-4Oo3BwM_b2HtesjgUK4tRnp7o0ALPhdbP-GX6jDq6TDNw_qfs-agbymrrLWUemcffKjgUDLgk94qLQ7VMFvlDdWJlXsFfLvpoJLDNFyiKNcyDqubi4J0-wgcK-3SS5qEnu1HU6lERkWBZPWMcQsPHpEiqdIrstBKtnllJbZcx9dRQggoQgSKpbsc96oEQAsAxKdr4pYwXp1-uqW__1IMru1InVmK1fexJGINIVoWx0WEeKKqlFUSqYqKZ4V3wTnRGlVb-ePy8r5mFxgRUslJ0SLR2C7R3iQpHUY1GYty6o4C3vcGxxDfrFTCt_bmzVYBu7OuzmmKwXH5qHFIS9PhOJSzfbfDMA9MfkE6GxW_zKBkNfBvy84yUZGJhIe4zubC_91uINc1weri0rUBQJ0VpQOUZK63D0NnJATc7wWKFax9P1RwNbpUa3hddFZZeSTsF4qIe76YuYwkv4IeCd0txWwm4mLVjDldjDrkuHMtJn8-V5Qm9ycKjExBLaB-3h3J15-SqwsZb_S6EywIODbklrBZjK5hWxiQIknwSwYFhsLsRhIFzu1nlOKviZq1YEkSVPSAEkrJ4NAHSXir-Hpqaqkl-nfjV7Rn0tM_k1AI5xNkBhcCtL_W7m==

图 7 AWS 示例

https://www.plantuml.com/plantuml/svg/VLDjQzim4FwkNt4BXMRWnL_wQOJGD0jReUdAaZ861IFBPqT4benqNj9_lxFZU0vD-yNevRbxNaw-3IGzrQKHdxHLfiuGfkecNjma2sS93pIf-78cmaxRIdfPGYhLhl2kjjd26UU1lBI1hz2I4DSUSzWILL_Zk3BIDfqdofLneCpeT43YybmhZ9y3-X3N_Es8ta6KBjK6am5GN3_C__nytYI_xpS_aeVbz-NZDo58aq5OlmR24ZeBa6bPDD9pbdlFHzuYmPsqxAdei48yCOspOrK7SYLwW0WMftK4e-bLmps3wTL0okp5mXpw4fS3RP4Jihi8zfgsKBLDfMdFG2h5kL4OmMSXZhpZz2WZ2UsMYTuHEEAhkJ5k7tg-0EJWhyOzQClMIadQMP2fgwdHeVqvQmJIPb3A7K8bNqkULvYCUY79ya3ZKchpNydoIxE7qFDls9nkvR6ZbLRU1PSJB0zgAss1WCE2flTvQvlp493xh4xh2nxNv3m6aCQSubHy05rC5vpsQKG3f-sZbAg1yGv9jKv_eUdd6y6RvFcb1OOnAhdZHpw0dkUoHfk5pcmpWwxc4NMnJPr_Cz8Fgbl7gytJiSMboZwqJjqjbpU_wpy=

图 8 C4 模型示例

其中三个 .uml 文件的下载链接如下: