Автоматизация форматирования текста

Статус
Закрыто для дальнейших ответов.

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 701
Реакции
11 004
Предвижу массовый поток тапков, летящих в свою сторону, мол "в фотошопе верстать нельзя", но он, как и любая адобовская программа, внезапно, обладает весьма внушительным инструментом форматирования текста в блоках, включая текстовые и параграф-стили и т.д.
Соответственно, так же, как и в индизайне, возможно автоматизировать это форматирование при помощи 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 );
Объект, помимо множества полезных параметров, включает в себя коллекций шейпов textShape, текстовых стилей textStyleRange и параграфстилей paragraphStyleRange. В данный момент нам интересна коллекция textStyleRange. Она состоит из объектов данного типа (Txtt) каждый из которых имеет целые поля From (начальный символ форматирования стиля), To (последний символ) и объекта типа textStyle (TxtS)
Как все устроено мы разобрались, нам нужно теперь проделать следующую последовательность действий:
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);
Итак, мы получили объект lr, содержащий полный список параметров текущего слоя. В нем мы без труда находим поле textKey, содержащее интересующий нас объект типа textLayer. Применяем к нему действия 2) и 3) - бинго!
 
А теперь можно для тупых в двух словах: о чём твой пост?
 
Пост для тупых не предназначен, поэтому в двух словах нельзя '))'
 
Тю, давай для более умных, и не умничай. Просто стили в новых фотошопах есть, зачем тогда твой пост, чем он лучше абзацных и символьных стилей?
 
Жора, не придирайся, я не сомневаюсь в твоих умственных способностях - просто пост для тех кто в скриптинге понимает. Или ты хочешь чтобы я тут краткий курс истории ВКП(Б) адобовского ява скриптинга в топике замутил? ;)
 
стили в новых фотошопах есть
Есть то они есть, но автоматизированно применить их к части текстового блока нельзя. К примеру, ты не можешь одно слово в блоке перекрасить или болдом сделать кроме как руками.
 
Михаил, на практике где подобное применимо?
 
Михаил, на практике где подобное применимо?
Петро, а где на практике применимы индизайновские скрипты? Которые текст форматируют внутри параграфа?
При желании дофига можно применения придумать - скажем, чисто теоретически, можно перегнать скриптом документ INDD->PSD и наоборот с сохранением форматирования
 
Петро, а где на практике применимы индизайновские скрипты? Которые текст форматируют внутри параграфа?
Ну ты не путай таки кислое с мякгим. :)
ИнДизайн и Фотошоп - как бы две большие разницы.

скажем, чисто теоретически, можно перегнать скриптом документ INDD->PSD ... с сохранением форматирования
Только в страшном сне! :))
Один вопрос только: нафига это надо?
Вот тут можно подумать. Иногда бывают, конечно, мегамакеты в Фотошопе, которые нужно привести в божеский вид... Но, сдается мне, задача настолько нетривиальная, что автоматизация тут не справится.
 
ИнДизайн и Фотошоп - как бы две большие разницы.
Ну если лично ты до сих пор этим не пользовался - это ж не значит, что никому не надо вообще? Мне до вчерашнего дня тоже не надо было - и тем не менее понадобилось.
Если текст в фотошопе набирать можно, есть форматированиек и стили - то почему бы этим не пользоваться по нормальному?
Один вопрос только: нафига это надо?
Это как один из утопических вариантов. Вообще говоря, действительно, обратная задача тут гораздо актуальнее и PDF не помогает.
C другой стороны, полным-полно более прозаических задач - к примеру, всякие буковицы и выделения, расставить, трэкинги подправить и т.д. А никто не делает, потому что не умеет и инструмент автоматизации дубовый и не документированный.
 
Ну если лично ты до сих пор этим не пользовался - это ж не значит, что никому не надо вообще? Мне до вчерашнего дня тоже не надо было - и тем не менее понадобилось.
Если текст в фотошопе набирать можно, есть форматированиек и стили - то почему бы этим не пользоваться по нормальному?
Приведи пример практического случая. Мне правда интересно.

А никто не делает, потому что не умеет
Никто не делает, потому что для подобных целей есть ИнДизайн! :))
 
Приведи пример практического случая.
Запросто. В фотошопе скриптом генерируется набор картинок с текстовыми надписями.
Некоторые слова или буквы выделяются шрифтом/цветом/размером.
Можно, конечно, такое делать индизайном, но тогда получается дополнительное звено в технологической цепочке - перевод всего этого хозяйства в растр, которое, кстати, этот ваш индизайн, внезапно, не умеет - то есть еще два звена - PDF->Acrobat или опять же фотошоп
 
  • Спасибо
Реакции: garif
Жора, а что тебя так поразило?
Ну ладно там фотошоповский скриптинг, но я ни за что не поверю, что такой спец по индизайну как ты, впервые услышал о существовании там переменных и метаданных '))'
 
перевод всего этого хозяйства в растр, которое, кстати, этот ваш индизайн, внезапно, не умеет
Экспорт в jpeg есть
И есть Automatication | LayoutZone (CS4/5.x/CS6/CC) - Free
Export Selection now supports:
PNG (CS4/CS5/CS5.5/CS6/CC)
И наверняка еще что-то и написать свое можно.
 
  • Спасибо
Реакции: colorprint
кстати, этот ваш индизайн, внезапно, не умеет - то есть еще два звена - PDF->Acrobat или опять же фотошоп
Ну оставайся, только ID внезапно вполне умеет растрировать без звеньев.
 
Статус
Закрыто для дальнейших ответов.