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

今回は思いっきり他人の褌で相撲を取るエントリです。公開を快く許可してくださった市川せうぞーさんに感謝します。
このあいだからずっと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を偽装してるし。よい子も悪い子も決してまねをしないように

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

  1. 名前:せうぞー 投稿日:2008/10/20(月) 18:45:14 ID:77b7caefd 返信

    ご紹介いただき、ありがとうございます。
    世の中にはけっこうたくさんのwebserviceがありますから、こうした手法でさまざまなリソースが使えるのはとてもよいことだと思っています。
    ちなみにわたしは、エディタを使ってこんあ感じでルビにしております。
    http://d.hatena.ne.jp/seuzo/20080603/1212480415

  2. 名前:お~まち 投稿日:2008/10/20(月) 19:12:09 ID:77991d096 返信

    > ご紹介いただき、ありがとうございます。
    いやいやとんでもない。こちらこそ、色々紹介していただいてて。おまけにハッキングまがいの行為なのに快く許諾いただきありがとうございます。

  3. 名前:tk3 投稿日:2008/10/23(木) 21:28:56 ID:a602b1407 返信

    スクリプト、大変参考になりました。
    おかげ様で、Socketを利用して「Yahoo! JAPANのWebサービス」の「ふりがな」を直接叩くスクリプトを完成させることができました。

  4. 名前:お~まち 投稿日:2008/10/24(金) 13:24:19 ID:eb2b95f0c 返信

    > おかげ様で、Socketを利用して「Yahoo! JAPANのWebサービス」の「ふりがな」を直接叩くスクリプトを完成させることができました。
    おー、よかったですね。役に立って何よりです。今後ともよろしくお願いします。