Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Устанавливаем версию скриптинга - 4я, на момент cs2
- app.properties.scriptPreferences.version = 4;
- var paragraphStyleNames = new Array();
- var masterLabels = new Array("Left", "Right");
- var delimiter = new Array("—", "–", ":", "::", ">");
- var check = false;
- with(app) // with означает, что мы все действия будем осуществлять по умолчанию с обхектом app, т.е. вместо app.selection можно писать просто selection
- {
- if((selection.length!=1) || // ЕСЛИ "длинна" (количество элементов в массиве) выделения не равно 1 (выделено 0 или больше 1 объекта) ИЛИ
- (selection.length==1 && // выделен один объект И (НО)
- selection[0].constructor.name!="TextFrame")) // его конструктор (объект-создатель) - не текстовое поле
- {
- alert("Ничего не выделено или выделено более одного объекта, или выделенный объект не является текстовым фреймом!"); // посылаем пользователя
- exit(); // завершаем скрипт
- }
- for(i=0; i<app.activeDocument.paragraphStyles.length; i++) // пробегаем циклом по всем стилям документа
- paragraphStyleNames[i] = app.activeDocument.paragraphStyles[i].name; // добавляем их в массив paragraphStyleNamess
- var dialog = dialogs.add(); // добавляем диалог
- with (dialog.dialogColumns.add()) // т.н. "столбец" в диалоге - добавляем
- {
- with (dialogRows.add().borderPanels.add().dialogColumns.add()) // в столбец добавляем строку, "обёртку" (панель) и в строку добавляем новый столбец
- {
- with (dialogRows.add()) // в тот столбец добавляем строку
- {
- staticTexts.add({staticLabel: "Искать стиль:"}); // добавляем текст-подсказку
- var dialog_paragraphStyle = dropdowns.add({stringList:paragraphStyleNames}); // выползающий список со стилями (стили раньше циклом читали, значение будем хранить в dialog_paragraphStyle)
- dropdowns[0].selectedIndex = Math.ceil(dropdowns[0].stringList.length/2); // делаем выделенным средний в списке стиль (length/2), ceil - округляет
- }
- with (dialogRows.add()) // добавляем вторую строку
- {
- staticTexts.add({staticLabel: "Разделитель:"}); // добавляем текст-подсказку
- var dialog_delimiter = dropdowns.add({stringList:delimiter, selectedIndex: 0}); // добавляем список с разделителями (значение будет храниться в переменной dialog_delimiter)
- }
- }
- } // конец блока создания диалога
- if(dialog.show()) // показываем диалог пользователю - и ЕСЛИ он нажал Ok
- {
- var c = ""; // в c будем писать полученный заголовочек
- var prev = ""; // переменная prev будет помнить "предыдущее" значение заголовка
- var sel = app.activeDocument.selection[0]; // для упрощения, вынесем текущий выделенный объект в переменную sel
- findPreferences = null; // обнуляем настройки поиска
- changePreferences = null; // и замены
- findPreferences.appliedParagraphStyle = app.activeDocument.paragraphStyles[dialog_paragraphStyle.selectedIndex]; // настраиваем поиск на поиск стиля параграфа с выбранным в диалоге
- do // начинаем бесконечный цикл с т.н. "пост-условием" - условие цикла будет известно только после первого выполнения тела цикла
- {
- var page = sel.parent; // страница у нас - родитель выделения - устанавливаем её в переменную page
- var s = sel.search(); // ищем нужный параграф, значение помещаем в s
- if(s.length == 0) // ЕСЛИ ничего не нашли (длинна массива результатов = 0)
- {
- if(prev != "") // если в предыдущий раз что-то находили, (оно хранится в prev)
- {
- с = "Ст. " + prev; // то результатом будет предыдущее значение
- }
- }
- else // ИНАЧЕ - чото нашли
- {
- if(prev.length > 0) // и при этом находили ранее
- {
- // проверка на принадлежность параграфа к началу страницы - если в начале страницы текст БЕЗ стиля - значит БУДЕМ писать prev
- if(page.textFrames[0].paragraphs[0].appliedParagraphStyle.index == 0)
- {
- с = "Ст. " + prev + " " + delimiter[dialog_delimiter.selectedIndex] + " " + s[s.length-1].contents.replace(/(^\d+).*/, "$1"); // результатом будет предыдущее + разделитель + последний найденный
- }
- else if(s.length >1) // иначе проверяем, если нашли больше 1 параграфа - пишем первый и последний
- {
- с = "Ст. " + s[0].contents.replace(/(^\d+).*/, "$1") + " " + delimiter[dialog_delimiter.selectedIndex] + " " + s[s.length-1].contents.replace(/(^\d+).*/, "$1");
- }
- else // иначе - нашли только один параграф - его и пишем
- {
- с = "Ст. " + s[s.length-1].contents.replace(/(^\d+).*/, "$1");
- }
- prev = s[s.length-1].contents.replace(/(^\d+).*/, "$1"); // обновляем значение "предыдущего" на последний найденный
- // и ещё наверно надо будет проверять последний найденный на пустоту (мб там человек случайно enter нажал -
- // обратным циклом идти до ближайшего непустого
- } // закончился блок обработки, "если находили ранее"
- else // иначе - не находили ранее ничего
- {
- if(s.length > 1) // если нашли больше 1 параграфа
- с = "Ст. " + s[0].contents.replace(/(^\d+).*/, "$1") + " " + delimiter[dialog_delimiter.selectedIndex] + " " + s[s.length-1].contents.replace(/(^\d+).*/, "$1"); // пишем первый и последний найденные параграфы
- else // нашли только один параграф
- с = "Ст. " + s[0].contents.replace(/(^\d+).*/, "$1"); // пишем найденный параграф
- prev = s[s.length-1].contents.replace(/(^\d+).*/, "$1"); // устанавливаем значение "предыдущего" на последний найденный
- }
- } // закончился блок, если чото нашли
- if(c != undefined)
- {
- var colonTitle = page.textFrames.item(masterLabels[page.documentOffset%2]);
- // э.. это лучше на пальцах показать %2 - остаток от деления на 2
- // получается, что мы в colonTitle пишем текстовое поле, имеющее метку, выбранную по значению, получаемому от делению на 2 текущего положения страницы,
- // и взятому из массива masterLabels (там у нас "Left" и "Right")
- // если колонтитул пустой (такого фрейма ещё нет) И на мастере существует соответствующее метке поле
- if (colonTitle==null && (page.appliedMaster.textFrames.item(masterLabels[page.documentOffset%2])!=null))
- {
- try
- {
- colonTitle = page.appliedMaster.textFrames.item(masterLabels[page.documentOffset%2]).override(page); // перезаписываем это поле на страницу
- }
- catch(err) { /* какая-то хрень с оверрайдом фрейма, ну и хрень с ним */ }
- }
- try // try...catch используем, чтобы не ругалось в случае ошибок
- {
- colonTitle.contents = с; // записываем в это поле полученное в с значение
- }
- catch(err) { /* alert("Какая-то хрень на странице " + page.name + " с переменной c"); */ }
- }
- }
- while(sel = sel.nextTextFrame); // и так до тех пор, пока есть чо проверять
- alert("Скрипт завершил работу на стр. " + page.name);
- } // if(dialog.show())
- } // with(app)
Add Comment
Please, Sign In to add comment