以前の記事【解決】Illustratorでアイウなどの連番をふり直したい!により,選択したテキストフレームの連番(123・アイウ・ABCなど連続した番号)を一括で変更できるようになりました。
しかし作業をしていればいっきに変えるのではなく,選択している文字のみ連番をスライドしたくなることもよくありますよね。
そこで今回は選択した1文字の連番を1つ増やしたり,減らしたりするJavaScriptを紹介します。
以下のIllustrator用スクリプトをダウンロードし,使えるようにしておいてください。textIncrement(インクリメント)が増やすほう,textDecrement(デクリメント)が減らすほうです。
sttk3-textIncrement.zip
使いかた
テキスト1文字,または1文字だけのテキストフレームを選択し,スクリプトを実行してください。選択された連番が変更されます。
動作説明
選択している1文字を連番とみなし,インクリメントなら1増やし・デクリメントなら1減らします。
基本的に番号は文字コード順に変わります。
インクリメントの場合1の次は2ですが,9の次は10でなく:(コロン)です。
デクリメントの場合1の次は0ですが,0の次は-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 |
/** * @fileOverview 選択した文字を(基本的に)文字コード順に+1スライドする * @version 1.0.0 * @author sttk3.com */ //#target 'illustrator' (function() { var step = 1 ; if(app.documents.length <= 0) {return ;} var doc = app.documents[0] ; var sel = getTextSelection() ; var len = sel.length ; if(len <= 0) {return ;} for(var i = 0 ; i < len ; i++) { slideString(sel[i], step) ; } })() ; /** * 1文字のテキストを文字コード順にスライドする。ユーザー設定リストにある文字は文字コードを無視し,リストに準じて変更する * @param {TextRange} targetRange 対象のtextRange * @param {Integer} step スライドするステップ数。プラス方向に1つなら1,マイナス方向に1つなら-1 * @return なし */ function slideString(targetRange, step) { // ユーザー設定リスト var specialChars = [ 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん', 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン', //'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせすん', //'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセスン', //'日月火水木金土', // 七曜 //'甲乙丙丁戊己庚辛壬癸', // 十干 //'子丑寅卯辰巳午未申酉戌亥', // 十二支 '〇一二三四五六七八九十' ] ; var reGeneral = new RegExp('[^' + specialChars.join('') + ']', 'g') ; var baseChar = targetRange.contents ; if(baseChar.length != 1) {return ;} var baseCharCode = baseChar.charCodeAt(0) ; // 単純に文字コード番号で置換する var indexNum = baseCharCode + step ; var newStr = baseChar.replace(reGeneral, function(s0) { // 文字コードの範囲を超えないようにする var res = s0 ; if(0 <= indexNum && indexNum <= 65535) { // 目に見えない制御コードの領域を避ける var s1 = String.fromCharCode(indexNum) ; if(/[^\x00-\x1f\x7f]/.test(s1)) {res = s1 ;} } return res ; }) ; // ユーザー設定リストで置換する for(var i = 0, specialCharsLength = specialChars.length ; i < specialCharsLength ; i++) { var reSpecial = new RegExp('[' + specialChars[i] + ']', 'g') ; newStr = newStr.replace(reSpecial, function(s) { var nextStep = specialChars[i].indexOf(s) + step ; if(0 <= nextStep && nextStep < specialChars[i].length) { res = specialChars[i][nextStep] ; } else { res = s ; } return res ; }) ; } // 元の文字から変更があれば置換する if(newStr != baseChar) {targetRange.contents = newStr ;} } /** * selectionを常にtextRangeのArrayとして返す * @return {Array} 選択なしの場合[]を返す */ function getTextSelection() { var sel = app.selection ; var selLength = sel.length ; var res = [] ; switch(sel.constructor.name) { case 'Array' : if(!sel[0]) {return res ;} for(var i = 0 ; i < selLength ; i++) { var itemType = sel[i].constructor.name ; if(itemType == 'TextFrame') { res.push(sel[i].textRange) ; } else if(itemType == 'TextRange') { res.push(sel[i]) ; } } break ; case 'TextRange' : res.push(sel) ; break ; } return res ; } |
このサイトで配布しているスクリプトやその他のファイルを,無断で転載・配布・販売することを禁じます。
それらの使用により生じたあらゆる損害について,私どもは責任を負いません。
スクリプトやファイルのダウンロードを行った時点で,上記の規定に同意したとみなします。