CotEditorでオープン中の最前面の書類中のテキストの、日付フォーマットを変換するAppleScriptです。
▲スクリーンショットは作成中のものです
Blogのアーカイブ本のオマケとして(記事だけだとウンザリする仕上がりだったので)、冒頭にその年に何があったかをAppleのニュースリリースから抽出して掲載してみたのですが、日付の形式が独特だったので、手で打ち直していました。
繰り返して行うと面倒だったので、NSDataDetectorで自然言語テキスト(CotEditorの本文テキスト)から日付を自動検出して書き換えを試みたのですが、NSDataDetectorではこのサンプルのようなほんのちょっとだけ手の加わった日付テキストでは検出してくれませんでした。
一応、フォーマット自体は固定だったので、フォーマッターだけ指定すれば日付テキストとして認識し、常識的なYYYY/MM/DDの日付フォーマットに書き換えるようにしてみました。
▲日付フォーマット文字列の入力
▲日付フォーマット置換したテキスト(処理は一瞬)
ただし、日付フォーマットテキストが行で独立しているもの(添付スクリーンショットのように)を処理対象にしているので、あまり汎用性はなさそうです。
一般的には正規表現で指定することになるんでしょうけれど、その正規表現というかもともとの日付フォーマットを元のテキストから自動検出してくれることがベストだと思います。
なお、CotEditorに依存した処理はひとつもないので、JeditΩでもmiでもテキストエディットでもTextWranglerでもBBEditでも、対象にして処理することはかんたんです。クリップボードの内容に対して処理したほうがいいのかもしれません。
AppleScript名:CotEditorの最前面のテキストの日付フォーマットを変換する |
— Created 2018-07-07 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.5" use framework "Foundation" use scripting additions property NSArray : a reference to current application’s NSArray property NSString : a reference to current application’s NSString property NSLocale : a reference to current application’s NSLocale property NSDictionary : a reference to current application’s NSDictionary property NSCountedSet : a reference to current application’s NSCountedSet property NSMutableArray : a reference to current application’s NSMutableArray property NSSortDescriptor : a reference to current application’s NSSortDescriptor property NSDateFormatter : a reference to current application’s NSDateFormatter set tmpArray to NSMutableArray’s new() –変換元(テキストから自動取得できるとよかったのに) set dFfromStr to text returned of (display dialog "Input Date Format:(年=yyyy, 月=MM, 日=dd)" default answer "MM月 dd, yyyy") –変換先 set dOutFormStr to "yyyy/MM/dd" tell application "CotEditor" tell front document set aRes to contents of it end tell set aList to paragraphs of aRes end tell repeat with i in aList set j to contents of i set theDate to dateFromStringWithDateFormat(j, dFfromStr) of me if theDate is not equal to missing value then set newDateStr to convDateObjToStrWithFormat(theDate, dOutFormStr) of me (tmpArray’s addObject:newDateStr) else (tmpArray’s addObject:j) end if end repeat –NSArrayを指定デリミタをはさんでテキスト化 set tRes to tmpArray’s componentsJoinedByString:(return) set ttRes to tRes as string tell application "CotEditor" tell front document set (contents of it) to ttRes end tell end tell –日付文字列からdate objectを作成する on dateFromStringWithDateFormat(dateString as string, dateFormat as string) set dStr to NSString’s stringWithString:dateString set dateFormatStr to NSString’s stringWithString:dateFormat set aDateFormatter to NSDateFormatter’s alloc()’s init() aDateFormatter’s setDateFormat:dateFormatStr aDateFormatter’s setLocale:(NSLocale’s alloc()’s initWithLocaleIdentifier:"en_US_POSIX") set aDestDate to (aDateFormatter’s dateFromString:dStr) return aDestDate as list of string or string end dateFromStringWithDateFormat –date objectから指定の日付文字列を作成する on convDateObjToStrWithFormat(aDateO as date, aFormatStr as string) set aDF to NSDateFormatter’s alloc()’s init() set aLoc to NSLocale’s currentLocale() set aLocStr to (aLoc’s localeIdentifier()) as string aDF’s setLocale:(NSLocale’s alloc()’s initWithLocaleIdentifier:aLocStr) aDF’s setDateFormat:aFormatStr set dRes to (aDF’s stringFromDate:aDateO) as string return dRes end convDateObjToStrWithFormat |