前回の記事【解決】再リンクのとき画像のあるフォルダを起点にしたい!により,リンクの貼り直しが少し楽になりました。
それに関して「再リンクのときファイルの名前はわかっているのだから,同じ名前のファイルを検索して候補を挙げてくれればいいのにといつも思っていた」という主旨の感想をいただきました。確かにその通りで,実現すればさらに楽ができそうです。
そこで今回は選択した配置画像の名前でSpotlight検索し,見つかった候補の中から選んで再リンクするAppleScriptを紹介します。
それではこちらのスクリプトをダウンロードしてください。今回はAppleScriptなのでMac専用です。
relinkSpotlight.scpt
1 ファイル 13.54 KB
使いかたは,リンク画像を選択してスクリプトを実行するだけです。
拡張子を除いた部分のファイル名で密かにSpotlight検索し,同じ名前のファイルが見つかったらダイアログに表示します。Spotlightが把握していれば,外付けドライブ内のファイルも対象になります。
候補が10個以上あったら諦めてスキップするので,その場合は通常の機能を使い再リンク設定をしてください。
これでまた少し仕事が速くなりました。今日もさっさと仕事を切り上げて好きなことをしましょう!
コードはこちら
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 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
(** * @file リンク再設定ダイアログ。Spotlight検索で見つかった同名のファイルを再設定候補として出す * @version 1.1.0 * @author sttk3.com * @copyright © 2022 sttk3.com *) on run tell application "Adobe Illustrator" if not (document 1 exists) then return tell document 1 -- 選択アイテムからplaced itemだけを取り出す set original_sel to selection set sel to my all_items_of(original_sel) if ((count sel) is less than or equal to 0) then return set target_items to my select_items_by_class(sel, placed item) set target_length to count target_items if (target_length is less than or equal to 0) then return repeat with a_item in target_items if (target_length is not 1) then set selection to {a_item} -- リンクファイル名を取得する try set item_link to file path of a_item set file_name to my get_name(item_link) on error error_message number error_number -- 行方不明の場合,変数xmlからファイル名を取得する。xmpだとどれがどれだかわからなかった。 -- データ駆動型グラフィックスを使用している場合は取得を諦めてfalseを返す set file_name to my get_missing_name(it, a_item) end try -- AppleScriptにはcontinueにあたる表現がないので,try/errorで代用 try set my_error to false -- リンクファイル名が取得できなければcountinue if (file_name is false) then set skip_message to "行方不明のリンクファイル名が取得できませんでした。スキップします。" as text set my_error to true error end if (* spotlight検索で再リンク候補を探し出す。式: mdfind 'kMDItemFSName == "*file_name*" && ! kMDItemContentType == public.folder' *) set file_name to do javascript "arguments[0].replace(/\\.[a-z0-9]{2,4}$/i, '') ;" with arguments file_name set com to {"mdfind 'kMDItemFSName == \"*", file_name as text, "*\" && ! kMDItemContentType == public.folder'"} as text set new_link_path to do shell script com -- 候補がなければcountinue if (new_link_path is "") then set skip_message to {file_name, " は再リンク候補が見つかりませんでした。"} as text set my_error to true error end if set display_list to every paragraph of new_link_path -- 候補が20個より多かったらcountinue if ((count display_list) > 10) then set skip_message to {file_name, " は再リンク候補が多すぎるのでスキップします。"} as text set my_error to true error end if -- 候補をダイアログに表示して選択を促す activate set choose_file to choose from list display_list with prompt "同名の候補から再リンクファイルを選択" default items item 1 of display_list without multiple selections allowed -- 選択したファイルでリンクを更新する if (choose_file is not false) then set file path of a_item to (POSIX file choose_file) end if on error error_message number error_number if (my_error) then display notification skip_message with title (name of me) end if end try end repeat end tell end tell end run (** * selectionからグループの中身を含めたすべてのpage itemを取り出す * @param {list} sel 対象のlist。selectionを指定する * @return {list} *) on all_items_of(sel) tell application "Adobe Illustrator" set res to {} repeat with a_item in sel set item_class to class of a_item if (item_class is group item) then set end of res to a_item as reference set res to res & my all_items_of(every page item of a_item) else set end of res to a_item end if end repeat end tell return res end all_items_of (** * 配列をクラス名でfilterする。select/rejectのselect * @param {list} list_obj 対象のlist * @param {class} class_obj 対象のclassを直接指定する。textではない * @return {list} *) on select_items_by_class(list_obj, class_obj) tell application "Adobe Illustrator" set res to {} repeat with a_item in list_obj if (class of a_item is class_obj) then set end of res to a_item end if end repeat end tell return res end select_items_by_class (** * fileから名前部分だけを取り出す * @param {alias} file_obj 対象のファイル * @return {text} *) on get_name(file_obj) tell application "Finder" to set res to name of (file_obj as alias) return res end get_name (** * 行方不明のリンクからファイル名を取り出す * @param {document} doc 対象の書類 * @param {placed item} placed_item 対象の(リンクが切れた)リンク画像 * @return {text / false} *) on get_missing_name(doc, placed_item) tell application "Adobe Illustrator" -- 一時的に変数機能を扱う。現状復帰が面倒なので,datasetやvariableを含んだ書類の場合は諦める if ((dataset 1 of doc exists) or (variable 1 of doc exists)) then return false set var_name to "sttk3-link" as text set com to "(function(argv) { var res = false ; var doc = argv[0] ; var targetItem = argv[1] ; // リンク変数を生成し,リンク画像に紐づける var varLink = doc.variables.add() ; var varName = '" & var_name & "' ; varLink.name = varName ; varLink.kind = VariableKind.IMAGE ; targetItem.contentVariable = varLink ; // dataSetを生成する doc.dataSets.add() ; try { // 適当な場所に変数ライブラリを書き出す var libFile = new File(Folder.temp.fullName + '/sttk3-link.xml') ; doc.exportVariables(libFile) ; // 変数ライブラリからファイル名を取り出す var xmlStr = readText(libFile, 'utf-8') ; var matchObj = xmlStr.match(/<" & var_name & ">\\s*file:\\/{3}(.+)\\s*<\\/" & var_name & ">/) ; res = matchObj[1].replace(/.+\\//, '') ; // パスが欲しい場合はmatchObj[1]を直接返すと良い } catch(e) { alert(e) ; } finally { libFile.remove() ; } app.redraw() ; app.undo() ; return res ; })(arguments) ; /** * ファイルを読み出す。 * @param {File} fileObj 読み込むFileオブジェクト * @param {String} [encoding] 初期設定はSHIFT-JIS * @return {String} */ function readText(fileObj, encoding) { if(!encoding) {var encoding = 'SHIFT-JIS' ;} try { fileObj.encoding = encoding ; fileObj.open('r') ; var str = fileObj.read() ; } catch(e) { alert(e.toString()) ; } finally { fileObj.close() ; } return str ; }" set res to do javascript com with arguments {doc, placed_item} if (res is "false") then set res to false end tell return res end get_missing_name |
このサイトで配布しているスクリプトやその他のファイルを,無断で転載・配布・販売することを禁じます。
それらの使用により生じたあらゆる損害について,私どもは責任を負いません。
スクリプトやファイルのダウンロードを行った時点で,上記の規定に同意したとみなします。