AppleScript名:ASOCで文字を逆順に v2(CJK文字などマルチバイト対応) |
— Created 2015-09-01 by Takaaki Naganoya — Modified 2015-09-01 by Shane Stanley –Consider CJK Characters & Emoji –http://stackoverflow.com/questions/6720191/reverse-nsstring-text use AppleScript version "2.4" use scripting additions use framework "Foundation" set aUUID to (current application’s NSUUID’s UUID()’s UUIDString()) as text –> "46EF17B7-CB3E-4DD9-BA8A-013D3B30A80A" set aUUID to "😀😐" & aUUID & "😀😐" –> "😀😐46EF17B7-CB3E-4DD9-BA8A-013D3B30A80A😀😐" set revUUID to reversedStr(aUUID) as text –> "😐😀A08A03B3D310-A8AB-9DD4-E3BC-7B71FE64😐😀" on reversedStr(paramStr as text) set aStr to current application’s NSString’s stringWithString:paramStr set strLength to aStr’s |length|() set revStr to current application’s NSMutableString’s stringWithCapacity:strLength set charIndex to strLength – 1 repeat while charIndex > -1 set subStrRange to aStr’s rangeOfComposedCharacterSequenceAtIndex:charIndex revStr’s appendString:(aStr’s substringWithRange:subStrRange) set charIndex to (location of subStrRange) – 1 end repeat return revStr end reversedStr |
カテゴリー: Text
バージョン番号文字列からメジャーバージョンを取り出し数値として返す v4
AppleScript名:バージョン番号文字列からメジャーバージョンを取り出し数値として返す v4 |
use AppleScript version "2.5" use scripting additions use framework "Foundation" set a to "10.0.1" set b to retMajorVersionNumber(a) of me –> 10 set a to "9.10" set b to retMajorVersionNumber(a) of me –> 9 –バージョン番号文字列からメジャーバージョンを取り出し数値として返す on retMajorVersionNumber(a) set aStr to current application’s NSString’s stringWithString:a –> "10.0.1" (NSString) set aRes to (aStr’s componentsSeparatedByString:".") –> {"10","0","1"} (NSArray) set bRes to aRes’s firstObject() –> "10" (NSString) set cRes to bRes’s integerValue() –> 10 return cRes as integer end retMajorVersionNumber |
2つのPDFのテキストの指定ページの差分をVimdiffで表示する v2
2つのPDFの指定ページのテキスト内容をvimdiffで差分表示するAppleScriptです。
Terminal上でvimdiffによる差分比較を表示します。Mac AppStoreに出したアプリ(Double PDF)の部品として使ったらリジェクトされました。Terminal.appを使うものはリジェクトなんだそうで。
半日ぐらいですぐに別のルーチンに差し替えたので本Scriptはあっという間に闇から闇へと葬られました。
FileMergeがAppleScript用語辞書を持っていて単独配布されていたらいろいろ問題は解決される気がします。
AppleScript名:2つのPDFのテキストの指定ページの差分をVimdiffで表示する v2 |
— Created 2017-06-24 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "Quartz" set aPageNum to 103 –diffを表示する対象ページ set aPath to POSIX path of (choose file of type {"com.adobe.pdf"}) set a1Name to makeTmpFileStrPath(aPath) of me set aStr to retBodyStringFromPdf(aPath, aPageNum) of me set aStr1 to cleanUpText(aStr as string, string id 13, string id 10) of me –改行コードをCRからLFに置換 aStr1’s writeToFile:a1Name atomically:true encoding:(current application’s NSUTF8StringEncoding) |error|:(missing value) set bPath to POSIX path of (choose file of type {"com.adobe.pdf"}) set b1Name to makeTmpFileStrPath(bPath) of me set bStr to retBodyStringFromPdf(bPath, aPageNum) of me set bStr1 to cleanUpText(bStr as string, string id 13, string id 10) of me –改行コードをCRからLFに置換 bStr1’s writeToFile:b1Name atomically:true encoding:(current application’s NSUTF8StringEncoding) |error|:(missing value) set sText to "vimdiff " & quoted form of (a1Name as string) & " " & quoted form of (b1Name as string) doComInTerminalWindow(sText) of me on makeTmpFileStrPath(aPath) set aTmpPath to current application’s NSString’s stringWithString:(POSIX path of (path to temporary items)) set aUUID to current application’s NSUUID’s UUID()’s UUIDString() set aName to aUUID’s stringByAppendingPathExtension:"txt" set a1FullPath to (aTmpPath’s stringByAppendingString:aName) return a1FullPath end makeTmpFileStrPath on retBodyStringFromPdf(thePath as string, targPageNum as integer) set anNSURL to (current application’s |NSURL|’s fileURLWithPath:thePath) set theDoc to current application’s PDFDocument’s alloc()’s initWithURL:anNSURL set theCount to theDoc’s pageCount() as integer if targPageNum > theCount then return "" set aPage to (theDoc’s pageAtIndex:(targPageNum – 1)) set tmpStr to (aPage’s |string|()) return tmpStr end retBodyStringFromPdf on doComInTerminalWindow(aCMD) using terms from application "Terminal" tell application id "com.apple.Terminal" activate set wCount to count (every window whose visible is true) if wCount = 0 then –ウィンドウが1枚も表示されていない場合 do script "pwd" activate set size of front window to {1280, 700} do script aCMD in front window else –すでにウィンドウが表示されている場合 do script "pwd" in front window activate set size of front window to {1280, 700} do script aCMD in front window end if end tell end using terms from end doComInTerminalWindow on cleanUpText(someText, targStr, repStr) set theString to current application’s NSString’s stringWithString:someText set targString to current application’s NSString’s stringWithString:targStr set repString to current application’s NSString’s stringWithString:repStr set theString to theString’s stringByReplacingOccurrencesOfString:targString withString:repString options:(current application’s NSRegularExpressionSearch) range:{location:0, |length|:length of someText} return theString end cleanUpText |
PDFから本文テキストを抽出して配列にストアして文字列検索 v2
指定のPDFの本文テキストから、同義語をリストで与えて文字列検索を行い、出現ページのページ数を返すAppleScriptです。
PDFからの索引作成を行うために作成したものです。最初に対象PDFから本文テキストを(ページごとに)抽出してテキスト検索キャッシュを作成。
まずはこのテキスト検索キャッシュへの検索を行ったのち、ヒットしなかったらPDFに対して文字列検索を行います。
筆者の実行環境(MacBook Pro Retina 2012)で483ページある「AppleScript最新リファレンス」に対して本Scriptを実行して4.66 secぐらいです。
テキスト検索キャッシュの効果を発揮するためには、索引作成の同義語リストをまとめて与えて処理するのがベストでしょう。
AppleScript名:PDFから本文テキストを抽出して配列にストアして文字列検索 v2 |
— Created 2017-06-18 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "Quartz" use bPlus : script "BridgePlus" –検索対象の語群 set sList to {"Piyomaru Software", "ぴよまるソフトウェア"} –considering case set thePath to POSIX path of (choose file of type {"com.adobe.pdf"}) set aRes to findWordListInPDFContents(thePath, sList) of me –> {1, 3, 4, 71, 72, 75, 95, 96, 97, 98, 420, 429, 479, 483} —PDF本文テキスト中から、語群で出現ページをリストで取得(索引作成用) on findWordListInPDFContents(thePOSIXPath as string, sList as list) script spdPDF property textCache : missing value property aList : {} end script –PDFのテキスト内容をあらかじめページごとに読み取って、検索用のテキストキャッシュを作成 set anNSURL to (current application’s |NSURL|’s fileURLWithPath:thePOSIXPath) set theDoc to current application’s PDFDocument’s alloc()’s initWithURL:anNSURL set theCount to theDoc’s pageCount() as integer set (textCache of spdPDF) to current application’s NSMutableArray’s new() repeat with i from 0 to (theCount – 1) set aPage to (theDoc’s pageAtIndex:i) set tmpStr to (aPage’s |string|()) ((textCache of spdPDF)’s addObject:{pageIndex:i + 1, pageString:tmpStr}) end repeat –主にテキストキャッシュを対象にキーワード検索 repeat with s in sList –❶部分一致で抽出 set bRes to ((my filterRecListByLabel1((textCache of spdPDF), "pageString contains ’" & s & "’"))’s pageIndex) as list –❷、❶のページ単位のテキスト検索で見つからなかった場合(ページ間でまたがっている場合など) if bRes = {} then set bRes to {} set theSels to (theDoc’s findString:s withOptions:0) repeat with aSel in theSels set thePage to (aSel’s pages()’s objectAtIndex:0)’s label() set curPage to (thePage as integer) if curPage is not in bRes then set the end of bRes to curPage end if end repeat end if set the end of (aList of spdPDF) to bRes end repeat –2D list to 1D list conversion (Flatten) load framework set bList to (current application’s SMSForder’s arrayByFlattening:(aList of spdPDF)) as list –Uniquefy set cList to uniquifyList(bList) of me –Sort 1D List set anArray to current application’s NSArray’s arrayWithArray:cList set sortRes1 to (anArray’s sortedArrayUsingSelector:"compare:") as list of string or string –as anything set (textCache of spdPDF) to "" –Purge set (aList of spdPDF) to {} –Purge return sortRes1 end findWordListInPDFContents –リストに入れたレコードを、指定の属性ラベルの値で抽出 on filterRecListByLabel1(aRecList as list, aPredicate as string) set aArray to current application’s NSArray’s arrayWithArray:aRecList set aPredicate to current application’s NSPredicate’s predicateWithFormat:aPredicate set filteredArray to aArray’s filteredArrayUsingPredicate:aPredicate return filteredArray end filterRecListByLabel1 on uniquifyList(aList as list) set aArray to current application’s NSArray’s arrayWithArray:aList set bArray to aArray’s valueForKeyPath:"@distinctUnionOfObjects.self" return bArray as list end uniquifyList |
GHKitのじっけん
AppleScript名:GHKitのじっけん |
— Created 2016-04-12 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "GHKit" –https://github.com/gabriel/GHKit –AppleScriptObjC uses "_" as special character (equivalent to ":" in method names). So, I changed them in whole project. – Original Method Name: gh_parseISO8601: – Converted Method Name: GHparseISO8601: set aStr to current application’s NSString’s stringWithString:"Sun, 06 Nov 1994 08:49:37 +0000" set aDate to (current application’s NSDate’s GHparseRFC822:aStr) as date –> date "1994年11月6日日曜日 17:49:37" set bStr to current application’s NSString’s stringWithString:"1997-07-16T19:20:30.045Z" set bDate to (current application’s NSDate’s GHparseISO8601:bStr) as date –> date "1997年7月17日木曜日 4:20:30" set cDateStr to bDate’s GHformatHTTP() –> (NSString) "Wed, 16 Jul 1997 19:20:30 GMT" set dDate to current application’s NSDate’s GHparseTimeSinceEpoch:(1.23456789E+9) –> (NSDate) 2009-02-13 23:31:30 +0000 set eDate to current application’s NSDate’s |date|() eDate’s GHisToday() as boolean –> true —–GHyesterday() cause error.. set fDate to eDate’s GHaddDays:-1 fDate’s GHwasYesterday() as boolean –> true set ffRes to ((fDate’s GHtimeAgo:false)’s |description|()) as string –> "1 day" set anArray to current application’s NSArray’s arrayWithArray:{1, 1, 3} set cArray to anArray’s GHuniq() as list –> {1, 3} set aDic to current application’s NSDictionary’s dictionaryWithDictionary:{key1:2, key2:3.1, key3:true} set aJSONstr to (aDic’s GHtoJSON:(current application’s NSJSONWritingPrettyPrinted) |error|:(missing value)) as string (* –> (NSString) "{\n "key1" : 2,\n "key3" : true,\n "key2" : 3.1\n}" *) ( current application’s NSString’s GHisBlank:" ") as boolean–> true ( current application’s NSString’s GHisBlank:(missing value)) as boolean–> true set aStr to current application’s NSString’s stringWithString:" some text " set a1Str to (aStr’s GHstrip()) as string –> "some text" set a2Str to (aStr’s GHpresent()) as string –> " some text " set a3Str to aStr’s GHreverse() –> " txet emos " set a4Str to aStr’s GHcount:"e" –> 2 |
Absolute Timeを取得
AppleScript名:Absolute Timeを取得 |
— Created 2016-07-12 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –タイムスタンプ取得(Jan 1 2001 00:00:00 GMTからの相対秒、Absolute Timeで取得) set aTime to current application’s NSString’s stringWithFormat_("%@", current application’s CFAbsoluteTimeGetCurrent()) as string –> "490022703.57607" |
自然言語テキストから日付を抽出
NSDataDetectorを用いて、自然言語テキスト(ここでは日本語のテキスト)から日付の情報を抽出するAppleScriptです。
AppleScript名:自然言語テキストから日付を抽出 |
— Created 2015-10-08 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.5" use framework "Foundation" use scripting additions set theDate to my getDatesIn:"本テキストには次の火曜日という日付情報を含んでいる。" log theDate –> date "2015年10月13日火曜日 12:00:00" set theDate to my getDatesIn:"本テキストには今度の土曜日という日付情報を含んでいる。" log theDate –> date "2015年10月10日土曜日 12:00:00" set theDate to my getDatesIn:"昨日うな重を食べた。" log theDate –> date "2015年10月7日水曜日 12:00:00" –set theDate to my getDatesIn:"一昨日何を食べたか覚えていない。" –> error number -2700 No date found –set theDate to my getDatesIn:"The day after tommorow." –set theDate to my getDatesIn:"相対日付の認識能力は低い。明後日はいつだ?" –> error number -2700 No date found –set theDate to my getDatesIn:"本テキストには元旦という日付情報を含んでいる。" –This means 1/1 in next year –> error number -2700 No date found on getDatesIn:aString set anNSString to current application’s NSString’s stringWithString:aString set theDetector to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeDate) |error|:(missing value) set theMatch to theDetector’s firstMatchInString:anNSString options:0 range:{0, anNSString’s |length|()} if theMatch = missing value then error "No date found with String:" & aString set theDate to theMatch’s |date|() return theDate as date end getDatesIn: |
GMTとの時差を求める
AppleScript名:GMTとの時差を求める |
set tDIff to (time to GMT) / 3600 –> 9.0 |
UTCTime StringとNSDateの相互変換
AppleScript名:UTCTime StringとNSDateの相互変換 |
— Created 2015-02-24 by Shane Stanley — Changed 2015-02-25 By Takaaki Naganoya use AppleScript version "2.4" use scripting additions use framework "Foundation" set aStr to retUTCTimeString() –> "2018-02-13T12:40:01.936" set aNSDate to retNSDateFromUTCString(aStr) as date –> date "2018年2月13日火曜日 21:39:43" –Current Date -> UTCTime String on retUTCTimeString() –There is need to get Current Calendar in my Time Zone set aCalendar to current application’s NSCalendar’s currentCalendar() set aTimeZone to (aCalendar’s timeZone) set tDiff to (aTimeZone’s secondsFromGMT()) set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:"yyyy-MM-dd’T’HH:mm:ss.SSS" theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:tDiff) return (theNSDateFormatter’s stringFromDate:(current application’s NSDate’s |date|())) as text end retUTCTimeString –UTCTime String -> NSDate on retNSDateFromUTCString(aText) set aStr to current application’s NSString’s stringWithString:aText set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:"yyyy-MM-dd’T’HH:mm:ss.SSS" theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:0) return theNSDateFormatter’s dateFromString:aStr end retNSDateFromUTCString |
ISO8601フォーマット日付のテキストをdateに変換
AppleScript名:ISO8601フォーマット日付のテキストをdateに変換 |
— Created 2015-08-28 20:19:04 +0900 by Takaaki Naganoya — 2015 Piyomaru Software — http://www.tondering.dk/claus/cal/iso8601.php use AppleScript version "2.4" use scripting additions use framework "Foundation" use BridgePlus : script "BridgePlus" –https://www.macosxautomation.com/applescript/apps/BridgePlus.html set aStr to "2010-12-01T21:35:43+09:00" BridgePlus’s datesFromStrings:{aStr} inFormat:"yyyy-MM-dd’T’HH:mm:ssZ" –> {date "2010年12月1日水曜日 21:35:43"} set aStr to "2010-12-01 21:35:43" BridgePlus’s datesFromStrings:{aStr} inFormat:"yyyy-MM-dd HH:mm:ss" –> {date "2010年12月1日水曜日 21:35:43"} |
ISO8601日付文字列を生成 v2
AppleScript名:ISO8601日付文字列を生成 v2 |
use AppleScript version "2.5" use scripting additions use framework "Foundation" set aDate to getDateInternational(2018, 12, 18, 9, 59, 35, "CET") –―year, month, date, hour, minute, second, time zone abbreviation. set bStr to retISO8601DateTimeString(aDate, "CET") as string –> "2018-12-18T09:59:35+01:00" –NSDate -> ISO8601 Date & Time String on retISO8601DateTimeString(targDate, timeZoneAbbreviation) set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:"yyyy-MM-dd’T’HH:mm:ssZZZZZ" — Five zeds to get a colon in the time offset (except with GMT). theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(timeZoneAbbreviation)) return (theNSDateFormatter’s stringFromDate:targDate) as text end retISO8601DateTimeString –Make a GMT Date Object with parameters from a given time zone. on getDateInternational(aYear, aMonth, aDay, anHour, aMinute, aSecond, timeZoneAbbreviation) set theNSCalendar to current application’s NSCalendar’s currentCalendar() theNSCalendar’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(timeZoneAbbreviation)) set theDate to theNSCalendar’s dateWithEra:1 |year|:aYear |month|:aMonth |day|:aDay hour:anHour minute:aMinute |second|:aSecond nanosecond:0 return theDate as date end getDateInternational |
date objectをRFC2822 date stringに変換
AppleScript名:date objectをRFC2822 date stringに変換 |
— Created 2017-12-19 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aDate to getDateInternational(2018, 2, 1) of me set bStr to rfc2822DateTimeString(aDate, "JST") as string –> "Thu, 01 Feb 2018 00:00:00 +0900" –date -> RFC2822 Date & Time String on rfc2822DateTimeString(targDate, timeZoneName as string) set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:"EEE, dd MMM yyyy HH:mm:ss Z" theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s alloc()’s initWithName:timeZoneName) theNSDateFormatter’s setLocale:(current application’s NSLocale’s alloc()’s initWithLocaleIdentifier:"en_US_POSIX") return (theNSDateFormatter’s stringFromDate:targDate) as text end rfc2822DateTimeString –Make Date Object from parameters on getDateInternational(aYear as integer, aMonth as integer, aDay as integer) set theNSCalendar to current application’s NSCalendar’s currentCalendar() set theDate to theNSCalendar’s dateWithEra:1 |year|:aYear |month|:aMonth |day|:aDay hour:0 minute:0 |second|:0 nanosecond:0 return theDate as date end getDateInternational |
RFC822エンコーダー v0
AppleScript名:RFC822エンコーダー v0 |
— Created 2016-02-07 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" set aStr to "2016-02-06 11:00:00" set rfc822str to retRFC822StrFromDateStr(aStr) of me –> "Sat, 06 Feb 2016 11:00:00GMT" on retRFC822StrFromDateObj(aObj) set aFormat to "yyyy-MM-dd HH:mm:ss" set aTZ to "GMT" set bDate to retNSDateFromStringWithTimeZone(aStr, aFormat, aTZ) of me set aGMform to current application’s NSDateFormatter’s alloc()’s init() aGMform’s setDateFormat:"EEE, dd MMM yyyy HH:mm:ss" aGMform’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:0) set usLocale to current application’s NSLocale’s alloc()’s initWithLocaleIdentifier:"GMT" aGMform’s setLocale:usLocale set theDate to aGMform’s stringFromDate:bDate set theDate to theDate’s stringByAppendingString:"GMT" return theDate as string end retRFC822StrFromDateObj on retRFC822StrFromDateStr(aStr) set aFormat to "yyyy-MM-dd HH:mm:ss" set aTZ to "GMT" set bDate to retNSDateFromStringWithTimeZone(aStr, aFormat, aTZ) of me set aGMform to current application’s NSDateFormatter’s alloc()’s init() aGMform’s setDateFormat:"EEE, dd MMM yyyy HH:mm:ss" aGMform’s setTimeZone:(current application’s NSTimeZone’s timeZoneForSecondsFromGMT:0) set usLocale to current application’s NSLocale’s alloc()’s initWithLocaleIdentifier:"GMT" aGMform’s setLocale:usLocale set theDate to aGMform’s stringFromDate:bDate set theDate to theDate’s stringByAppendingString:" GMT" return theDate as string end retRFC822StrFromDateStr on retNSDateFromStringWithTimeZone(aText, aFormat, aTZ) set aStr to current application’s NSString’s stringWithString:aText set theNSDateFormatter to current application’s NSDateFormatter’s alloc()’s init() theNSDateFormatter’s setDateFormat:(current application’s NSString’s stringWithString:aFormat) theNSDateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(current application’s NSString’s stringWithString:aTZ)) return (theNSDateFormatter’s dateFromString:aStr) –as date end retNSDateFromStringWithTimeZone |
RFC822デコーダー v0
AppleScript名:RFC822デコーダー v0 |
— Created 2016-02-07 by Takaaki Naganoya — 2016 Piyomaru Software –http://stackoverflow.com/questions/1850824/parsing-a-rfc-822-date-with-nsdateformatter use AppleScript version "2.4" use scripting additions use framework "Foundation" set dateString to "Sun, 19 May 2002 15:21:36 GMT" –set dateString to "Tue, 01 Dec 2009 08:48:25 +0000" set aRes to rfc822StrDecode(dateString) of me –> date "2002年5月20日月曜日 0:21:36" –http://stackoverflow.com/questions/1850824/parsing-a-rfc-822-date-with-nsdateformatter on rfc822StrDecode(dateString) set aTZ to "GMT" set en_US_POSIX to current application’s NSLocale’s alloc()’s initWithLocaleIdentifier:"en_US_POSIX" set dateFormatter to current application’s NSDateFormatter’s alloc()’s init() dateFormatter’s setLocale:en_US_POSIX dateFormatter’s setTimeZone:(current application’s NSTimeZone’s timeZoneWithAbbreviation:(current application’s NSString’s stringWithString:aTZ)) set aDate to missing value set RFC822String to (current application’s NSString’s stringWithString:dateString)’s uppercaseString() if (RFC822String’s rangeOfString:",")’s location() is not equal to (current application’s NSNotFound) then if aDate is equal to missing value then — Sun, 19 May 2002 15:21:36 GMT dateFormatter’s setDateFormat:"EEE, d MMM yyyy HH:mm:ss zzz" set aDate to dateFormatter’s dateFromString:RFC822String end if if aDate is equal to missing value then — Sun, 19 May 2002 15:21 GMT dateFormatter’s setDateFormat:"EEE, d MMM yyyy HH:mm zzz" set aDate to dateFormatter’s dateFromString:RFC822String end if if aDate is equal to missing value then — Sun, 19 May 2002 15:21:36 dateFormatter’s setDateFormat:"EEE, d MMM yyyy HH:mm:ss" set aDate to dateFormatter’s dateFromString:RFC822String end if if aDate is equal to missing value then — Sun, 19 May 2002 15:21:36 dateFormatter’s setDateFormat:"EEE, d MMM yyyy HH:mm" set aDate to dateFormatter’s dateFromString:RFC822String end if else if aDate is equal to missing value then — 19 May 2002 15:21:36 GMT dateFormatter’s setDateFormat:"d MMM yyyy HH:mm:ss zzz" set aDate to dateFormatter’s dateFromString:RFC822String end if if aDate is equal to missing value then — 19 May 2002 15:21 GMT dateFormatter’s setDateFormat:"d MMM yyyy HH:mm zzz" set aDate to dateFormatter’s dateFromString:RFC822String end if if aDate is equal to missing value then — 19 May 2002 15:21:36 dateFormatter’s setDateFormat:"d MMM yyyy HH:mm:ss" set aDate to dateFormatter’s dateFromString:RFC822String end if if aDate is equal to missing value then — 19 May 2002 15:21 dateFormatter’s setDateFormat:"d MMM yyyy HH:mm" set aDate to dateFormatter’s dateFromString:RFC822String end if end if if aDate is equal to missing value then return false return aDate as date end rfc822StrDecode |
画像を文字認識して文字エリアを塗りつぶし v3
▲Original Image
▲Filtered Image(CIColorMonochrome)
▲Filtered Image(CIColorPosterize)
▲Result Image
AppleScript名:画像を文字認識して文字エリアを塗りつぶし v3 |
— Created 2017-11-19 by Takaaki Naganoya — Modified 2018-02-11 by Takaaki Naganoya –v3:画像の前処理を付加 use AppleScript version "2.5" use scripting additions use framework "Foundation" use framework "AppKit" use framework "QuartzCore" use framework "AppKit" set retinaF to (current application’s NSScreen’s mainScreen()’s backingScaleFactor()) as real –> 2.0 (Retina) / 1.0 (Non Retina) set imgPath to POSIX path of (choose file of type {"public.image"}) set anImage to current application’s NSImage’s alloc()’s initWithContentsOfFile:imgPath set aCIImage to convNSImageToCIimage(anImage) –モノクロ化フィルタ set bCIImage to monochromefilterACGImage(aCIImage) of me –2階調ポスタライズフィルタ set cCIImage to posterizefilterACGImage(bCIImage) of me –文字領域認識 set detectList to textDetect(cCIImage) of me –描画開始 anImage’s lockFocus() repeat with i in detectList set origX to (x of origin of i) / retinaF set origY to (y of origin of i) / retinaF set sizeX to (width of |size| of i) / retinaF set sizeY to (height of |size| of i) / retinaF set theRect to {{x:origX, y:origY}, {width:sizeX, height:sizeY}} set theNSBezierPath to current application’s NSBezierPath’s bezierPath (theNSBezierPath’s appendBezierPathWithRect:theRect) set rRnd to (random number from 1 to 10) / 10 set gRnd to (random number from 1 to 10) / 10 set bRnd to (random number from 1 to 10) / 10 set fillColor to (current application’s NSColor’s colorWithCalibratedRed:rRnd green:gRnd blue:bRnd alpha:0.6) fillColor’s |set|() –色設定 theNSBezierPath’s fill() –ぬりつぶし end repeat anImage’s unlockFocus() –描画ここまで set aUUIDstr to (current application’s NSUUID’s UUID()’s UUIDString()) as string set aPath to ((current application’s NSString’s stringWithString:imgPath)’s stringByDeletingLastPathComponent()’s stringByAppendingPathComponent:aUUIDstr)’s stringByAppendingPathExtension:"png" set fRes to saveImageRepAtPathAsPNG(anImage, aPath) of me on openImageFile(imageFile) — imageFile: POSIX path 形式のファイルパス set fileURL to current application’s |NSURL|’s fileURLWithPath:imageFile return current application’s CIImage’s alloc()’s initWithContentsOfURL:fileURL end openImageFile –画像を指定パスにPNG形式で保存 on saveImageRepAtPathAsPNG(anImage, outPath) set imageRep to anImage’s TIFFRepresentation() set aRawimg to current application’s NSBitmapImageRep’s imageRepWithData:imageRep –書き出しファイルパス情報を作成 set pathString to current application’s NSString’s stringWithString:outPath set newPath to pathString’s stringByExpandingTildeInPath() –書き出し set myNewImageData to (aRawimg’s representationUsingType:(current application’s NSPNGFileType) |properties|:(missing value)) return (myNewImageData’s writeToFile:newPath atomically:true) as boolean end saveImageRepAtPathAsPNG on textDetect(imageRef) — 検出器のオプションを NSDictonary で作成 set optDic1 to current application’s NSDictionary’s dictionaryWithObject:(current application’s CIDetectorAccuracyHigh) forKey:(current application’s CIDetectorAccuracy) set textDetector to current application’s CIDetector’s detectorOfType:(current application’s CIDetectorTypeText) context:(missing value) options:optDic1 — 文字エリア検出を実行 set optDic2 to current application’s NSDictionary’s dictionaryWithObject:true forKey:(current application’s CIDetectorReturnSubFeatures) set textArray to textDetector’s featuresInImage:imageRef options:optDic2 set fList to {} — 検出されたテキストの位置とサイズをログに出力 repeat with i from 1 to (count of textArray) set typeFace to item i of textArray set bList to (typeFace’s subFeatures()) repeat with ii in bList set aBounds to ii’s |bounds|() set aType to ii’s type() set the end of fList to aBounds end repeat end repeat return fList end textDetect on convCIimageToNSImage(aCIImage) set aRep to current application’s NSBitmapImageRep’s alloc()’s initWithCIImage:aCIImage set tmpSize to aRep’s |size|() set newImg to current application’s NSImage’s alloc()’s initWithSize:tmpSize newImg’s addRepresentation:aRep return newImg end convCIimageToNSImage on convNSImageToCIimage(aNSImage) set tiffDat to aNSImage’s TIFFRepresentation() set aRep to current application’s NSBitmapImageRep’s imageRepWithData:tiffDat set newImg to current application’s CIImage’s alloc()’s initWithBitmapImageRep:aRep return newImg end convNSImageToCIimage –Posterizeフィルタ on posterizefilterACGImage(aCIImage) set aFilter to current application’s CIFilter’s filterWithName:"CIColorPosterize" aFilter’s setDefaults() aFilter’s setValue:aCIImage forKey:"inputImage" aFilter’s setValue:2 forKey:"inputLevels" set aOutImage to aFilter’s valueForKey:"outputImage" return aOutImage end posterizefilterACGImage –Monochromeフィルタ on monochromefilterACGImage(aCIImage) set aFilter to current application’s CIFilter’s filterWithName:"CIColorMonochrome" aFilter’s setDefaults() aFilter’s setValue:aCIImage forKey:"inputImage" aFilter’s setValue:1.0 forKey:"inputIntensity" set aOutImage to aFilter’s valueForKey:"outputImage" return aOutImage end monochromefilterACGImage |
RTF本文内の色を置換 v2
指定のRTF書類の本文中の色を置換するAppleScriptです。
指定のRTF書類内のカラーをざっくりとした色に分類し、同じくざっくりとした色名で置換対象を指定し(blue, green)、指定色(black)に色置換。結果をデスクトップ上に別名で保存します。
AppleScript名:RTF本文内の色を置換 v2 |
— Created 2018-01-13 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" property NSData : a reference to current application’s NSData property NSUUID : a reference to current application’s NSUUID property NSColor : a reference to current application’s NSColor property NSString : a reference to current application’s NSString property NSPredicate : a reference to current application’s NSPredicate property NSDictionary : a reference to current application’s NSDictionary property NSMutableArray : a reference to current application’s NSMutableArray property NSMutableAttributedString : a reference to current application’s NSMutableAttributedString property NSForegroundColorAttributeName : a reference to current application’s NSForegroundColorAttributeName property NSDocumentTypeDocumentAttribute : a reference to current application’s NSDocumentTypeDocumentAttribute set targFilePath to POSIX path of (choose file of type {"public.rtf"}) set targColorNameList to {"blue", "green"} –replace target color names set toColor to NSColor’s blackColor() –to color set aRes to replaceRTFColorsByColorName(targFilePath, targColorNameList, toColor, 65535) of me –指定RTF書類本文中、名称で指定した色の該当箇所を指定色(NSColor)に置換する(複数色) on replaceRTFColorsByColorName(targFilePath as string, targColorNameList as list, toColor, aColorMax as integer) script spd property hitList : {} end script set (hitList of spd) to {} set aFilePath to NSString’s stringWithString:(targFilePath) set aData to NSData’s dataWithContentsOfFile:aFilePath options:0 |error|:(missing value) set theStyledText to NSMutableAttributedString’s alloc()’s initWithData:aData options:(missing value) documentAttributes:(missing value) |error|:(missing value) set attrList to getAttributeRunsFromAttrString(theStyledText, aColorMax) of me set attrArray to NSMutableArray’s arrayWithArray:attrList theStyledText’s beginEditing() —— repeat with ii in targColorNameList set jj to contents of ii set thePred to NSPredicate’s predicateWithFormat_("colorName == %@", jj) set (hitList of spd) to ((attrArray’s filteredArrayUsingPredicate:thePred)’s valueForKey:"rangeVal") as list repeat with i in (hitList of spd) (theStyledText’s addAttribute:(NSForegroundColorAttributeName) value:toColor range:(contents of i)) end repeat end repeat theStyledText’s endEditing() —— –Save RTF to desktop set targFol to current application’s NSHomeDirectory()’s stringByAppendingPathComponent:"Desktop" set aRes to saveStyledTextAsRTF(targFol, theStyledText) of me return aRes as boolean end replaceRTFColorsByColorName –AttributedStringを書式でlist of record化 on getAttributeRunsFromAttrString(theStyledText, aColorMax) script aSpd property styleList : {} end script set (styleList of aSpd) to {} —for output set thePureString to theStyledText’s |string|() –pure string from theStyledText set theLength to theStyledText’s |length|() set startIndex to 0 repeat until (startIndex = theLength) set {theAtts, theRange} to theStyledText’s attributesAtIndex:startIndex longestEffectiveRange:(reference) inRange:{startIndex, theLength – startIndex} –String set aText to (thePureString’s substringWithRange:theRange) as string –Color set aColor to (theAtts’s valueForKeyPath:"NSColor") if aColor is not equal to missing value then set aSpace to aColor’s colorSpace() set aRed to (aColor’s redComponent()) * aColorMax set aGreen to (aColor’s greenComponent()) * aColorMax set aBlue to (aColor’s blueComponent()) * aColorMax set colList to {aRed as integer, aGreen as integer, aBlue as integer} –for comparison set colStrForFind to (aRed as integer as string) & " " & (aGreen as integer as string) & " " & (aBlue as integer as string) –for filtering else set colList to {0, 0, 0} set colStrForFind to "0 0 0" end if –Color Name set cName to retColorName(aRed, aGreen, aBlue, aColorMax) of me –Font set aFont to (theAtts’s valueForKeyPath:"NSFont") if aFont is not equal to missing value then set aDFontName to aFont’s displayName() set aDFontSize to aFont’s pointSize() end if set the end of (styleList of aSpd) to {stringVal:aText, colorStr:colStrForFind, colorVal:colList, fontName:aDFontName as string, fontSize:aDFontSize, rangeVal:theRange, colorName:cName} set startIndex to current application’s NSMaxRange(theRange) end repeat return (styleList of aSpd) end getAttributeRunsFromAttrString –RGB値から色名称(だいたいの色)を計算する on retColorName(rCol as integer, gCol as integer, bCol as integer, aColMax as integer) set aCol to makeNSColorFromRGBAval(rCol, gCol, bCol, aColMax, aColMax) of me set hueVal to aCol’s hueComponent() as real set satVal to aCol’s saturationComponent() as real set brightVal to aCol’s brightnessComponent() as real if satVal ≤ 0.01 then set satVal to 0.0 if satVal = 0.0 then if brightVal ≤ 0.2 then set colName to "black" else if (brightVal > 0.95) then set colName to "white" else set colName to "gray" end if else if hueVal ≤ (15.0 / 360) or hueVal ≥ (330 / 360) then set colName to "red" else if hueVal ≤ (45.0 / 360) then set colName to "orange" else if hueVal < (70.0 / 360) then set colName to "yellow" else if hueVal < (150.0 / 360) then set colName to "green" else if hueVal < (190.0 / 360) then set colName to "cyan" else if (hueVal < 250.0 / 360.0) then set colName to "blue" else if (hueVal < 290.0 / 360.0) then set colName to "purple" else set colName to "magenta" end if end if return colName end retColorName on makeNSColorFromRGBAval(redValue as integer, greenValue as integer, blueValue as integer, alphaValue as integer, aMaxVal as integer) set aRedCocoa to (redValue / aMaxVal) as real set aGreenCocoa to (greenValue / aMaxVal) as real set aBlueCocoa to (blueValue / aMaxVal) as real set aAlphaCocoa to (alphaValue / aMaxVal) as real set aColor to NSColor’s colorWithCalibratedRed:aRedCocoa green:aGreenCocoa blue:aBlueCocoa alpha:aAlphaCocoa return aColor end makeNSColorFromRGBAval –スタイル付きテキストを指定フォルダ(POSIX path)にRTFで書き出し on saveStyledTextAsRTF(targFol, aStyledString) set bstyledLength to aStyledString’s |string|()’s |length|() set bDict to NSDictionary’s dictionaryWithObject:"NSRTFTextDocumentType" forKey:(NSDocumentTypeDocumentAttribute) set bRTF to aStyledString’s RTFFromRange:(current application’s NSMakeRange(0, bstyledLength)) documentAttributes:bDict set theName to (NSUUID’s UUID()’s UUIDString()) set thePath to NSString’s stringWithString:targFol set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:"rtf" return (bRTF’s writeToFile:thePath atomically:true) as boolean end saveStyledTextAsRTF |
rtf_rtfdからテキスト抽出
RTFないしRTFD(添付ファイルつきRTF)からテキストを抽出するAppleScriptです。
AppleScript名:rtf_rtfdからテキスト抽出 |
— Created 2018-02-10 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aFile to choose file of type {"com.apple.rtfd", "public.rtf"} set aRes to retTextFromRTF(aFile) of me on retTextFromRTF(aFile) set aFilePath to current application’s NSString’s stringWithString:(POSIX path of aFile) set anExt to (aFilePath’s pathExtension()) as string if anExt = "rtfd" then set aFilePath to aFilePath’s stringByAppendingString:"TXT.rtf" end if set aData to current application’s NSData’s dataWithContentsOfFile:aFilePath options:0 |error|:(missing value) set theStyledText to current application’s NSMutableAttributedString’s alloc()’s initWithData:aData options:(missing value) documentAttributes:(missing value) |error|:(missing value) if theStyledText is not equal to missing value then return (theStyledText’s |string|()) as string else return false –Not RTF file end if end retTextFromRTF |
指定URLをロードしてtitleを取得
AppleScript名:指定URLをロードしてtitleを取得 |
— Created 2015-09-07 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "WebKit" property loadDone : false property theWebView : missing value set aURL to "https://www.youtube.com/watch?v=WuziqYptTyE" set aTitle to getPageTitle(aURL) –> "戦場の絆ポータブル【HD】鉱山都市 オンライン対戦 2015.09.04 – YouTube" on getPageTitle(aURL) –Check If this script runs in foreground if not (current application’s NSThread’s isMainThread()) as boolean then display alert "This script must be run from the main thread (Command-Control-R in Script Editor)." buttons {"Cancel"} as critical error number -128 end if set my loadDone to false set my theWebView to missing value openURL(aURL) set waitLoop to 1000 * 60 –60 seconds set hitF to false repeat waitLoop times if my loadDone = true then set hitF to true exit repeat end if current application’s NSThread’s sleepForTimeInterval:("0.001" as real) –delay 0.001 end repeat if hitF = false then return set jsText to "document.title" set x to ((my theWebView)’s stringByEvaluatingJavaScriptFromString:jsText) as text set my theWebView to missing value return x end getPageTitle –WebViewにURLを読み込む on openURL(aURL) set noter1 to current application’s NSNotificationCenter’s defaultCenter() set my theWebView to current application’s WebView’s alloc()’s init() noter1’s addObserver:me selector:"webLoaded:" |name|:(current application’s WebViewProgressFinishedNotification) object:(my theWebView) my (theWebView’s setMainFrameURL:aURL) end openURL –Web Viewのローディング完了時に実行 on webLoaded:aNotification set my loadDone to true end webLoaded: |
URLの妥当性チェック
AppleScript名:URLの妥当性チェック |
— Created 2015-09-06 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –http://stackoverflow.com/questions/1471201/how-to-validate-an-url-on-the-iphone set aRes1 to validateURL("http://www.apple.com/jp") –> true set aRes2 to validateURL("http.s://www.gmail.com") –> false set aRes3 to validateURL("https:.//gmailcom") –> false set aRes4 to validateURL("https://gmail.me.") –> false set aRes5 to validateURL("https://www.gmail.me.com.com.com.com") –> true set aRes6 to validateURL("http:/./ww-w.wowone.com") –> false set aRes7 to validateURL("http://.www.wowone") –> false set aRes8 to validateURL("http://www.wow-one.com") –> true set aRes9 to validateURL("http://www.wow_one.com") –> true set aRes10 to validateURL("http://.") –> false set aRes11 to validateURL("http://") –> false set aRes12 to validateURL("http://k") –> false return {aRes2, aRes3, aRes4, aRes5, aRes6, aRes7, aRes8, aRes9, aRes10, aRes11, aRes12} –> {false, false, false, true, false, false, true, true, false, false, false} –URLの妥当性チェック on validateURL(anURL as text) –set regEx1 to current application’s NSString’s stringWithString:"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+" set regEx1 to current application’s NSString’s stringWithString:"((https|http)://)((\\w|-)+)(([.]|[/])((\\w|-)+))+" set predicate1 to current application’s NSPredicate’s predicateWithFormat_("SELF MATCHES %@", regEx1) set aPredRes1 to (predicate1’s evaluateWithObject:anURL) as boolean return aPredRes1 end validateURL |
画像にステガノグラフィーで埋め込まれた文字列を取り出す
オープンソースのステガノグラフィーのプログラム「ISStego」(By Isaac Stevao Sena氏)を用いて、JPEG画像に埋め込んだ文字情報を取り出すAppleScriptです。
ISStegoは普通にObjective-Cで書かれたGUIベースのアプリケーションだったので、そのままではAppleScriptから呼び出せませんでした。
そこで、中身をそのままそっくり移し替えた新規フレームワーク「stegLib.framework」をでっちあげてビルドし、AppleScriptから呼び出してみました。
JPEG画像にUTF-8の文字情報(日本語文字列)を埋め込んで別のPNG画像に書き出し、書き出した画像からUTF-8の文字情報を取り出す実験を行ってみました。エンコードもデコードもうまく行っているようなので、うまく処理できていると思います。
ステガノグラフィーについて初めて聞いたのは20年ぐらい前のことと記憶していますが、こんなに手軽に使えるようになっていたとは驚きです。
▲Original Image
▲Information Embedded Image
AppleScript名:画像にステガノグラフィーで埋め込まれた文字列を取り出す |
— Created 2015-10-21 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" use framework "stegLib" –https://github.com/isena/ISStego set aFile to POSIX path of (choose file of type {"public.png"}) set aFilePath to current application’s NSString’s stringWithString:aFile set aURL to current application’s |NSURL|’s fileURLWithPath:aFilePath set aImage to current application’s NSImage’s alloc()’s initWithContentsOfURL:aURL set aDecodedData to current application’s ISStegoDecoder’s alloc()’s init()’s decodeStegoImage:aImage |error|:(missing value) set resStr to (current application’s NSString’s alloc()’s initWithData:aDecodedData encoding:(current application’s NSUTF8StringEncoding)) as string –> "長野谷隆昌/ぴよまるソフトウェア/Piyomaru Software" |