終了

Indesign javascriptの正規表現で特殊文字検索

ゲスト
Jun 17, 2021 Jun 17, 2021

Indesign CC2018です。

JavaScriptの正規表現でテキスト内容の比較をしたいのですが、

テキストアンカーやここまでインデントなどの特殊文字は無視して比較したいのです。

 

テキストアンカーやここまでインデントなどの特殊文字をJSの正規表現で

検索することは可能でしょうか?

できれば特殊文字系全てを一括で、ダメなら個別でも。

キーワード
スクリプティング
2.5K
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Jun 17, 2021 Jun 17, 2021

幾つか教えてください。

  • テキスト内容を比較したいというのは,何と何になりますか? InDesign上の何かしらのテキストとString型オブジェクト,つまりスクリプト上での文字列,ということですか? それとも,InDesign上のテキスト同士でしょうか?
  • 特殊文字とは具体的に何でしょうか? すべて列挙できますか? それとも不可視文字(制御文字)全般を指しますか?
  • スクリプト上でその結果を知りたいということかもしれませんが,例えばそういうテキスト同士を比較できるツールがあるエディタもあります。そういうものではなく,あくまでスクリプト上でその結果を知りたい,ということでいいですか?

 

以下,InDesign上のテキスト対String型オブジェクトの文字列を前提として,テキストアンカーとここまでインデントを例にテキスト内容を比較する例です。

スクリーンショット 2021-06-18 11.28.29.png

var indStr = app.selection[0].contents;
var difStr = "てきとうてきすと";

// 単純比較
alert(indStr === difStr); // false

// アンカーテキストとここまでインデントをreplaceする
var tempStr = indStr.replace(/[\ufffc\u0007]/g, "");
alert(tempStr === difStr); // true;

 ご参考まで。

 

Yusuke S.
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
ゲスト
Jun 17, 2021 Jun 17, 2021

インデザインのテキストフレームやセルの中身(旧商品情報)をJavaScriptで文字列として取得し、

テキストデータとして用意したテキスト(新商品情報)との比較です。

情報が変更になっていれば、置き換えるという処理を行っており、空白文字列は無視しているのですが

インデザイン側に特殊文字が含まれている場合に異なる文字列として判断されてしまうので。

主にアンカーテキストとここまでインデントの処理なのですが、

他の特殊文字も含まれる可能性もあるので、できれば一括で無視できればと思いました。

 

アンカーテキストとかの文字コードは存在するのですね。ありがとうございます。

この文字コードってどのように取得したらよいのでしょうか?

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Jun 17, 2021 Jun 17, 2021

情報パネルから見られますよ。コードポイントなので,JavaScriptで扱う場合は

'\u0000'

という形で(最大4桁)使ってください。

_ほげ_indd___300___GPU_プレビュー_.png

 

JSから調べるなら,Ten_Aさんが下でおっしゃっているような方法があります。

Yusuke S.
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
ゲスト
Jun 17, 2021 Jun 17, 2021

ありがとうございます。

情報パネル表示したことなかったので気づきませんでした。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jun 17, 2021 Jun 17, 2021

単純にそのモノを指定するなら文字コードダイレクトに指定すれば可能です。

 

Stringt.match(/[\x07]/);

 

ちなみに、InDesignの特殊キャラクタはBellやEnd of Textと言った制御文字を利用してたりします。ただし、無視するのであればそういった事は考えずにマッチさせたい条件をしっかり考えれば良いだけです。
これはJavaScript側のRegExpを使おうがInDesignの検索機能であるfindGrepPreferenceを操作しようが同様です。まずはロジカルな部分を熟考する必要があります。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
ゲスト
Jun 17, 2021 Jun 17, 2021

ありがとうございます。

 

テキスト比較はあらゆる文字が可能性としてはあるので、

視覚的な文字列の内容が一致しているかを知りたいのですが

このような場合に適した比較方法ってどの様にしたら良いのでしょう?

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
積極的な参加者 ,
Jun 17, 2021 Jun 17, 2021

横からすみません。

InDesignで表現できる文字列は非常に多いので,実はそんなに簡単な話ではないです。

例えばサロゲートペアを考慮するかどうかだけでもスクリプト側の難易度は跳ね上がります。

また,コードポイントによる比較になるので,InDesignで表現される異体字はString型オブジェクトと単純に比較できません。

InDesignであればオープンタイプフィーチャーまでたどって調べる必要がありますし,String型オブジェクトには字形という概念をもたせることができません(IVSなどを利用する必要があります)。

 

ですので,「視覚的な文字列の内容」とおっしゃいますが,どの程度のレベルまで比較するかは準備するテキスト,InDesignのデータと比較し,取り得る最大限の範囲をスクリプト開発者側が明確に線引する必要があります。

 

このような場合に適した比較方法ってどの様にしたら良いのでしょう?

というご質問ですが,テキスト比較は地道に実装するほかないと思います。要するに不要な文字列を除外するとか,サロゲートペアの場合の文字コード計算式を組み込むとか…です。

スクリプトで文字を扱う,特にExtendScriptで扱うのは実は非常にシビアで知識も要求されます。

Yusuke S.
翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
ゲスト
Jun 17, 2021 Jun 17, 2021
最新

そうなのですね、ありがとうございます。

地道に実行時に引っかかった文字コードを追加していくことにします。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jun 17, 2021 Jun 17, 2021

JavaScriptで調べるのが良いかと思います。

当該キャラクタを選択した状態で

alert(app.selection[0].contents.charCodeAt(0).toString(16))

でいけるかと思います。 

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Contributor ,
Jun 17, 2021 Jun 17, 2021

特殊文字1文字だけを選択した場合のcontentsはSpecialCharacters Enumになってしまうのでこれだとエラーになります。
調べたい文字と、その次の文字まで選択して実行すれば大丈夫。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
ゲスト
Jun 17, 2021 Jun 17, 2021

ありがとうございます。

こちらも試してみます。

翻訳
レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines