タブ名でまとめてエクスポートしたい
Draw.io はとても便利で、いつもvscode内で使っているのだけど、エクスポートが面倒くさい。個々の絵にはタブに名前がつけられるので、このタブの名前をファイル名にしてまとめてエクスポートする方法がありそうなものだけど、どうもないらしい。
デスクトップアプリを使うと、個々のタブを個別にエクスポートする事はできるし、その際にファイル名を指定することもできるのだけど、タブの名前を取り出す方法がわからない。Pythonのdrawioパッケージ?みたいなものを使うとできるらしいが、このためだけに導入するのも、管理上面倒だと思っていたら、drawioファイルはXMLファイルで普通に読めるらしいのでやってみた。
Draw.io ファイルの構造
適当にDraw.ioファイルを作って、タブを2つ作って開いてみると以下のようになっている。mxfile の中に diagram がネストされていて、diagram の name 属性にタブ名が入っている。
<mxfile host="65bd71144e">
<diagram id="cN5VryQN1u5QBBV3Ox7x" name="Page-1">
<mxGraphModel dx="937" dy="366" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
</root>
</mxGraphModel>
</diagram>
<diagram id="Gwga_LjCDhwcRshZ86WP" name="Page-2">
<mxGraphModel dx="937" dy="366" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
</root>
</mxGraphModel>
</diagram>
</mxfile>
タブ名の取り出し
ということで、このファイルは標準のXMLパッケージを使って読めばいいので、以下のようにすればよい。diagramという要素を探してそのname属性をプリントしているだけ。
import xml.etree.ElementTree as ET
import sys
def main(filename):
try:
with open(filename, "r") as f:
xml_string = f.read()
root = ET.fromstring(xml_string)
for d in root.findall("diagram"):
print(d.attrib['name'])
except Exception as e :
print(f"Got exception {e}", file=sys.stderr)
sys.exit(-1)
if __name__ == "__main__":
if len(sys.argv) < 2:
print(f"Usage: python {sys.argv[0]} DRAWIO_FILENAME")
main(sys.argv[1])
タブ名でのエクスポート
あとは、タブ名が分かれば後はdrawio コマンドを使って出力してやればいい。上のコードをextract_tabnames.pyとして保存してあるとすると、下記のようにすればいい。
#!/bin/bash
target_dir=../figs
counter=1
for f in `python extract_tabnames.py $1`; do
drawio --export --format svg -p $counter --output $target_dir/$f.svg $1
((counter++))
done
-p オプションでタブの番号を指定する。タブ番号は1オリジンなのだけど、なぜか0にしてもエラーがでずに、1枚目がでてくる。つまり0と1で挙動が同じになる。こういうのやめてほしい。
所感
タブ名のリストを出力する機能ぐらい、デスクトップコマンドに用意されていてもいいと思うのだけど、なんでないのだろう。。