テキストファイルをソースに、UML図を作れるツール。しゅごい。(というお題目で始めたのにどうしてこうなった)
走れメロス(前20段落)の状態遷移図です。(オチ)
出力用ワンライナー
返ってこなくてもバグではありませんし、JVMの設定などをしてないとそもそも例外が飛びます(全文だとJava以前にDotの実行から返ってこずTimeoutしますが。。。)。
aozora books --title "走れメロス" | jq '.[0].book_id' | xargs aozora content --format html --id | sed '1,/id="contents"/d' | sed '/class="chitsuki_1"/,$d' | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' | sed 's#<[^>]*>##g' | tr -d \\r | sed 's#[ 、「」]##g' | head -n 20 | mecab | sed 's#\t.*##' | grep -v -e EOS -e '^$' | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' | awk '!a[$0]++' | cat <(echo @startuml) - <(echo @enduml) | plantuml -p > merosu_20.png
解説
青空文庫にCLIでアクセスできる aozora-cli
を使って、ワンライナーで走れメロスの状態遷移図(アクティビティ図)を作ったよ!
インストール
まずはインストール。
sudo apt install plantuml fonts-ricty-diminished
Rictyフォントをインストールしているのは、Windows Subsystem for Linum (Bash on Windows) には、デフォルトだと日本語が入っていないからです。
$ pip3 install aozora-cli The program 'pip3' is currently not installed. You can install it by typing: sudo apt install python3-pip
ʅฺ(・ω・。)ʃฺ??
$ apt install python3-pip ...... $ pip3 install aozora-cli Collecting aozora-cli Downloading aozora-cli-0.0.3.tar.gz Collecting requests (from aozora-cli) ......
aozora books --title "走れメロス" | jq '.[0].book_id' | xargs aozora content --format html --id | sed '1,/id="contents"/d' | sed '/class="chitsuki_1"/,$d' | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' | sed 's#<[^>]*>##g' | tr -d \\r | sed 's#[ 、「」]##g' | head -n 20 | mecab | sed 's#\t.*##' | grep -v -e EOS -e '^$' | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' | awk '!a[$0]++' | cat <(echo @startuml) - <(echo @enduml) | plantuml -p > merosu_20.png java.lang.NegativeArraySizeException
(#^ω^)
$ sudo vim `which plantuml` $ tail -n 1 `which plantuml` $JAVA -Xmx4096m -jar /usr/share/plantuml/plantuml.jar ${@}
で再度実行したらできます。
まとめ
plantumlもaozora-cliも青空文庫もしゅごい。
おまけ
1文
aozora books --title "走れメロス" | jq '.[0].book_id' | xargs aozora content --format html --id | sed '1,/id="contents"/d' | sed '/class="chitsuki_1"/,$d' | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' | sed 's#<[^>]*>##g' | head -n 1 | tr -d \\r | sed 's#[ 、「」]##g' | sed 's#\([^。]*。\).*#\1#' | mecab | sed 's#\t.*##' | grep -v -e EOS -e '^$' | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' | awk '!a[$0]++' | cat <(echo @startuml) - <(echo @enduml) | plantuml -p > merosu_1.png
1段落
aozora books --title "走れメロス" | jq '.[0].book_id' | xargs aozora content --format html --id | sed '1,/id="contents"/d' | sed '/class="chitsuki_1"/,$d' | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' | sed 's#<[^>]*>##g' | head -n 1 | tr -d \\r | sed 's#[ 、「」]##g' | mecab | sed 's#\t.*##' | grep -v -e EOS -e '^$' | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' | awk '!a[$0]++' | cat <(echo @startuml) - <(echo @enduml) | plantuml -p > merosu.png
整形ワンライナー
aozora books --title "走れメロス" \ | jq '.[0].book_id' \ | xargs aozora content --format html --id \ | sed '1,/id="contents"/d' \ | sed '/class="chitsuki_1"/,$d' \ | sed 's#<ruby><rb>\([^<]*\)</rb><rp>[^<]*</rp><rt>\([^<]*\)</rt><rp>[^<]*</rp></ruby>#\1#g' \ | sed 's#<[^>]*>##g' \ | tr -d \\r \ | sed 's#[ 、「」]##g' \ | head -n 20 \ | mecab \ | sed 's#\t.*##' \ | grep -v -e EOS -e '^$' \ | awk 'NR==1{print "(*) \""$0"\""}NR!=1{print "\""p"\" \""$0"\""}{p=$0}END{print "\""$0"\" (*)"}' \ | awk '{a[$0]++;i[NR]=$0;a1[NR]=$1;a2[NR]=$2}END{for(idx=1;idx<=NR;idx++){print a1[idx]" -->["a[i[idx]]"] "a2[idx]}}' \ | awk '!a[$0]++' \ | cat <(echo @startuml) - <(echo @enduml) \ | plantuml -p > merosu_20.png