В скрипте получить абзац, предшествующий текущему выделению

Я сделал скрипт, который проходит через все отслеживаемые изменения:

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. В противном случае переместите один абзац назад и проверьте то же условие до тех пор, пока.

Я просто не знаю, как написать сам скрипт и возможно ли это вообще.

Спасибо за помощь!

Ответы (1)

Мне нужна была функция для выбора предыдущего абзаца следующим образом:

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*/
    }
}

Тяжелый материал для начинающего программиста, много исследований и тестов!