Заметки

В InDesign GREP не работает на мастер-страницах. Исправляем двойные пробелы другим способом

2025-01-15·5 мин чтения
<indesign/><grep/><типографика/>

Двойные пробелы — мелочь, которая бросается в глаза. Особенно в печати: там, где текст крупный, лишний пробел виден сразу. А в навигации, где я работаю, текст часто крупный.

Проблема

У меня был документ с 40 страницами. Текст на мастер-страницах — заголовки, подписи, повторяющиеся элементы. Часть текста пришла от заказчика с двойными пробелами: где-то при копировании, где-то при импорте из Word.

Стандартный подход: GREP-поиск, замена {2,} пробелов на один. Работает на обычных страницах. Но на мастер-страницах — ноль замен. Ни changeGrep(), ни findGrep(), ни на уровне story, ни на уровне textFrame. Просто молчит.

Почему так

GREP-движок InDesign не обрабатывает контент мастер-страниц через скрипты. Это не баг — это ограничение API. doc.stories включает истории мастер-страниц, но вызов changeGrep() на них возвращает пустой результат. Без ошибки, без предупреждения — просто 0.

Решение

Пришлось искать другой путь. Вместо GREP — JavaScript regex через tf.contents:

  1. Читаем текст фрейма
  2. Находим позиции двойных пробелов через match()
  3. Заменяем только нужные символы через textRange.contents

Ключевой момент: нельзя просто сделать tf.contents = newText — это сотрёт форматирование всего фрейма. Жирный, курсив, разные шрифты — всё исчезнет. Вместо этого нужно работать с конкретным диапазоном символов через characters.itemByRange().

var content = tf.contents;
var match = content.match(/ {2,}/);
if (match) {
    var start = match.index;
    var length = match[0].length;
    var range = tf.texts[0].characters.itemByRange(start, start + length - 1);
    range.contents = " ";
}

Результат

Скрипт DoubleSpaces обрабатывает весь документ: обычные страницы и мастер-страницы. Форматирование сохраняется. Всё в одной операции Undo — если что-то не так, Ctrl+Z откатывает.

Скрипт бесплатный. Если у вас такая же задача — попробуйте.