Hatena::Groupkeiroku

~DTPとかFlexとかFlashとかを中心に勉強中~

※初学者が右往左往しております。万が一記事内のスクリプトを利用される際は、恐れ入りますが自己責任にてお願いいたします。

2011-09-19

【InDesign CS5】 ルビの検索ができないんだよ。

| 17:28

ということで、作った。

ルビテキストの検索置換(超簡易ver)。

入力画面出ません。

検索置換文字列スクリプトに直接入れて下さい。

var my_doc = app.activeDocument;

var searchWord	= "検索文字ココ";
var replaceWord = "置換文字ココ";

for (var j=0; j<my_doc.stories.length; j++)
{
	if (my_doc.stories[j].contents != '')
	{
		//alert(j+"\n\r"+my_doc.stories[j].contents);
		var my_story = my_doc.stories[j];
		rubycheck(my_story, searchWord,replaceWord);
	}
}

function rubycheck(my_story,sChar,rChar)
{
	for (var i=0; i<my_story.characters.length; i++)
	{
		//if (i>100){break;}
		var my_char = my_story.characters[i];
		
		if (my_char.rubyFlag)
		{
			//alert(my_char.rubyString);
			if(my_char.rubyString.match(sChar))
			{
				//alert(my_char.parentPage.index);
				my_char.select();
				alert(my_char.rubyString+","+sChar+","+rChar);
				my_char.rubyString = my_char.rubyString.replace(RegExp(sChar,'g'),rChar);
			}
		}
	}
}

正規表現にも対応。

ただし、常時gオプション(ぉ...

それと、すごく遅いです。。。

seuzoseuzo2011/09/26 02:23はじめまして。
こちらのブログは「身内向け」とありますので、失礼かとは存じますがコメントさせていただきます。

>それと、すごく遅いです。。。

Story.charactersではなくて、Story.textStyleRangesだともう少し速いような気がします。
あと、複雑な正規表現を使うなら、正規表現を生成するのにコストがかかるため、RegExp(sChar,'g')はループの外に出した方がいいと思います。

ちなみに、親文字を指定して検索し、検索結果のrubyStringを書き換えるようにすると、10倍以上速くなりました。

ryo513ryo5132011/09/29 12:38>seuzoさん

はじめまして、コメントありがとうございます!
数日ブログを放置しておりまして、亀レス大変失礼いたしました。

『名もないテクノ手』、いつもこっそり拝見して、勉強させてもらってます。
まさか、こんな僻地のブログにコメントいただけるとは。。。
「身内向け」は、「外向け」には耐えられないという程度の意味ですので、
どうかお気になさらないでください。

もろもろのアドバイスありがとうございます。
『名もないテクノ手』のほうの記事も読ませていただきました。
まだちょっと試せていないのですが、急ぎ確認してみます。

とりいそぎ、御礼まで。
ありがとうございました!

2011-09-17

こんな感じでテスト投稿。

| 22:13

JavascriptIndesign CS5 をいじりましょう。

ということで、テスト系スクリプト

checkObjに適当なオブジェクトをセットしておくと、

そのオブジェクトプロパティメソッドを吐き出してくれます。

ただし、対象のオブジェクトが現在開いているドキュメントに存在していることが条件。

checkObj = app.activeDocument.pages[0];
CR = String.fromCharCode(13);
result = "";
for (i in checkObj)
{
try { result = result + i+" = "+checkObj[i] + CR; }
catch(e){ result = result + CR; }
}
pageObj = app.documents.add();
txtObj = pageObj.textFrames.add();
txtObj.visibleBounds = ["2cm","2cm","27cm","19cm"];
txtObj.contents = result;

問題は、これの出典サイトを忘れてしまったこと。。。

見つけ次第URL書きますゴメンナサイ。