[ID CC-CC2021] Перекрестные ссылки (cross-references) на основе стиля

aleksasha

Топикстартер
15 лет на форуме
Сообщения
316
Реакции
5
Может натыкались на похожую задачу, прошу помощи.
Есть текст определенного стиля вида "...смотрите раздел 2.5.3". Есть привязки текста (hyperlinkTextDestinations) с таким же названием - 2.5.3.
Как создать перекрестные ссылки (cross-references) на основе стиля, имея данную информацию?
 

Аскольдыч

Участник
Сообщения
1
Реакции
2
Добрый день!

Мне трудно объяснить это "на пальцах" не имея реального файла и исходя из вашего очень краткого описания. Здесь я выложил два тестовых файла "до" и "после" и сампл-скрипт. Запустите скрипт на Test-Before.indd и увидите как это работает. Это не готовый к использованию скрипт: здесь нет проверки условий необходимых для корректной работы (открыт ли файл, есть ли нужный формат перекрестной ссылки и т.д и т.п.). Моя цель продемонстрировать общий подход к решению данной задачи.
Предположим: в начале мы имеем такой вот документик.
118031


Перед разделами уже стоят анкера. А текст, который должен стать перекрестной ссылкой, помечен символьным стилем "Number". (голубым цветом)
В документе уже определен формат перекрестной ссылки — "смотрите раздел"
118032


Сначала скрипт находит этот стиль используя GREP-выражение: цифра(ы) + точка + цифра(ы) + точка + цифра(ы)
Его, разумеется можно, подправить под ваши конкретные нужды.
Затем, для каждого найденного номера проверяется существует ли анкер с таким же именем. Если да, то создается перекрестная ссылка.
Вот тот же документик после скрипта:
118033


JavaScript:
main();

function main() {
    try {
        var foundItem, foundItems, sourceText, sourceName, source, dest, hyperLink,
        doc = app.activeDocument,
        xRefFormat = doc.crossReferenceFormats.item("смотрите раздел");
        
        app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.NOTHING;
        app.findGrepPreferences.findWhat = "\\d+\.\\d+\.\\d+";
        app.findGrepPreferences.appliedCharacterStyle = doc.characterStyles.itemByName("Number");
        foundItems = doc.findGrep();
    
        for (var i = 0; i < foundItems.length; i++) {
            sourceText = foundItems[i];
            sourceName = sourceText.contents;
            source = doc.crossReferenceSources.add(sourceText, xRefFormat);
                
            dest = doc.hyperlinkTextDestinations.itemByName(sourceName);
            if (dest.isValid) {
                hyperLink = doc.hyperlinks.add(source, dest);
            }
    
        }   
    }
    catch(err) {
        $.writeln(err.message + ", line: " + err.line);
    }   
}

Как видите ничего сложного здесь нет.
 
Последнее редактирование:
  • Спасибо
Реакции: RIKITIKI и aleksasha