PlantUMLとは
概要
PlantUMLはUMLやガントチャートのような複雑な図形をテキストから作成するコンポーネントです。
PlantUML
VSCodeと連携させて即座に画像化したり、astahと連携させたりと多様な使い方が可能です。
今回はオンラインサーバを使用して作成した画像を取得するまでの処理をPythonで実装します。
必要な情報
PlantUMLを使用するにあたり、理解しておくべきことは大きく分けて3つあります。
-
入力形式
PlantUMLの入力は@startuml
〜@enduml
までを一区切りとし、その中に図の情報を書きます。@startuml Alice -> Bob: Authentication Request Bob --> Alice: Authentication Response @enduml
この場合作成される図は以下のリンク先から取得される。
https://www.plantuml.com/plantuml/png/SoWkIImgAStDuNBAJrBGjLDmpCbCJbMmKiX8pSd9vt98pKi1IW80 -
圧縮アルゴリズム
詳しい説明は公式の説明書に委ねますが、PlantUMLのオンラインサーバを使用する場合は、入力形式で示した一連の文字列を画像のURLにおける/png/
以降SoWk..
に変換する必要があります。
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図などが画像として取得できます。
コメント