« Zaurus向けSpiderMonkey1.5パッケージ | Main | Adobe InDesign CS / CS2用JavaScript「都道府県順段落ソート」 »

2006.08.27

Adobe InDesign CS / CS2用JavaScript「正規表現検索スタイル適用」

わけあってInDesign CS / CS2用のJavaScript、「正規表現検索スタイル適用」というものを公開します。
Windows、Mac OS Xどちらでも動くと思います。

Regexpstyle_mac

Regexpstyle_win

ダウンロード regexpstyle20060826.zip (445.1K)

ライセンスはApache License, Version 2.0です。

動作確認環境は以下です。

  • Mac OS X用InDesign CS
  • Mac OS X用InDesign CS2
  • Windows用InDesign CS

Windows用InDesign CS2では動作確認していませんが、多分動くのではないかと。

インストール方法等の説明

同梱のREADME.txtをごらんください。

何をするものか

正規表現にヒットした文字列に対して、ドキュメント中に設定された文字スタイルを適用するというものです。
タグ付き正規表現にも対応しており、それぞれに別のスタイルを適用可能です。
動画を作ってありますので、見てみてください。

DEMO動画1 regexpstyle.mov (1772.0K)
DEMO動画2 regexpstyle02.mov (9885.0K)

少し前のバージョンなので、ちょっと違うところがあるかもしれません。
見るにはQuickTimeが入っていないといけませんが、iTunesが入っていれば見られるかと。

何の役に立つのか

例えば、インタビューページみたいなものがあるとします。
これの名前部分にチクチクスタイルを適用するのはかったるいです。
InDesignの機能である先頭文字スタイルでカバーは可能ですが、人物別に色を分けているような場合は無理です。

このような場合でも、このスクリプトを使えば一発でカタが付きます。

「^(田中(以下 田)|田)?(山田(以下 山)|山)?(鈴木(以下 鈴)|鈴)?(一同)? 」
↑最後に全角アキ

いささかトリッキーな例ですが、上記のような正規表現を入力し、$1、$2、$3、$4の適用スタイルに別々の文字スタイルを設定すると、人物別に色を設定しているようなインタビューフォーマットが一発で片付きます。

田中(以下 田) あああ
山田(以下 山) いいい
鈴木(以下 鈴) ううう
田 あああ
山 いいい
鈴 ううう
一同 (笑)

↑人物別に違うスタイルが適用できるのはもちろん、「田中(以下 田)」と「田」に同じスタイルを適用できるのがミソです。急に「田山」という人が交ざると、この例ではマズいですが(笑)。

もちろん、用途はこれだけに限りません。
正規表現をお分かりの方なら、もうあーもあろ、こーもあろとアイデアが思い浮かびのことでしょう。
欲望に忠実にお使いください。

テキストフレームの複数選択、表組みの中のテキストにも対応しています。
セルの中を選んでいた場合は、表組全体を処理します。セルを選んだ場合は、選んだセルを処理します。

使える正規表現は、JavaScript準拠のはずです。

制限

当面サロゲートペアには非対応です。サロゲートペアを含むテキストを処理するとエラーが出ます。

1段落ずつ処理しているので、改行をまたいだマッチはできません。

選択テキストを対象にした処理はできません。必ずテキストフレーム全体が対象になります。

テキストフレームを複数選んで、中の表組に対して処理をすることはできません。テキストフレームを選択した場合は、中のテキストだけが処理されます。(これは要望があれば対応するかも)

今後の予定

要望があれば機能向上、バグ取りも検討しますが、自分自身では使わないため、自主的なバージョンアップはしません。

|

« Zaurus向けSpiderMonkey1.5パッケージ | Main | Adobe InDesign CS / CS2用JavaScript「都道府県順段落ソート」 »

Comments

はじめまして、三島梅花藻(ミシマバイカモ、梅花藻、by鴨)と申します。
こむぎ様の書かれたtable_initialize.js、たいへん勉強になりました。
この、「正規表現検索スタイル適用」のスクリプトも、素晴らしいものでとても勉強になります。
ところで、実は私もInDesignでTextのcontentsを取り出して、正規表現でMatchした箇所の文字を操作するスクリプトを書いた事があるのですが、contentsの文字数とcharactersの文字数が一致せずに、上手く動かないという事がありました。
「」のようなサロゲートペア(?ごめんなさい。よく知らないのです)で2文字分で1文字を表す文字が含まれていると、contentsでは2文字とカウントされ、charactersでは1文字なので、文字の位置の計算が合わなくなってしまうのです。
試してみました所、この「正規表現検索スタイル適用」でも、この問題が発生しました。

Posted by: 三島梅花藻 | 2006.08.28 at 12:00 PM

三島梅花藻はじめまして。コメントありがとうございます。
僕も正式名称を知らないので、問題がある文字を「サロゲートペア」と表現します(どなたか正式名称知ってらしたら教えて)。
なるほど。JavaScriptの正規表現でも2文字分、indexOfでも2文字分ですね。JavaScriptの組み込みオブジェクト内では2文字分として扱われる。
一方、InDesignのオブジェクト内では1文字分と。

これはアドホックに対応するしか無いですね。操作対象の文字列の範囲が確定したら、範囲内をcharacters.item(hoge)で1文字ずつスキャンして、都度lengthを取る。

paragraphs.item(i).characters.item(j).contents.length

2文字(以上?)として数えられる文字が登場したらそれを集計。スタイルを適用する範囲を合計値分狭める……。

paragraphs.item(j).characters.itemByRange(from, to - 補正値).appliedCharacterStyle = hoeghoge;

しかし、そのままでは本来より長い範囲が処理されてしまうので、問題が出る可能性があります。
例えば、以下のような例が考えられます。

正規表現:(.+):(.+)

文字列(1は非サロゲートペア、2はサロゲートペア):11122111:2111

この場合、無思考の補正では本来正規表現にマッチしない「:」の後の1文字まで補正対象にしてしまうので、問題が出ると。
2文字(以上?)として数えられる文字が登場し次第、即座に調査対象の文字列の範囲のお尻を狭める処理が必要ですね。
これで大丈夫かな。

メールアドレスがそのまま書いてあったので、びっくりして手を加えましたが、これ実体参照になっているからSpamは大丈夫ですかね。

Posted by: moyashi | 2006.08.28 at 06:09 PM

よく考えたら、正規表現にマッチした部分だけでなく、全般的に影響があるので、当面サロゲートペアには非対応ということにしたいと思います。何とかしようとしてみましたが、足りない頭がこんがらがってしまいました。

サロゲートペアの検出自体は以下でできますので、やりようはあると思いますが。

var currentCharacterLength = target.paragraphs.item(j).characters.item(positionCounter).contents.length;

// もしサロゲートペアなら
if(currentCharacterLength > 1)
{
//検出時の処理
}

いっそのことJavaScriptを捨てて、サロゲートペアに対応した処理系でインデックス出しをした方が簡単かもしれません。

#!/usr/bin/env ruby -Ku

require 'jcode'

class String
def char_count
n = 0
each_char do
n += 1
end
n
end
end

p "".char_count # => 1

Posted by: moyashi | 2006.08.29 at 03:37 AM

梅花藻です。メールアドレスの件ありがとうございます。
rubyだとサロゲートペアを含んでいても大丈夫なのですね。
当方、学参ものを扱っている関係でサロゲートペアの文字が時たま出てくるのです。
今年になってInDesign CS2に触れてからJavaスクリプトを始めた者ですから、「table_initialize.js」の中で使われていたeveryItem()というメソッドも知りませんでした。
次のようにfor文を使わなくてもスタイル名の一覧の配列を得る事ができると知りました。
app.activeDocument.characterStyles.everyItem().name

細かい事で恐縮ですが、「制限」で「1行ずつ処理しているので」とありますが、「1段落ずつ」ですね。
行は「line」でしてCharacterオブジェクトのプロパティ「lines」で「lines[0]」とすることで、そのCharacterオブジェクトを含む行を取り出す事ができます。
p.s.すみません。メールアドレスの細工の仕方がわかりません。(エラーが出てしまいます)そのまま入れます。

Posted by: 三島梅花藻 | 2006.08.31 at 12:13 PM

自分は8月から、この「正規表現検索スタイル適用」を書くためにJavaScriptを始めました。

自分が調べた限りでは、サロゲートペアへの対応状況は、

■Ruby 1.8.2 :対応
■Perl 5.8.6 :対応
■REALbasic :対応
■AppleScript :非対応
■Python 2.3.5 :非対応
■Visual Basic 2005 Express Edition :非対応

といった感じでした。全部ソースにリテラルとしてサロゲートペアを書いてテストしてますから、そのせいでダメってのがあるかもしれませんが。なるほど。lineってのが別にあるのですね。「行」は後で直しておきます。

ちなみに、ExtendScript Toolkitをもしお使いになってなければ、使ってみるとかなり楽にスクリプト書けますよ。
IDEを使った経験が無いと、最初はとまどうかもしれませんが。
分からないことがあったら聞いてください。

CS2からはReflectionInfo Objectというものが増えていて、そこでプロパティやメソッドの一覧を配列で取得できます。リファレンス見ればいいんですが、選択中のオブジェクトのメソッドだけの一覧、なんてことができるので便利です。ExtendScript Toolkitのデータブラウザを使えば、変数に格納されたオブジェクトのメソッド、プロパティの一覧が見られますけれどね。
$.writeln("string")は、ExtendScript ToolkitならびにJavaScriptデバッガのJavaScriptコンソールへの書き出し命令です。

#target indesign

main();

function main()
{
if (app.documents.length != 0)
{
if (app.selection.length > 0)
{
inspect();
}
else
{
alert("何かオブジェクトを選んでください");
}
}
else
{
alert("ドキュメントが開かれていません");
}
}

function inspect()
{
try
{
var tempArray = app.selection[0].reflect.methods;
tempArray.sort();

$.writeln("-----------List of methods-----------");

for (i = 0; i < tempArray.length ;i++)
{
$.writeln(tempArray[i]);
}

$.writeln("-----------List of properties-----------");

tempArray = app.selection[0].reflect.properties;
tempArray.sort();

for (i = 0; i < tempArray.length ;i++)
{
$.writeln(tempArray[i]);
}
}
catch(e)
{
}
}

Posted by: moyashi | 2006.09.01 at 04:34 AM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/13760/11621838

Listed below are links to weblogs that reference Adobe InDesign CS / CS2用JavaScript「正規表現検索スタイル適用」:

» InDesign [PukiWiki/TrackBack 0.2]
InDesign 用語集 Tag: indesign InDesign †  Adobe Systems社が、QuarkXPressの市場をねらって発売したページレイアウトソフト。  QuarkXPressと比較して高度な機能を搭載し、差別化を図ったが、初代バージョンは動作が遅く不評だった。バージョンアップを重ね... [Read More]

Tracked on 2006.11.29 at 03:17 AM

« Zaurus向けSpiderMonkey1.5パッケージ | Main | Adobe InDesign CS / CS2用JavaScript「都道府県順段落ソート」 »