イラストレーターで正規表現とテキストの変形
「す。」をスクリプトで詰めてみる - なにする?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; }}]]); } })();