Преобразование умных (фигурных) кавычек в простые (прямые) кавычки в InDesign с помощью JavaScript

Я пытаюсь написать скрипт для автоматического преобразования всех фигурных двойных кавычек ( “”) в текстовом поле в прямые двойные кавычки ( "). Вот все, что я пробовал до сих пор, и ни один из них, похоже, не работает:

  1. imgtext.contents = imgtext.contents.replace(/[\u201C\u201D]/g, '"');

  2. imgtext.contents = imgtext.contents.replace(/[\u201C\u201D]/g, "\u0022");

  3. imgtext.contents = imgtext.contents.replace(/[\u201C\u201D]/g, '\^"');

  4. imgtext.contents = imgtext.contents.replace(/[\u201C\u201D]/g, '^\"');

  5. imgtext.contents = imgtext.contents.replace(/[\u201C\u201D]/g, '\^\"');

Параметр «Найти/Заменить» в меню «Правка» работает отлично, и это именно та функциональность, которую я пытаюсь воспроизвести с помощью своего сценария. Вот как выглядит мой диалог «Найти/Заменить»:

введите описание изображения здесь

Что мне здесь не хватает?

Ответы (1)

Проблема в том, что в настройках InDesign вы включили «Использовать цитаты типографа». Каждый раз, когда вы записываете обычный текст в текстовый фрейм, ID проверяет, является ли он простым single 'или double "; и если это так, он немедленно меняет его на правильный фигурный эквивалент. Вы можете увидеть это, если вы запустите свой сценарий в текстовом поле, содержащем как одинарные, так и двойные кавычки; это не только оставит ваши существующие двойные кавычки без изменений, но, кроме того, все прямые двойные и одинарные кавычки волшебным образом свернутся!

Вы можете исправить это для своего текущего скрипта, изменив глобальную настройку этого предпочтения на false, изменив текст, а затем сбросив его до исходного значения (как в «Будьте добры к своим пользователям»):

oldPref = app.activeDocument.textPreferences.typographersQuotes;
app.activeDocument.textPreferences.typographersQuotes = false;
imgtext = app.selection[0];
imgtext.contents = imgtext.contents.replace(/[\u201C\u201D]/g, '"');
app.activeDocument.textPreferences.typographersQuotes = oldPref;

Однако при тестировании я обнаружил, что изменилось и множество других мелочей. Это связано с тем, что изменение текстового содержимого фрейма таким образом удаляет весь текст, а затем вставляет его снова. Это означает, что любое «локальное» форматирование исчезнет, ​​и весь текст в поле получит форматирование самого первого символа.

Лучший способ — не взаимодействовать с обычным текстом через Javascript, а изменить текст в вашем фрейме с помощью собственного InDesign changeText, который делает то же самое, что и в интерфейсе при использовании диалогового окна «Найти/Заменить».

В Javascript это будет:

imgtext = app.selection[0];
app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.findWhat = '"';
app.changeTextPreferences.changeTo = '^"';
imgtext.changeText();

но, к моему большому удивлению, я «вижу» изменения, которые вносятся одно за другим! Так что это может быть своего рода «взлом» программистов Adobe. Если вы отключите типографские кавычки и просто замените "их на ", вы не увидите этих странных артефактов перерисовки:

oldPref = app.activeDocument.textPreferences.typographersQuotes;
app.activeDocument.textPreferences.typographersQuotes = false;
imgtext = app.selection[0];
app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.findWhat = '"';
app.changeTextPreferences.changeTo = '"';
imgtext.changeText();
app.activeDocument.textPreferences.typographersQuotes = oldPref;

Обратите внимание, что, кроме Javascript replace, вам не нужно указывать ничего особенного, чтобы поймать все виды фигурных кавычек. При получении текста с "где угодно InDesign автоматически найдет как его, так и все его фигурные варианты.

(На случай, если вам понадобится какое-то время: чтобы найти только прямые ", вы действительно должны добавить к нему префикс a ^в диалоговом окне «Найти». Чтобы найти только фигурные “”, вам нужно скопировать их в диалоговое окно «Найти» или использовать сочетания клавиш ^{и ^}.)