Поддержка "стилизованного текста" в скриптовом приложении Mac (Cocoa Scripting)
Мое приложение поддерживает скрипты с помощью Applescript.
Я пытаюсь сделать стилизованный текстовый контент, хранящийся в объектах NSAttributedString, доступным для пользователя Applescript.
Я думал, что мог бы просто передать стилизованный текст с помощью класса NSAttributedString, точно так же, как я предоставляю простой текст с помощью класса NSString, но это не работает - тогда сценарии Cocoa сообщают, что они не могут конвертировать или приводить данные.
Интересно, я что-то упускаю или это просто невозможно со стандартными классами, поддерживаемыми Cocoa Scripting?
AppleScript знает тип "стиль текста", как показано в этом примере:
set stxt to "foo" as styled text
Итак, если AppleScript знает этот тип по умолчанию, разве не должен механизм движка сценариев Какао так или иначе поддерживать его?
2 ответа
Как всегда, есть много вариантов решения проблемы AS. В моем текстовом редакторе с поддержкой сценариев (Ted) я реализовал Text Suite, который основан на расширенном тексте (NSTextStorage, подкласс NSMutableAttributedString). Я хотел иметь возможность создавать сценарии для вкладок в своих абзацах, поэтому я добавил запись стиля, которая содержит всю информацию о стиле абзаца. Это позволяет мне писать такие сценарии:
tell application "Ted"
set doc1 to make new document at beginning with properties {name:"Document One"}
tell doc1
set p1 to make new paragraph at end with data "Paragraph One" with properties {size:24, color:maraschino}
set p2 to make new paragraph at end with data "Paragraph Two" with properties {style:style of paragraph 1}
set color of paragraph 1 to blue
end tell
set doc2 to make new document at beginning with properties {name:"Document Two"}
copy p1 to beginning of doc2
properties of paragraph 1 of doc2
end tell
Поскольку p1 - форматированный текст, второй документ заканчивается как текстом, так и форматированием первого абзаца первого документа.
Вы также можете запросить свойства фрагмента текста, где я реализовал обычные свойства Text Suite, а также свойство "style" для стиля абзаца (при поддержке NSParagraphStyle, так как я хотел иметь возможность сценариев табуляции)):
properties of paragraph 1 of doc2
Результат: {высота:60,0, курсив: ложь, размер:24, стиль: {интервал после абзаца: 0,0, отступ заголовка: 0,0, режим разрыва строки: 0, выравнивание:4, межстрочный интервал: 0,0, минимальная высота строки: 0,0, отступ в первой строке: 0,0, расстояние между абзацами перед: 0,0, табуляция:{"28L", "56L", "84L", "112L", "140L", "168L", "196L", "224L", "252L", "280L", "308L", "336L"}, отступ хвоста: 0.0, максимальная высота строки: 0.0, кратность высоты строки: 0.0, интервал табуляции по умолчанию:0.0}, цвет: синий, ширина:164.109375, шрифт:"Helvetica", полужирный:false, class:attribute run}
Это хорошо работает для передачи расширенного текста в моем приложении, но может быть не таким полезным для передачи стилизованного текста в другие приложения, что может быть тем, что вы хотели сделать. Я думаю, что добавление свойства "style" (типа record), вероятно, является наилучшим способом передачи информации о стиле для использования в других приложениях с поддержкой скриптов. Затем во втором приложении сценарий может использовать любые свойства записи стиля, которые понимает второе приложение.
Похоже, что нет неявной поддержки стилизованного текста в AppleScript. И нет также общего типа записи обмена для передачи стилизованного текста.
AppleScript был разработан в дни до OSX, когда стилизованный текст часто представлялся комбинацией простого текста (в кодировке System или MacRoman) и styl
ресурс. С Юникодом появился альтернативный формат ustl
формат стиля. Они все еще используются с Carbon Pasteboard API (PasteboardCreate
и т.д.) сегодня. Тем не менее, ни один из них, кажется, не использовал его в AppleScript.
Тот факт, что AppleScript знает о типе стилизованного текста, не имеет особого значения. Даже его класс просто текст.
Обновить
Я только что обнаружил, что в книге Мэтта Нойбурга "AppleScript The Definitive Guide" упоминается стилизованный текст и приводится пример, где он действительно показывает запись, содержащую как простой текст (класс ktxt
) и стиль данных (класс ksty
) с данными типа styl
так же, как я ожидал выше. Он также отмечает, что большинство приложений не используют этот формат.
Таким образом, кажется, что использование записи со стилевыми данными действительно является намеченным способом, только о котором мало кто знает. Пойди разберись.