Текстовые фреймы и текстовые контейнеры

Что есть текстовый фрейм в понятиях InDesign? В первую очередь — это элемент страницы (pageItem), то есть такой объект, который можно «пощупать» с помощью Selection Tool. Как всякий элемент старницы, текстовый фрейм можно трансформировать, вращать, перемещать, группировать с другими объектами — хоть вручную, хоть скриптом.

У каждого отдельно стоящего текстового фрейма есть свойство parentStory — ссылка на объект, который содержит так называемый текстовый поток (text flow), который отображается в текстовом фрейме. Этот текстовый поток может отображаться полностью в одиночном фрейме или в нескольких связанных (text thread) текстовых фреймах. В последнем случае все связанные текстовые фреймы будут иметь один и тот же объект в свойстве parentStory. Часть текстового потока может не отображаться в документе, оставаясь «за кадром» (overflow) текстового фрейма,  но из скрипта можно получить доступ к этой части текста для редактирования. Штатная функция поиска, кстати, тоже может искать и заменять текст в невидимой части текста.

Конечно, parentStory — это не только поток текста, это объект с многими свойствами и методами, но подробней о нем в другой раз. Сейчас — о небольшом, но важном различии между интерпретацией скриптов в InDeign CS2 и более старшими версиями.

В InDesign CS2 цепочку связанных фреймов можно было получить от их parentStory, обратившись к свойству story.textFrames. В InDesign CS3 и старше — story.textContainers. Это исправление было сделано потому, что в CS3 активно используются inline- и anchored-объекты, в том числе текстовые фреймы, которые в этой версии стали откликаться на позывной story.textFrames. При адаптировании скриптов  CS2 для CS3 важно учитывать эту особенность, поскольку при обращении по старинке story.textFrames ошибки не генерирует, но выдает не то, что CS2.

Характерно, что в объектой модели нет описания объекта textContainer и коллекции textContainers. Это потому, что таких объектов в объектной модели нет: textContainers — это свойство объекта типа story, по типу массив. А это значит, что никаких textContaiters.add() и прочих методов работы с коллекциями применить не удастся. Ну и родных методов массива, типа push() это свойство тоже воспринимать не будет. Так что единственое назначение свойства textContainers — доступ к текстовым фреймам в цепочке. Эти фреймы, кстати, по имеют тип TextFrame и входят в коллекцию текстовых фреймов документа document.textFrames.

Вот еще один интересный момент, связанный с коллекцией текстовых фреймов объекта типа story.

Если текстовый фрейм вставлен в таблицу, то в коллекцию story.textFrames он не входит, соответственно к нему нет доступа. Но этот же текстовый фрейм входит в коллекцию story.allPageItems. То есть, получить все текстовые фреймы в story можно, но для этого придется немного схитрить.

 

function getStoryAllTexFrames (myStory) {
	var result = [];
	for (var counter = 0; counter < myStory.allPageItems.length; counter++) {
		if (myStory.allPageItems[counter].constructor.name == 'TextFrame') {
			result.push(myStory.allPageItems[counter]);
			}
		}
	return result;
	}

1 комментарий на “Текстовые фреймы и текстовые контейнеры

  1. darii

    Добрый день, Олег!

    Спасибо за этот пост, а также за ответ ru_indesign — у меня второй раз за день чувство изобретения велосипеда. Хотелось бы задать вам несколько вопросов про объектную модель индизайна и, возможно, поговорить про IDML. Не подскажете ли какой-нибудь instant messenger для связи с вами?

Ответить на darii Отменить ответ