Donate269Patreon130


PlantUML テキスト エンコード

はじめに

PlantUMLでは、図のソースコードを英数字、アンダースコア、ハイフンだけのシンプルな文字列にエンコードする標準の方法を定めています。 これは、URLによって図を使ったコミュニケーションを円滑に行えるようにすることを目的としています(サーバーを参照)。 エンコード後の文字列をできるだけ短くするために圧縮が行われます。

エンコードされた文字列は、生成されたPNGファイルにもメタデータとして保存されます。つまり、画像ファイルから、その図のソースを取り出すことができます(サーバーを参照)。

圧縮

以下の圧縮アルゴリズムが利用可能です:

  1. Deflateアルゴリズムは小さい図の場合に有効です。
  2. バージョン1.2017.20以降のPlantUMLでは、Brotliアルゴリズムを利用することもできます。(issue #117)こちらは大きい図の場合に有効です。Brotliアルゴリズムであることを表すために、エンコード後の文字列の最初に0が追加されます(Deflateで0で始まるデータが生成されることはありません)。
  3. 単純な16進数(HEX)エンコーディングを使用することもできます。この場合、先頭に~hが追加されます。

原理

例えば、次のようなUMLのテキスト記述があった場合:

@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response
@enduml

このようにエンコードされます:

Syp9J4vLqBLJSCfFib9mB2t9ICqhoKnEBCdCprC8IYqiJIqkuGBAAUW2rO0LOr5LN92VLvpA1G00

この結果を得るには次の処理を行います:

  1. テキストをUTF-8でエンコードします。
  2. DeflateまたはBrotliアルゴリズムで圧縮します。
  3. Base64に類似したアルゴリズムを使って、ASCIIに再エンコーディングします。

Base64ではない理由

大きな理由は歴史的なものです。このフォーマットは最初、公開を目的としていませんでした。これを変更するのは今となっては遅すぎます。しかし、その差異は、使用する文字の順番のみです。

Base64は0~63の値を、次の配列に対応させます:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

PlantUMLでは、0~63の値を、次の配列に対応させます:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_

圧縮の比較

次の図をエンコードすると、

@startuml
skinparam backgroundColor #EEEBDC
skinparam handwritten true

skinparam sequenceArrowColor DeepSkyBlue
skinparam sequenceActorBorderColor DeepSkyBlue
skinparam sequenceLifeLineBorderColor blue
skinparam sequenceLifeLineBackgroundColor #A9DCDF
skinparam sequenceParticipantBorderColor DeepSkyBlue
skinparam sequenceParticipantBackgroundColor DodgerBlue
skinparam sequenceParticipantFontName Impact
skinparam sequenceParticipantFontSize 17
skinparam sequenceParticipantFontColor #A9DCDF
skinparam sequenceActorBackgroundColor aqua
skinparam sequenceActorFontColor DeepSkyBlue
skinparam sequenceActorFontSize 17
skinparam sequenceActorFontName Aapex

actor User
participant "First Class" as ParticipantA
participant "Second Class" as ParticipantB
participant "Last Class" as ParticipantC

User -> ParticipantA: DoWork
activate ParticipantA

ParticipantA -> ParticipantB: Create Request
activate ParticipantB

ParticipantB -> ParticipantC: DoWork
activate ParticipantC
ParticipantC --> ParticipantB: WorkDone
destroy ParticipantC

ParticipantB --> ParticipantA: Request Created
deactivate ParticipantB

ParticipantA --> User: Done
deactivate ParticipantA
@enduml

となります。

Running

PTE 表現は、 -encodeurl-decodeurlコマンドライン フラグをつけることで、使用できます。

以下のコードでは、このエンコードを実際に使っています。

シンプルな16進数(HEX)形式

DeflateやBrotliは複雑すぎると思う場合は、16進数(HEX)形式を使用することもできます。 この場合は、すべての文字を16進数形式でフォーマットするだけです。

例:

@startuml
Alice->Bob : I am using hex
@enduml

次のようになります:

407374617274756d6c0a416c6963652d3e426f62203a204920616d207573696e67206865780a40656e64756d6c

16進数(HEX)形式であることを示すために、PlantUMLサーバに送信するデータの先頭には~hを付ける必要があります。

http://www.plantuml.com/plantuml/uml/~h4073...

圧縮されていないので、図のサイズが大きくなるとURLが非常に長くなります。