HTML Tidyをサクラエディタのマクロから呼び出す

パラノイアちっくにコードの自動整形がダイスキなので、Eclipseの一番好きなプラグインはformat on saveだったりします。なのでEclipse 3.3で本家に取り込まれるのがとても嬉しいのですが、HTML editor系のフォーマットが求めるものではなかったし、HTMLを編集するくらいでEclipseを起動するのもヘビーだったので、少し調査。
でも、HTMLエディタと言われてる類のものには自動整形はないみたい。
とはいえ、DreamWeaverを買うようなお金もないし、emacsをこのためだけに使うのもやっぱり重い気がしたので、けっきょくHTML Tidyに落ち着いて、せっかくなのでサクラエディタから呼び出すようにしてみた。

たぶん、バージョン1.5.11くらい以降じゃないと動かない。はじめ、1.5.3で動かそうとしてて、

GetCharCode()

がなくて動かなかったけど、exeを最新の1.5.16.0に変えたら動いた。

コード

(function(){
    var _tidy_home = "C:\\tidy_jp_win\\";
    var _tidy_bin = "bin\\tidy.exe";
    var _tidy_conf = "sh_tidy.conf";
    var _temp_file = _tidy_home + ".temp_for_tidy";

    var _charcode_table = ["shift_jis", "iso-2022-jp", "x-euc-jp", "unicode", "utf-8", "utf-7", "unicodeBE"];

    Editor.ExecCommand(_tidy_home + _tidy_bin
                         + " -quiet -config " + quote(_tidy_home + _tidy_conf)
                         + " -o " + quote(_temp_file)
                         + " " + quote(Editor.GetFileName())
                       , 0);

    // read temp file
    var _f_text = read_by_ado();

    // del all
    Editor.SelectAll();
    Editor.Delete();

    // paste
    Editor.InsText(_f_text);

    function quote(_src) {
        return "\"" + _src + "\"";
    }

    function read_by_ado() {
        var stream = new ActiveXObject("ADODB.Stream");
        stream.Type = 2;
        stream.Charset = _charcode_table[Editor.GetCharCode()];
        stream.Open();
        stream.LoadFromFile(_temp_file);
        var _text = stream.ReadText();
        stream.close();
        return _text;
    }

    function read_by_fso() {
        var ForReading = 1;
        // cannnot select charset!
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var ts = fso.OpenTextFile(_temp_file, ForReading);
        var _f_text = ts.ReadAll();
        ts.Close();
        return _f_text;
    }
})();

快適だ!

でも、ActiveXObjectとか、ADOはやっぱり全然理解しないまま使ってます。
そしてMSDNの使い方がわからなくて、リファレンスを調べるのにも一苦労しちゃったよ!
MSDNのなかに入って検索しないといけないんだね!

始めに書いたやつ(ADOとか使わない版)

一番始めに書いたときはこんな感じに書いてたけど、ファイルを直接更新して開き直すとかだとアンドゥも効かなくなってありえないのでADOを使うようにした。

(function(){
    var _tidy_home = "C:\\tidy_jp_win\\";
    var _tidy_bin = "bin\\tidy.exe";
    var _tidy_conf = "sh_tidy.conf";

    Editor.ExecCommand(_tidy_home + _tidy_bin
                         + " -m -quiet -config " + quote(_tidy_home + _tidy_conf)
                         + " " + quote(Editor.GetFileName())
                       , 0);
    Editor.FileReopen(1);

    function quote(_src) {
        return "\"" + _src + "\"";
    }
})();

HTML Tidy

tidy.confはこんな感じ。

indent-cdata: yes
lower-literals: yes
output-html: yes
char-encoding: raw
indent: yes
indent-spaces: 2
vertical-space: yes
wrap-attributes: yes
tidy-mark: no