Emacs org-modeを使ってみる: (42) 日本語化ditaaの利用

このエントリーをはてなブックマークに追加

今回は,日本語化したditaaの利用方法を説明する.
なおUbuntu 8.04 LTSとEmacs22上で, org-6.34c (2010年1月10日リリース)の利用を前提にしている.

Jditaaプログラム

ditaaを使ってみる に書いたように,各日本語文字の後ろに空白を付け加えれば良い.
そこで,以下のように日本語文字の後ろに空白を付け加える Jditaa.java プログラムを作成した.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.File;
import java.io.IOException;
import java.lang.Character.UnicodeBlock;
import java.util.HashMap;
import java.util.Map;

import org.stathissideris.ascii2image.core.CommandLineConverter;

public class Jditaa {
    static Map<UnicodeBlock,Integer> widthMap;
    
    static {
        widthMap = new HashMap<UnicodeBlock,Integer>();
        widthMap.put(UnicodeBlock.ARROWS, 2);
        widthMap.put(UnicodeBlock.CJK_COMPATIBILITY, 2);
        widthMap.put(UnicodeBlock.CJK_COMPATIBILITY_FORMS, 2);
        widthMap.put(UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS, 2);
        widthMap.put(UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION, 2);
        widthMap.put(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS, 2);
        widthMap.put(UnicodeBlock.ENCLOSED_CJK_LETTERS_AND_MONTHS, 2);
        widthMap.put(UnicodeBlock.HIRAGANA, 2);
        widthMap.put(UnicodeBlock.KATAKANA, 2);
    }

    public static int charWidth(char ch) {
        UnicodeBlock block = UnicodeBlock.of(ch);
        Integer w = widthMap.get(block);
        if (w != null) {
            return w;
        }
        return 1;
    }
    
    public static void jditaa(File in, File out) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(in));
        BufferedWriter writer = new BufferedWriter(new FileWriter(out));
        while (true) {
            String line = reader.readLine();
            if (line == null)
                break;
            StringBuilder s = new StringBuilder();
            for (int i = 0; i < line.length(); i++) {
                char ch = line.charAt(i);
                s.append(ch);
                if (Character.isHighSurrogate(ch)) {
                    i++;
                    s.append(line.charAt(i));
                } else {
                    int w = charWidth(ch);
                    for (int k = 1; k < w; k++)
                        s.append(' ');
                }
            }
            s.append('\n');
            writer.write(s.toString());
        }
        writer.close();
        reader.close();
    }
    
    public static void main(String[] args) {
        if (args.length >= 2) {
            try {
                int i = args.length - 2;
                File ditaaFile = new File(args[i]);
                if (ditaaFile.exists()) {
                    File tmpFile = File.createTempFile("temp", "ditaa");
                    tmpFile.deleteOnExit();
                    jditaa(ditaaFile, tmpFile);
                    System.out.println(ditaaFile + " --> " + tmpFile);
                    args[i] = tmpFile.getAbsolutePath();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        CommandLineConverter.main(args);
    }

}

インストール

以下のようにして,jditaa.jar ファイルを作成する.なお ditaa.jar ファイルは, org-6.34c.zip を展開した時にできた org-6.34c/contrib/scripts/ ディレクトリ中にある.

  $ cp ditaa.jar jditaa.jar
  $ javac -cp jditaa.jar Jditaa.java
  $ echo "Main-Class: Jditaa" >manifest
  $ jar umf manifest jditaa.jar Jditaa.class

また .emacs ファイル等で,jditaa.jarのパスを指定する.

(setq org-ditaa-jar-path "~/jditaa.jar")

コマンドラインからの利用方法

まず,入力ファイルを準備する.文字コードは,利用するJavaデフォールトエンコーディングを利用すること(Ubuntuの場合はUTF-8).

/-------------+-------------\
|cRED 赤色    |cBLU 青色    |
+-------------+-------------+
|cGRE 緑色    |cPNK 桃色    |
+-------------+-------------+
|cBLK 黒色    |cYEL 黄色    |
\-------------+-------------/

Emacsで作成する場合は,Emacs picture-modeの拡張 を利用すると便利.
コマンドラインからは,以下のように利用する.引数の最後から二つ目が入力ファイル名になるようにすること.つまり,オプションを指定する場合は,入力ファイル名の前に指定すること.

  $ java -jar jditaa.jar -s 2 input output.png

orgファイル中での利用

以下は,orgファイル中での利用例である.

#+TITLE: ditaaのテスト
#+AUTHOR: 屯遁
#+EMAIL:
#+LANGUAGE: ja
#+OPTIONS: toc:nil num:nil author:nil creator:nil

#+BEGIN_DITAA images/ditaa-test.png -s 2
/-------------+-------------\
|cRED 赤色    |cBLU 青色    |
+-------------+-------------+
|cGRE 緑色    |cPNK 桃色    |
+-------------+-------------+
|cBLK 黒色    |cYEL 黄色    |
\-------------+-------------/
#+END_DITAA

「C-c C-c h」でHTMLにエクスポートすると,以下のようになる.


バグなど

  • 特定のUnicodeブロックを,幅2の文字として処理している. Emacsやその他のエディタの処理とは異なるかもしれない.
  • Javaデフォールトエンコーディング以外に対応していない. Reader, Writerのエンコーディングを指定する必要があるかもしれない.
  • 引数の最後から二つ目が入力ファイル名と決めて,処理している.オプションを指定する場合は,入力ファイル名の前に指定すること.