Archive for the 'NSDataDetector' Category

2015/09/07 メーラーから取得したメールアドレスのうち純粋なアドレス部分を抽出 v2

Cocoaの機能を用いて、メーラーから取得した「name<address>」的な余計な文字のついたメールアドレス文字列から純粋なアドレス部分を抽出するAppleScriptです。

Shaneから「こう書けば短くなるよ」と、3分の1ぐらいに短くなる書き方を教えてもらいました。しかも、与えた文字列にメールアドレスが複数記載してあってもlistで複数返すようになっています。

AppleScript名:ASOCでメーラーから取得したメールアドレスのうち純粋なアドレス部分を抽出 v2
– Created 2015-09-07 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set theString to “Takaaki Naganoya<maro@piyocast.com>”
set theAddress to extractMailAddress(theString)
–>  {”maro@piyocast.com”}

set theString to “Takaaki Naganoya<maro@piyocast.com>,Takaaki Naganoya<maro@piyocast.com>,Takaaki Naganoya<maro@piyocast.com>”
set theAddress to extractMailAddress(theString)
–> {”maro@piyocast.com”, “maro@piyocast.com”, “maro@piyocast.com”}

on extractMailAddress(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeLink) |error|:(reference)
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to theMatches’s valueForKey:“URL”
  
set thePredicate to current application’s NSPredicate’s predicateWithFormat:“scheme == ’mailto’”
  
set theResults to theResults’s filteredArrayUsingPredicate:thePredicate
  
return (theResults’s valueForKey:“resourceSpecifier”) as list
end extractMailAddress

★Click Here to Open This Script 

2015/09/07 メーラーから取得したメールアドレスのうち純粋なアドレス部分を抽出

Cocoaの機能を用いて、メーラーから取得した「name<address>」的な余計な文字のついたメールアドレス文字列から純粋なアドレス部分を抽出するAppleScriptです。

DataDetectorでURLを抽出し、URL Schemeがmailto:なものをメールアドレスとして採用しています。

AppleScript名:ASOCでメーラーから取得したメールアドレスのうち純粋なアドレス部分を抽出
– Created 2015-09-07 by Takaaki Naganoya
– By Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set theString to “Takaaki Naganoya<maro @piyocast.com>”
set theAddress to extractMailAddress(theString)
–>  ”maro@piyocast.com”

on extractMailAddress(theString)
  
  
–メールアドレスをメールアドレス(URL)をDataDetectorで検出
  
set theURLs to (extractLinksFromNaturalText(theString))
  
–>  {​​​​​(NSURL) mailto:maro@piyocast.com​​​}
  
  
set hitF to false
  
repeat with i in theURLs
    –メールURLのうちのプロトコルschemeを抽出
    
set anURL to contents of i
    
set aScheme to (anURL’s |scheme|() as text)
    
–>  ”mailto”
    
if aScheme = “mailto” then
      set hitF to true
      
exit repeat –最初に見つけたmailtoのURLを抽出する。複数存在しても2つ目以降は無視
    end if
  end repeat
  
  
if hitF = false then return “” –mailtoのURLが存在しなかったらヌル文字列を文字列を返す
  
  
–メールURL文字列(文字列(schemeつき))を取得
  
set aStr to anURL’s absoluteString()
  
–>  (NSString) “mailto:maro@piyocast.com”
  
  
–メールURLからscheme部分を除去
  
set bStr to aStr’s stringByReplacingOccurrencesOfString:(aScheme & “:”) withString:“”
  
–>  (NSString) “maro@piyocast.com”
  
  
return bStr as text
  
end extractMailAddress

on extractLinksFromNaturalText(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeLink) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to theMatches’s valueForKey:“URL”
  
  
return theResults as list
end extractLinksFromNaturalText

★Click Here to Open This Script 

2015/08/22 NSDataDetectorを用いてテキストから各種データを抽出

NSDataDetectorを用いて、本来は自然言語のテキスト(メールの本文とかスケジュールとか)から指定の属性の情報を抽出するAppleScriptです。

前バージョンよりも情報抽出部を短く記述できるという指摘がShaneからあったため、その点を書き換えて動作確認したものです。内容自体は前バージョンと変わりありません。

NSDataDetectorのサンプルで、すべての属性データを指定しているものが存在せず、ひととおり調べてテストするのにはそれなりに時間がかかりました(T_T)

AppleScript名:ASOCで各種文字列からdate objectを抽出 v2
– Created 2015-08-21 by Shane Stanley
– Modified 2015-08-22 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use script “BridgePlus”

set theString to “Sunny September 4
Fri., September 1
Fri. Sept. 2
Fri Sep 3
Sep. 4
Sept. 9
9/8
9/7/15
09/06/2015
9/5/2015
2015/9/5
2015年9月5日
2015年9月5日(土)
2015.9.5


set theDates to ASify from (my getDatesIn:theString)
–>  {​​​​​date “2015年9月4日金曜日 12:00:00″, ​​​​​date “2015年9月1日火曜日 12:00:00″, ​​​​​date “2015年9月2日水曜日 12:00:00″, ​​​​​date “2015年9月3日木曜日 12:00:00″, ​​​​​date “2015年9月4日金曜日 12:00:00″, ​​​​​date “2015年9月9日水曜日 12:00:00″, ​​​​​date “2009年7月15日水曜日 12:00:00″, ​​​​​date “2015年9月6日日曜日 12:00:00″, ​​​​​date “2015年9月5日土曜日 12:00:00″, ​​​​​date “2015年9月5日土曜日 12:00:00″, ​​​​​date “2015年9月5日土曜日 12:00:00″, ​​​​​date “2015年9月5日土曜日 12:00:00″​​​}

on getDatesIn:aString
  set anNSString to current application’s NSString’s stringWithString:aString
  
  set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeDate) |error|:(reference)
  
  set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to theMatches’s valueForKey:“date”
  
  return theResults as list
end getDatesIn:

★Click Here to Open This Script 

AppleScript名:ASOCで各種文字列から電話番号を抽出 v2
– Created 2015-08-21 by Shane Stanley
– Modified 2015-08-21 by Takaaki Naganoya
– Modified 2015-08-22 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set theString to “長野谷隆昌
(Takaaki Naganoya)
maro@piyocast.com
http://piyocast.com/as
2015年8月21日〜23日
080-1111-2222
東京都練馬区中村橋1-2-3

set theDates to (extractPhoneNumberFromNaturalText(theString))
–>  {​​​​​”080-1111-2222″​​​}

on extractPhoneNumberFromNaturalText(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypePhoneNumber) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to theMatches’s valueForKey:“phoneNumber”
  
  
return theResults as list
end extractPhoneNumberFromNaturalText

★Click Here to Open This Script 

AppleScript名:ASOCで各種文字列から住所を抽出 v2
– Created 2015-08-21 by Shane Stanley
– Modified 2015-08-21 by Takaaki Naganoya
– Modified 2015-08-22 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set theString to “長野谷隆昌
(Takaaki Naganoya)
maro@piyocast.com
http://piyocast.com/as
2015年8月21日〜23日
東京都練馬区中村橋1-2-3

set theDates to (extractAddressFromNaturalText(theString))
–>  {{State:”東京都”, Street:”中村橋1-2-3″, City:”練馬区”}}

on extractAddressFromNaturalText(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeAddress) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to theMatches’s valueForKey:“addressComponents”
  
  
return theResults as list
end extractAddressFromNaturalText

★Click Here to Open This Script 

AppleScript名:ASOCで各種文字列からリンクURLを抽出 v2
– Created 2015-08-21 by Shane Stanley
– Modified 2015-08-21 by Takaaki Naganoya
– Modified 2015-08-22 by Shane Stanley
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set theString to "長野谷隆昌
(Takaaki Naganoya)
maro@piyocast.com
http://piyocast.com/as
2015年8月21日〜23日
080-1111-2222
東京都練馬区中村橋1-2-3
"

set theDates to (extractLinksFromNaturalText(theString))
–>  {​​​​​(NSURL) mailto:maro@piyocast.com, ​​​​​(NSURL) http://piyocast.com/as​​​}

on extractLinksFromNaturalText(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeLink) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to theMatches’s valueForKey:"URL"
  
  
return theResults as list
end extractLinksFromNaturalText

★Click Here to Open This Script 

AppleScript名:ASOCで各種文字列からフライト情報を抽出 v2
– Created 2015-08-21 by Shane Stanley
– Modified 2015-08-21 by Takaaki Naganoya
– Modified 2015-08-22 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set theString to “UA460 SFO to YVR [Flight] 6/12/2013 United Airlines(UA) #460 dep SFO 7:57pm PDT arr YVR 10:14pm PDT; Ticket #0162360127882, Ticket #0162360127883; conf #K5XBXY; Note:, Seats:—/30A , Seats:—/30B

set theDates to (extractTransitInfoFromNaturalText(theString))
–>  {​​​​​{​​​​​​​Flight:”460″​​​​​}​​​}

on extractTransitInfoFromNaturalText(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeTransitInformation) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to theMatches’s valueForKey:“components”
  
  
return theResults as list
end extractTransitInfoFromNaturalText

★Click Here to Open This Script 

2015/08/22 ASOCで各種文字列からdate objectに変換 ほかNSDataDetectorの活用

Shane StanleyのShane StanleyによるScript Library「BridgePlus」の機能を用いた各種「日付っぽい文字列」をdate objectに変換するAppleScriptです。

US Appleが主催しているMailing List「AS Users ML」にて、少々ラフな記述を行った日付文字をdate objectに変換できないのはおかしいとかバグじゃないかとか、荒れ気味の議論が起こった際に、Shaneがリーサルウェポン級の破壊力を持つScriptを投稿。

なんと、NSDataDetectorを用いて、本来は自然言語のテキスト(メールの本文とかスケジュールとか)から日付関連の情報を抽出するところを、「荒れた記法の日付情報」を変換するのに利用。こういうやり方があるかと、いたく感心しました(^ー^)。

AppleScript名:ASOCで各種文字列からdate objectに変換
– Created 2015-08-21 by Shane Stanley
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use script “BridgePlus”

set theString to “Sunny September 4
Fri., September 1
Fri. Sept. 2
Fri Sep 3
Sep. 4
Sept. 9
9/8
9/7/15
09/06/2015
9/5/2015
2015/9/5
2015年9月5日
2015年9月5日(土)
2015.9.5

set theDates to ASify from (my getDatesIn:theString)
–>  {​​​​​date “2015年9月4日金曜日 12:00:00″, ​​​​​date “2015年9月1日火曜日 12:00:00″, ​​​​​date “2015年9月2日水曜日 12:00:00″, ​​​​​date “2015年9月3日木曜日 12:00:00″, ​​​​​date “2015年9月4日金曜日 12:00:00″, ​​​​​date “2015年9月9日水曜日 12:00:00″, ​​​​​date “2009年7月15日水曜日 12:00:00″, ​​​​​date “2015年9月6日日曜日 12:00:00″, ​​​​​date “2015年9月5日土曜日 12:00:00″, ​​​​​date “2015年9月5日土曜日 12:00:00″, ​​​​​date “2015年9月5日土曜日 12:00:00″, ​​​​​date “2015年9月5日土曜日 12:00:00″​​​}

on getDatesIn:aString
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeDate) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theDates to current application’s NSMutableArray’s array()
  
  
repeat with i from 1 to theMatches’s |count|()
    set thisMatch to (theMatches’s objectAtIndex:(i - 1))
    (
theDates’s addObject:(thisMatch’s |date|()))
  end repeat
  
  
return theDates
end getDatesIn:

★Click Here to Open This Script 

NSDataDetectorで指定できる抽出データのタイプは、

 【日付】 NSTextCheckingTypeDate
 【電話番号】 NSTextCheckingTypePhoneNumber
 【住所】 NSTextCheckingTypeAddress
 【リンクURL】 NSTextCheckingTypeLink
 【フライト情報】 NSTextCheckingTypeTransitInformation

となっており、それぞれテキストからの抽出が可能とあります。そこで、date以外も実際にためしてみました。

AppleScript名:ASOCで各種文字列から電話番号を抽出
– Created 2015-08-21 by Shane Stanley
– Modified 2015-08-21 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set theString to “長野谷隆昌
(Takaaki Naganoya)
maro@piyocast.com
http://piyocast.com/as
2015年8月21日〜23日
080-1111-2222
東京都練馬区中村橋1-2-3

set theDates to (extractPhoneNumberFromNaturalText(theString))
–>  {​​​​​”080-1111-2222″​​​}

on extractPhoneNumberFromNaturalText(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypePhoneNumber) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to current application’s NSMutableArray’s array()
  
  
repeat with i from 1 to theMatches’s |count|()
    set thisMatch to (theMatches’s objectAtIndex:(i - 1))
    (
theResults’s addObject:(thisMatch’s phoneNumber()))
  end repeat
  
  
return theResults as list
end extractPhoneNumberFromNaturalText

★Click Here to Open This Script 

AppleScript名:ASOCで各種文字列から住所を抽出
– Created 2015-08-21 by Shane Stanley
– Modified 2015-08-21 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set theString to “長野谷隆昌
(Takaaki Naganoya)
maro@piyocast.com
http://piyocast.com/as
2015年8月21日〜23日
東京都練馬区中村橋1-2-3

set theDates to (extractAddressFromNaturalText(theString))
–>  {{State:”東京都”, Street:”中村橋1-2-3″, City:”練馬区”}}

on extractAddressFromNaturalText(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeAddress) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to current application’s NSMutableArray’s array()
  
  
repeat with i from 1 to theMatches’s |count|()
    set thisMatch to (theMatches’s objectAtIndex:(i - 1))
    (
theResults’s addObject:(thisMatch’s addressComponents()))
  end repeat
  
  
return theResults as list
end extractAddressFromNaturalText

★Click Here to Open This Script 

AppleScript名:ASOCで各種文字列からリンクURLを抽出
– Created 2015-08-21 by Shane Stanley
– Modified 2015-08-21 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set theString to “長野谷隆昌
(Takaaki Naganoya)
maro@piyocast.com
http://piyocast.com/as
2015年8月21日〜23日
080-1111-2222
東京都練馬区中村橋1-2-3

set theDates to (extractLinksFromNaturalText(theString))
–>  {​​​​​(NSURL) mailto:maro@piyocast.com, ​​​​​(NSURL) http://piyocast.com/as​​​}

on extractLinksFromNaturalText(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeLink) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to current application’s NSMutableArray’s array()
  
  
repeat with i from 1 to theMatches’s |count|()
    set thisMatch to (theMatches’s objectAtIndex:(i - 1))
    (
theResults’s addObject:(thisMatch’s |URL|()))
  end repeat
  
  
return theResults as list
end extractLinksFromNaturalText

★Click Here to Open This Script 

AppleScript名:ASOCで各種文字列からフライト情報を抽出
– Created 2015-08-21 by Shane Stanley
– Modified 2015-08-21 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set theString to “UA460 SFO to YVR [Flight] 6/12/2013 United Airlines(UA) #460 dep SFO 7:57pm PDT arr YVR 10:14pm PDT; Ticket #0162360127882, Ticket #0162360127883; conf #K5XBXY; Note:, Seats:—/30A , Seats:—/30B

set theDates to (extractTransitInfoFromNaturalText(theString))
–>  {​​​​​{​​​​​​​Flight:”460″​​​​​}​​​}

on extractTransitInfoFromNaturalText(aString)
  set anNSString to current application’s NSString’s stringWithString:aString
  
  
set {theDetector, theError} to current application’s NSDataDetector’s dataDetectorWithTypes:(current application’s NSTextCheckingTypeTransitInformation) |error|:(reference)
  
  
set theMatches to theDetector’s matchesInString:anNSString options:0 range:{0, anNSString’s |length|()}
  
set theResults to current application’s NSMutableArray’s array()
  
  
repeat with i from 1 to theMatches’s |count|()
    set thisMatch to (theMatches’s objectAtIndex:(i - 1))
    (
theResults’s addObject:(thisMatch’s components()))
  end repeat
  
  
return theResults as list
end extractTransitInfoFromNaturalText

★Click Here to Open This Script