アプリケーションを使わずに標準のAppleScriptのみでスタイル付きテキストを生成することはできませんが、実はスタイル付きテキストをアプリケーションから取り入れた時、文字列にはスタイル情報が付いたままです。
値のクラス(class)はstyled textです。しかしながら、スタイル付きテキストを扱えるアプリケーションのtellブロックでなくては、このクラスは返ってきません。
set theStr to the clipboard
class of theStr
--> string
-- スタイルが付いていようといまいと、文字列は全てstringとなってしまう
as string(as text)によってもスタイル情報は無くなりません。
また、style属性を取り出すこともできません。しかし、文字列を比較する時に太字(bold)や斜字(italic)などは、考慮されないので気にする必要はありません。
ただし、文字列のスクリプトシステム(言語情報)は保持されるので、比較した場合、プレインテキストならば同じ文字列でも、英語フォントと日本語フォントの文字列ではfalseとなります。
AppleScript バージョン1.8現在、スタイルを扱える標準のOSAXはクリップボード関連のものだけです。
クリップボードは、常に1つのデータが格納されるのでは無く、幾つかのデータに分割されて記録されることがあります。
ここで問題としているスタイル付きテキストの場合、プレインテキストとスタイル付きテキストに分けてクリップボードに記録されています。そのように記録することで、スタイル情報が扱えないアプリケーションにも、データ形式の違いを意識せず自然にペーストできるわけです。Macって偉いですねー。
さて、クリップボードを扱うOSAX命令は、the clipboard、set the clipboard、clipboard infoの3つです。
そして、複数のデータの確認ができるのはclipboard infoです。情報は、例えば次のようなリストで返されます。
clipboard info
--> {{string, 90}, {styled Clipboard text, 102}}
item 1の方がプレインテキストの情報で、item 2の方がスタイル付きテキストです。後ろの整数がデータサイズを示していますが、スタイル付きの方がサイズが大きいことを確認できると思います。
itemの数は2個に限らず0や1個の時もありますし、並ぶ順番も一定ではありませんから、中身をチェックして使う必要があります。
styled textは、as recordで、textとstyleに分離する事ができます。Appleの資料には書かれていない、言うならば裏技です。
例えば、次のようなスクリプトを実行します。
結果の値は、クリップボードにtという茶色のstyled textが入っている場合です。
the clipboard as record
--> {styled Clipboard text:«data styl0001000000000010000C00030000000C999900000000 », string:"t"}
ただ、これはclipboard命令に内蔵された処理なので、styled Clipboard textという属性に一般性はありませんので、注意して下さい。
そこで、一旦変数に入れて、クリップボードとは関係のないstyled textとし、as recordしてみます。
set theStyledText to the clipboard
theStyledText as record
--> {«class ktxt »:"t", «class ksty »:«data styl0001000000000010000C00030000000C999900000000 »}
クラスが生データで書かれていますが、ちゃんと別れてます。
«data styl、以降の16進数のデータはスタイル情報が入っていますが、細かいことは良く分かりません。フォント、色、スタイル(boldなど)、ベースラインなどのスタイル情報が入っているようですが。
次のスクリプトはクリップボードの中身が、スタイル付きテキストか、それ以外かを判定するハンドラです。
結果には、真偽値が返ってきます。スタイルありの場合にtrueです。
isStyledOfClipboard()
on isStyledOfClipboard()
return (clipboard info for styled Clipboard text) /= {}
end isStyledOfClipboard
stringクラスの値をset the clipboardでクリップボードにセットすると、styled textとになってしまてます。変数の中身がstyled textか、そうで無いかを調べるのにクリップボードを使う事はできません。
次は、クリップボード以外の値のスタイル情報を調べます。
引数がstyled textで無かった場合はエラーとなりますから、tryブロックで括って、エラー処理をしています。
{isStyled(the clipboard) ,isStyled("the clipboard")}
--> {true, false}
on isStyled(theText)
try
«class ksty » of (theText as record)
on error
return false
end try
return true
end isStyled
クリップボードに入っているテキストのスタイル情報を外すには、次のようなスクリプトを書きます。
結果に文字列が返ってきます、as textではダメなので注意。
the clipboard as string
クリップボード以外を使う場合は、as recordを使います。ハンドラにしてみました。
引数がstyled textで無かった場合はエラーとなりますから、tryブロックで括って、エラー処理をしています。先ほどのisStyledOfClipboardハンドラとほぼ同じ処理です。
removeStyle(the clipboard)
on removeStyle(theText)
try
return «class ktxt » of (theText as record)
on error
end try
return theText
end removeStyle
生データを利用したり、エラートラップを利用したり、なんともイレギュラーな方法を駆使していて、非常に格好悪いですね。
標準でのstyled textの扱いを強化して欲しいもんです。
テキストエディタ「QuoEdit」のおまけにText JobsというOSAXが入っていて、styled textの扱いが可能です。作者の酒井さんのサイトには、「Text X」というOSAXもあって、なかなか便利に使えます。