我正在尝试在我的可编写脚本的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'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”,则代码运行时没有错误。
答案 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"/>
...