2

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&apos;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" を削除すると、コードはエラーなしで実行されます。

4

2 に答える 2

2

Sdef エディターが提供するテキスト スイートは、Cocoa スクリプト フレームワークを使用するアプリでは使用できないようです。また、「TextEdit.app」が使用する手法を適応させることもできません。この手法では、テキスト クラスに ID が割り当てられ (「text.ctxt」)、それが Text Suite のテキスト クラスを使用するプロパティ タイプで使用されます。

代わりに、「Sketch」サンプル コードからのものを使用する必要があります。そのタイプの名前を「テキスト」から「リッチテキスト」に変更することで、質問で説明した競合するタイプ名の問題を解決します。

「クラシック」アプリがプレーン テキストとリッチ テキストの両方のプロパティに「テキスト」タイプを使用するのは興味深いことですが、新しい Cocoa Scripting フレームワークに依存する最新のアプリでは、それはもはや不可能のようです。

于 2016-05-07T22:23:38.173 に答える
1

生成された SDEF の行にエラーがあると思います。

    <cocoa name="NSTextSuite" />

タグは、コード内のクラスまたは変数を参照するために使用されます。フレームワークには NSTextSuite という名前のクラスはありません。テキスト スイートの定義は、次のように開始する必要があります。

<suite name="Text Suite" code="????" description="...">
    <class name="rich text" plural="rich text" code="ctxt" description="Rich (styled) text." inherits="item" hidden="yes" >
        <cocoa class="NSTextStorage"/>
        <type type="text"/>
        ...
于 2016-05-08T00:12:16.000 に答える