以前の記事【解決】スタイルにショートカットを割り当てたい!により,キーボードショートカットでスタイルを適用できるようになりました。お気に入りのスタイルをすぐに呼び出すことができ,とても便利に使っています。
でもこのスクリプトは,スタイルごとに1つずつJavaScriptファイルを必要とします。だんだん管理が面倒になってきました。
だって想像してみてください。私がこのスクリプトをアップデートするたびに,あなたは毎回JavaScriptファイルをリネームすることになるんですよ……
幸いなことに,Illustratorにはスクリプト実行時に引数(ひきすう)を渡す機能がついています。引数とはスクリプトに渡す文字や数字などのデータのことです。スタイル名を引数として渡せば,プログラムの中身はそのままでも,そのスタイルを適用する処理に変えられます。
前のスクリプトを作ったときは,引数を管理できるアプリが普及していなかったためファイル名で代用していました。最近はKeyboard Maestroを使う人が増えてきたので,それで管理できそうです。
そこで今回は,バージョンアップしたスタイル適用スクリプトとKeyboard Maestroで,複数のスタイル適用ショートカットの管理を簡単にします。
準備
Keyboard Maestroには,Illustratorに引数を渡すことに特化した機能はありません。そのため,【解決】Keyboard MaestroのIllustratorスクリプト実行を簡単にしたい!で紹介したヘルパー,Yatakagami.scptでできるようにします。
まずはリンク先の内容の通り,Yatakagami.scptのセッティングを済ませてください。一言で言ってる割に,ここが一番大変なんですけどね。
次にこちらの新しいスタイル適用スクリプトをダウンロードします。名前はapplyStyle.jsxと,前のより短くしました。
applyStyle.jsx
設定方法
Yatakagami.scptのセッティングが終わっていれば,Keyboard Maestroに[sttk3] Functionというマクログループがあるはずです。その中のマクロの1つmacro_templateをIllustrator用マクログループ内に複製し,自分が管理しやすい名前をつけてください。「文字スタイル◯◯適用」のようにスタイルの種類と名前を明記し,適用か追加かを識別できるようにしておくのがおすすめです。
説明を簡単にするため,このマクロは以後「スタイルマクロ」と呼ぶことにします。
スタイルマクロには,好きなキーボードショートカットを指定しておいてください。もちろんショートカット以外のTyped String Triggerなども指定可能です。お好みでどうぞ。
さて次に行きます。スタイルマクロの中に「Set Vatiable “exec_path” to Text」というアクションがあります。そのアクションのto: という文字の右にある大きめのテキスト入力欄に,applyStyle.jsxのパスを入力してください。ファイルをドロップすれば自分で打ち込まなくてもパスが入ります。
適用するスタイルを指定するには,スタイルマクロのexec_argsの部分に特定の書式のXMLを書き込みます。例えば,文字スタイルの[標準文字スタイル]を適用したい場合,下記のようにします。
1 2 3 4 5 6 7 |
<params> <param> <type>c</type> <name>[標準文字スタイル]</name> <clearingOverrides>true</clearingOverrides> </param> </params> |
ここまでできたら設定完了です。別のスタイル用マクロを追加したい場合,スタイルマクロを複製してexec_argsを書き換えるだけ。exec_pathはそのままでOKです。
使いかた
こちらは単純で,スタイルを適用したいオブジェクトを選択して,設定したキーボードショートカットを押すだけです。前のよりちょっと間があります。
設定XMLの詳細
type :
スタイルの種類を示す文字です。文字(character)スタイルの場合c,段落(paragraph)スタイルの場合p,グラフィック(graphic)スタイルの場合gを入れます。
name :
スタイル名です。Illustratorのスタイルパネルに出ている名前そのものを入れます。ただし,XMLの制御文字(<>'"&)はエスケープする必要があります。例えば「&」だったら「&」になります。
clearingOverrides :
オーバーライドを削除するかどうかを指定できます。別の言いかたをすれば,「適用(apply)」のときはtrue,「追加(merge)」のときはfalseです。この項目は省略可能で,省略した場合は「適用」になります。
type,name,clearingOverridesをparamタグで囲ったものがスタイル1つ分のセットです。セットを3つまで増やせば,1回の動作で文字・段落・グラフィックスタイルが適用できます。何ということでしょう!
これでまた少し仕事が速くなりました。今日もさっさと仕事を切り上げて好きなことをしましょう!
コードはこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
/** * @fileOverview スクリプト引数のXMLをもとに,選択しているアイテムにスタイルを適用する。最大で1度に3種類のスタイル(文字・段落・グラフィックを1つずつ)を適用可能<br /> * type : cで文字スタイル,pで段落スタイル,gでグラフィックスタイルを適用<br /> * name : スタイル名。もし&<>'"などXMLの制御文字を使いたい場合は&のようにエスケープする<br /> * clearingOverrides : Optional. オーバーライドを消して適用するかどうか(trueで消す)。デフォルトtrue。Graphic Styleで言えばtrueがapply・falseがmerge * @version 2.0.0 * @author sttk3.com */ /* XML example <params> <param> <!-- required 必須 --> <type>c</type> <name>[標準文字スタイル]</name> <!-- optional 省略可 --> <clearingOverrides>true</clearingOverrides> </param> <param> <type>p</type> <name>標準段落スタイル</name> <clearingOverrides>true</clearingOverrides> </param> <param> <type>g</type> <name>add_text_fuchi</name> <clearingOverrides>false</clearingOverrides> </param> </params> */ #target 'illustrator' (function(argv) { if(app.documents.length <= 0) {return ;} var doc = app.documents[0] ; var sel = doc.selection ; if(sel.length <= 0) {return ;} // 引数をパースする var paramArray = parseParams(argv[0].toString(), doc, sel) ; if(!paramArray) {return ;} // パースした情報を元にスタイルを適用する var aParam ; for(var i = 0, paramLength = paramArray.length ; i < paramLength ; i++) { aParam = paramArray[i] ; for(var j = 0, itemLength = aParam.targetItems.length ; j < itemLength ; j++) { with(aParam) { styleObj[funcName](targetItems[j], clearingOverrides) ; } } } })(arguments) ; /** * XMLのテキストを解析し,適用するスタイルや適用先などの情報をまとめて返す * @param {String} xmlStr XML形式の文字列 * @param {Document} doc 対象のドキュメント。スタイルの取得元 * @param {Array} sel doc.selectionを渡す * @return {Array} [{'styleObj' : 適用するスタイル, 'targetItems' : 適用先のArray, 'funcName' : applyTo/mergeToのメソッド名, 'clearingOverrides' : 文字のオーバーライドをクリアするか}...] */ function parseParams(xmlStr, doc, sel) { var res = [] ; // 文字・段落スタイル適用範囲,グラフィックスタイル適用範囲をそれぞれ取得する var sel2 = classifySelection(sel) ; var targetTextRanges = sel2.textRanges ; var targetPageItems = sel2.pageItems ; // 引数で渡されるテキストを解析する try { var xmlData = new XML(xmlStr) ; var params = xmlData.descendants('param') ; } catch(e) { alert(e) ; return res ; } var param, typeFlag, styleName, clearingOverrides, styleObj, targetItems, funcName ; for(var i = 0, len = params.length() ; i < len ; i++) { // 情報が取得できない,スタイルが存在しないなどの場合は無視する try { param = params[i] ; // スタイルの種類。cで文字スタイル,pで段落スタイル,gでグラフィックスタイル typeFlag = param['type'].toString().replace(/[A-Za-z0-9_]/g, function(s) {return String.fromCharCode(s.charCodeAt(0) - 0xFEE0) ;}).toLowerCase() ; // スタイル名。ファイル名を経由しなければ濁点の結合不要 styleName = param['name'].toString() ; // オーバーライドを消して適用するかどうか(trueで消す)。Graphic Styleで言えばtrueがapply・falseがmerge clearingOverrides = true ; if(param['clearingOverrides']) { if(/^\s*(?:false|0)\s*$/i.test(param['clearingOverrides'].toString())) {clearingOverrides = false ;} } // 適用するスタイル,適用先の範囲,applyTo/mergeToのメソッド名,オーバーライドをクリアするか,の情報をセットにして返す funcName = 'applyTo' ; switch(typeFlag) { case 'c' : // XXXStyles[styleName]にした場合,[0]と['0']を区別できないのでgetByNameを使う styleObj = doc.characterStyles.getByName(styleName) ; targetItems = targetTextRanges ; break ; case 'p' : styleObj = doc.paragraphStyles.getByName(styleName) ; targetItems = targetTextRanges ; break ; case 'g' : styleObj = doc.graphicStyles.getByName(styleName) ; targetItems = targetPageItems ; if(!clearingOverrides) {funcName = 'mergeTo' ;} break ; } res.push({'styleObj' : styleObj, 'targetItems' : targetItems, 'funcName' : funcName, 'clearingOverrides' : clearingOverrides}) ; } catch(e) { continue ; } } return res ; } /** * selectionをTextRangeとそれ以外に分け,それぞれの配列を返す * @param {Array} sel selection * @return {Object} {textRanges : [textRange1, textRange2...], pageItems : [pageItem1, pageItem2...]} */ function classifySelection(sel) { var selLength = sel.length ; var res ; var arrayTextRange = [] ; var arrayPageItem = [] ; switch(sel.constructor.name) { case 'Array' : if(!sel[0]) {return res ;} for(var i = 0 ; i < selLength ; i++) { switch(sel[i].constructor.name) { case 'TextRange' : arrayTextRange.push(sel[i]) ; break ; case 'TextFrame' : arrayTextRange.push(sel[i].textRange) ; // breakしないでdefaultの動作もする default : arrayPageItem.push(sel[i]) ; break ; } } break ; case 'TextRange' : arrayTextRange.push(sel) ; arrayPageItem = Array.apply(null, sel.story.textFrames) ; break ; } res = { 'textRanges' : arrayTextRange, 'pageItems' : arrayPageItem } ; return res ; } |
このサイトで配布しているスクリプトやその他のファイルを,無断で転載・配布・販売することを禁じます。
それらの使用により生じたあらゆる損害について,私どもは責任を負いません。
スクリプトやファイルのダウンロードを行った時点で,上記の規定に同意したとみなします。