Cocoa脚本:集成Text Suite

时间:2016-05-07 19:32:48

标签: applescript cocoa-scripting

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

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

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

所以我最终在Sdef编辑器的文本选择器中为我的元素的属性选择了两个“text”,并且在写入的Sdef中它是相同的类型。这意味着我不能在Sdef中区分处理支持Text Suite的文本的属性和不支持Text Suite的文本,即使我的代码并不总是使用NSTextStorage

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

但是对于仅提供简单纯文本字符串的简单属性,例如应用程序的名称,支持Text Suite会有点过分,不是吗?

那么,我该如何解决这个问题呢?难道我只是让用户在他可以使用Text Suite时找到它,而不是因为我只将NSTextStorage用于我认为值得支持富文本的属性?其他人如何解决这个问题?

更新

事实证明,当我简单地将Text Suite添加到我的Sdef(我使用Sdef编辑器在其File子菜单下提供的“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”,则代码运行时没有错误。

2 个答案:

答案 0 :(得分:2)

看起来Sdef编辑器提供的Text Suite不适用于使用Cocoa Scripting框架的应用程序。人们也不能适应&#34; TextEdit.app&#34;使用,文本类获取一个id(&#34; text.ctxt&#34;),然后使用属性类型使用Text Suite的文本类。

相反,来自&#34; Sketch&#34;应使用示例代码。那个人从&#34; text&#34;重命名该类型。 to&#34;富文本&#34;,从而解决了我在我的问题中描述的冲突类型名称的问题。

我觉得很奇怪那个&#34;经典&#34;应用程序使用&#34;文本&#34;对于纯文本属性和富文本属性,对于依赖新Cocoa Scripting框架的现代应用程序来说,这似乎不再可能。

答案 1 :(得分:1)

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

    <cocoa name="NSTextSuite" />

标记用于引用代码中的类或变量。 afaik在框架中没有名为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"/>
        ...