Сценарии Cocoa: интеграция текстового пакета
Я пытаюсь использовать Text Suite
в моем скриптовом приложении Mac.
Небольшая документация, которую я нашел в Руководстве по написанию сценариев Какао, предлагает использовать NSTextStorage
, Но это не объясняет, как остальные должны быть настроены, как в Sdef, так и на стороне кодирования.
В частности, мне интересно, как я говорю своему определению сценариев, когда использовать Text Suite с его более богатыми командами, а когда нет. Проблема, которую я вижу, состоит в том, что Text Suite объявляет свой собственный тип с именем text
, Но это уже предопределенный тип, используемый и для простого текста.
Таким образом, я получаю два варианта "text" в текстовом селекторе редактора Sdef для свойств моих элементов, и для Sdef, который пишется, это тот же тип. Это означает, что я не могу провести различие в Sdef между свойствами, которые обрабатывают текст, который поддерживает Text Suite, и теми, которые не поддерживают, даже если мой код не всегда использует NSTextStorage
для них.
Означает ли это, что мне нужно хранить все свои свойства сценариев в объектах класса NSTextStorage
? В противном случае пользователь может ожидать использования расширенных команд Text Suite для любого текстового свойства, но при использовании я получу ошибки во время выполнения. NSString
вместо NSTextStorage
для них, верно?
Но для простых свойств, которые возвращают только простые текстовые строки, такие как имя приложения, было бы излишним поддерживать Text Suite, не так ли?
Итак, как мне поступить об этом? Должен ли я просто позволить пользователю понять, когда он может использовать Text Suite, а где нет, потому что я использую NSTextStorage
только для свойств, которые я считаю достойными поддержки расширенного текста? Как другие решают это?
Обновить
Оказывается, что когда я просто добавляю Text Suite в свой Sdef (я использую тот, который редактор Sdef предлагает как "NSTextSuite" в его подменю File), все свойства, которые возвращают text
перестать работать (вызывает ошибку -10000). Я сравнил записи Text Suite с записями из других приложений и не вижу никаких очевидных отличий.
Почему добавление 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'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
Если я удаляю "Text Suite" из Sdef, код запускается без ошибок.
2 ответа
Похоже, текстовый пакет, который предлагает редактор Sdef, непригоден для приложений, использующих инфраструктуру сценариев Cocoa. Также нельзя адаптировать технику, которую использует "TextEdit.app", где текстовый класс получает присвоенный идентификатор ("text.ctxt"), который затем используется с типами свойств, которые должны использовать текстовый класс Text Suite.
Вместо этого следует использовать код из примера Sketch. Тот переименовывает тип из "text" в "rich text", тем самым решая проблему конфликтующих имен типов, которые я описал в своем вопросе.
Мне кажется любопытным, что эти "классические" приложения используют тип "текст" для свойств как обычного, так и расширенного текста, тогда как это кажется невозможным в современных приложениях, использующих новую инфраструктуру сценариев Cocoa.
Я считаю, что в сгенерированном 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"/>
...