javascrptのループ処理について

[7421]javascrptのループ処理について 投稿者:きじまえみ 投稿日:2013/04/03 17:08:52
indesignのjavascrptを勉強中です。
公開されているスクリプトを参考に、ルビの一括置換を考えているのですが
選択されたテキストボックスを処理するものだった為、
ドキュメント全体のテキストボックスを対象にできればと模索中です。

ループ処理が上手くいっていない気がするのですが
どうにもつまずいて進まなくなってしまったので
ヒントだけでもいただけるとありがたいです。
どうぞよろしくお願いいたします。


★作業環境★
MacOS:10.6.8
indesign:CS4


★javascrpt
var rubyPos = [];
var count = 0;

//ココがおかしい気がしています
(function(){
var docObj = app.activeDocument;
for (var i=0; i<docObj.pages.length; i++)
{
var selObj = docObj.pages[i].textFrames;
for (var j=0; j<selObj.length; j++)
{
checkRuby(selObj[j]);
setRuby(selObj[j]);
}
}
})();
//ココまで

var startRubyChar = "(";
var endRubyChar = ")";
var srcText = tfObj.parentStory.contents
for (var i=0; i<srcText.length; i++){
var c = srcText[i];
if (c != startRubyChar) continue;
var sp = i;
for (var j=i; j<srcText.length; j++){
if (srcText[j] != endRubyChar) continue;
var ep = j;
break;
}
var rStr = srcText.substring(sp+1,ep);
var flag = rStr.match(/^[ぁ-ん|ァ-ン]/g);
if (flag != null){
for (var k=sp-1; k>-1; k--){
c = srcText.charAt(k);
flag = c.match(/^[一-龠|々]/);
if (k == 0) {
k = -1;
flag = null;
}
if (flag != null) continue;
var spk = k+1;
rubyPos[count] = [spk, sp, sp+1, ep];
count++;
break;
}
}
}
}

function setRuby(tfObj){
for (var i=count-1; count>1; i--){
try{
var rubyStr = tfObj.parentStory.contents.substring(rubyPos[i][2], rubyPos[i][3]);
}catch(e){ return; }
tfObj.parentStory.characters.itemByRange(rubyPos[i][2]-1, rubyPos[i][3]).remove();
charaObj = tfObj.parentStory.characters.itemByRange(rubyPos[i][0], rubyPos[i][1]-1);
charaObj.rubyFlag = true;
charaObj.rubyType = RubyTypes.groupRuby;
charaObj.rubyString = rubyStr;
}
}
[7422]Re: javascrptのループ処理について 投稿者:dot 投稿日:2013/04/03 18:03:22
ページ毎に分けなくても、
app.activeDocument.textFrames
でドキュメント上のテキストフレームを拾えますよ。
[7423]Re: javascrptのループ処理について 投稿者:きじまえみ 投稿日:2013/04/03 18:38:18
dot様
返信どうもありがとうございました。
いただいたお返事を参考に、怪しかった箇所を
下記の形に修正してみました。


(function(){
var docObj = app.activeDocument.textFrames;
for (var j=0; j<docObj.length; j++)
{
checkRuby(docObj[j]);
setRuby(docObj[j]);
}
})();


javascriptエラーを出しながら、一部のテキストボックスのみ
変換される状態になったのですが、何か根本的に
思い違いをしているのでしょうか……?
たびたび申し訳ありません。
[7424]Re: javascrptのループ処理について 投稿者:流星光輝 投稿日:2013/04/04 00:08:42
横槍ですみませんが、
checkRuby関数は、書いてないですけれども、
存在するんですよね?
ソースコード全部載せないと何で躓いているのか
トレースして分析することができないと思うのですが、
いかがでしょうか?
[7425]Re: javascrptのループ処理について 投稿者:dot 投稿日:2013/04/04 10:29:19
処理できていないテキストボックスは、
グループ化されているテキストボックスでしょうか?

もし、グループ化されているのであれば、
グループ化されているテキストボックスを拾い上げる必要があります。
[7426]Re: javascrptのループ処理について 投稿者:きじまえみ 投稿日:2013/04/04 11:24:18
流星光輝様
ご指摘ありがとうございました。
確認したところ、投稿時に1行抜けてしまっていたようです。

//ココまで の後に
function checkRuby(tfObj){
上記で、ソースコードは全てになります。


dot 様
ご返信ありがとうございます。データを確認したところ
グループ化されているテキストボックスはありませんが、連結しているボックスはありました。試しに連結を解除し、再度かけてみましたが同様の結果でした。

attached image
[7427]Re: javascrptのループ処理について 投稿者:流星光輝 投稿日:2013/04/04 12:21:00
ソース1行足して、

鰤(ぶり)鰤(ぶり)鰤(ぶり)鰤(ぶり)鰤(ぶり)
みたいな文字列の入ったTextFrameを複数用意してテストしました。

try ~ catchでトラップしている範囲外で
エラーしてるんですね。

function setRuby(tfObj){
for (var i=count-1; count>1; i--){
try{
var rubyStr = tfObj.parentStory.contents.substring(rubyPos[i][2], rubyPos[i][3]);
tfObj.parentStory.characters.itemByRange(rubyPos[i][2]-1, rubyPos[i][3]).remove();
charaObj = tfObj.parentStory.characters.itemByRange(rubyPos[i][0], rubyPos[i][1]-1);
charaObj.rubyFlag = true;
charaObj.rubyType = RubyTypes.groupRuby;
charaObj.rubyString = rubyStr;
}catch(e){ return; }
}
}

のようにsetRubyの処理を書き換えたら、
エラーしなくなりましたけれども、
そういうことではなくて?
[7428]Re: javascrptのループ処理について 投稿者:きじまえみ 投稿日:2013/04/04 13:06:42
流星光輝様
ご返信ありがとうございます。そうです、ご指摘の内容の通りです。
対象を選択テキストボックスにしていた時は動作していたので
疑っていなかったところでした。
大変助かりました。どうもありがとうございました。


dot様
おかげさまで、理想の結果を得ることができました。
グループ化の件も、勉強になりました。
お手数をおかけしました。どうもありがとうございました。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)