Text Suite
スクリプト可能な Mac アプリでを使用しようとしています。
Cocoa Scripting Guide で見つけた小さなドキュメントでは、NSTextStorage
. ただし、Sdef とコーディング側の両方で、残りをどのように設定する必要があるかについては説明していません。
特に、より豊富なコマンドで Text Suite を使用する場合と使用しない場合を、スクリプト定義にどのように伝えるかが気になります。問題は、Text Suite が という名前の独自の型を宣言していることtext
です。しかし、それはすでにプレーンテキストにも使用される定義済みの型です。
そのため、Sdef エディタの要素のプロパティのテキスト セレクターで 2 つの「テキスト」を選択することになり、書き込まれる Sdef には同じタイプになります。つまり、コードが常にそれらを使用しているわけではありませんが、テキスト スイートをサポートするテキストを処理するプロパティとそうでないプロパティを Sdef で区別することはできませんNSTextStorage
。
これは、すべてのスクリプト可能なプロパティを class のオブジェクトに格納する必要があるということNSTextStorage
ですか? そうしないと、ユーザーは任意のテキスト プロパティで拡張 Text Suite コマンドを使用することを期待するかもしれませんが、それらNSString
の代わりに使用すると実行時エラーが発生NSTextStorage
しますよね?
しかし、アプリの名前など、単純なプレーン テキスト文字列のみを返す単純なプロパティの場合、Text Suite をサポートするのはやり過ぎですよね?
では、これについてどうすればよいでしょうか。NSTextStorage
リッチ テキストのサポートに値すると思われるプロパティのみを使用するため、Text Suite をいつ使用できるか、どこで使用できるかをユーザーに理解させるだけでよいでしょうか? 他の人はこれをどのように解決しますか?
アップデート
Text Suite を Sdef に単純に追加すると (Sdef エディターの [ファイル] サブメニューで "NSTextSuite" として提供されるものを使用しています)、返されるすべてのプロパティが機能しtext
なくなります (エラー -10000 が発生します)。Text Suite のエントリを他のアプリのエントリと比較しましたが、明らかな違いは見られません。
Text Suite を追加すると、タイプが「text」のプロパティを持つすべてのプロパティが破損するのはなぜですか?
以下は簡略化された Sdef であり、私が何をしているかを見ることができます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd">
<dictionary title="Demo Terminology">
<suite name="Demo Suite" code="Demo" description="Demo suite">
<class name="application" code="capp" description="The application's top-level scripting object.">
<cocoa class="NSApplication"/>
<property name="demo text" code="DeTx" description="A text prop for testing" type="text">
<cocoa key="testText"/>
</property>
</class>
</suite>
<suite name="Text Suite" code="????" description="A set of basic classes for text processing.">
<cocoa name="NSTextSuite"/>
<class name="text" code="ctxt" description="Rich (styled) text" plural="text">
<cocoa class="NSTextStorage"/>
<element type="paragraph">
<cocoa key="paragraphs"/>
</element>
<element type="word">
<cocoa key="words"/>
</element>
<element type="character">
<cocoa key="characters"/>
</element>
<element type="attribute run">
<cocoa key="attributeRuns"/>
</element>
<element type="attachment">
<cocoa key="attachments"/>
</element>
<property name="color" code="colr" description="The color of the first character." type="color">
<cocoa key="foregroundColor"/>
</property>
<property name="font" code="font" description="The name of the font of the first character." type="text">
<cocoa key="fontName"/>
</property>
<property name="size" code="ptsz" description="The size in points of the first character." type="number">
<cocoa key="fontSize"/>
</property>
</class>
<class name="attachment" code="atts" description="Represents an inline text attachment. This class is used mainly for make commands." inherits="text">
<cocoa class="NSAttachmentTextStorage"/>
<!-- This property should be deprecated like all the other path-centric properties, and replaced with a type="file" property. -->
<property name="file name" code="atfn" description="The path to the file for the attachment" type="text">
<cocoa key="filename"/>
</property>
</class>
<class name="paragraph" code="cpar" description="This subdivides the text into paragraphs." inherits="text">
<cocoa class="NSTextStorage"/>
</class>
<class name="word" code="cwor" description="This subdivides the text into words." inherits="text">
<cocoa class="NSTextStorage"/>
</class>
<class name="character" code="cha " description="This subdivides the text into characters." inherits="text">
<cocoa class="NSTextStorage"/>
</class>
<class name="attribute run" code="catr" description="This subdivides the text into chunks that all have the same attributes." inherits="text">
<cocoa class="NSTextStorage"/>
</class>
</suite>
<suite name="Standard Suite" code="????" description="Common classes and commands for most applications.">
<cocoa name="NSCoreSuite"/>
<class name="color" code="colr" description="A color.">
<cocoa class="NSColor"/>
</class>
</suite>
</dictionary>
このスクリプトを実行すると、エラー -10000 が発生します。
tell application "Demo"
demo text
end tell
Sdef から "Text Suite" を削除すると、コードはエラーなしで実行されます。