日本語対応のditaaをpandocで使用する

PlantUMLなどでditaaを使用してみたが、ditaaは便利そうなのに日本語が非対応で残念。 しかし、日本語に対応したditaaも存在する。

これをpandocのフィルタと組み合わせて、pandocのマークダウンから直接、日本語ditaaを使用してみる。

作業ディレクト

jarファイルなどパスが通っているところに置かれていれば、どこでも良いと思うが、今回は~/binにパスを通して使用する。

jditaa.jarの入手

$ cd ~/bin
$ wget https://github.com/luozengbin/dot.emacs.d/raw/master/extra/org-ditaa/jditaa.jar

pandoc filter(codeblock-diagrams.pl)の入手

$ cd ~/bin
$ wget https://gist.githubusercontent.com/bpj/5454765371a4e3c1a8354fedced1cc6b/raw/0802b99341be3ca5abb3e1d49b1e6f5f79d367f3/codeblock-diagrams.pl
$ chmod +x ./codeblock-diagrams.pl

フィルタをjditaaに対応するために修正する。

--- codeblock-diagrams.pl~   2016-10-31 11:20:08.963133308 +0900
+++ codeblock-diagrams.pl 2016-10-31 11:21:13.333003211 +0900
@@ -93,7 +93,7 @@ my %ditaa;
 {
     my $loc = dirname(abs_path($0));
     my $home = abs_path($ENV{HOME});
-    my %jar = (png => "ditaa0_6b.jar", pdf => "DitaaEps.jar");
+    my %jar = (png => "jditaa.jar");
     JAR:
     while ( my($fmt, $name) = each %jar ) {
         PATH:

Pandoc::Elemntsの入手

$ cpan install Pandoc::Elements

実行コマンド

次のように使用する。

$ pandoc -F codeblock-diagrams.pl [-M dia_format=pdf|png] [PANDOC-OPTIONS] [FILE-NAME ...]

実行例

サンプル

```{.ditaa .no-separation scale=1.2 .fig_}

    +----------+      +--------+     +--------+  +-----+  +-----+  +-----+
    |          |      |        |     |        |  |     |  |     |  |     |
    | markdown |----->| pandoc |---->| output |  | img |  | img |  | img |
    | {d}      |      |        |     | {d}    |  | {d} |  | {d} |  | {d} |
    |          |      +--------+     |        |  |     |  |     |  |     |
    +----------+         |  ^        +--------+  +-----+  +-----+  +-----+
                         v  |                       ^        ^        ^ 
                      +--------+   +--------+       |        |        |     
                      |        |-->| ditaa  |-------+        |        |
                      | filter |   +--------+                |        |
                      |        |-->| dot    |----------------+        |
                      |        |   +--------+                         |
                      |        |-->| rdfdot |-------------------------+
                      +--------+   +--------+
```

次のようになる。

[f:id:mickey_happygolucky:20161101033910p:plain]

日本語

```{.ditaa .no-separation scale=1.0 .fig_}

    +----------+      +--------+     +--------+  +-----+  +-----+  +-----+
    |          |      |        |     |        |  |     |  |     |  |     |
    | マーク   |      |        |     |        |  |     |  |     |  |     |
    | ダウン   |----->| pandoc |---->| output |  | img |  | img |  | img |
    | {d}      |      |        |     | {d}    |  | {d} |  | {d} |  | {d} |
    |          |      |        |     |        |  |     |  |     |  |     |
    +----------+      +--------+     +--------+  +-----+  +-----+  +-----+
                         |  ^                       ^        ^        ^ 
                         v  |                       |        |        |
                      +--------+   +--------+       |        |        |     
                      |        |-->| ditaa  |-------+        |        |
                      | filter |   +--------+                |        |
                      |        |-->| dot    |----------------+        |
                      |        |   +--------+                         |
                      |        |-->| rdfdot |-------------------------+
                      +--------+   +--------+
```

次のようになる。

[f:id:mickey_happygolucky:20161101033916p:plain]

ditaaで絵を書くときはRictyなどの等幅フォントがよい。

「->classes is deprecated. Use [ split ‘ ’, $e->class ] instead」のエラー (2017/06/12 追記)

Ubuntu 16.04.2 LTSでこれを実行すると、当時とはPerlのバージョンが異なっているせいか、上記のようなエラーが発生する。

指示に従って次のように修正する。

--- codeblock-diagrams.pl.old    2017-06-12 23:08:06.907006140 +0900
+++ codeblock-diagrams.pl 2017-06-12 23:24:31.336718744 +0900
@@ -162,7 +162,7 @@ print $document->to_json;
 sub codeblock_dia {
     my($code_block) = @_;
     # 'CodeBlock' eq $code_block->name or return;
-    my($type, @classes) = @{ $code_block->classes };
+    my($type, @classes) = @{ [ split ' ', $code_block->class ] };
     return unless $type;
     return unless $diagramtypes{$type};
     my $kvs = $code_block->attr->[2];

これでエラーが回避できる。