モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

dot言語の「デフォルトフォント」設定とレンダリングを行うスクリプトを作ってみた

ハンドル名とかぶっている…(汗

ともかく、実はいままでdot言語(とGraphviz)なるものがあることを知らず。 最近になって知り、そんな便利なものがあったのか!と感激したわけです。

しかし、いかんせん古めかしい?ものなのか、多少融通が効かない模様… 特に、全体のフォントを指定できないのは実に悲しい。

そこでググったところ、さすがstackoverflow、そのものずばりの解答がありました。 なるほどsvgにしてフォント名をsedで置き換えてしまう…これは目から鱗です。

そこでこのstackoverflowの話を元に、さらにinkscapeを経由してpngやらjpgにしてしまおう、と考え、その一連の行動をスクリプトにすることを思い立ちました。

inkscapeのexport周りは拡張子で面倒くさいことになりそうなので、png決め打ちにして、pngでないファイルが出力指定された場合はimagemagickを使うということにしました。 そのため、

の3つに依存するということになりました。

多少、オプション形式がdotコマンドと変わった上に、ものすごい厳選されたオプションしか使えなくなっているわけですが(汗

オイラ的な実用にはこれで十分かなぁ〜、と…

なにか簡単な説明図を描く時、いままでわざわざマウス動かしてinkscapeやdiaを使ってたわけですが、これで捗りそうです。

#!/bin/bash

fontname="IPA ゴシック"

while [ "$1" != "" ];do

    case $1 in
    -f | --fontname)
        fontname=$2
        shift 1
        ;;
    -o | --output)
        outputname=$2
        outputext=${outputname##*.}
        shift 1
        ;;
    -h | --help)
        linenum=`cat $0 | grep -n -e '^#--*#' | sed -e 's/:.*//g'`
        head -n $linenum $0
        exit 0
        ;;
    * )
        ext=${1##*.}
        if [ "$ext" = "dot" ];then
            inputfile=$1
        else
            echo "[WARNING] unknown option $1 ignored."
        fi
        ;;
    esac

shift 1
done
#--------------------#

curdate=`date +"%y%m%d_%H%M%S"`
basefontname="Times,serif"
workfilename="/tmp/${curdate}_tmp_dot.svg"


if [ "$outputname" = "" ];then
    echo "[ERROR]:no output filename set.quitted."
    exit 1
fi

if [ "$outputext" != "svg" ];then
    convedname=$outputname
    outputname="/tmp/${curdate}_conv_dot.svg"

    convedext=${convedname##*.}
    if [ "$convedext" != "png" ];then
        finalimg=$convedname
        convedname="/tmp/${curdate}_conv_dot.png"
    fi


fi

dot $inputfile -Tsvg -o${workfilename}
sed "s/${basefontname}/${fontname}/g" $workfilename > $outputname

rm $workfilename

# Do not forget to rasterize it.
if [ "$convedname" != "" ];then
    inkscape --file=$outputname --export-png=$convedname
    if [ -e "$convedname" ];then
        rm $outputname

        if [ "$finalimg" != "" ];then
            convert $convedname $finalimg
            rm $convedname
        fi

    else
        echo "[WARNING] 画像ファイルが生成されませんでした.そのため中間ファイル ${outputname} をそのまま残しました。"
    fi

fi