К объектам коллекций paragraphs, words, characters, lines, insertionPoints можно обращаться напрямую, минуя объект более общего типа text, который служит исключительно для указания, что работа происходит только с текстовым содержимым фрейма.
Упрощенный вариант обращения к текстовым объектам изображен па рис. 5.2.
Рис. 5.2. Четыре варианта обращения к различным текстовым объектам Как видно из рис. 5.2, в InDesign можно использовать любой из поддерживаемых способов обращения к текстовым объектам - а их четыре. Главное- выбрать тот, который в наибольшей степени удовлетворяет вашим задачам. Например, если вы работаете только с конкретной страницей, проще всего ограничить сферу действия, используя обращение with(myPage). Если же действия происходят над всем содержимым документа, логично использовать with (document). Подобная гибкость позволяет выбрать наиболее оптимальный вариант в каждом конкретном случае.
Часто можно обойтись без использования фреймов. Например, если вы форматируете текст в целом материале или в некоторой выделенной области, то достаточно указать на соответствующий объект (например, anyObject.parentStory ИЛИ selection[0]) И работать В его пределах. TextFrame, как правило, используется либо для позиционирования фрейма на странице, либо вставке одного фрейма в другой.
Поскольку методы работы с текстом существенно отличаются от методов работы с другими объектами, считается хорошим тоном вначале каждого скрипта выполнять проверку типа объекта. С учетом постоянного использования такой проверки рационально выполнить ее к виде функции и сохранить в файле библиотеки. В таком случае вначале любого скрипта достаточно бу дет вставить ссылку на библиотечный файл и в дальнейшем использовать его функции.
Поскольку заранее тип объекта нам неизвестен, поступим следующим образом: создадим новый метод для любого объекта InDesign (листинг 5.1).
Листинг 5.1. Функция проверки объекта на принадлежность той или иной коллекции
Object.prototype.isText = function() ( switch(this.constructor.name) { case "InsertionPoint": case "Character": case "Word": case "TextStyleRange": case "Line": case "Paragraph": case "TextColumn": case "Text": case "Story": return true'; alert("Выбран текст") break; case "TextFrame":
alert("Выбран текстовый фрейм") break; default :
return false;
alert("Выбран не текстовый объект")
}
}
object - это глобальный тип объекта, не привязанный ни к какому конкретному типу.
Свойство prototype позволяет добавлять любому типу объекта новые методы и свойства. Мы добавляем к методам, существующим у любого объекта, новый (isText о), который определяем как функцию (= function о).
this - это ссылка на текущий объект, т. е. тот объект, к которому он в каждый момент применяется. Если выделенным будет прямоугольник, то вместо this будет использоваться rectangular, вместо абзаца - paragraph и т. д.
А вот как данную проверку можно использовать в скрипте - проверяем, является ли область выделения текстом (листинг 5.2).