イラストレーターで正規表現とテキストの変形

「す。」をスクリプトで詰めてみる - なにする?DTP+WEBにインターフェースをつけてみた。

正規表現で見つけたテキストに指定した値を適用します。
入力した数値についてチェックしてませんので、
それぞれ適切な数値を入力してください。

おもしろいのは、文字パレットだと文字詰めは100%までしか選べませんが
スクリプトからだと1000とか入れれますので1000%の詰めとか可能です。
アキも、文字パレットだと「二分とか三分」になっていますが、
スクリプトだと数値で管理しているが分かります。

ダウンロード

簡単ですが正規表現の簡易サンプル

  • [0-9]:半角数字
  • [A-Za-z]:アルフェベットの大文字小文字
  • [ぁ-ん]:ひらがな
  • [ァ-ン]:カタカナ
  • [ぁ-んァ-ン]:ひらがな・カタカナ
  • [一-龠]:漢字

(追記)
上の例だと1文字ずつマッチしますが、
「+」を追加することにより連続した文字にマッチするので
高速化できます。

  • [0-9]+:半角数字
  • [A-Za-z]+:アルフェベットの大文字小文字
  • [ぁ-ん]+:ひらがな
  • [ァ-ン]+:カタカナ
  • [ぁ-んァ-ン]+:ひらがな・カタカナ
  • [一-龠]+:漢字
(function(){
#target 'illustrator';
#include 'c.js';
#include 'ai_textReplacePatterns.js';
 
var textRangeConfig = [
['フォントサイズ(pt)' , 'size' , 15 , 'number'] ,
['文字ツメの値(%)' , 'Tsume' , 0 , 'number'] , 
['カーニング' , 'kerning' , 0 , 'number'] , 
['トラッキング' , 'tracking' , 0 ,'number'] ,
['垂直比率(%)' , 'verticalScale' , 100 ,'number'] , 
['水平比率(%)' , 'horizontalScale' , 100 ,'number'] , 
['ベースライン(pt)' , 'baselineShift' , 0 ,'number'] ,  
['文字回転' , 'rotation' , 0 ,'number'] , 
['アキを挿入左' , 'akiLeft' , -1,'number'] , //(-1:自動、0:ベタ、0.5:二分、1:全角
['アキを挿入右' , 'akiRight' , -1,'number'] //(同上)
];
 
//Makeing Dialog
var title = '正規表現で文字をいじる1.0' ;
var D_TOP = 100;
var D_LEFT = 200;
var D_WIDTH = 210;
var D_HEIGHT = 380;
var pos = [D_LEFT , D_TOP , D_LEFT+D_WIDTH,D_TOP+D_HEIGHT];
var wD = new Window('dialog',title,pos);
var items = {};
var check = {};
 
 
//RegexDialg
wD.add('statictext',[10,13,120,30],'正規表現:/',{});
var defaultRegex = '[ぁ-ん]';
var myRegex = wD.add('edittext',[75,10,180,30],defaultRegex,{});
myRegex.value = defaultRegex;
myRegex.onChange = function(){this.value = this.text;};
wD.add('statictext',[180,13,200,30],'/g',{});
 
//TextRangeDialog
for(i=0;i<textRangeConfig.length;i++){
var sT = wD.add('statictext',[10,13+(30*(i+1)),120,30+(30*(i+1))],textRangeConfig[i][0]+':',{});
items[textRangeConfig[i][1]] = wD.add('edittext',[120,10+(30*(i+1)),160,30+(30*(i+1))],textRangeConfig[i][2],{name:textRangeConfig[i][1]});
items[textRangeConfig[i][1]].value = textRangeConfig[i][2];
items[textRangeConfig[i][1]].onChange = function(){this.value = this.text;};
items[textRangeConfig[i][1]].onClick = function(){this.enabled = true;};
items[textRangeConfig[i][1]].enabled = false;
//CheckBox
check[textRangeConfig[i][1]] = wD.add('checkbox',[170,10+(30*(i+1)),200,30+(30*(i+1))],'');
check[textRangeConfig[i][1]].name = textRangeConfig[i][1];
check[textRangeConfig[i][1]].onClick = function(){
	 items[this.name].enabled = this.value ? true : false;
};
}
var cancelBtn =wD.add('button',[10,10+(30*(textRangeConfig.length+1)),80,30+(30*(textRangeConfig.length+1))],'Cancel',{name:'cancel'});
var okBtn =wD.add('button',[100,10+(30*(textRangeConfig.length+1)),180,30+(30*(textRangeConfig.length+1))],'OK',{name:'OK'});
cancelBtn.theDialog =wD;
cancelBtn.onClick = function(){this.theDialog.close(0);};
okBtn.theDialog =wD;
okBtn.onClick = function(){this.theDialog.close(1);};
 
//Show Dialog
if(wD.show()){
var textRangeV = {};
for(i=0;i<textRangeConfig.length;i++){
	if(items[textRangeConfig[i][1]].enabled)textRangeV[textRangeConfig[i][1]] = items[textRangeConfig[i][1]].value;
}
 
c('selection').filter('textFrames').each(textReplacePatterns,[['/'+myRegex.text+'/g',function(){ return function cz(tr){
	c.extend(tr,textRangeV);
	return tr;
}}]]);
}
})();