2

我正在尝试Text Suite在我的可编写脚本的 Mac 应用程序中使用。

我在 Cocoa 脚本指南中找到的小文档建议使用NSTextStorage. 但它没有解释在 Sdef 和编码方面需要如何设置其余部分。

特别是,我想知道如何告诉我的脚本定义何时使用具有更丰富命令的文本套件,何时不使用。我看到的问题是 Text Suite 声明了自己的名为text. 但这已经是用于纯文本的预定义类型。

因此,我最终在 Sdef 编辑器的文本选择器中为我的元素属性选择了两种“文本”,并且对于写入的 Sdef,它是相同的类型。这意味着我无法在 Sdef 中区分处理支持文本套件的文本的属性和不支持文本套件的属性,即使我的代码并不总是NSTextStorage用于它们。

这是否意味着我需要将所有可编写脚本的属性存储在类对象中NSTextStorage?否则,用户可能希望在任何文本属性上使用扩展的文本套件命令,但如果我使用NSString而不是NSTextStorage它们,则会出现运行时错误,对吗?

但是对于只返回简单纯文本字符串的简单属性,例如应用程序的名称,支持 Text Suite 将是矫枉过正,不是吗?

那么,我该怎么办呢?我是否应该简单地让用户弄清楚他什么时候可以使用 Text Suite,以及因为我NSTextStorage只使用我认为值得富文本支持的属性而不能使用?其他人如何解决这个问题?

更新

事实证明,当我只是将文本套件添加到我的 Sdef 时(我使用 Sdef 编辑器在其文件子菜单下作为“NSTextSuite”提供的那个),所有返回的属性都text停止工作(导致错误 -10000)。我已经将 Text Suite 条目与其他应用程序中的条目进行了比较,并且看不到任何明显的差异。

为什么添加文本套件会破坏所有具有“文本”类型属性的属性?

以下是缩写的 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 中删除“文本套件”,则代码运行不会出错。

4

2 回答 2

2

看起来 Sdef 编辑器提供的文本套件不适用于使用 Cocoa 脚本框架的应用程序。也不能适应“TextEdit.app”使用的技术,其中文本类获得一个分配的 id(“text.ctxt”),然后将其与将使用 Text Suite 的文本类的属性类型一起使用。

相反,应该使用“草图”示例代码中的那个。那个将类型从“文本”重命名为“富文本”,从而解决了我在问题中描述的类型名称冲突的问题。

我觉得奇怪的是,“经典”应用程序对纯文本和富文本属性都使用“文本”类型,而对于依赖新 Cocoa 脚本框架的现代应用程序来说,这似乎不再可能。

于 2016-05-07T22:23:38.173 回答
1

我认为在该行中生成的 SDEF 存在错误:

    <cocoa name="NSTextSuite" />

标签用于引用代码中的类或变量。框架中没有名为 NSTextSuite 的类,afaik。文本套件定义应该像这样开始:

<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 回答