Archive for the 'NSAttributedString' Category

2017/03/27 実体参照している文字列をデコードする(ASOC)

HTMLの中などで実体参照(Character reference)しているエンコードされた文字列をデコードするAppleScriptのCocoa呼び出し版です(Pure AppleScript版はこちら)。

AppleScript名:実体参照している文字列をデコードする(ASOC)
– Created 2017-01-18 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
–http://piyocast.com/as/archives/4568

set aStr to "龍馬伝"
set aRes to decodeCharacterReference(aStr) of me
–>  "龍馬伝"

set aStr to "\"第2エア\""
set aRes to decodeCharacterReference(aStr) of me
–>  "\"第2エア\""

on decodeCharacterReference(aStr)
  set anNSString to current application’s NSString’s stringWithString:aStr
  
set theData to anNSString’s dataUsingEncoding:(current application’s NSUTF16StringEncoding)
  
set styledString to current application’s NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)
  
set plainText to (styledString’s |string|()) as string
  
return plainText
end decodeCharacterReference

★Click Here to Open This Script 

2017/01/27 ASOCの美しい書き方?

AppleScriptからCocoaの機能を呼び出すことができるようになり、AppleScript本来の簡潔な記述はしにくくなりました。

ASOCの記述方法について、どのようなアプローチが可能かをまとめてみました。

(1)は、ふだん書いているやり方です。一番安全で確実にAppleScriptの処理系に解釈されるので、トラブル回避のためにこの書き方をしています。ただし、1行がものすごく長くなるので、本Blogに掲載したときの「見た目」がよろしくありません(エディタの上では問題ないのですが、、、)

(2)は、Xcode上のAppleScriptでよくやる書き方です。インデントを基本としたAppleScriptらしいスタイルにはなっているものの、書かなくてはならない情報が多く、やや面倒と感じます。

(3)は、(2)でインデントの段数の増えすぎたことに対する改良とでも呼ぶべきものでしょうか。「its」を毎回書く必要があることに対し、抵抗感があるかないかが問題でしょう。

(4)は、Script Debugger 6のテンプレートに入っていた記述で、なかなかいい手だと思います(Xcode上でもやっていましたが)。ただ、プログラムが長く複雑になると冒頭のProperty宣言部分がどんどん長くなるという問題もあります。

サンプルとして書くのであれば、(4)あたりを検討すべきなんでしょう。

AppleScript名:(1)quick style
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4412

set a to (current application’s NSString’s stringWithString:“aaaaa”) as string
–>  ”aaaaa”

★Click Here to Open This Script 

AppleScript名:(2)xcode style
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4412

tell current application
  tell class “NSString”
    set a to (its stringWithString:“aaaaa”) as string
  end tell
end tell
–>  ”aaaaa”

★Click Here to Open This Script 

AppleScript名:(3)layer style
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4412

tell current application’s NSString
  set a to (its stringWithString:“aaaa”) as string
end tell
–>  ”aaaa”

★Click Here to Open This Script 

AppleScript名:(4)mark alldritt style
use AppleScript version “2.4″
use framework “Foundation”
use scripting additions
–http://piyocast.com/as/archives/4412

property NSString : a reference to current application’s NSString

set a to (NSString’s stringWithString:“aaaa”) as string
–>  ”aaaa”

★Click Here to Open This Script 

実際に(4)のスタイルで書いてみたら、NSMakeRangeやNSMaxRangeなどのObjective-Cのメソッドでない部分を同じスタイルに統一できなくて(current application’sを省略できなくて)、化けきれていない感じが、、、、

あとは、スクリプトエディタ上だとほとんど構文要素の変化に乏しく、メリハリがない(構文要素カラーリングの効果がなく)ので書く方にとって読みにくくなるような気がします。

macOS標準搭載のスクリプトエディタでは、Cocoaのclass名もmethod名も同じ色で表示されてしまいますが、ASObjC Explorer 4やScript Debugger 6ではmethod名を別の色で表示する機能が実装されているため、やはりそうしたツールがないと辛い感じです。

mi.png

AppleScript名:テキストエディタ「mi」で選択中のテキストからHTMLタグを外して逆順に並べなおす
– Created 2017-01-27 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4412

property NSString : a reference to current application’s NSString
property NSAttributedString : a reference to current application’s NSAttributedString
property NSArray : a reference to current application’s NSArray
property NSMutableArray : a reference to current application’s NSMutableArray
property NSUTF16StringEncoding : a reference to current application’s NSUTF16StringEncoding

tell application “mi”
  tell document 1
    set aText to selection
  end tell
end tell

–選択部分のテキストからHTMLのタグを外す
set anNSString to NSString’s stringWithString:aText
set theData to anNSString’s dataUsingEncoding:(NSUTF16StringEncoding)
set styledString to NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)
set plainText to (styledString’s |string|())

–テキストを行ごとにparseしてNSArrayに
set anArray to NSMutableArray’s alloc()’s init()
set aRange to current application’s NSMakeRange(0, plainText’s |length|())

repeat while aRange’s |length|() > 0
  set subRange to plainText’s lineRangeForRange:(current application’s NSMakeRange(aRange’s location(), 0))
  
  
–行が改行コードまで取得されるので、改行コードを除外するように微調整
  
copy subRange to tmpRange
  
set tmpRange’s |length| to ((subRange’s |length|()) - 1) –微調整
  
set aLine to plainText’s substringWithRange:tmpRange
  
anArray’s addObject:aLine
  
  
set aRange’s location to (current application’s NSMaxRange(subRange))
  
set aRange’s |length| to ((aRange’s |length|()) - (subRange’s |length|()))
end repeat

–NSArrayを逆順に(reverse order array)
set outArray to (anArray’s reverseObjectEnumerator())’s allObjects()

–NSArray to string with line delimiter
set outStr to retStrFromArrayWithDelimiter(outArray, return) of me

–リストを指定デリミタをはさんでテキスト化
on retStrFromArrayWithDelimiter(aList, aDelim)
  set anArray to NSArray’s arrayWithArray:aList
  
set aRes to anArray’s componentsJoinedByString:aDelim
  
return aRes as text
end retStrFromArrayWithDelimiter

★Click Here to Open This Script 

2017/01/03 Notesの指定エントリの本文をプレーンテキストとして取得

macOS標準搭載アプリ「メモ」(英語名:Notes)の指定エントリの本文をプレーンテキストとして取得するAppleScriptです。

メモの本文(body)がHTMLとして取得されるので、HTMLからスタイル付きテキスト(NSAttributedString)を経由してプレーンテキストに変換します。

AppleScript名:Notesの指定エントリの本文をプレーンテキストとして取得
– Created 2017-01-03 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

tell application “Notes”
  tell note 1 –とりあえず最新のエントリを指定
    set theBody to body
  end tell
end tell

set anNSString to current application’s NSString’s stringWithString:theBody
set theData to anNSString’s dataUsingEncoding:(current application’s NSUTF16StringEncoding)
set styledString to current application’s NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)

set plainText to (styledString’s |string|()) as string

★Click Here to Open This Script 

2016/11/29 バンドル形式のAppleScript自身の「説明」を取得する v3

バンドル形式のAppleScript自身に書かれている「説明」の文章を取得するAppleScriptです。

path to meで自分自身のパスを取得したあと、ファイルタイプ(type identifier)を問い合わせるように変更しました。

AppleScript名:バンドル形式のAppleScript自身の「説明」(description.rtfd/TXT.rtf)を取得する v3
【コメント】 このScriptの説明文を書いておきますよー
– Created 2016-10-12 by Takaaki Naganoya
– Created 2016-11-28 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
–http://piyocast.com/as/archives/4268

set cRes to retMyComment() of me
–> "このScriptの説明文を書いておきますよー"

on retMyComment()
  set myPath to (path to me)
  
tell application "System Events"
    set myType to type identifier of myPath
  end tell
  
if myType is not equal to "com.apple.applescript.script-bundle" then return ""
  
  
set docPath to (myPath as string) & "Contents:Resources:description.rtfd:TXT.rtf"
  
set aRes to retTextFromRTF(docPath) of me
  
return aRes
end retMyComment

on retTextFromRTF(aFile)
  set aFilePath to current application’s NSString’s stringWithString:(POSIX path of aFile)
  
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

★Click Here to Open This Script 

2015/09/22 クリップボードの内容をRTFとPDFとHTMLで書き出す

Cocoaの機能を用いて、クリップボードの内容をデスクトップにRTFとPDFで書き出すAppleScriptの改訂版です。

前バージョンのAppleScriptでは、スタイル付きテキスト(NSAttributedString)をHTMLに書き出すと、HTML内のタグでは「UTF-8」になっていながらも、HTMLのテキスト自体のエンコーディングがShift JISというたいへん不思議な状態になっていました。

スタイル付きテキスト(NSAttributedString)の取得部分に問題がないことを確認。スタイル付きテキストをPDFやRTFに書き出した場合には問題なし。HTMLの書き出しに固有の根の深い問題があるのかと疑っていましたが・・・難易度でいえば、それほど難しくない話でした。

修正部分はたった1箇所。最後にHTMLをファイルに書き込む際に、UTF-8(NSUTF8StringEncoding)を指定する記述を追加しただけです。

テキストエンコーディングの省略時にはかならず「UTF-8」が指定されるものとばかり思っていましたが、明示的に指定しないとダメということがよくわかりました。

AppleScript名:クリップボードの内容をRTFとPDFとHTMLで書き出す v2
– Created 2015-09-20 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit” – for NSPasteboard, which is the clipboard

–クリップボードの内容をNSAttributedStringに
set anAttr to my getClipboardASStyledText()

–保存先とファイル名を求める
set targFol to POSIX path of (path to desktop)
set aUUID to current application’s NSUUID’s UUID()’s UUIDString() as text

set aRes to my saveStyledTextAsRTF(aUUID, targFol, anAttr) –RTFで書き出す
set bRes to my saveStyledTextAsPDF(aUUID, targFol, anAttr) –PDFで書き出す
set cRes to my saveStyledTextAsHTML(aUUID, targFol, anAttr) –HTMLで書き出す

– クリップボードの内容をNSAttributedStringとして取り出して返す
on getClipboardASStyledText()
  set theNSPasteboard to current application’s NSPasteboard’s generalPasteboard()
  
set theAttributedStringNSArray to theNSPasteboard’s readObjectsForClasses:({current application’s NSAttributedString}) options:(missing value)
  
set theNSAttributedString to theAttributedStringNSArray’s objectAtIndex:0
  
return theNSAttributedString
end getClipboardASStyledText

–スタイル付きテキストを指定フォルダ(POSIX path)にRTFで書き出し
on saveStyledTextAsRTF(aFileName, targFol, aStyledString)
  –Convert NSMutableStyledStrings to RTF
  
set bstyledLength to aStyledString’s |string|()’s |length|()
  
set bDict to current application’s NSDictionary’s dictionaryWithObject:“NSRTFTextDocumentType” forKey:(current application’s NSDocumentTypeDocumentAttribute)
  
set bRTF to aStyledString’s RTFFromRange:(current application’s NSMakeRange(0, bstyledLength)) documentAttributes:bDict
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:“/” withString:“_”
  
set theName to theName’s stringByReplacingOccurrencesOfString:“:” withString:“_”
  
set thePath to current application’s 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

–スタイル付きテキストを指定フォルダ(POSIX path)にPDFで書き出し
on saveStyledTextAsPDF(aFileName, targFol, aStyledString)
  – get page size being used for printing
  
set printInfo to current application’s NSPrintInfo’s sharedPrintInfo()
  
set pageSize to printInfo’s paperSize()
  
set theLeft to printInfo’s leftMargin()
  
set theTop to printInfo’s topMargin()
  
  
– make a text view
  
set theView to current application’s NSTextView’s alloc()’s initWithFrame:{origin:{x:0, y:0}, |size|:pageSize}
  
theView’s setTextContainerInset:{theLeft, theTop}
  
  
– put in the text
  
theView’s textStorage()’s setAttributedString:aStyledString
  
set theData to theView’s dataWithPDFInsideRect:{origin:{x:0, y:0}, |size|:pageSize}
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:“/” withString:“_”
  
set theName to theName’s stringByReplacingOccurrencesOfString:“:” withString:“_”
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:“pdf”
  
  
return (theData’s writeToFile:thePath atomically:true) as boolean
end saveStyledTextAsPDF

–スタイル付きテキストを指定フォルダ(POSIX path)にHTMLで書き出し
on saveStyledTextAsHTML(aFileName, targFol, aStyledString)
  –Convert NSMutableStyledStrings toHTML
  
set theNSDictionary to current application’s NSMutableDictionary’s dictionaryWithObject:(current application’s NSHTMLTextDocumentType) forKey:(current application’s NSDocumentTypeDocumentAttribute)
  
set theNSData to aStyledString’s dataFromRange:{location:0, |length|:aStyledString’s |length|()} documentAttributes:theNSDictionary |error|:(missing value)
  
set aHTML to current application’s NSString’s alloc()’s initWithData:theNSData encoding:(current application’s NSUTF8StringEncoding)
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:“/” withString:“_”
  
set theName to theName’s stringByReplacingOccurrencesOfString:“:” withString:“_”
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:“html”
  
  
return (aHTML’s writeToFile:thePath atomically:true encoding:(current application’s NSUTF8StringEncoding) |error|:(missing value)) as boolean
  
end saveStyledTextAsHTML

★Click Here to Open This Script 

2015/09/20 クリップボードの内容をRTFとPDFで書き出す

Cocoaの機能を用いて、クリップボードの内容をデスクトップにRTFとPDFで書き出すAppleScriptです。

HTMLでも書き出せるのですが、日本語の文字化け(UTF-8で書き出したつもりがShift JISになっていた問題)が解決されていないため、とりあえずこんなもんで。

AppleScript名:クリップボードの内容をRTFとPDFで書き出す
– Created 2015-09-20 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit” – for NSPasteboard, which is the clipboard

–クリップボードの内容をNSAttributedStringに
set anAttr to my getClipboardASStyledText()

–保存先とファイル名を求める
set targFol to POSIX path of (path to desktop)
set aUUID to current application’s NSUUID’s UUID()’s UUIDString() as text

set aRes to my saveStyledTextAsRTF(aUUID, targFol, anAttr) –RTFで書き出す
set bRes to my saveStyledTextAsPDF(aUUID, targFol, anAttr) –PDFで書き出す

– クリップボードの内容をNSAttributedStringとして取り出して返す
on getClipboardASStyledText()
  set theNSPasteboard to current application’s NSPasteboard’s generalPasteboard()
  
set theAttributedStringNSArray to theNSPasteboard’s readObjectsForClasses:({current application’s NSAttributedString}) options:(missing value)
  
set theNSAttributedString to theAttributedStringNSArray’s objectAtIndex:0
  
return theNSAttributedString
end getClipboardASStyledText

–スタイル付きテキストを指定フォルダ(POSIX path)にRTFで書き出し
on saveStyledTextAsRTF(aFileName, targFol, aStyledString)
  –Convert NSMutableStyledStrings to RTF
  
set bstyledLength to aStyledString’s |string|()’s |length|()
  
set bDict to current application’s NSDictionary’s dictionaryWithObject:“NSRTFTextDocumentType” forKey:(current application’s NSDocumentTypeDocumentAttribute)
  
set bRTF to aStyledString’s RTFFromRange:(current application’s NSMakeRange(0, bstyledLength)) documentAttributes:bDict
  
  – build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:“/” withString:“_”
  
set theName to theName’s stringByReplacingOccurrencesOfString:“:” withString:“_”
  
set thePath to current application’s 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

–スタイル付きテキストを指定フォルダ(POSIX path)にPDFで書き出し
on saveStyledTextAsPDF(aFileName, targFol, aStyledString)
  – get page size being used for printing
  
set printInfo to current application’s NSPrintInfo’s sharedPrintInfo()
  
set pageSize to printInfo’s paperSize()
  
set theLeft to printInfo’s leftMargin()
  
set theTop to printInfo’s topMargin()
  
  – make a text view
  
set theView to current application’s NSTextView’s alloc()’s initWithFrame:{origin:{x:0, y:0}, |size|:pageSize}
  
theView’s setTextContainerInset:{theLeft, theTop}
  
  – put in the text
  
theView’s textStorage()’s setAttributedString:aStyledString
  
set theData to theView’s dataWithPDFInsideRect:{origin:{x:0, y:0}, |size|:pageSize}
  
  – build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:“/” withString:“_”
  
set theName to theName’s stringByReplacingOccurrencesOfString:“:” withString:“_”
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:“pdf”
  
  return (theData’s writeToFile:thePath atomically:true) as boolean
end saveStyledTextAsPDF

★Click Here to Open This Script 

2015/09/19 Notes上の指定のエントリをHTMLとして書き出す

Cocoaの機能を使って、Notes(日本語名:「メモ」)の指定エントリの内容をHTMLとして書き出すAppleScriptです。

ただ、普通にPDFやRTFと同様に出力してみたら・・・文字化けしてしまいました(汗)。

html1.png

UTF-8で出力しているはずなのですが、

html2.png

Safariで文字エンコーディングを「日本語(Shift JIS)」に設定すると・・・

html3.png

html4.png

文字化けしなくなります。

html5.png

保存されたHTMLのソースを見ると、エンコーディングはUTF-8となっているのですが、ソースをUTF-8でオープンしても文字化けしたままです。

AppleScript名:Notes上の指定のエントリをHTMLとして書き出す
– Created 2015-09-18 by Shane Stanley
– Modified 2015-09-19 by Takaaki Naganoya
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

set targFol to POSIX path of (path to desktop)

tell application "Notes"
  set theBody to body of note 2
  
set theName to name of note 2 – for file name
end tell

– Notesの本文をスタイル付きテキストに
set anNSString to current application’s NSString’s stringWithString:theBody
set theData to anNSString’s dataUsingEncoding:(current application’s NSUTF16StringEncoding)
set styledString to current application’s NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)

set cRes to my saveStyledTextAsHTML(theName, targFol, styledString)
–> true

–スタイル付きテキストを指定フォルダ(POSIX path)にHTMLで書き出し
on saveStyledTextAsHTML(aFileName, targFol, aStyledString)
  –Convert NSMutableStyledStrings toHTML
  
set theNSDictionary to current application’s NSMutableDictionary’s dictionaryWithObject:(current application’s NSHTMLTextDocumentType) forKey:(current application’s NSDocumentTypeDocumentAttribute)
  
set theNSData to aStyledString’s dataFromRange:{location:0, |length|:aStyledString’s |length|()} documentAttributes:theNSDictionary |error|:(missing value)
  
  
set aHTML to current application’s NSString’s alloc()’s initWithData:theNSData encoding:(current application’s NSUTF8StringEncoding)
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:"/" withString:"_"
  
set theName to theName’s stringByReplacingOccurrencesOfString:":" withString:"_"
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:"html"
  
  
return (aHTML’s writeToFile:thePath atomically:true) as boolean
  
end saveStyledTextAsHTML

★Click Here to Open This Script 

一応、Notes(メモ)から取得した本文データがHTMLだったので、Styled Textに変換しないでそのまま保存するバージョンも作ってみました。こちらであれば、文字化けは見られませんが・・・Styled Text(NSAttributedString)をHTMLに変換してファイル出力するという機能は、普通に文字化けせずに使えてほしいので、回避策を検討しておきたいところです。

AppleScript名:Notes上の指定のエントリをHTMLとして書き出す v2
– Created 2015-09-18 by Shane Stanley
– Modified 2015-09-19 by Takaaki Naganoya
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

set targFol to POSIX path of (path to desktop)

tell application "Notes"
  set theBody to body of note 2
  
set theName to name of note 2 – for file name
end tell

– Notesの本文をスタイル付きテキストに
set anNSString to current application’s NSString’s stringWithString:theBody
–>  (NSString) "<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">ASOCでできないこと<div><br></div><div>CFString の文字列(Cの文字列)を扱えない</div><div><br></div><div>block構文を必要とするAPIを呼べない</div><div><br></div><div>Key Value Observation を使えない(Xcode上ではOK?)</div></body></html>"

set aRes to my saveStyledTextAsHTML(theName, targFol, anNSString)

–スタイル付きテキストを指定フォルダ(POSIX path)にRTFで書き出し
on saveStyledTextAsHTML(aFileName, targFol, anNSString)
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:"/" withString:"_"
  
set theName to theName’s stringByReplacingOccurrencesOfString:":" withString:"_"
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:"html"
  
  
return (anNSString’s writeToFile:thePath atomically:true) as boolean
  
end saveStyledTextAsHTML

★Click Here to Open This Script 

2015/09/18 Notes上の指定のエントリをPDFやRTFとして書き出す

Cocoaの機能を使って、Notes(日本語名:「メモ」)の指定エントリの内容をPDFやRTFとして書き出すAppleScriptです。

  「・・・そんなもん作ってどうするんだ、本当に必要なのか?」

と、私自身が感じた内容ではありましたが、Shaneが質問に答えてMLに投稿し、それを私が日本語環境で検証して「文字化けするよー」とメールで報告してやりとりして、「ああ、Encodingがちがうんだー」ということでめでたく動くようになりました(NotesがデータをUTF-8ではなくUTF-16で保持していたのが原因ですが・・・El Capitanの新形式=iOS9上の新形式 だとどーなんだろう???)。

動くようになってはみたものの、あまりに特定の目的に最適化されたScriptだったので、データ取得部分と保存部分を別々に分け、スタイル付きテキストをPDFやRTFとして保存できるルーチンに整備して汎用性を確保しておきました。こういうのを作っておくと、あとになって地道に効いてくるはずです。たぶん・・・きっと。

実行すると、お手元の環境の「メモ」アプリの最新から2つ目のエントリの名称をファイル名にして、本文内容をデスクトップにPDFとRTFで保存します。

notes_entry.png

filenames.png

pdf.png

rtf.png

AppleScript名:Notes上の指定のエントリをPDFやRTFとして書き出す
– Created 2015-09-18 by Shane Stanley
– Modified 2015-09-18 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set targFol to POSIX path of (path to desktop)

tell application “Notes”
  set theBody to body of note 2
  
set theName to name of note 2 – for file name
end tell

– Notesの本文をスタイル付きテキストに
set anNSString to current application’s NSString’s stringWithString:theBody
set theData to anNSString’s dataUsingEncoding:(current application’s NSUTF16StringEncoding) –日本語の環境&内容で検証ずみ。Chineseとかはどうか?
set styledString to current application’s NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)

set aRes to my saveStyledTextAsPDF(theName, targFol, styledString)
–> true

set bRes to my saveStyledTextAsRTF(theName, targFol, styledString)
–> true

–スタイル付きテキストを指定フォルダ(POSIX path)にRTFで書き出し
on saveStyledTextAsRTF(aFileName, targFol, aStyledString)
  –Convert NSMutableStyledStrings to RTF
  
set bstyledLength to aStyledString’s |string|()’s |length|()
  
set bDict to current application’s NSDictionary’s dictionaryWithObject:“NSRTFTextDocumentType” forKey:(current application’s NSDocumentTypeDocumentAttribute)
  
set bRTF to aStyledString’s RTFFromRange:(current application’s NSMakeRange(0, bstyledLength)) documentAttributes:bDict
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:“/” withString:“_”
  
set theName to theName’s stringByReplacingOccurrencesOfString:“:” withString:“_”
  
set thePath to current application’s 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

–スタイル付きテキストを指定フォルダ(POSIX path)にPDFで書き出し
on saveStyledTextAsPDF(aFileName, targFol, aStyledString)
  – get page size being used for printing
  
set printInfo to current application’s NSPrintInfo’s sharedPrintInfo()
  
set pageSize to printInfo’s paperSize()
  
set theLeft to printInfo’s leftMargin()
  
set theTop to printInfo’s topMargin()
  
  
– make a text view
  
set theView to current application’s NSTextView’s alloc()’s initWithFrame:{origin:{x:0, y:0}, |size|:pageSize}
  
theView’s setTextContainerInset:{theLeft, theTop}
  
  
– put in the text
  
theView’s textStorage()’s setAttributedString:aStyledString
  
set theData to theView’s dataWithPDFInsideRect:{origin:{x:0, y:0}, |size|:pageSize}
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:“/” withString:“_”
  
set theName to theName’s stringByReplacingOccurrencesOfString:“:” withString:“_”
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:“pdf”
  
  
return (theData’s writeToFile:thePath atomically:true) as boolean
end saveStyledTextAsPDF

★Click Here to Open This Script