はい、2回目と題しましたが、ようは昨日上げたコードを修正してみました、というだけなのですが。
余計な物を取り除いたのもそうですが、選択必須にして TextFrame 判別をいれて要所で alert を出すようにしました。後は変えてないつもりです。
//-------------------------------
//@target "indesign";
var aDoc=app.activeDocument;
var aPgObj;
var aObj;
var feature1;
var feature2;
app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "〓([一-龠々]{1,})(《[ぁ-ん]{1,}》)";
rubyStart();
function rubyStart(){
try{
rubyMain();
function rubyMain(){
aPgObj=aDoc.selection;
for (var i=0; i<aPgObj.length; i++){
if(aPgObj[i].constructor.name !== "TextFrame"){
alert("テキストボックスを選択してください");
exit();
}
if(aPgObj[i].contents !== ""){
var result = aPgObj[i].findGrep();
if(result){
for(l=0;l<result.length;l++){
result[l].select();
aStr=result[l].contents;
feature2=rubySlice(aStr);
var sStr=aStr.substr(1,feature2[1]-2);
var rubyStr=feature2[0];
var sNum=feature2[1];
result[l].select();
aObj = aDoc.selection[0];
aObj.contents=aObj.contents.replace(aStr,sStr);
aObj.rubyFlag = true;
aObj.rubyString = rubyStr;
if(aObj.length<2){
aObj.rubyType = RubyTypes.PER_CHARACTER_RUBY;
}else{
aObj.rubyType = RubyTypes.GROUP_RUBY;
}
}
}
}
}
}
//-------------------------------
function rubySlice(rsltStr){
for(var x=0; x<rsltStr.length; x++){
//cutStr = rsltStr.charAt(k);
if(rsltStr[x] != "《" ) continue;
var s=x+1;
}
var remStr=rsltStr.slice(s,rsltStr.length-1);
var sliNum=s;
return[remStr,sliNum];
}
}catch (e) { }
};
alert("終了しました");
app.findGrepPreferences.findWhat = "";
app.changeGrepPreferences.changeTo = "";
//-------------------------------
もっといい書き方があると思うのデスが、いまはこれが精一杯。 catch(e) が何を意味しているのかなんてよくわかっていません。
一応、空のTextFrameを無視したり、複数のTextFrameでも動作したりします。ただ、おそらく仕様だと思うのですが、TextFrameに表示しきれなくて隠れた(オーバーフローの)テキストは無視されてしまいます。 select() してるからだと思いますが、これをやめると rubyFlag がいろいろめんどくさいなあと思って、とりあえず保留中です…
(´・ω・`)
※コメント投稿者のブログIDはブログ作成者のみに通知されます