Скриптинг в InDesign. Часть 1
Отступление для читателей, не знакомых с программированием
Идея создания настоящего материала возникла летом, во время подготовки обзорной статьи «Лед тронулся, или Приключения InDesign в России» (КомпьюАрт №7’2001). Тогда авторам было мало что сказать по существу вопроса. Сейчас же ситуация изменилась. Полгода мы проработали в InDesign и добились, на наш взгляд, выдающегося результата — ВЕСЬ «КомпьюАрт» верстается в этом замечательном издательском пакете. Номер, который у вас сейчас в руках, уже третий, полностью подготовленный в среде InDesign1. Нам очень интересно и комфортно работать в нем — во многом благодаря постоянному ощущению свободы и всесильности, возникающему на всех стадиях издательского процесса. Важной составляющей этой свободы является возможность гибкого программирования собственных задач и высвобождения собственного Времени для достойных дел. Ребята из Adobe Systems проделали отличную работу и хорошо постарались ради существования этой возможности.
Кому и зачем?
Дефинируем предмет рассмотрения. Скрипт — серия команд, указывающая InDesign, какие действия ему следует выполнять в определенный момент времени при соблюдении или несоблюдении соответствующих условий. Эти действия могут быть как одиночными и влиять исключительно на один, выбранный в данный момент объект, так и входить в состав чрезвычайно сложной структуры, влияющей на многие объекты и публикации. Таким образом, скриптинг2 — увлекательный и творческий процесс, позволяющий решать посредством несложного программирования абсолютно любую задачу, выполнимую в InDesign штатными средствами (работа с инструментами, меню, палитрами, диалогами).
Входящие в состав скрипта процедуры и операторы могут касаться как InDesign непосредственно, так и затрагивать внешние приложения: текстовые редакторы, электронные таблицы, СУБД, ГИС- и CAD-системы. Более того, скриптинг в среде InDesign может служить не только целям автоматизации часто повторяющихся операций, но и являться продвинутым дизайнерским инструментом. Например, задачи случайного выбора гарнитуры и цвета символа в строке текста, равномерного изменения кегля от начала до конца строки в каждом символе, в конце концов просто свободного распределения литер на полосе (распространенный дизайнерский прием) — все это без применения скриптинга кажется тяжеловесным и трудновыполнимым.
Скриптинг доступен не только профессиональным разработчикам программного обеспечения. Более того, он для них не предназначен. Верстальщику — «версталово», а программисту — «программерово». Для профессиональных разработчиков существует SDK — Software Development Kit for InDesign, который Adobe Systems предоставляет в свободном доступе. Скриптинг же доступен каждому пользователю InDesign.
Широкое распространение InDesign и появление достаточного количества пользователей, способных программировать свои задачи и добиваться максимальной эффективности своей работы, способны взорвать и кардинально изменить сложившееся за 10 лет эпохи Десктопа представление о профессии верстальщика. К глубокому сожалению авторов, авторитет зубров-метранпажей3 и их традиционно высокое в негласной иерархии типографских работников место остались в прошлом. Ныне в основном превалирует отношение к верстальщику, как к низкоквалифицированной рабочей силе, что-то вроде «посадимдевочкузалитьтекстнаполосы». Надо отметить, что некоторые горе-«верстальщики» сильно способствуют этому. Но речь не о них. Владение скриптингом может и должно стать основным аргументом верстальщика при трудоустройстве. Ведь экономия времени, необходимого для выполнения рутинных задач, в разы — серьезное повышение эффективности допечатного процесса, суть — прямое конкурентное преимущество предприятия. А какое наслаждение запустить скрипт собственного изготовления и наблюдать за тем, как публикация верстается «сама»! Скриптинг — как процесс, безусловно, творческий — способен одухотворить деятельность верстальщика, придать ей шарм и избавить от ощущения «одного и того же». Наконец, полномасштабное владение скриптингом и знание общей типографской культуры могут служить серьезным источником дополнительного дохода. Ни один программист (если он никогда не занимался версткой) не в состоянии элементарно сформулировать задачу по автоматизации издательского процесса, не говоря уже о ее реализации и отладке. Разумеется, речь здесь идет не о глобальных плагинах и дополнениях, над которыми работают целые коллективы специалистов, а о маленьких скриптиках, учитывающих особенности и потребности конкретного издательского процесса, но дающих в итоге огромную экономию временных ресурсов.
Надеемся, что необходимость и полезность освоения скриптинга в InDesign очевидна всем. Итак, приступим!
Среда разработки
До единого аппаратно-платформенного стандарта в DTP-индустрии очень далеко, и с программной средой разработки, отлаживания и исполнения скриптов для InDesign ситуация обстоит так же, как и во всей отрасли. Для PC пишем на Visual Basic, для InDesign под Mac OS — на AppleScript. К сожалению, конструкции скриптов для InDesign под этими программными средами отличаются семантикой, но логика работы одна и та же. Авторы не имеют возможности тестировать и отлаживать скрипты под Macintosh, поэтому, не желая отбирать хлеб у наших коллег, приверженцев платформы Apple, мы лишь кратко остановимся на сути скриптинга под Mac OS, а в дальнейшем будем рассматривать в качестве программной среды Visual Basic (VB). К тому же предварительный анализ семантических конструкций обеих программных сред позволяет надеяться на появление в недалеком будущем скрипт-конверторов VB « AppleScript.
Итак, для успешного скриптинга в InDesign на платформе Apple нам необходимо наличие в системе интерпретатора AppleScript, который входит в стандартную поставку любой из Mac OS, и одного из доступных редакторов (AppleScript editor, Scripter, Script Debugger, etc.)
Для скриптинга в InDesign на платформе Windows необходимо установить Microsoft Visual Basic либо использовать любое приложение, содержащее Visual Basic for Applications (VBA). Такие пакеты, как MS Office, AutoCAD, Corel, Visio и др., содержат в составе поставки VBA. InDesign, к сожалению, пока не комплектуется VBA, но вполне успешно его поддерживает. На сайте Adobe Systems, в форуме, посвященном скриптингу в InDesign, появлялась неофициальная информация о том, что InDesign 2.0 будет снабжен необходимыми компонентами VBA для работы со скриптами непосредственно в пакете4, но эти ожидания пока не оправдались.
Базовые понятия
В этой части материала, которую имеющие минимальный опыт программирования на VB читатели вполне могут пропустить, дадим начальные сведения о конструкциях Visual Basic и принципах скриптинга в InDesign.
В процессе обычной работы в среде InDesign мы работаем с фреймами и их содержимым, применяем к ним цвета и стили, масштабируем, перемещаем и форматируем; открываем публикации, перемещаемся по полосам и разворотам, размещаем элементы на них, то есть всегда имеем дело с неким объектом.
При исполнении скрипта происходит то же самое, с той лишь разницей, что активной стороной, влияющей на процесс, являемся не мы, как субъект взаимодействия с пакетом, а скрипт, серия команд. С точки зрения InDesign не происходит ничего незаурядного. Пакету отдается команда совершить действие А над объектом X. Если это действие допустимо, оно выполняется.
Суть скриптинга заключается в объектной модели — описании всех доступных InDesign’у объектов: публикаций, разворотов, полос и фреймов. При этом каждому типу присущи свои специфические свойства, и каждый объект может быть однозначно идентифицирован.
Таким образом, скриптинг в InDesign является типичным случаем объектно-ориентированного программирования. Схожие по тому или иному признаку объекты объединяются в классы (classes), обладают свойствами (properties), манипуляции над объектами осуществляются посредством методов (methods) в Windows или команд (commands) на Macintosh.
Объектные ссылки
Объекты в InDesign расположены иерархически, то есть фреймы принадлежат полосам, полосы принадлежат публикации, которая, в свою очередь, принадлежит InDesign. Для того чтобы подать команду какому-либо объекту, необходимо ее направить по иерархической цепочке — указать «точный адрес» объекта. Адресация объектов в VB идет от старшего объекта к младшему, в AppleScript — наоборот, но четкая последовательность обращений к каждой иерархической ступени обязательна:
«Documents.Item(1).Spreads.Item(1). TextFrames.Item(1)» — Visual Basic; «the first text frame of the first spread of the first document» — AppleScript.
Вышеприведенные конструкции являются объектными ссылками (object reference) и позволяют реализовывать принцип однозначности идентификации объекта. Таким образом у каждого объекта существует уникальная объектная ссылка.
Классы объектов
Объекты со схожими свойствами объединяются в классы. Так, все типы фреймов — прямоугольники, полигоны, овалы и фреймы свободной формы — принадлежат классу объектов PageItems и обладают свойствами, общими для всех других типов объектов этого класса. Например, свойство Geometric location является общим для всех объектов класса PageItems.
Наследование свойств
Типы объектов класса наследуют ряд свойств этого класса. Прямоугольник наследует свойство fill от класса PageItems, как и все прочие типы фреймов. Вместе с тем, объекты могут обладать свойствами, которыми не обладают объекты другого типа данного класса. У текстового фрейма есть свойство TextContents, которым фреймы другого типа не обладают.
Типы данных
Поддерживаются данные пяти типов:
- Boolean (логический тип данных true or false);
- Integer (целое);
- Double (вещественные числа);
- String (строка символов, заключается в двойные кавычки);
- Array (массив данных любого типа).
Отдельно стоит описание данных как Variant, но об этом позднее.
Переменные
Переменные являются контейнерами для данных и могут содержать число, строку текста или объект. У каждой переменной обязательно должно быть уникальное имя, по которому мы к ней обращаемся. Присвоение значений переменным и последующее их использование позволяет сделать скрипт универсальным и не зависящим от конкретной ситуации, как это было бы при непосредственном использовании данных.
В AppleScript присвоение значений осуществляется с помощью оператора set:
set myNumber to 10 set myString to “Hello, World!” В Visual Basic при помощи оператора равенства (=): myNumber = 10 myString = “Hello, World!”
Операторы
Используются для выполнения вычислений над переменными и данными. Оператор возвращает какое-либо значение, которое зависит от типа данных, над которыми производятся вычисления. Это может быть как числовая величина (MyWidth/2), так и логическое значение (в случае использования оператора сравнения MyWidth > MyHeight).
Команды и методы
Команды в AppleScript и методы в VB по сути являются «глаголами», сообщающими системе, что именно необходимо сделать с тем или иным объектом.
Так, в VB для создания нового объекта используется метод Add, для привязки переменной к объекту — метод Set и оператор равенства (=) для изменения свойств объекта.
В AppleScript команда make создает новый объект, set изменяет его свойства, а get позволяет получить от объекта информацию о его свойствах.
Условные выражения
Условные выражения дают возможность скрипту в процессе исполнения анализировать ситуацию и принимать то или иное решение в зависимости от выполнения условия. Данные выражения всегда начинаются с оператора if. Следующий скрипт создает новую публикацию, запрашивает InDesign о количестве текстовых материалов в ней и, не обнаружив таковых, выводит сообщение5.
Private Sub Form_Load() Dim myInDesign As InDesign.Application Dim myPub As InDesign.Document Dim myStories As InDesign.Stories Set myInDesign = CreateObject (“InDesign. _ Application”) myNumberOfStories = myStories.Count If myNumberOfStories = 0 then MsgBox “В данном документе _ не содержится текстовых блоков” End If End Sub
Структуры управления
Предположим, что нам необходимо выполнить какое-либо действие несколько раз подряд. Записать последовательно несколько строк, описывающих это действие? А если существует необходимость в выполнении ста итераций? Для этих целей и существуют структуры управления.
Следущие конструкции исполняют последовательности операторов скрипта (тело цикла) заданное количество раз.
AppleScript: repeat with counter from 1 to 20 -- тело цикла end repeat Visual Basic: For counter = 1 to 20 rem тело цикла Next counter
Несколько более сложная конструкция управляющей структуры, которая выполняет тело цикла до тех пор, пока ограничивающее условие истинно.
AppleScript repeat while myToDoCondition = true -- тело цикла end repeat Visual Basic Do While myToDoCondition = true rem тело цикла loop
Координатная сетка
Как и все современные пакеты верстки, InDesign использует стандартную 2D геометрию для точного позиционирования объекта на полосе. Горизонтальный компонент координатной пары (точки) обозначается как x, вертикальный — y. Эти координаты отображаются в палитре Transform, при выборе объекта инструментом «указатель». Геометрический ноль полосы в InDesign находится в левом верхнем углу полосы. Таким образом, положительное направление по оси X — слева направо, а по оси Y — сверху вниз. Важно помнить про последовательность записи координат объектов: сначала x, затем y! InDesign ждет от нас именно такую запись. Следующий скрипт создает новую публикацию, в ней новый объект, а затем перемещает его на 10 мм вправо и на 40 мм вниз.
AppleScript tell application “InDesign 1.5” set mySelection to selection move mySelection to {“10mm”, “40mm”} end tell Visual Basic Dim myInDesign as InDesign.Application Dim myPub as InDesign.Document Set myInDesign = CreateObject(“InDesign._ Application”) Set myPub = myInDesign.ActiveDocument myPub.Selection.Move Array(“10mm”,”40mm”)
Однако обратите внимание: при различных запросах InDesign выдает разные значения координат. Координаты геометрической границы объекта и его видимой границы есть различные массивы данных, включающие в себя по четыре значения: для верха (y), левого края(x), низа (y) и правого края (x).
Переходим к практике
Специфика журнальной публикации не позволяет в полной мере развернуть все особенности конструкций скриптинга и снабдить их подробными примерами, как это могло бы быть в отдельном издании-учебнике. Но мы и не ставили перед собой подобную задачу. В дальнейшем мы продолжим конспективное изложение основ скриптинга и его диалектов на VB и AppleScript, главный же смысл серии публикаций, посвященных скриптингу, мы видим в решении с его помощью конкретных издательских задач.
Подробное руководство по скриптингу доступно для свободного скачивания с сайта Adobe Systems: http://www.adobe.com/products/indesign/pdfs/idsnscripting.pdf
Мы осваивали тонкости скриптинга в InDesign именно по этому руководству, в котором подробно и с примерами описывается каждая семантическая конструкция диалектов VB и AppleScript. Результатом наших экспериментов является появление и внедрение в производственный процесс издательства «КомпьютерПресс» нескольких очень полезных, на наш взгляд, облегчающих жизнь и экономящих время и верстальщикам и корректорам издательства. Один из этих скриптов, текст которого приведен на следующей полосе, мы предлагаем сегодня вашему вниманию. Наберите, протестируйте, отладьте, скомпилируйте из него исполняемый файл и распространите его среди своих коллег. Их благодарность не будет знать границ!
Верстка любого материала начинается с размещения текста на полосе и с его предобработки, которая, как правило, происходит при помощи операций поиска и замены. Утомительное занятие! Настоящий скрипт как раз и занимается предобработкой помещенного текста: расставляет символы неразрывного пробела после каждого односимвольного слова, удаляет двойные пробелы, заменяет там, где необходимо, дефис на тире и меняет западные типографские кавычки (“лапки”) на принятые в отечественной типографике («елочки»).
Логика скрипта основана на анализе текущего символа и двух предыдущих. Для визуализации процесса скрипт снабжен прогресс-индикатором, который вам необходимо нарисовать в любом редакторе форм и включить в проект в виде файла zam.frm.
Скрипт, безусловно, можно оттачивать, модифицировать и усложнять. Можно добавить процедуру предварительного выбора вариантов при помощи CheckBox: что включать в список замен, а что нет. Можно добавить замену иксов между цифрами на знак умножения (2x2 ® 2×2). Можно многое и не только с этим скриптом. Надеемся, что настоящая публикация подвигнет вас к экспериментам, уважаемый коллега. Обязуемся публиковать любой присланный нам законченный и работающий скрипт.
zlotnikov@compress.ru; michnykin@mail.ru
КомпьюАрт 2'2002