[ID CS4-CS6] Список выделений

  • Автор темы Автор темы ewaeee
  • Дата начала Дата начала

ewaeee

Топикстартер
15 лет на форуме
Сообщения
20
Реакции
0
Добрый день.
Есть документ, в котором несколько статей (разные текстовые фреймы, как связанные, так и не связанные). Среди текстов есть выделения определенным стилем символа. Помогите собрать в каком-нибудь отдельном текстовом фрейме все эти выделения (через любой разделитель или каждое новое - на новой строке).
В идеале, если бы стандартный инструмент Оглавления мог использовать не стили абзацев, а стили символов, то это было бы то, что нужно (да еще с номерами страниц сразу)!

(Собственно, если бы стандартный инструмент Index мог автоматом определять элементы указателя по выделению определенным символьным стилем, тоже все было бы замечательно.)
 
Код:
#target indesign

var _char_style_ = '#Bold' //char style name here

function clearTextFindChangePreferences () {
    app.findTextPreferences = NothingEnum.NOTHING;
    app.changeTextPreferences = NothingEnum.NOTHING;
}

function main () {

    if (app.documents.length == 0) {
        return false;
    }

    var doc = app.activeDocument;
    var style = doc.characterStyles.itemByName(_char_style_);
    if (!style.isValid) {
        return false;
    }

    clearTextFindChangePreferences();
    app.findTextPreferences.appliedCharacterStyle = style;
    var texts = doc.findText(true);
    clearTextFindChangePreferences();

    var objects = [];
    for (var i = 0; i < texts.length; i++) {
        if (texts[i].parentTextFrames.length > 0) {
            objects.push({
                text: texts[i],
                page: texts[i].parentTextFrames[0].parentPage,
            });
        };
    }

    objects.sort( function (a, b) {
        if (a.page.documentOffset != b.page.documentOffset) {
            return a.page.documentOffset - b.page.documentOffset
        } else {
            return a.text.contents.toString() - b.text.contents.toString();
        }
    } );

    
    var contents = '';
    for (var i = 0; i < objects.length; i++) {
        contents += (objects[i].text.contents.toString() + '\u0008' + objects[i].page.name + '\u000D');
    }

    var page = doc.pages[doc.pages.length - 1];
    var tf = page.textFrames.add(undefined, undefined, undefined, {geometricBounds: page.bounds, contents: contents});
    tf.select();

    return true;

}

main();
 
  • Спасибо
Реакции: LeonidB
Волшебно! Спасибо!
А если можно чуть-чуть понаглеть - нельзя ли к каждому элементу через любой разделитель еще указать номер страницы, на которой он встречается?
 
Я тормоз. Вижу страницы! Спасибо!
 
Намек видел ))
Однако есть вопрос. Все термины выносятся в отдельный фрейм НЕ ПО ПОРЯДКУ.
Прикладываю скриншот одной страницы. В желтом окне результат работы скрипта (вынесены все подчеркнутые слова). Аналогичный результат на всех страницах.
 

Вложения

  • 2_.jpg
    2_.jpg
    251.5 КБ · Просм.: 813
Не так просто предугадать, что такое "ПО ПОРЯДКУ" в связанных и несвязанных фреймах. "Порядок" зависит от массы причин.
Вот этот вариант сортирует тексты по порядку следования в статье, а статьи по порядку добавления в документ.
Код:
#target indesign

var _char_style_ = '#Bold' //char style name here

function clearTextFindChangePreferences () {
    app.findTextPreferences = NothingEnum.NOTHING;
    app.changeTextPreferences = NothingEnum.NOTHING;
}

function main () {

    if (app.documents.length == 0) {
        return false;
    }

    var doc = app.activeDocument;
    var style = doc.characterStyles.itemByName(_char_style_);
    if (!style.isValid) {
        return false;
    }

    clearTextFindChangePreferences();
    app.findTextPreferences.appliedCharacterStyle = style;
    var texts = doc.findText(true);
    clearTextFindChangePreferences();

    var objects = [];
    for (var i = 0; i < texts.length; i++) {
        if (texts[i].parentTextFrames.length > 0) {
            objects.push({
                text: texts[i],
                page: texts[i].parentTextFrames[0].parentPage,
            });
        };
    }

    objects.sort( function (a, b) {
        if (a.text.parentStory == b.text.parentStory) {
            return a.text.index - b.text.index;
        } else {
            return a.text.parentStory.id - b.text.parentStory.id;
        }
    } );

    
    var contents = '';
    for (var i = 0; i < objects.length; i++) {
        contents += (objects[i].text.contents.toString() + '\u0008' + objects[i].page.name + '\u000D');
    }

    var page = doc.pages[doc.pages.length - 1];
    var tf = page.textFrames.add(undefined, undefined, undefined, {geometricBounds: page.bounds, contents: contents});
    tf.select();

    return true;

}

main();
 
  • Спасибо
Реакции: LeonidB