Guest User

Untitled

a guest
Jun 23rd, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Устанавливаем версию скриптинга - 4я, на момент cs2
  2. app.properties.scriptPreferences.version = 4;
  3.  
  4. var paragraphStyleNames = new Array();
  5. var masterLabels = new Array("Left", "Right");
  6. var delimiter = new Array("—", "–", ":", "::", ">");
  7. var check = false;
  8.  
  9. with(app) // with означает, что мы все действия будем осуществлять по умолчанию с обхектом app, т.е. вместо app.selection можно писать просто selection
  10. {
  11.     if((selection.length!=1) || // ЕСЛИ "длинна" (количество элементов в массиве) выделения не равно 1 (выделено 0 или больше 1 объекта) ИЛИ
  12.         (selection.length==1 && // выделен один объект И (НО)
  13.             selection[0].constructor.name!="TextFrame")) // его конструктор (объект-создатель) - не текстовое поле
  14.     {
  15.         alert("Ничего не выделено или выделено более одного объекта, или выделенный объект не является текстовым фреймом!"); // посылаем пользователя
  16.         exit(); // завершаем скрипт
  17.     }
  18.     for(i=0; i<app.activeDocument.paragraphStyles.length; i++) // пробегаем циклом по всем стилям документа
  19.         paragraphStyleNames[i] = app.activeDocument.paragraphStyles[i].name; // добавляем их в массив paragraphStyleNamess
  20.  
  21.     var dialog = dialogs.add(); // добавляем диалог
  22.     with (dialog.dialogColumns.add()) // т.н. "столбец" в диалоге - добавляем
  23.     {
  24.         with (dialogRows.add().borderPanels.add().dialogColumns.add()) // в столбец добавляем строку, "обёртку" (панель) и в строку добавляем новый столбец
  25.         {
  26.             with (dialogRows.add()) // в тот столбец добавляем строку
  27.             {
  28.                staticTexts.add({staticLabel: "Искать стиль:"}); // добавляем текст-подсказку
  29.                var dialog_paragraphStyle = dropdowns.add({stringList:paragraphStyleNames}); // выползающий список со стилями (стили раньше циклом читали, значение будем хранить в dialog_paragraphStyle)
  30.                dropdowns[0].selectedIndex = Math.ceil(dropdowns[0].stringList.length/2); // делаем выделенным средний в списке стиль (length/2), ceil - округляет
  31.             }
  32.             with (dialogRows.add()) // добавляем вторую строку
  33.             {
  34.                 staticTexts.add({staticLabel: "Разделитель:"}); // добавляем текст-подсказку
  35.                 var dialog_delimiter = dropdowns.add({stringList:delimiter, selectedIndex: 0}); // добавляем список с разделителями (значение будет храниться в переменной dialog_delimiter)
  36.             }
  37.         }
  38.     } // конец блока создания диалога
  39.  
  40.     if(dialog.show()) // показываем диалог пользователю - и ЕСЛИ он нажал Ok
  41.     {
  42.         var c = ""; // в c будем писать полученный заголовочек
  43.         var prev = ""; // переменная prev будет помнить "предыдущее" значение заголовка
  44.         var sel = app.activeDocument.selection[0]; // для упрощения, вынесем текущий выделенный объект в переменную sel
  45.    
  46.         findPreferences = null; // обнуляем настройки поиска
  47.         changePreferences = null; // и замены
  48.         findPreferences.appliedParagraphStyle = app.activeDocument.paragraphStyles[dialog_paragraphStyle.selectedIndex]; // настраиваем поиск на поиск стиля параграфа с выбранным в диалоге
  49.        
  50.         do // начинаем бесконечный цикл с т.н. "пост-условием" - условие цикла будет известно только после первого выполнения тела цикла
  51.         {
  52.             var page = sel.parent; // страница у нас - родитель выделения - устанавливаем её в переменную page
  53.             var s = sel.search(); // ищем нужный параграф, значение помещаем в s
  54.            
  55.             if(s.length == 0) // ЕСЛИ ничего не нашли (длинна массива результатов = 0)
  56.             {
  57.                 if(prev != "") // если в предыдущий раз что-то находили, (оно хранится в prev)
  58.                 {
  59.                     с = "Ст. " + prev; // то результатом будет предыдущее значение
  60.                 }
  61.             }
  62.            
  63.             else // ИНАЧЕ - чото нашли
  64.             {
  65.                 if(prev.length > 0) // и при этом находили ранее
  66.                 {
  67.                     // проверка на принадлежность параграфа к началу страницы - если в начале страницы текст БЕЗ стиля - значит БУДЕМ писать prev
  68.                     if(page.textFrames[0].paragraphs[0].appliedParagraphStyle.index == 0)
  69.                     {
  70.                         с = "Ст. " + prev + " " + delimiter[dialog_delimiter.selectedIndex] + " " + s[s.length-1].contents.replace(/(^\d+).*/, "$1"); // результатом будет предыдущее + разделитель + последний найденный
  71.                     }
  72.                     else if(s.length >1) // иначе проверяем, если нашли больше 1 параграфа - пишем первый и последний
  73.                     {
  74.                         с = "Ст. " + s[0].contents.replace(/(^\d+).*/, "$1") + " " + delimiter[dialog_delimiter.selectedIndex] + " " + s[s.length-1].contents.replace(/(^\d+).*/, "$1");
  75.                     }
  76.                     else // иначе - нашли только один параграф - его и пишем
  77.                     {
  78.                         с = "Ст. " + s[s.length-1].contents.replace(/(^\d+).*/, "$1");
  79.                     }
  80.                     prev = s[s.length-1].contents.replace(/(^\d+).*/, "$1"); // обновляем значение "предыдущего" на последний найденный
  81.                     // и ещё наверно надо будет проверять последний найденный на пустоту (мб там человек случайно enter нажал -
  82.                     // обратным циклом идти до ближайшего непустого
  83.                 } // закончился блок обработки, "если находили ранее"
  84.                
  85.                 else // иначе - не находили ранее ничего
  86.                 {
  87.                     if(s.length > 1) // если нашли больше 1 параграфа
  88.                         с = "Ст. " + s[0].contents.replace(/(^\d+).*/, "$1") + " " + delimiter[dialog_delimiter.selectedIndex] + " " + s[s.length-1].contents.replace(/(^\d+).*/, "$1"); // пишем первый и последний найденные параграфы
  89.                     else // нашли только один параграф
  90.                         с = "Ст. " + s[0].contents.replace(/(^\d+).*/, "$1"); // пишем найденный параграф
  91.                     prev = s[s.length-1].contents.replace(/(^\d+).*/, "$1"); // устанавливаем значение "предыдущего" на последний найденный
  92.                 }
  93.             } // закончился блок, если чото нашли
  94.  
  95.             if(c != undefined)
  96.             {
  97.                 var colonTitle = page.textFrames.item(masterLabels[page.documentOffset%2]);
  98.                 // э.. это лучше на пальцах показать %2 - остаток от деления на 2
  99.                 // получается, что мы в colonTitle пишем текстовое поле, имеющее метку, выбранную по значению, получаемому от делению на 2 текущего положения страницы,
  100.                 // и взятому из массива masterLabels (там у нас "Left" и "Right")
  101.                
  102.                 // если колонтитул пустой (такого фрейма ещё нет) И на мастере существует соответствующее метке поле
  103.                 if (colonTitle==null && (page.appliedMaster.textFrames.item(masterLabels[page.documentOffset%2])!=null))
  104.                 {
  105.                     try
  106.                     {
  107.                         colonTitle = page.appliedMaster.textFrames.item(masterLabels[page.documentOffset%2]).override(page);  // перезаписываем это поле на страницу
  108.                     }
  109.                     catch(err) { /* какая-то хрень с оверрайдом фрейма, ну и хрень с ним */ }
  110.                 }
  111.                 try // try...catch используем, чтобы не ругалось в случае ошибок
  112.                 {
  113.                     colonTitle.contents = с; // записываем в это поле полученное в с значение
  114.                 }
  115.                 catch(err) { /* alert("Какая-то хрень на странице " + page.name + " с переменной c"); */ }
  116.             }        
  117.         }
  118.         while(sel = sel.nextTextFrame); // и так до тех пор, пока есть чо проверять
  119.         alert("Скрипт завершил работу на стр. " + page.name);
  120.     } // if(dialog.show())
  121. } // with(app)
Add Comment
Please, Sign In to add comment