В InDesign GREP не работает на мастер-страницах. Исправляем двойные пробелы другим способом
Двойные пробелы — мелочь, которая бросается в глаза. Особенно в печати: там, где текст крупный, лишний пробел виден сразу. А в навигации, где я работаю, текст часто крупный.
Проблема
У меня был документ с 40 страницами. Текст на мастер-страницах — заголовки, подписи, повторяющиеся элементы. Часть текста пришла от заказчика с двойными пробелами: где-то при копировании, где-то при импорте из Word.
Стандартный подход: GREP-поиск, замена {2,} пробелов на один. Работает на обычных страницах. Но на мастер-страницах — ноль замен. Ни changeGrep(), ни findGrep(), ни на уровне story, ни на уровне textFrame. Просто молчит.
Почему так
GREP-движок InDesign не обрабатывает контент мастер-страниц через скрипты. Это не баг — это ограничение API. doc.stories включает истории мастер-страниц, но вызов changeGrep() на них возвращает пустой результат. Без ошибки, без предупреждения — просто 0.
Решение
Пришлось искать другой путь. Вместо GREP — JavaScript regex через tf.contents:
- Читаем текст фрейма
- Находим позиции двойных пробелов через
match() - Заменяем только нужные символы через
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 откатывает.
Скрипт бесплатный. Если у вас такая же задача — попробуйте.