20090929

Indesign автоматическая подгонка текста внутри фрейма

Не знаю, как у других, но у меня при верстке «вольных» изделий иногда требуется запихнуть/растянуть текст в выбранную область. То есть имеется площадь, которую надо забить текстом, при этом размер шрифта практически не играет значения.
Для этих целей и создавался скрипт CompactTXT


/** Скрипт для размещения текстов внутри выбранных фреймов.
 Автоматически растягивает/уменьшает размер шрифта в фрейме
 (c) Eugeny Borisov a.k.a. kstati
 2008.
 */

var myApp = app;

var myDoc = myApp.activeDocument;
var myObj = myDoc.selection[0];

var myTexts;
var myText;
var MixTextPointSize = 1;

var MaxTextPointSize = 200;
var InitPointSize = 9;

var selCount = myDoc.selection.length;
var currSelect = myDoc.selection;

var objects2Work=Array();
 
while (selCount--) CalcObjectForHandle(currSelect[selCount]);

/** Добавляю уникальные объекты в массив  */
function AddToArrayUnique(obj,Iarray) {
 var i = Iarray.length; 
 while (i--) if (Iarray[i] == obj) return;

 Iarray.push(obj);
}


/** objects2Work -- массив объектов с которыми нужно работать */

function CalcObjectForHandle(inputObject) {

 switch (String(inputObject)) {

   // HandleTextFrame(inputObject);
  //  ('handled');

    break;
   case "[object Story]" :
     AddToArrayUnique(inputObject, objects2Work);

    break;
   case "[object TextFrame]":
   case "[object Text]":
   case "[object TextColumn]":

   case '[object InsertionPoint]':
   case '[object Character]':  
     AddToArrayUnique(inputObject.parentStory,objects2Work);

     break;
   case '[object Group]':
     var i = inputObject.allPageItems.length;

      while (i--)  CalcObjectForHandle(inputObject.allPageItems[i]);

     break;

   case '[object Rectangle]':
   case '[object GraphicLine]':
    break;

   default: alert ("Выделенный объект неподдерживается Type : "+ String(inputObject));
 }

}


var WorkLen = objects2Work.length;
// alert(WorkLen);
while (WorkLen--) HandleStory(objects2Work[WorkLen]);



/** Функция, изменяющая размер текста, на указанную единицу (в процентах), пока не поменяется статус overflow 
 если процент отрицательный - то ждем overflow==false, если положительный - true, 
//  Использует значения MinTextPoinSize и MaxTextPointSize.
  При выходе за их рамки функция генерирует исключения 'StoryOverflowControl_MinTextPoinSize' и 'StoryOverflowControl_MaxTextPointSize'
  При percent = 0 генерирует исключение 'StoryOverflowControl_zeroPercent';
*/
function StoryOverflowControl(inpStory, percent) {

  percent = percent/100;
if ( percent == 0) throw ('StoryOverflowControl_zeroPercent');

  var waitForOverflow = (percent > 0)  ? true: false;

  if (inpStory.overflows == waitForOverflow) return true;

  var newPointSize = inpStory.pointSize*percent;
  newPointSize = Math.round(newPointSize*20)/20;

  while (1) {
  inpStory.pointSize = newPointSize;

  if (inpStory.overflows == waitForOverflow) return true;

    var newPointSize = inpStory.pointSize*percent;
     newPointSize = Math.round(newPointSize*20)/20;

     
  if (inpStory.pointSize < MixTextPointSize) throw ('StoryOverflowControl_MinTextPoinSize');

  if (inpStory.pointSize > MaxTextPointSize) throw ('StoryOverflowControl_MaxTextPointSize');

 }

}

function HandleStory (inputSory) {

   inputSory.clearOverrides();
   inputSory.autoLeading = 130; /** Процент автолеадинга */

   inputSory.leading = Leading.auto;
   inputSory.pointSize = InitPointSize;

   inputSory.pointSize = InitPointSize;
   StoryOverflowControl(inputSory,+100);

   StoryOverflowControl(inputSory,-50);
   StoryOverflowControl(inputSory,+25);

   StoryOverflowControl(inputSory,-10);
   StoryOverflowControl(inputSory,+5);

   StoryOverflowControl(inputSory,-2.5);
   StoryOverflowControl(inputSory,+1);   
   StoryOverflowControl(inputSory,-0.5); 

}

Комментариев нет: