正規表現を使ってテキストをいじる3.0

3倍早くなるためのDTP講座"効率化のヒント7"正規表現を使ってテキストをいじる2.0が紹介されました。
追加機能のヒントをもらい、良い機会なので気づいていて直してなかった不具合も含めて、1年越しでバージョンアップしてみました。
前のバージョンよりもずいぶんキビキビ動くようになった気がします。(単にマシンが速くなっただけかも)

追記(2010-10-13):
設定ファイルの「保存」と
「読み込み機能」を追加したデラックス版をアップしました。

ダウンロード


対応バージョン:イラストレーターCS3以上
ダウンロード

ScriptUIで絵を描く。

ExtendScriptのScriptUIオブジェクトモデルビューアを調べていると、
ScriptUIGraphicsクラスにractPathやnewPath、moveToなどの
メソッドが用意されていることを知ったので、
ちょっと試してみた。
そして、こんな感じになりました。
ダウンロード

けっこうグラフィカルでしょ?
CS4だと期待どおり動くんだけど、
CS3だとマウスオーバー/マウスアウト時のイベントが期待どおり動いてないようです。
もちろん、小さな四角のみのモザイクで描画しているので
画像ファイルはいっさいふくまれておりません。
そして遅いです。

これをうまく使えば、
小さいツールアイコンの画像なら、画像を複数添付しなくても、
書き方によってはスクリプトファイル1つだけの配布ですみそうです。

「PI_FontList(AI用)」を使ってみた。


オリジナルツール / フォント一覧管理パネル 「PI_FontList(AI用)」を作りました (PIXEL LAB)が公開されたようなのでさっそく使ってみた。
FlashでUIを作ると、ここまで出来るということに感動。


イラストレーターCS4以上ということなんだけど、
CS3でも、$.fileNameが動かない問題等、スクリプトを書きなおせば動く事を確認。


フォントリストの取得に時間がかかるようなので簡易的にキャッシュできるようにしてみました。

function getFonts (){
	var f = app.textFonts ; 
	var s = "";
	var FontListC = new File(swfFolder+"/"+"FontList.txt");
	if(!FontListC.exists){
		for( var i = 0 ; i < f.length ; i++ ){
			//s += f[i].family+"-"+f[i].style;
			s +=f[i].name;
			s += (i != f.length - 1)? ",":"";
		}
		FontListC.open ('w');
		FontListC.write (s);
	}else{
		FontListC.open ('r');
		s = FontListC.read ();
	}
	return s;
}

FlashUIで行こう

Double-talk Publisher UIの精神?
中綴千頁さんがFlashUIでツールを製作中です。

おっしゃられるとおり、まさに「FlashUI向き」な案件です。使い勝手よく便利なツールを作られる方なので期待大です。


自分の方はというと…
Try&ErrorとFlashコンパイルの遅さに辟易して。放置中のこれもなんとかしなきゃね。
イラストレーターとインデザインのスクリプトをWEBから取得する試み

自分にハッパを懸ける意味でダウンロード出来るようにしておきます。
インデザイン用です。
インストール方法はこちらを参照ください。(もう既に定番?)
FlashUIは検索とかボタンだけついている状態だったりします。

このスクリプトは外部通信が発生するので、
Adobe - Flash Player:設定マネージャ - グローバルセキュリティ設定パネルで許可しないと動きません。

フォルダではなくファイル毎に設定することをお勧めします。もちろん自己責任です。
ScriptUIからFlashPlayerを利用する場合のセキュリティ対策
こういう外部通信が入るスクリプトだとソースの公開が必須?でしょうか。

ScriptUIでセーブダイアログ

いつもは中身から作るのですが、
今回はインターフェースのみ作ってみた。
イラストレーターのセーブダイアログの
インターフェースのみ。

皮だけなのでなんにもできなんですけどね。

ダウンロード

こっちは本物。

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

「す。」をスクリプトで詰めてみる - なにする?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;
}}]]);
}
})();

イラストレーターとインデザインのスクリプトをWEBから取得する試み

仕事のあいまにちまちま作ってみたりしてある程度動くようになったので、
他にネタもないんで途中経過でも。
今回はWindowsXPでの動作画面です。
今回も録画使ったのはVNC2SWF。カクカクしてます。

ScriptUIのFlashPanelを利用して
ScriptClip::Roomからスクリプトを取得しています。

始めに作ったものより面積が半分になりましたが、まだ大きいですね。
使いやすいユーザーインターフェイスを作るのってとても難しいです。