- Сообщения
- 33 701
- Реакции
- 11 004
Предвижу массовый поток тапков, летящих в свою сторону, мол "в фотошопе верстать нельзя", но он, как и любая адобовская программа, внезапно, обладает весьма внушительным инструментом форматирования текста в блоках, включая текстовые и параграф-стили и т.д.
Соответственно, так же, как и в индизайне, возможно автоматизировать это форматирование при помощи JS и VBскриптинга. Беда в том, что, как обычно, адобовцы поручили фотошоповский скриптинг группе особо продвинутых индусов, которым какого то кришны вздумалось, что пускать пользователя к выборочному форматированию внутри текстового блока - категорически нельзя. Однако, русский пытливый ум всегда найдет решение и я, пользуясь бессонницей, расскожу о возможном варианте.
В референсе на данный счет все весьма уныло - мол, есть один стиль на весь текстовый layer и не умничайте. Тем не менее, сделать выборочное форматирование текста внутри слоя можно и если записать экшн, то видно, что при этом внутри слоя форматирование разбивается на несколько подстилей, ограниченных полями From и To.
Попробуем конвертировать экшн в скрипт при помощи ScriptListener - натыкаемся на еще одну рогатку, установленную на нашем пути коварными индусами: экшн не может выборочно изменить форматирование части готового текстового слоя - он полностью формирует форматирование слоя заново, причем, пихает в скрипт все до единого параметры текста, о которых мы даже не подозревали. В итоге получается огромная простыня безумного кода, который, на первый взгляд, еще и практически бесполезен - ведь при применении к другому текстовому блоку он просто копирует в него исходный целиком вместе с текстом и полным форматированием.
Но это только на первый взгляд. При в внимательном изучении кода мы наблюдаем, что он, по сути, представляет собой команду "set", инициализирующую текстовый слой:
Объект, помимо множества полезных параметров, включает в себя коллекций шейпов textShape, текстовых стилей textStyleRange и параграфстилей paragraphStyleRange. В данный момент нам интересна коллекция textStyleRange. Она состоит из объектов данного типа (Txtt) каждый из которых имеет целые поля From (начальный символ форматирования стиля), To (последний символ) и объекта типа textStyle (TxtS)
Как все устроено мы разобрались, нам нужно теперь проделать следующую последовательность действий:
1) Получить текущее форматирование текстового слоя
2) Модифицировать его, изменив стили в коллекции textStyleRange или добавив новые на базе существующих
3) Применить полученное новое форматирование к данному слою
Последнее действие мы делать уже умеем, благодаря вышеописанным действиям, второе тоже особой сложности не представляет, попробуем сделать первое. Тут нам scriptlistener не поможет, но мы помним, что существует замечательная команда executeActionGet и пытаемся при помощи нее прочитать параметры текущего слоя:
Итак, мы получили объект lr, содержащий полный список параметров текущего слоя. В нем мы без труда находим поле textKey, содержащее интересующий нас объект типа textLayer. Применяем к нему действия 2) и 3) - бинго!
Соответственно, так же, как и в индизайне, возможно автоматизировать это форматирование при помощи JS и VBскриптинга. Беда в том, что, как обычно, адобовцы поручили фотошоповский скриптинг группе особо продвинутых индусов, которым какого то кришны вздумалось, что пускать пользователя к выборочному форматированию внутри текстового блока - категорически нельзя. Однако, русский пытливый ум всегда найдет решение и я, пользуясь бессонницей, расскожу о возможном варианте.
В референсе на данный счет все весьма уныло - мол, есть один стиль на весь текстовый layer и не умничайте. Тем не менее, сделать выборочное форматирование текста внутри слоя можно и если записать экшн, то видно, что при этом внутри слоя форматирование разбивается на несколько подстилей, ограниченных полями From и To.
Попробуем конвертировать экшн в скрипт при помощи ScriptListener - натыкаемся на еще одну рогатку, установленную на нашем пути коварными индусами: экшн не может выборочно изменить форматирование части готового текстового слоя - он полностью формирует форматирование слоя заново, причем, пихает в скрипт все до единого параметры текста, о которых мы даже не подозревали. В итоге получается огромная простыня безумного кода, который, на первый взгляд, еще и практически бесполезен - ведь при применении к другому текстовому блоку он просто копирует в него исходный целиком вместе с текстом и полным форматированием.
Но это только на первый взгляд. При в внимательном изучении кода мы наблюдаем, что он, по сути, представляет собой команду "set", инициализирующую текстовый слой:
Код:
var idsetd = charIDToTypeID( "setd" );
var desc151 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref33 = new ActionReference();
var idTxLr = charIDToTypeID( "TxLr" );
var idOrdn = charIDToTypeID( "Ordn" );
var idTrgt = charIDToTypeID( "Trgt" );
ref33.putEnumerated( idTxLr, idOrdn, idTrgt );
desc151.putReference( idnull, ref33 );
var idT = charIDToTypeID( "T " );
// инициализация объекта Desc типа textLayer
var idTxLr = charIDToTypeID( "TxLr" );
desc151.putObject( idT, idTxLr, Desc );
executeAction( idsetd, desc151, DialogModes.NO );
Как все устроено мы разобрались, нам нужно теперь проделать следующую последовательность действий:
1) Получить текущее форматирование текстового слоя
2) Модифицировать его, изменив стили в коллекции textStyleRange или добавив новые на базе существующих
3) Применить полученное новое форматирование к данному слою
Последнее действие мы делать уже умеем, благодаря вышеописанным действиям, второе тоже особой сложности не представляет, попробуем сделать первое. Тут нам scriptlistener не поможет, но мы помним, что существует замечательная команда executeActionGet и пытаемся при помощи нее прочитать параметры текущего слоя:
Код:
var typeOrdinal = charIDToTypeID('Ordn');
var enumTarget = charIDToTypeID('Trgt');
var ID = 'Lyr ';
var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID(ID), typeOrdinal, enumTarget);
var lr=app.executeActionGet(ref);