PlantUMLを使ってPythonでマインドマップを作成する方法

PlantUMLとは

概要

PlantUMLはUMLやガントチャートのような複雑な図形をテキストから作成するコンポーネントです。

PlantUML

VSCodeと連携させて即座に画像化したり、astahと連携させたりと多様な使い方が可能です。

今回はオンラインサーバを使用して作成した画像を取得するまでの処理をPythonで実装します。

必要な情報

PlantUMLを使用するにあたり、理解しておくべきことは大きく分けて3つあります。

Pythonでの実装

入力形式の変換

ファイル名はなんでも良いですが、ここでは「makemindmap.py」とし、以下を記述してください。

from zlib import compress
import base64
import string

class MakeMindMap:
    def __init__(self):
        self.url_base = "http://www.plantuml.com/plantuml/png/"

    def deflate(self,text):
        puml_str    = string.digits + string.ascii_uppercase + string.ascii_lowercase + '-_'
        b64_str     = string.ascii_uppercase + string.ascii_lowercase + string.digits + '+/'
        b64_to_puml = bytes.maketrans(b64_str.encode('utf-8'), puml_str.encode('utf-8'))

        zlibbled_str = compress(text.encode('utf-8'))
        compressed_string = zlibbled_str[2:-4]

        self.encoded = base64.b64encode(compressed_string).translate(b64_to_puml).decode('utf-8')
  • deflate関数の引数に文字列を入れると、PlantUMLの圧縮アルゴリズム沿って変換された文字列が出力されます。

画像の取得

画像の取得には requestライプラりを使用します。

from requests import request

    def get_image(self, filename):

        f = open(filename, 'wb')
        responce = requests.get(self.url_base + self.encoded)
        f.write(responce.content)
        f.close()
  • 先ほど作成したdeflate関数を実行した後に、get_image関数の引数にファイル名を指定して実行すると、指定したファイル名の画像が取得できる
  • requests.getはHTTPのGETメソッドに該当

まとめ

ここまでの一連の処理をまとめると、以下のようになります。

from zlib import compress
import base64
import string
import requests

from requests import request

class MakeMindMap:
    """マインドマップ作成クラス
    """
    def __init__(self):
        self.url_base = "http://www.plantuml.com/plantuml/png/"

    def deflate(self,text):
        """PlantUML APIを使用可能な形式へ圧縮・変換する

        Note:
            参考コード:
                https://github.com/lucsorel/py2puml

        Args:
            text (str): PlantUMLの入力

        """
        puml_str    = string.digits + string.ascii_uppercase + string.ascii_lowercase + '-_'
        b64_str     = string.ascii_uppercase + string.ascii_lowercase + string.digits + '+/'
        b64_to_puml = bytes.maketrans(b64_str.encode('utf-8'), puml_str.encode('utf-8'))

        zlibbled_str = compress(text.encode('utf-8'))
        compressed_string = zlibbled_str[2:-4]

        self.encoded = base64.b64encode(compressed_string).translate(b64_to_puml).decode('utf-8')

    def get_image(self, filename):
        """PlantUML APIを使用し画像を取得する

        Args:
            filename (str): 保存するファイル名
        """
        f = open(filename, 'wb')
        responce = requests.get(self.url_base + self.encoded)
        f.write(responce.content)
        f.close()

if __name__ == "__main__":
    text = '''
    @startuml
    Alice -> Bob: Authentication Request
    Bob --> Alice: Authentication Response
    @enduml
    '''
    mmm = MakeMindMap()
    mmm.deflate(text)
    mmm.get_image("img.png")

textの部分をPlantUMLの記法に沿ったデータに書き換えると、作成したいUML図などが画像として取得できます。

コメント