[ID CC-CC2022] Скрипт Текст Автоужимка

Lana_

Участник
Топикстартер
Сообщения
20
Реакции
1
Добрый день!
Есть скрипт "Текст Автоужимка", который ужимает выделеный параграф или параграф, в котором стоит курсор до тех пор пока параграф не ужмется на 1 строку, но не менее мин. значения трекинга. Если ужать не удалось - возвращается начальное значение трекинга.
А можно ли в этот скрипт к трекингу добавить еще ужатие букв по горизонтали (Horizontal Scale) до определнного минимального значения и разрешить переносы слов? А потом также отменить, если не удалось ужать?
Вот скрипт:
// v.1.00
//Ужимает выделеный параграф или параграф, в котором стоит курсор до тех пор пока параграф не ужмется на 1 строку, но не менее мин. значения трекинга.
//Если ужать не удалось - возвращается начальное значение трекинга
//Если параграф уже имеет минусовой трекинг - просто обнуляет трекинг; это можно оключить (resetTracking = false)
var resetTracking = true;
var minTracking = -20;//минимальный трекинг
var step = 2;//шаг ужимки

var mySelect = app.selection[0];
switch (mySelect.constructor){
case InsertionPoint:
setTracking( mySelect.insertionPoints[0].paragraphs[0] );
break;
case Paragraph:
setTracking( mySelect );
break;
case Text:
for( i = 0; i < mySelect.paragraphs.length; i++ )
setTracking( mySelect.paragraphs );
break;
default:
alert("Необходимо выделить параграф");
exit();
}
function setTracking( paragraph ){
if(resetTracking && paragraph.tracking <0){
paragraph.tracking = 0;
exit();
}
var lastUndoIndex = app.activeDocument.undoHistory.length;//длинна массива отмен на момент запуска скрипта
var thisParaLines = paragraph.lines.length;//запоминаем исходное кол-во строк
var thisParaTracking = paragraph.tracking;//запоминаем исходный трекинг
var thisTracking = 0;
while(paragraph.tracking >-20){
paragraph.tracking = (thisTracking -= step);//уменьшаем трекинг
if(paragraph.lines.length<thisParaLines)//если кол-во линий стало меньше - заканчиваем и выходим
return;
}
if( lastUndoIndex < app.activeDocument.undoHistory.length )
for(var i = app.activeDocument.undoHistory.length; i > lastUndoIndex; i--)
app.activeDocument.undo();
//paragraph.tracking = thisParaTracking;//восстанавливаем исходный трекинг если ужать не удалось
}



//=================================================
/*
var win = new Window('dialog');
win.sText = win.add('statictext', undefined, 'ТРЕКИНГ ОБНУЛЕН');
win.center();
win.show();
$.sleep(100);
win.close();
*/
 
В движке форума (в шапке окна ввода) есть тег code. Весь код, который вы хотите процитировать, надо заключать в него, там таже язык выбрать можно (в данном случае javascript) В противном случае код может рассыпаться и важные места будут потеряны, что мы и видим на вашем примере.
 
  • Спасибо
Реакции: Lana_
А можно ли в этот скрипт к трекингу добавить еще ужатие букв по горизонтали (Horizontal Scale) до определнного минимального значения и разрешить переносы слов? А потом также отменить, если не удалось ужать?
JavaScript:
// v.1.00
//Ужимает выделеный параграф или параграф, в котором стоит курсор до тех пор пока параграф не ужмется на 1 строку, но не менее мин. значения горизонтального скейлинга.
//Если ужать не удалось - возвращается начальное значение скейлинга.
//Если параграф уже имеет скейлинг меньше 100% - просто обнуляет скейлинг; это можно оключить (resetScale = false)
var resetScale = true;
var minScale = 80;//минимальный горизонтальный скейлинг
var step = 1;//шаг ужимки

var mySelect = app.selection[0];
switch (mySelect.constructor){
    case InsertionPoint:
        setScaling( mySelect.insertionPoints[0].paragraphs[0] );
    break;
    case Paragraph:
        setScaling( mySelect );
    break;
    case Text:
    for( i = 0; i < mySelect.paragraphs.length; i++ )
        setScaling( mySelect.paragraphs[i] );
    break;
    default:
    alert("Необходимо выделить параграф");
    exit();
    }
function setScaling( paragraph ){
    if(resetScale && paragraph.horizontalScale <100){
        paragraph.horizontalScale = 100;
        paragraph.hyphenation = false;
        exit();
        }
    var lastUndoIndex = app.activeDocument.undoHistory.length;//длина массива отмен на момент запуска скрипта
    var thisParaLines = paragraph.lines.length;//запоминаем исходное кол-во строк
    var thisParaScaling = paragraph.horizontalScale;//запоминаем исходный скейлинг
    var thisScaling = 100;
    paragraph.hyphenation = true;
    while(paragraph.horizontalScale >minScale){
        paragraph.horizontalScale = (thisScaling -= step);//уменьшаем скейлинг
        if(paragraph.lines.length<thisParaLines)//если кол-во линий стало меньше - заканчиваем и выходим
            return;
        }
    if( lastUndoIndex < app.activeDocument.undoHistory.length )
        for(var i = app.activeDocument.undoHistory.length; i > lastUndoIndex; i--)
            app.activeDocument.undo();
    //paragraph.tracking = thisParaTracking;//восстанавливаем исходный скейлинг если ужать не удалось
    }
 
Последнее редактирование:
А можно ли в этот скрипт к трекингу добавить еще ужатие букв по горизонтали (Horizontal Scale)
Там же добавить надо было, а не заменить с прибавлением включения переносов.
Тогда требуется уточнение по алгоритму - в какой последовательности будет производиться изменение скейлинга, трекинга и в какой момент добавляются переносы.
 
  • Спасибо
Реакции: Lana_
Добрый день, спасибо всем откликнувимся!

Текст скрипта с тегом:


JavaScript:
// v.1.00
//Ужимает выделеный параграф или параграф, в котором стоит курсор до тех пор пока параграф не ужмется на 1 строку, но не менее мин. значения трекинга.
//Если ужать не удалось - возвращается начальное значение трекинга
//Если параграф уже имеет минусовой трекинг - просто обнуляет трекинг; это можно оключить (resetTracking = false)
var resetTracking = true;
var minTracking = -20;//минимальный трекинг
var step = 2;//шаг ужимки

var mySelect = app.selection[0];
switch (mySelect.constructor){
    case InsertionPoint:
        setTracking( mySelect.insertionPoints[0].paragraphs[0] );
    break;
    case Paragraph:
        setTracking( mySelect );
    break;
    case Text:
    for( i = 0; i < mySelect.paragraphs.length; i++ )
        setTracking( mySelect.paragraphs[i] );
    break;
    default:
    alert("Необходимо выделить параграф");
    exit();
    }
function setTracking( paragraph ){
    if(resetTracking && paragraph.tracking <0){
        paragraph.tracking = 0;
        exit();
        }
    var lastUndoIndex = app.activeDocument.undoHistory.length;//длинна массива отмен на момент запуска скрипта
    var thisParaLines = paragraph.lines.length;//запоминаем исходное кол-во строк
    var thisParaTracking = paragraph.tracking;//запоминаем исходный трекинг
    var thisTracking = 0;
    while(paragraph.tracking >-20){
        paragraph.tracking = (thisTracking -= step);//уменьшаем трекинг
        if(paragraph.lines.length<thisParaLines)//если кол-во линий стало меньше - заканчиваем и выходим
            return;
        }
    if( lastUndoIndex < app.activeDocument.undoHistory.length )
        for(var i = app.activeDocument.undoHistory.length; i > lastUndoIndex; i--)
            app.activeDocument.undo();
    //paragraph.tracking = thisParaTracking;//восстанавливаем исходный трекинг если ужать не удалось
    }



//=================================================
    /*
    var win = new Window('dialog');
    win.sText = win.add('statictext', undefined, 'ТРЕКИНГ ОБНУЛЕН');
    win.center();
    win.show();
    $.sleep(100);
    win.close();
    */
 

densen, спасибо!​

Да, вы правы, есть нюансы.
Тут еще очень важно то, что текст, к которому надо применить скрипт «Автоужимка» уже имеет определенное ужатие по ширине символов и трекингу. И это как бы «норма» к которой надо вернуться, если Автоужимкой не удалось уменьшить кол-во строк в абзаце. То есть не 100% ширина и 0 трекинг – а то, что было раньше.

(В абзаце уже заданы, например 95% высота букв, 92% ширина, минусовой трекинг + на некоторых частях текста еще сверху заданы символьные стили, задающие другое ужатие).

Изначально в тексте запрещены переносы.
Первое - нужно их разрешить и, если это привело к уменьшению строк в абзаце – на этом можно остановиться.
Если нет, далее надо ужимать ширину букв до 75%. С шагом 1%.
Если и это не помогло – ужимать трекинг до -40. С шагом 1.
(ну или можно самому менять эти значения в теле скрипта)

В случае, если не вышло – вернуть тексту те параметры, которые у него были до применения скрипта (изначальное ужатие). И переносы снова запретить.

Бало бы хорошо, чтобы можно было запустить скрипт, выделив сразу несколько абзацев. И чтобы скрипт поработал с каждым из них индивидуально – ну, может где-то достаточно ширины символов 90%, а где-то надо 80%. И в то же время, можно было и с одним абзацем работать, поставив в него курсор.
 
Последнее редактирование:
Бало бы хорошо, чтобы можно было запустить скрипт, выделив сразу несколько абзацев. И чтобы скрипт поработал с каждым из них индивидуально – ну, может где-то достаточно ширины символов 90%, а где-то надо 80%. И в то же время, можно было и с одним абзацем работать, поставив в него курсор.
Страшно представить, какой уродливой верстка будет.
 
  • Спасибо
Реакции: Emergency
Страшно представить, какой уродливой верстка будет.
Да, я понимаю, что может нарисовать воображение)
Такая специфика. Сейчас делается все то же самое, только вручную. Текст с большим количеством разнообразного оформления, и, в целом ужатие не бросается в глаза. Просто нужно попытаться ужать максимально, прежде чем удалять часть информации.
 
Последнее редактирование:
Densen, ваш скрипт идеален! 'cooll)'
Сначала чуть не разобралась - больше не нужно никаких условий! Он все делает, как надо!
Спасибо огромное! :)