Загрузка GREP-запросов с отсутствующими в документе стилями app.loadFindChangeQuery

Статус
Закрыто для дальнейших ответов.

andrew.folio

Участник
Топикстартер
Сообщения
28
Реакции
40
Есть такая проблема.
Если вы попытаетесь вручную загрузить GREP-запрос, который опирается на какие-либо стили, которых нет в документе, то Индизайн предупредит вас о конфликте. Однако, если загрузку такого GREP-запроса выполнить из скрипта, то никаких предупреждений не последует. И если его выполнить, то это может закончится большими неприятностями, например потерей текста.

Функция app.loadFindChangeQuery(GREPname, SearchModes.GREP_SEARCH) не возвращает никакого значения по-поводу успешности загрузки GREP-запроса.

Я-то нашел выход путем предварительного анализа соответствующего XML, но это получилось довольно громоздко. И я не уверен, что предусмотрел все неприятные ситуации.

Может, у кого-то есть идеи как сделать это красиво?
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Загрузка GREP-запросов с отсутствующими в документе стилями app.loadFindChangeQuery

По моим расчётам потеря текста произойдёт в том и только том случае, если в параметрах замены будет пусто. Это и вправду самый критичный момент, связанный с несоответствием ГРЕП-запроса текущему макету. Все остальные моменты будут связаны только с неназначением тексту каких-либо параметров, что тоже нехорошо, но пережить можно.
Таким образом, в первую очередь требуется решить задачу: выяснить, не остались ли абсолютно пустыми параметры замены после загрузки запроса.
У меня получилось тоже не слишком элегантно, но без обращения к XML:
Код:
var sel = app.activeDocument.selection[0].parentStory;

app.findGrepPreferences = app.changeGrepPreferences=null;
//далее записываем, как "выглядят" пустые параметры замены
var noPrefs = getprop(app.changeGrepPreferences.properties);

app.loadFindChangeQuery("tmp",SearchModes.GREP_SEARCH);

//Если в замене не пусто - выполняем
if (getprop(app.changeGrepPreferences.properties)!=noPrefs){
	sel.changeGrep();
	}
else{alert("В параметрах замены пусто\n"+getprop(app.changeGrepPreferences.properties));}

function getprop(curprops){
	var res = "";
	for(i in curprops){
		try{
			if (String(curprops[i]).match("\\[")){
				res += i+":\""+curprops[i].name+"\"\n";
				}else{res += i+":\""+curprops[i]+"\"\n";}
			}catch(e){}
		}
	return res;
	}
 

andrew.folio

Участник
Топикстартер
Сообщения
28
Реакции
40
Ответ: Загрузка GREP-запросов с отсутствующими в документе стилями app.loadFindChangeQuery

Проверка весьма опасная. Например ГРИП состоит в том, чтобы заменить весь символьный стиль style1 на style2. В строке поиска: .+ в строке замены пусто.
Но стиля style1 в документе предположим не оказалось. В результате эта проверка пропустила такую замену и весь текст принял стиль style2. Что делать? (если ctrl-Z не нажимать).
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Загрузка GREP-запросов с отсутствующими в документе стилями app.loadFindChangeQuery

Ну именно в этом примере я бы вообще выкинул из запроса строку поиска (она тут ничего не решает), и тогда по нашему сценарию стиль1 отсутствует, параметры поиска остаются пустыми, и при попытке замены скрипт вылетает с ошибкой, что легко обходится через try{}catch(){}.
Если же говорить в целом о проблеме, то, например, и в скрипте findChangeQueryList, судя по его описанию (РЕЖИМ 'С ПРОСМОТРОМ', Быстрая отмена, и главное — "Запросы, содержащие форматирование, отсутствующее в обрабатываемой публикации, будут выполняться без учета этого форматирования."), это не решено.
 
Статус
Закрыто для дальнейших ответов.