//FindProblemCharInIndex.jsx
// © Михаил Иванюшин, 2017 | m.ivanyushin@gmail.com | adobeindesign.ru
programTitul = "Поиск проблемных символов в индексном указателе";
var aboutScript = "При подготовке индексного указателя в записях могут быть ошибки. К сожалению, сообщение о наличии ошибки крайне невнятно:\n[ Не удалось создать указатель.\nОдна или несколько записей указателя содержат недопустимые символы.\nУдалите недопустимые символы из записей указателя. ]\n\nКакие конкретно записи? Какие в них недопустимые символы?\nТакой информации нет. Проблемы клиентов Adobe не волнуют.\nИ ты остаёшься в полном неведении, что, где и как в этой вёрстке искать.\nВ этот момент мои слова «Вёрстка должна быть в кайф» звучат, наверное, издевательски.\n\nЧтобы не чувствовать себя беспомощным в этой ситуации, и получать удовольствие от работы с текстом, придуман этот скрипт.\nОн просматривает все записи индексного указателя и проверяет по очереди каждый символ:\n= это скобка\n= это строчная/прописная английская/русская буква\n= это дефис, точка, пробел\nЕсли символ прошел проверку, программа перейдет к проверке следующего.\nЕсли нет, будут запомнены полная строка указателя, и часть её до первого знака, не прошедшего проверку.\nПосле просмотра всех строк индексного указателя будет выведена информация по всем проблемным строкам.\n\nСимволы, которые считаются допустимыми в строке указателя, собраны в 48-й строке этой программы.\nЭто редактируемый текст, и можно добавить туда буквы с умляутами, аксантами, минус, плюс, тире, двоеточие и другие знаки.\n\nЧтобы скрипт после запуска начал работу, курсор должен быть в тексте. Если выделить текст, в котором есть знак вопроса, будет выведена эта справка о программе.\n\nВопросы, предложения, идеи? Пишите: m.ivanyushin@gmail.com\n";
var ProgressBar = function(title) { // ProgressBar
var w = new Window('palette', title, {x:0, y:0, width:700, height:52},{closeButton: false}),
pb = w.add('progressbar', {x:20, y:12, width:660, height:12});
w.center();
this.reset = function(maxValue) {
pb.value = 0;
pb.maxvalue = maxValue;
pb.visible = maxValue;
w.show();
w.update();
}
this.hit = function() {pb.value += 1; w.update();}
this.close = function() {w.close();}
} // ProgressBar
var mySel = app.selection[0];
if (mySel == undefined || (mySel.constructor.name != "InsertionPoint" && (mySel.hasOwnProperty("pointSize") && mySel.contents.match(/\?/) == "?"))) { // == "?"
alert(aboutScript,programTitul);
exit();
} // == "?"
if (mySel == undefined || mySel.constructor.name != "InsertionPoint") {
alert("Курсор должен быть в тексте.\nДля получения справки о программе выделите текст, где есть знак вопроса и запустите скрипт.",programTitul);
exit();
}
var myStory = mySel.parentStory;
if (!myStory.parent.indexes[0].isValid) {
alert("В этом документе нет индексного указателя.",programTitul);
exit();
}
var myTopics = myStory.parent.indexes[0].topics;
var tL = myTopics.length;
var rightChars = [];
var wholeLine = [];
var shortLine = [];
var pBar = new ProgressBar(programTitul);
pBar.reset(tL);
for (i = 0; i < tL; i++, pBar.hit()) { // i++
var tmpName = myTopics[i].name;
var nameLength = tmpName.length;
while (rightChars.length > 0) rightChars.shift();
for (n = 0; n < nameLength; n++) { // n++
var nameChar = tmpName[n];
if (nameChar.match(/[\(\)\[\]-a-zA-Zа-яА-Я0123456789. ]/) != null) { // != null
rightChars.push(nameChar);
continue;
} // != null
else { // == null
var lineChars = rightChars.join("");
wholeLine.push(tmpName);
shortLine.push(lineChars);
break;
} // == null
} // n++
} // i++
pBar.close();
if (wholeLine.length == 0) alert("В индексном указателе проблемные символы не найдены.",programTitul);
else {
var mess = "";
for (r = 0; r < wholeLine.length; r++) mess += "Полная запись в указателе: " + wholeLine[r] +"\nЧасть этой записи, прошедшая проверку: " + shortLine[r] + "\n-----------\n";
alert(mess,programTitul);
}
exit();