Quantcast
Channel: Planet DTP@jp
Viewing all articles
Browse latest Browse all 4819

chalcedony: Illustrator 10で、正規表現にマッチする文字が連続してるときだけトラッキングをかけるJavaScript

$
0
0

タイトル長い。

★追記:激重だったので修正版作りました!

どうにも入りきらないテキストをむりくりスペースに収めたいとき、かなの間だけ詰めたりすることがよくあります。それを自動でやろうっていうスクリプトです。俺得です。
Illustrator 10はダイアログを出したりできない(ぽい)ので、文字やトラッキング量の指定はスクリプトを書き換えて行います。10じゃなければ、「イラストレーターで正規表現とテキストの変形 - なにする?DTP+WEB」でもっとずっと高性能なものが配布されています。いいなあこれ使いたいなあ……。

// 正規表現にマッチする文字が並んでるときだけ指定量トラッキング// 選択したテキストオブジェクト(TextArtItem)について処理します。複数選択対応。// 下の例だと、「正規表現にマッチする」を処理した場合は// 「マ」「ッ」に-20のトラッキングがかかります。// すでにトラッキングが設定されている場合は現状から増減します。

(function(){// ----------------------------var amount = -20
  var charClass = "[ァ-ン]"; // エスケープとかは自分でやってね// ----------------------------// 以下本体 =================================================if ( selection.length == 0 ) {alert("何か選択してください"); return; }var sel = selection;
  var rex = newRegExp(charClass,"g");
  var rex2 = newRegExp(charClass);

  for ( var i = 0, len = sel.length; i < len; i++ ) {var tmp = sel[i];

    if ( tmp.typename != "TextArtItem" ) {alert("テキストじゃないので飛ばします");
      continue;
    }

    tmp = tmp.textRange(); // textRangeオブジェクトに変更var contents = tmp.contents;
    var characters = tmp.characters;

    var m = [];
    while ( m = rex.exec(contents) ) {var index = m.index;

      if ( index == characters.length - 1 ) {break; }// 最後の文字ならループ抜けるvar tc = tmp.characters[index];
      var nc = tmp.characters[index + 1];

      if ( !nc.contents.match(rex2) ) {continue; }// 次が違う文字クラスだったらパス

      tc.tracking += amount; // ★}// whileループここまで

    rex.lastIndex = 0; // 検索開始位置リセット}// 選択オブジェクトループここまでalert("おしまい!");

})();

例によってエラーとかまじめに気にしてないです。

★のついてる行を書き換えれば、文字単位の属性にはいろいろ使いまわせる(んじゃないかな)と思います。
ちなみにトラッキングでなくカーニングを使いたい場合(あるんかな)には注意が必要で、

tc.kerning += (amount / 1000); // ★

と書き換えないととんでもない量になります。文字パレットと単位が違うんですね……。
この単位の違い、リファレンスを見る限りCS2から解消されています。


Viewing all articles
Browse latest Browse all 4819

Trending Articles