Archive for the 'NSMutableAttributedString' Category

2016/11/05 RTF/RTFDを読み込んでテキスト抽出 v2

リッチテキストフォーマットのファイル(RTF/RTFD)を読み込んでテキストを抽出するAppleScriptの修正版です。

以前に掲載していたバージョンでも動いていたので気づかなかったのですが、オプションの指定に間違いがあり、missing valueと指定すべきところをnullと書いていました(汗)。最初の記述のままでもScript Editor上で動作していたものが、osascriptコマンド経由で実行するとかならずWarning Messageが出る。

 「osascript経由だとWarning Messageが出るのはなぜだー?」
 「それはお前のプログラムが間違っているからだー」

というやりとりをAppleのサポートと行って、Shaneに相談したところ「そこ、間違ってるぞ」という結論に(ーー;;

うん、確かに間違ってた。でも、osascriptコマンドには要らないWarning messageが不意に出力されてくるんで(choose fileコマンド実行時にQuickLookプラグインのWarningとか)、それを止められないのかというのがそもそも指摘したかった事項ではあるのですが、、、

あれ? Warnig Messageの発生源だった「MDQuickLook.qlgenerator」を調査してみたら、これが壊れていたので削除。これに起因するWarning Messageは出なくなりました。

AppleScript名:RTFを読み込んでテキスト抽出 v2
– Created 2016-09-29 by Takaaki Naganoya
– Modified 2016-11-05 by Shane Stanley
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4240
–http://piyocast.com/as/archives/4303

set aFile to choose file of type {“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 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 

AppleScript名:RTFDを読み込んでテキスト抽出 v2
– Created 2016-09-29 by Takaaki Naganoya
– Modified 2016-11-05 by Shane Stanley
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4240
–http://piyocast.com/as/archives/4303

set aFile to choose file of type {“com.apple.rtfd”}
set aRes to retTextFromRTFD(aFile) of me

on retTextFromRTFD(aFile)
  set aFilePath to current application’s NSString’s stringWithString:((POSIX path of aFile) & “/TXT.rtf”)
  
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 retTextFromRTFD

★Click Here to Open This Script 

2016/10/12 AppleScript自身の「説明」を取得する

実行中のAppleScript自身の「説明」欄に書かれたテキストを取得するAppleScriptです。

scriptcom1.jpg

AppleScript書類がスクリプトバンドル形式になっている場合にかぎられますが、実行中のAppleScript書類自体の「説明」欄に書かれているテキストを取得できます。

「説明」欄についてかる〜くご説明しておきますと、

「説明」欄にはそのAppleScript自体の説明やバージョンアップ履歴を書いておくことが多いようです。好きに使えます。そして、スタイル付きテキストを許容しますし、画像やムービーや音声をペーストしておくことも可能です。Applet書き出しを行い、初期画面を表示させるように設定しておくと、Applet起動時に表示されます。

AppleScriptをスクリプトバンドル形式(.scptd)で保存すると、「説明」欄の内容はバンドル中の、

  /Contents/Resources/description.rtfd

に記録されます。

scriptcom2.jpg

RTFではなくRTFDなので、さらにこのファイル自体がバンドルになっており、

  /Contents/Resources/description.rtfd/TXT.rtf

の中にリッチテキストが入っています。

scriptcom3.jpg

実行中のAppleScriptのパス(path to me)を取得し、そこからスクリプトバンドル中のrtf書類までのパスを組み立て、そこからテキストのみを抽出します。

scriptcmment4.jpg

最初、RTFのつもりでdescription.rtfdにアクセスして、テキストが取得できずに困ってしまいました。

なお、掲載しているAppleScriptのリストにも、文字色が黒なのでわかりにくいですが「説明」欄の内容が入っています(本Blog開設時の8年前から)。こちらは、スクリプトエディタに対してAppleScriptから問い合わせを行って取得しているもので、本Scriptとはアクセス方法が根本的に異なります。

AppleScript名:test script
【コメント】 このScriptの説明文を書いておきますよー
– Created 2016-10-12 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4268

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

on retMyComment()
  set myPath to (path to me) as string
  
set docPath to myPath & “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:(null) |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 

2016/09/29 RTFを読み込んでテキスト抽出

指定のRTF(リッチテキスト)ファイルから、プレーンテキストを抽出するAppleScriptです。

→ 本プログラムには間違いがあるので、修正版を利用してください

不等号などの特殊記号について(≠、≥、≤)、スクリプトエディタ以外のサードパーティのAppleScriptエディタ(海外産)でエラーになる場合があるので(ASObjC Explorerとか)、大事をとって特殊記号を使わずに、「is not equal to」などと書くようにしています(あくまで個人的な見解です)。

このために、

tougou_resized.png

のように、Script Assistantで特殊記号類からこれらの英語表記を自動入力しやすいようにしています。

AppleScript名:RTFを読み込んでテキスト抽出
– Created 2016-09-29 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4240

set aFile to choose file of type {“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 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:(null) |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/08/15 ASOCでRTFの内容を読み取って指定文字を置換してファイルに保存する

Cocoaの機能を利用して、既存のRTF(リッチテキストフォーマット)の内容を読み取って、指定文字を置換するAppleScriptです。置換したあとのスタイル付きテキストをファイルに保存するところまでの処理を追加しました。

前バージョンを掲載したところ、(自分的には目的にかなう内容であったものの)Shaneからツッコミ。「ファイルに書かないと置換した内容の確認のしようがないじゃん(意訳)」という指摘により、保存処理を追加しました。

AppleScript名:ASOCでRTFの内容を読み取って指定文字を置換してファイルに保存する
– Created 2015-08-15 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

–Input
set aFile to POSIX path of (choose file of type {“public.rtf”})
set aFilePath to current application’s NSString’s stringWithString:aFile

–Output
set bFile to POSIX path of (choose file name with prompt “Choose replaced new RTF to save (with \”.rtf\” extension)”)
set bFilePath to current application’s NSString’s stringWithString:bFile

–Read RTF to NSData
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:(null) |error|:(missing value)
set astyledLength to theStyledText’s |string|()’s |length|()

–Replace Tag with String
theStyledText’s mutableString()’s replaceOccurrencesOfString:“<name>” withString:“長野谷” options:(current application’s NSCaseInsensitiveSearch) range:(current application’s NSMakeRange(0, astyledLength))

–Convert NSMutableStyledStrings to RTF
set bstyledLength to theStyledText’s |string|()’s |length|()
set bDict to current application’s NSDictionary’s dictionaryWithObject:“NSRTFTextDocumentType” forKey:(current application’s NSDocumentTypeDocumentAttribute)
–>  (NSDictionary) {​​​​​DocumentType:”NSRTFTextDocumentType”​​​}

set bRTF to theStyledText’s RTFFromRange:(current application’s NSMakeRange(0, bstyledLength)) documentAttributes:bDict

–Save to File
bRTF’s writeToFile:bFilePath atomically:true

★Click Here to Open This Script 

2015/08/14 ASOCでRTFの内容を読み取って指定文字を置換する

Cocoaの機能を利用して、既存のRTF(リッチテキストフォーマット)の内容を読み取って、指定文字を置換するAppleScriptです。

rtf1.png

こういう(↑)RTFを(OS X標準添付のTextEditなどで)作成したとして、本Scriptを実行すると、

rtf2.png

このようになります。RTFDの読み込みも実験しているのですが、こちらはなかなかうまくいきません。

AppleScript名:ASOCでRTFの内容を読み取って指定文字を置換する
– Created 2015-08-14 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

set aFile to POSIX path of (choose file of type {“public.rtf”})
set aFilePath to current application’s NSString’s stringWithString: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:(null) |error|:(missing value)
set astyledLength to theStyledText’s |string|()’s |length|()

theStyledText’s mutableString()’s replaceOccurrencesOfString:“<name>” withString:“長野谷” options:(current application’s NSCaseInsensitiveSearch) range:(current application’s NSMakeRange(0, astyledLength))

★Click Here to Open This Script 

2012/03/07 テキストへの色指定サンプル

テキストに色指定を行うサンプルのAppleScriptObjCプログラムです。

textcol.jpg

AppleScriptObjCファイル名:textcolorTestAppDelegate.applescript

– textcolorTestAppDelegate.applescript
– textcolorTest

– Created by 長野谷 隆昌 on 12/02/13.
– Copyright 2012 Piyomaru Software. All rights reserved.

script textcolorTestAppDelegate
  
property parent : class “NSObject”
  
  
property nsc : class “NSColor”
  
property tf : missing value
  
property aTextField : missing value
  
  
on applicationWillFinishLaunching_(aNotification)
    
    
–ひとつめのNSTextField(入力フィールド)
    
set aString to current application’s NSMutableAttributedString’s alloc()’s initWithString_(“これはテスト用の文字列ですよー”)
    
    
set colorArray to current application’s NSArray’s arrayWithObjects_(nsc’s redColor(), nsc’s orangeColor(), nsc’s yellowColor(), nsc’s greenColor(), nsc’s blueColor, nsc’s purpleColor(), missing value)
    
    
repeat with i from 0 to (aString’s |length|()) - 1
      
aString’s addAttribute_value_range_(current application’s NSForegroundColorAttributeName, colorArray’s objectAtIndex_(i mod 6), {i, 1})
    
end repeat
    
    
tf’s setAttributedStringValue_(aString)
    
    
    
–ふたつめのNSTextField(Label)
    
set bString to current application’s NSMutableAttributedString’s alloc()’s initWithString_(“●私のユーザー名”)
    
    
set colorArray to current application’s NSArray’s arrayWithObjects_(nsc’s redColor(), nsc’s blackColor())
    
    
set bLen to bString’s |length|()
    
    
bString’s addAttribute_value_range_(current application’s NSForegroundColorAttributeName, colorArray’s objectAtIndex_(0), {0, 1})
    
bString’s addAttribute_value_range_(current application’s NSForegroundColorAttributeName, colorArray’s objectAtIndex_(1), {1, (bLen - 1)})
    
    
aTextField’s setAttributedStringValue_(bString)
    
  
end applicationWillFinishLaunching_
  
  
  
  
on applicationShouldTerminate_(sender)
    
return current application’s NSTerminateNow
  
end applicationShouldTerminate_
  
  
end script

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に