選択したテキストフレーム内の漢字に対してルビをふる

今回は思いっきり他人の褌で相撲を取るエントリです。公開を快く許可してくださった市川せうぞーさんに感謝します。
このあいだからずっSocketのことを考えてまして、もっInDesignにからんだサンプルがないかと。
そこで思い出したのが、せうぞーさんが公開されている、ふりがな(ルビ)を追加するページ。
http://www.seuzo.jp/st/WebApp/yahoo_ruby.html
(参考)
http://d.hatena.ne.jp/seuzo/20080811/1218429275
http://d.hatena.ne.jp/seuzo/20080815/1218770848
Yahoo! JAPANのAPIエンジンを利用しているこのページを利用させていただいて、InDesign上で勝手にルビを振っちゃおうというスクリプトです。
以下にソースを掲載しますが、試すときはせうぞーさんの注意書きに従ってください。

このサービスYahoo! JAPANのWebサービスを利用しております。変換品質Yahoo! JAPANのAPIエンジンに依存します。変換結果についても無保証とさせていただきます。
サーバーの負担になるため、連続でのご使用はお控えください。10回/1日程度を限度とします。同IPからの連続投稿を発見した場合、サイトごとブロック措置を取らせていただきます。

//メインルーチン
if (app.selection.length == 1){
    if (app.selection[0].constructor.name == "TextFrame"){
        var txf = app.selection[0];
        if (txf.characters.length < 500) {
            var postString = rubyDialog();
            if (postString != "") {
                postString = "my_data=" + txf.contents + postString;
                var reply = getRubyString(postString);
                if (reply != "") setruby(txf, reply);
            }
        } else {
            alert("500文字以内のテキストフレームにしてください");
        }
    } else {
        alert("テキストフレームを1つ選択してください");
    }
} else {
    alert("テキストフレームを1つ選択してください");
}
//オプションのダイアログを表示
function rubyDialog() {
    var dlg = app.dialogs.add({name:"ルビ付加オプション"});
    dlc = dlg.dialogColumns.add();
    with (dlc.dialogRows.add()){
        staticTexts.add({staticLabel:"▼学年を指定してください"});
    }
    with (dlc.dialogRows.add()){
        var ddl = dropdowns.add({stringList:[
            "小学1年生向け。すべての漢字にふりがなを付けます。",
            "小学2年生向け。1年生で習う漢字にはふりがなを付けません。",
            "小学3年生向け。1〜2年生で習う漢字にはふりがを付けません。",
            "小学4年生向け。1〜3年生で習う漢字にはふりがなを付けません。",
            "小学5年生向け。1〜4年生で習う漢字にはふりがなを付けません。",
            "小学6年生向け。1〜5年生で習う漢字にはふりがなを付けません。",
            "中学生以上向け。小学校で習う漢字にはふりがなを付けません。",
            "一般向け。常用漢字にはふりがなを付けません。"
        ]});
    }
    with (dlc.dialogRows.add()){
        staticTexts.add({
            staticLabel:"▼パスワード(メールアドレス)を入力してください"
        });
    }
    with (dlc.dialogRows.add()){
        var teb = textEditboxes.add({minWidth:200});
    }
    if (dlg.show()) {
        rubyoption = "&kanji_del=|&furigana_del=《》"
            + "&grade=" + (ddl.selectedIndex + 1).toString()
            + "&pw=" + teb.editContents;
    } else {
        rubyoption = "";
    }
    dlg.destroy();
    return rubyoption;
}
//せうぞーさんのページに接続してルビ付きテキストを返してもらう
function getRubyString(postString) {
    postString = encodeURI(postString);
    var conn = new Socket;
    if (conn.open ( "www.seuzo.jp:80", "UTF-8" ) ) {
        conn.write ("POST /st/WebApp/yahoo_ruby.rb HTTP/1.0\n"
            + "Referer: http://www.seuzo.jp/st/WebApp/yahoo_ruby.html\n"
            + "Host: www.seuzo.jp\n"
            + "User-Agent: omachi-TEST/1.00 (Windows NT 6.0; U; ja)\n"
            + "Content-Length: " + postString.length + "\n\n"
            + postString);
        var reply = conn.read(999999);
        conn.close();
        reply = reply.substring(reply.indexOf("</h2>\n\n") + 6 );
        reply = reply.substring(0,reply.indexOf("<hr"));
    } else {
        reply = "";
    }
    return decodeURI(reply);
}
//テキストを元のテキストフレームに入れる
function setruby(txf, reply) {
    txf.contents = "";
    var mySentence =reply.split("|");
    for ( i = 0; i < mySentence.length; i ++ ) {
        var mystr = mySentence[i];
        var oya = mystr.substring(0,mystr.indexOf("《"));
        if (oya != "") {
            mystr = mystr.substring(mystr.indexOf("《") + 1);
            var ruby = mystr.substring(0,mystr.indexOf("》"));
            mystr = mystr.substring(mystr.indexOf("》") + 1);
            var lip = txf.insertionPoints.length - 1;
            txf.insertionPoints[lip].contents = oya;
            var oyachr = txf.characters.itemByRange(lip, lip + oya.length - 1);
            oyachr.rubyType = RubyTypes.GROUP_RUBY;
            oyachr.rubyString = ruby;
            oyachr.rubyFlag = true;
        }
        lip = txf.insertionPoints.length - 1;
        txf.insertionPoints[lip].contents = mystr;
    }
}

実行前

実行後

まだまだチューニングしないといけないのですが、いちおう、テキストにルビを振ることができました。
ルビYahoo! JAPANのAPIエンジンに依存していますので、グループルビしか作成できません。(だからあんまり実用性はないです、あくまでもデモ用ですね)
なお、こんな風に人様のホームページを勝手に使うことは、あんまりよろしくないです。しかRefererを偽装してるし。よい子も悪い子も決してまねをしないように