Ярлыки

25 июн. 2014 г.

Создание алфавитного указателя на основе Character Style & GREP

Данный Script как и большинство других возник во время завершения одной книги. Где в последний момент остро встал вопрос необходимости алфавитного указателя. 

На входе имелась уже готовая книга в которой некоторые слова были выделены Character Style. На основании этих слов необходимо было создать алфавитный указатель. Но так как стандартные средства не для нас тогда приступим.

var myDocument = app.activeDocument;
//list name character style
listStrings = myDocument.characterStyles.everyItem().name;

var myArray = [];

//create dealog window
myDlg = new Window('dialog', "Сontent Of CharacterStyle beta 0.2",
    undefined, {
        closeButton: false
    });
//add drop-down
myDlg.DDgroup = myDlg.add('group');
myDlg.DDgroup.orientation = 'row';
myDlg.DDgroup.add('statictext', undefined, "Сharacter Style");
myDlg.DDgroup.DD = myDlg.DDgroup.add('dropdownlist', [0, 0, 240, 20],
    undefined, {
        items: listStrings
    })
myDlg.DDgroup.DD.selection = 0;
myDlg.closeBtn = myDlg.add("button", undefined, "OK");
// add button functions
myDlg.closeBtn.onClick = function () {
    this.parent.close();
    myDlgSelection = myDlg.DDgroup.DD.selection
    return myDlgSelection
}

myDlg.show();

//Clear Grep
ClearSearchGrep()

//Preferences Grep
app.findGrepPreferences.appliedCharacterStyle =
    myDlgSelection.toString();
app.findGrepPreferences.findWhat = ".+";
var myGrep = myDocument.findGrep();
myCount = myGrep.length;

for (i = 0; i < myCount; i++) {
    myWord = myGrep[i].contents;
    //Page number
    myPageNumber = myGrep[i].parentTextFrames[0].parentPage.name;
    //Add to array word + Page number
    myArray.push(myWord + "\t" + myPageNumber + "\r");
}

//Sort array
myArray.sort(function (a, b) {
    return a.toLowerCase() > b.toLowerCase()
});

//create a new document and add to it our array      
var myDocument = app.documents.add();
var myPage = myDocument.pages.item(0);
var myTextFrame = myPage.textFrames.add();

myTextFrame.geometricBounds = ["36pt", "36pt", "809pt", "563pt"];
myTextFrame.contents = "Contents" + "\r" + myArray;

ClearSearchGrep()
app.findGrepPreferences.findWhat = "\\r[=,=]";
app.changeGrepPreferences.changeTo = "\\r";
myDocument.changeGrep();

ClearSearchGrep()
app.findGrepPreferences.findWhat = "(?<=^(\\l))(.+\\r)(?!^\\1)(\\l)";
app.changeGrepPreferences.changeTo = "$2\\r$3\\r\\r$3";
myDocument.changeGrep();

alert("This is a test version. Check the same words!")

//Clear preferences Grep
function ClearSearchGrep() {
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
}

Данный скрипт был набросан в течении 30 минут. Он незаконченный в нем еще многое можно довести до совершенства))). Самый большой его недостаток он не удаляет дубликаты слов если они повторяются в тексте. Но на тот момент он отлично справился с возложенной на него задачей.

3 комментария:

  1. А для стиля абзаца такое же как будет?

    ОтветитьУдалить
  2. Точно так только заменить CharacterStyle на стиль параграфа. Вот только зачем?

    ОтветитьУдалить
  3. Video Gaming Videos | YouTube
    youtube.com. YouTube. YouTube. VideosLiquor. Casino. Video Gaming. Video Gaming. Video Gaming. Video Gaming. Video Gaming. Videosliquor. Casino. Video Gaming. Video youtube mp4 Gaming.

    ОтветитьУдалить