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