Я сделал скрипт, который проходит через все отслеживаемые изменения:
var allChanges =app.activeDocument.stories.everyItem().changes.everyItem().getElements();
var nChanges = allChanges.length;
for (var i = nChanges-1; i >= 0; i--) {
if (allChanges[i].changeType == ChangeTypes.INSERTED_TEXT) {
/*Do stuff to inserted text*/
} else if(allChanges[i].changeType == ChangeTypes.DELETED_TEXT) {
/*Do stuff to deleted text*/
}
/*What I need help with would go here*/
}
Теперь я хочу сделать оглавление статей, содержащих модификации. Для этого мне нужно будет изменить стиль абзаца первого предшествующего заголовка (отмеченного стилем абзаца «Заголовок») на «Заголовок с изменениями».
Я новичок в мире сценариев для indesign, но у меня есть хорошие основы javascript.
Я думаю, что способ сделать это будет состоять в том, чтобы перейти в цикл while, выбрав текущий абзац (содержащий модификацию) и проверить, применен ли к нему стиль «Заголовок», и если да, вместо этого примените стиль «Заголовок с изменениями» и завершите цикл . В противном случае, если к текущему абзацу применен стиль «Заголовок с изменениями», завершите цикл while. В противном случае переместите один абзац назад и проверьте то же условие до тех пор, пока.
Я просто не знаю, как написать сам скрипт и возможно ли это вообще.
Спасибо за помощь!
Мне нужна была функция для выбора предыдущего абзаца следующим образом:
function getPreviousPara(text){
return text.parent.characters.item(text.paragraphs[0].index-1).paragraphs[0];
}
Затем мне нужно пройтись по циклу и найти предыдущий абзац, прежде чем манипулировать изменением, поскольку я должен принять изменения, которые вносятся allChanges[i] == null
после их принятия.
Затем мне нужно сохранить историю, содержащую активное изменение, как var changeStory = allChanges[i].parent;
. Затем я манипулировал изменениями, применяя соответствующий стиль символов и принимая добавленный текст и отказываясь от удаленного текста. Затем я просматриваю var everyStyleRange = changeStory.textStyleRanges;
диапазон, содержащий стиль символов, примененный к любой модификации, или измененный стиль заголовка. Когда найдено, получите var currentPara = everyStyleRange[i].paragraphs[0];
и проверьте имя стиля абзаца. если он совпадает Title
, примените Title modif
. Если он совпадает, Title modif
то завершаем цикл, в противном случае — currentPara = getPreviousPara(currentPara);
и цикл.
Обновление: я добавил комментарии, чтобы было понятно, как работает скрипт.
/*Function to select the previous paragraph*/
function getPreviousPara(text){
var nextPara = text.parent.characters.item(text.paragraphs[0].index-1).paragraphs[0];
return nextPara
}
/*Global variables declaration*/
var myDoc = app.activeDocument;
var allChanges =myDoc.stories.everyItem().changes.everyItem().getElements();
var nChanges = allChanges.length;
/*Loop through all changes*/
for (var i = 0; i <= nChanges-1; i++) {
/*Get story containing change*/
var changeStory = allChanges[i].parent;
/*Apply character style to Added text and Deleted text*/
if (allChanges[i].changeType == ChangeTypes.INSERTED_TEXT) {
var cName = "Added";
var mCstyle = app.activeDocument.characterStyles.item(cName);
allChanges[i].characters.everyItem().applyCharacterStyle(mCstyle);
allChanges[i].accept();
} else if(allChanges[i].changeType == ChangeTypes.DELETED_TEXT) {
var cName = "Deleted";
var mCstyle = app.activeDocument.characterStyles.item(cName);
var changeParent = allChanges[i].parent;
allChanges[i].characters.everyItem().applyCharacterStyle(mCstyle);
allChanges[i].reject();
}
/*Get the textStyleRanges of the story*/
var everyStyleRange = changeStory.textStyleRanges;
nItems = everyStyleRange.length;
/*1st while loop variables declaration*/
var found = 0;
var i = 0;
/*Loop through all textStyleRanges*/
while(found==0 && i<=nItems-1){
/*Look for a style range that has the Deleted or Added character style or the Title modif style*/
if (everyStyleRange[i].appliedCharacterStyle.name == "Deleted" || everyStyleRange[i].appliedCharacterStyle.name == "Added" || everyStyleRange[i].appliedCharacterStyle.name == "Title modif"){
/*When found, kill the loop*/
found = 1;
/*2nd while loop variables declaration*/
var currentPara = everyStyleRange[i].paragraphs[0];
var corrected = 0;
var maxLoopLimit = 0;
/*Loop through all paragraphs of the story going backward from the found style range*/
while(corrected==0 && maxLoopLimit < changeStory.paragraphs.length){
maxLoopLimit++;
/*Get the paragraph style name*/
var currentParaStyleName= currentPara.appliedParagraphStyle.name;
/*Look for the Title paragraph style applied*/
if(currentParaStyleName == "Title"){
/*Title found, apply new paragraph style and kill 2nd while loop*/
currentPara.appliedParagraphStyle = currentParaStyleName+" modif";
corrected++;
}
else if(currentParaStyleName == "Title modif"){
/*Title already changed, kill 2nd while loop*/
corrected++;
}
else{
/*Get previous paragraph and start loop again, acts as counter*/
currentPara = getPreviousPara(currentPara);
}
/*2nd while loop end*/
}
/*if end*/
}
/*If no modification were found in the story, alert the user that an error occured*/
if(i>=nItems){alert("No changes character style was found so no Title change occured")}
/*increment 1st loop counter*/
i++;
/*1st loop end*/
}
}
Тяжелый материал для начинающего программиста, много исследований и тестов!