[ 掲示板に戻る ]

記事No.7426に関するスレッドです

javascrptのループ処理について / きじまえみ
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;
}
}

No.7421 2013/04/03(Wed) 17:08:52
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28

Re: javascrptのループ処理について / dot
ページ毎に分けなくても、
app.activeDocument.textFrames
でドキュメント上のテキストフレームを拾えますよ。

No.7422 2013/04/03(Wed) 18:03:22
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)

Re: javascrptのループ処理について / きじまえみ
dot様
返信どうもありがとうございました。
いただいたお返事を参考に、怪しかった箇所を
下記の形に修正してみました。


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


javascriptエラーを出しながら、一部のテキストボックスのみ
変換される状態になったのですが、何か根本的に
思い違いをしているのでしょうか……?
たびたび申し訳ありません。

No.7423 2013/04/03(Wed) 18:38:18
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28

Re: javascrptのループ処理について / 流星光輝 URL
横槍ですみませんが、
checkRuby関数は、書いてないですけれども、
存在するんですよね?
ソースコード全部載せないと何で躓いているのか
トレースして分析することができないと思うのですが、
いかがでしょうか?

No.7424 2013/04/04(Thu) 00:08:42
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31

Re: javascrptのループ処理について / dot
処理できていないテキストボックスは、
グループ化されているテキストボックスでしょうか?

もし、グループ化されているのであれば、
グループ化されているテキストボックスを拾い上げる必要があります。

No.7425 2013/04/04(Thu) 10:29:19
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)

Re: javascrptのループ処理について / きじまえみ
流星光輝様
ご指摘ありがとうございました。
確認したところ、投稿時に1行抜けてしまっていたようです。

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


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

No.7426 2013/04/04(Thu) 11:24:18
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28

Re: javascrptのループ処理について / 流星光輝 URL
ソース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の処理を書き換えたら、
エラーしなくなりましたけれども、
そういうことではなくて?

No.7427 2013/04/04(Thu) 12:21:00
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31

Re: javascrptのループ処理について / きじまえみ
流星光輝様
ご返信ありがとうございます。そうです、ご指摘の内容の通りです。
対象を選択テキストボックスにしていた時は動作していたので
疑っていなかったところでした。
大変助かりました。どうもありがとうございました。


dot様
おかげさまで、理想の結果を得ることができました。
グループ化の件も、勉強になりました。
お手数をおかけしました。どうもありがとうございました。

No.7428 2013/04/04(Thu) 13:06:42
Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.28) Gecko/20120306 Firefox/3.6.28