スタイル付きテキスト

スタイル付きテキストの基本

 アプリケーションを使わずに標準のAppleScriptのみでスタイル付きテキストを生成することはできませんが、実はスタイル付きテキストをアプリケーションから取り入れた時、文字列にはスタイル情報が付いたままです。
 値のクラス(class)はstyled textです。しかしながら、スタイル付きテキストを扱えるアプリケーションのtellブロックでなくては、このクラスは返ってきません。

set theStr to the clipboard
class of theStr
--> string
-- スタイルが付いていようといまいと、文字列は全てstringとなってしまう

 as string(as text)によってもスタイル情報は無くなりません。
 また、style属性を取り出すこともできません。しかし、文字列を比較する時に太字(bold)や斜字(italic)などは、考慮されないので気にする必要はありません。
 ただし、文字列のスクリプトシステム(言語情報)は保持されるので、比較した場合、プレインテキストならば同じ文字列でも、英語フォントと日本語フォントの文字列ではfalseとなります。

スタイルを扱える標準のOSAX

 AppleScript バージョン1.8現在、スタイルを扱える標準のOSAXはクリップボード関連のものだけです。
 クリップボードは、常に1つのデータが格納されるのでは無く、幾つかのデータに分割されて記録されることがあります。
 ここで問題としているスタイル付きテキストの場合、プレインテキストとスタイル付きテキストに分けてクリップボードに記録されています。そのように記録することで、スタイル情報が扱えないアプリケーションにも、データ形式の違いを意識せず自然にペーストできるわけです。Macって偉いですねー。
 さて、クリップボードを扱うOSAX命令は、the clipboard、set the clipboardclipboard infoの3つです。
 そして、複数のデータの確認ができるのはclipboard infoです。情報は、例えば次のようなリストで返されます。

clipboard info
--> {{string, 90}, {styled Clipboard text, 102}}

 item 1の方がプレインテキストの情報で、item 2の方がスタイル付きテキストです。後ろの整数がデータサイズを示していますが、スタイル付きの方がサイズが大きいことを確認できると思います。
 itemの数は2個に限らず0や1個の時もありますし、並ぶ順番も一定ではありませんから、中身をチェックして使う必要があります。

as recordでスタイルを分離

 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もあって、なかなか便利に使えます。


2002-01-02 2002-01-20