property pDiveMode : true property pHeaderText : "print \"" property pFooterText : "\\n\";" property pEscapeList : {"\\", "\"", "$", "%", "@", "&"} property pEscape2byte : true property pByte2charList : {"-", "ソ", "Ы", "\", "噂", "浬", "欺", "圭", "構", "蚕", "十", "申", "曾", "箪", "貼", "能", "表", "暴", "予", "禄", "兔", "喀", "媾", "彌", "拿", "杤", "歃", "濬", "畚", "秉", "綵", "臀", "藹", "觸", "軆", "鐔", "饅", "鷭", "\", "", "?"} global gRcodeList --ダブルクリック起動 -- on run activate set prefList to {"ダイブモード", "行頭挿入テキスト", "行末挿入テキスト", "エスケープ対象文字", "2バイト文字エスケープ"} set defaultPref to {true, "print \"", "\\n\";", {"\\", "\"", "$", "%", "@", "&"}, true} repeat set setPref to choose from list prefList with prompt "esc@pe 初期設定:" OK button name "設定" cancel button name "終了" if setPref = false then exit repeat else if item 1 of setPref = item 1 of prefList then --ダイブモード設定 Pref_DiveMode(item 1 of prefList, item 1 of defaultPref) else if item 1 of setPref = item 2 of prefList then --行頭挿入テキスト設定 Pref_HeaderText(item 2 of prefList, item 2 of defaultPref) else if item 1 of setPref = item 3 of prefList then --行末挿入テキスト設定 Pref_FooterText(item 3 of prefList, item 3 of defaultPref) else if item 1 of setPref = item 4 of prefList then --エスケープ対象文字設定 Pref_EscapeList(item 4 of prefList, item 4 of defaultPref) else if item 1 of setPref = item 5 of prefList then --2バイト文字エスケープ Pref_Escape2byte(item 5 of prefList, item 5 of defaultPref) end if end repeat end run --ダイブモード設定 -- [in] -- prefName : 初期設定名 -- defaultValue : デフォルト値 -- on Pref_DiveMode(prefName, defaultValue) set prefStr to "esc@pe 初期設定:" & prefName & return & return set onStr to "フォルダ内のファイルも処理対象とします。" set offStr to "フォルダのドロップは無視します。" if pDiveMode then set showStr to prefStr & "現在ダイブモードはONです。" & return & onStr & return & return & "ダイブモードをOFFにしますか?" set modeStr to "OFF" set setStr to offStr else set showStr to prefStr & "現在ダイブモードはOFFです。" & return & offStr & return & return & "ダイブモードをONにしますか?" set modeStr to "ON" set setStr to onStr end if --ダイアログ表示 set btList to {"デフォルト", "キャンセル", modeStr} set btIndex to Standard_Dialog(showStr, btList, 3, 1000, false, false) if btIndex = -128 then return else if btIndex = 1 then set pDiveMode to defaultValue else set pDiveMode to not pDiveMode Error_Dialog(prefStr & "ダイブモードを" & modeStr & "にしました。" & return & setStr, "OK", 1000, false, false) end if end Pref_DiveMode --行頭挿入テキスト設定 -- [in] -- prefName : 初期設定名 -- defaultValue : デフォルト値 -- on Pref_HeaderText(prefName, defaultValue) set prefStr to "esc@pe 初期設定:" & prefName & return & return set showStr to prefStr & "行頭に挿入するテキストを指定して下さい。" --ダイアログ表示 set btList to {"デフォルト", "キャンセル", "設定"} set {btIndex, inputStr} to Input_Dialog(showStr, pHeaderText, btList, 3, 1000, false, false) if btIndex = -128 then return else if btIndex = 1 then set pHeaderText to defaultValue else set pHeaderText to inputStr set showStr to return & "「" & pHeaderText & "」" & return Error_Dialog(prefStr & "行頭に挿入するテキストを、" & showStr & "にしました。" & return, "OK", 1000, false, false) end if end Pref_HeaderText --行末挿入テキスト設定 -- [in] -- prefName : 初期設定名 -- defaultValue : デフォルト値 -- on Pref_FooterText(prefName, defaultValue) set prefStr to "esc@pe 初期設定:" & prefName & return & return set showStr to prefStr & "行末に挿入するテキストを指定して下さい。" --ダイアログ表示 set btList to {"デフォルト", "キャンセル", "設定"} set {btIndex, inputStr} to Input_Dialog(showStr, pFooterText, btList, 3, 1000, false, false) if btIndex = -128 then return else if btIndex = 1 then set pFooterText to defaultValue else set pFooterText to inputStr set showStr to return & "「" & pFooterText & "」" & return Error_Dialog(prefStr & "行末に挿入するテキストを、" & showStr & "にしました。" & return, "OK", 1000, false, false) end if end Pref_FooterText --エスケープ対象文字設定 -- [in] -- prefName : 初期設定名 -- defaultValue : デフォルト値 -- on Pref_EscapeList(prefName, defaultValue) set prefStr to "esc@pe 初期設定:" & prefName & return & return set showStr to prefStr & "エスケープする文字を指定して下さい。" & return & "※複数ある場合はコンマ(,)区切り" set escapeChar to Delimiter_List2Text(pEscapeList, ",") --ダイアログ表示 set btList to {"デフォルト", "キャンセル", "設定"} set {btIndex, inputStr} to Input_Dialog(showStr, escapeChar, btList, 3, 1000, false, false) if btIndex = -128 then return else if btIndex = 1 then set pEscapeList to defaultValue else set pEscapeList to Delimiter_Text2List(inputStr, ",") set showStr to return & "「" & inputStr & "」" & return Error_Dialog(prefStr & "エスケープする文字を、" & showStr & "にしました。" & return, "OK", 1000, false, false) end if end Pref_EscapeList --2バイト文字エスケープ設定 -- [in] -- prefName : 初期設定名 -- defaultValue : デフォルト値 -- on Pref_Escape2byte(prefName, defaultValue) set prefStr to "esc@pe 初期設定:" & prefName & return & return set onStr to "文字化けの可能性がある2バイト文字をエスケープします。" & return & "※処理に時間がかかります。" set offStr to "2バイト文字をエスケープしません。" & return & "※処理が速くなります。" if pEscape2byte then set showStr to prefStr & "現在2バイト文字エスケープはONです。" & return & onStr & return & return & "2バイト文字エスケープをOFFにしますか?" set modeStr to "OFF" set setStr to offStr else set showStr to prefStr & "現在2バイト文字エスケープはOFFです。" & return & offStr & return & return & "2バイト文字エスケープをONにしますか?" set modeStr to "ON" set setStr to onStr end if --ダイアログ表示 set btList to {"デフォルト", "キャンセル", modeStr} set btIndex to Standard_Dialog(showStr, btList, 3, 1000, false, false) if btIndex = -128 then return else if btIndex = 1 then set pEscape2byte to defaultValue else set pEscape2byte to not pEscape2byte Error_Dialog(prefStr & "2バイト文字エスケープを" & modeStr & "にしました。" & return & setStr, "OK", 1000, false, false) end if end Pref_Escape2byte --ドラッグ&ドロップ起動 -- on open dropList --global変数初期化 set gRcodeList to {return, return & (ASCII character 10), ASCII character 10} --処理開始 Drop_Items(dropList) end open --ドロップアイテム処理 -- [in] -- itemList : ドロップされたアイテムのリスト -- on Drop_Items(itemList) repeat with theItem in itemList --フォルダチェック set folderFlag to Is_Folder(theItem) --ダイブモードONであれば再帰 if (folderFlag and pDiveMode) then tell application "Finder" set nextList to every item of theItem end tell Drop_Items(nextList) else if folderFlag = false then Operate_Escape(theItem) end if end repeat end Drop_Items -- フォルダチェック -- [in] -- theItem : アイテムの参照 -- [OUT] -- true:フォルダ, false:フォルダ以外 -- on Is_Folder(theItem) return (theItem as string) ends with ":" end Is_Folder --メイン処理 -- [in] -- fileRef : ファイル参照 -- on Operate_Escape(fileRef) --テキストファイルチェック&ファイル名取得 set {textFlag, filename} to File_Info(fileRef, "TEXT") if not textFlag then set showStr to filename & "はテキストファイルではありません。" Error_Dialog(showStr, "スキップ", 2, true, false) return end if --テキストデータ読み込み set {fileData, errNo} to Read_TextFile(fileRef) if errNo < 1 then set showStr to filename & "の読み込みに失敗しました。" if errNo = -601 then set showStr to showStr & return & "メモリが不足しています。" Error_Dialog(showStr, "スキップ", 2, true, false) return end if --改行コードチェック if fileData contains item 2 of gRcodeList then set theRcode to item 2 of gRcodeList else if fileData contains item 3 of gRcodeList then set theRcode to item 3 of gRcodeList else if fileData contains item 1 of gRcodeList then set theRcode to item 1 of gRcodeList else set theRcode to "" end if --テキストを行単位でリストに分割 set dataList to Delimiter_Text2List(fileData, theRcode) --エスケープ処理 repeat with theLine in dataList --エスケープ対象文字をエスケープ if pEscapeList as string ュ "" then repeat with escapeChar in pEscapeList set contents of theLine to Replace_Text(contents of theLine, escapeChar, "\\" & escapeChar) end repeat end if --2バイト文字をエスケープ if pEscape2byte then repeat with escapeChar in pByte2charList set contents of theLine to Replace_Text(contents of theLine, escapeChar, escapeChar & "\\") end repeat end if --行頭・行末挿入テキストを付加 set contents of theLine to pHeaderText & theLine & pFooterText end repeat --分割テキストを結合 set fileData to Delimiter_List2Text(dataList, theRcode) --テキストデータ書き出し set fileRef to choose file name with prompt "保存先を指定:" default name filename set errNo to Save_TextFile(fileRef, fileData) if errNo < 1 then set showStr to "ファイルの保存に失敗しました。" Error_Dialog(showStr, "スキップ", 2, true, false) return end if end Operate_Escape -- ファイルタイプチェック&ファイル名取得 -- [in] -- fileRef : ファイル参照 -- checkFtype : 照合するファイルタイプ -- [OUT] -- ファイルタイプ : 一致:true, 不一致:false -- ファイル名 -- on File_Info(fileRef, checkFtype) tell application "Finder" set targetName to name of fileRef set targetType to file type of fileRef end tell return {targetType = checkFtype, targetName} end File_Info --テキストファイル読み込み -- [in] -- fileRef : ファイル参照 -- [OUT] -- テキストデータ : 成功:データ, 失敗:空文字 -- エラーナンバー(エラー無し:1) -- on Read_TextFile(fileRef) set readData to "" set errNo to 1 set filePtr to open for access fileRef try set readData to read filePtr as strings on error number errNo close access filePtr end try close access filePtr return {readData, errNo} end Read_TextFile --テキストファイル書き出し -- [in] -- fileRef : ファイル参照 -- saveData : 書き出すデータ -- [OUT] -- エラーナンバー(エラー無し:1) -- on Save_TextFile(fileRef, saveData) set errNo to 1 set filePtr to open for access fileRef with write permission set eof filePtr to 0 try write (saveData as text) to filePtr on error number errNo close access filePtr end try close access filePtr return errNo end Save_TextFile --指定した文字でリストをテキストに結合 -- [in] -- targetList : 対象となるリスト -- theDelim : デリミタ文字 -- [OUT] -- 結合されたテキスト -- on Delimiter_List2Text(targetList, theDelim) set saveDelim to text item delimiters of AppleScript set text item delimiters of AppleScript to theDelim set unionText to targetList as string set text item delimiters of AppleScript to saveDelim return unionText end Delimiter_List2Text --指定した文字でテキストをリストに分割 -- [in] -- targetText : 対象となるテキスト -- theDelim : デリミタ文字 -- [OUT] -- 分割されたリスト -- on Delimiter_Text2List(targetText, theDelim) set saveDelim to text item delimiters of AppleScript set text item delimiters of AppleScript to theDelim set devideList to every text item of targetText set text item delimiters of AppleScript to saveDelim return devideList end Delimiter_Text2List --指定した語句でテキストを置換 -- [in] -- targetText : 対象となるテキスト -- olgnWord : 置換前の語句 -- postWord : 置換後の語句 -- [OUT] -- 置換されたテキスト -- on Replace_Text(targetText, olgnWord, postWord) if targetText contains olgnWord then set saveDelim to text item delimiters of AppleScript set text item delimiters of AppleScript to olgnWord set textList to every text item of targetText set text item delimiters of AppleScript to postWord set targetText to textList as string set text item delimiters of AppleScript to saveDelim end if return targetText end Replace_Text -- 標準ダイアログ -- [in] -- showStr : 表示するテキスト -- btList : ボタンリスト -- defaultBt : デフォルトボタン番号(指定無し:0) -- dlogIcon : 利用するアイコン(0:Alert, 1:Notice, 2:Caution, その他:Custom) -- beepFlag : ビープを鳴らすか(鳴らす:true、鳴らさない:false) -- exitFlag : 強制終了するか(する:true, しない:false) -- [OUT] -- 通常終了:選択ボタン番号, キャンセル:-128 -- on Standard_Dialog(showStr, btList, defaultBt, dlogIcon, beepFlag, exitFlag) activate if beepFlag then beep try set dlogReply to display dialog (showStr as string) buttons btList default button defaultBt with icon dlogIcon on error number errNo if errNo = -128 and exitFlag then error number -128 else return errNo end if end try set btIndex to 1 repeat with selectBt in btList if button returned of dlogReply = contents of selectBt then exit repeat set btIndex to btIndex + 1 end repeat return btIndex end Standard_Dialog -- 入力ダイアログ -- [in] -- showStr : 表示するテキスト -- inputStr : 入力フィールドに表示するテキスト -- btList : ボタンリスト -- defaultBt : デフォルトボタン番号(指定無し:0) -- dlogIcon : 利用するアイコン(0:Alert, 1:Notice, 2:Caution, その他:Custom) -- beepFlag : ビープを鳴らすか(鳴らす:true、鳴らさない:false) -- exitFlag : 強制終了するか(する:true, しない:false) -- [OUT] -- 通常終了:選択ボタン番号, キャンセル:-128 -- 入力されたテキスト -- on Input_Dialog(showStr, inputStr, btList, defaultBt, dlogIcon, beepFlag, exitFlag) activate if beepFlag then beep try set dlogReply to display dialog (showStr as string) default answer inputStr buttons btList default button defaultBt with icon dlogIcon on error number errNo if errNo = -128 and exitFlag then error number -128 else return {errNo, ""} end if end try set btIndex to 1 repeat with selectBt in btList if button returned of dlogReply = contents of selectBt then exit repeat set btIndex to btIndex + 1 end repeat return {btIndex, text returned of dlogReply} end Input_Dialog -- エラー系ダイアログ -- [in] -- showStr : 表示するテキスト -- btName : ボタンの名前 -- dlogIcon : 利用するアイコン(0:Alert, 1:Notice, 2:Caution, その他:Custom) -- beepFlag : ビープを鳴らすか(鳴らす:true, 鳴らさない:false) -- exitFlag : 強制終了するか(する:true, しない:false) -- on Error_Dialog(showStr, btName, dlogIcon, beepFlag, exitFlag) activate if beepFlag then beep display dialog (showStr as string) buttons {btName} default button 1 with icon dlogIcon if exitFlag then error number -128 end Error_Dialog