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