본문 바로가기

오피스/기타

인디자인에서 GREP으로 색인 생성하는 스크립트

인디자인에서 정규표현식으로 텍스트를 찾아 색인을 생성하는 스크립트입니다. 판례색인 등을 만들 때 사용할 수 있습니다.

GrepToIndex.jsx
0.00MB

① 첨부된 jsx파일을 사용자 스크립트 폴더에 넣습니다.

※ 사용자 스크립트 폴더는 패널의 메뉴 버튼 을 누르거나 사용자를 우클릭한 후 탐색기에 나타내기(파인더에 나타내기)를 선택하면 열 수 있습니다. 인디자인 2022 기준으로 경로는 "C:\Users\(사용자 이름)\AppData\Roaming\Adobe\InDesign\Version 17.0-J\ko_KR\Scripts\Scripts Panel"(Windows), "/Users/(사용자 이름)/Library/Preferences/Adobe InDesign/Version 17.0-J/ko_KR/Scripts/Scripts Panel"(Mac) 등입니다.

[B] 사용자를 우클릭하여 폴더를 엽니다.

② GrepToIndex를 더블클릭하여 스크립트를 실행하면 다음과 같은 대화상자가 열립니다.

[C] 대화상자 구성

  • 색인할 텍스트 GREP에는 찾을 텍스트의 GREP을 입력합니다.
  • 각주 포함을 선택하면 각주를 포함하여 텍스트를 찾습니다.
  • ③ 기존의 사항색인을 삭제하고 새로 판례색인을 넣는 경우와 같이 기존 색인을 삭제하여야 할 때 기존 색인 삭제를 선택합니다.

③ 색인할 텍스트의 GREP을 입력하고 확인을 누르면 GREP에 맞는 텍스트가 색인으로 추가됩니다.

[D] 옵션을 선택하고 색인할 텍스트의 GREP를 입력합니다.
[E] GREP에 맞는 색인이 생성되었습니다.

색인이 정상적으로 생성되면 색인한 횟수를 출력합니다. GREP에 맞는 텍스트가 없으면 색인이 생성되지 않았다는 메시지를 출력합니다.

[F] "색인이 생성되지 않았습니다"는 메시지가 나오면 GREP을 다시 확인합니다.

※ 스크립트 내용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// GrepToIndex.jsx
// An InDesign JavaScript
 
main();
 
function main() {
 
    var myAnswer = myDialogBox();
    if (!myAnswer || !myAnswer[0]) {
        return;
    }
 
    var myIndexCount = IndexGrep(myAnswer);
    if (myIndexCount) {
        alert("총 " + myIndexCount + "건의 색인이 생성되었습니다.");
    }
    else {
        alert("색인이 생성되지 않았습니다.");
    }
 
};
 
function myDialogBox() {
    var doc = app.activeDocument;
    var myEntryWidth = 300;
 
    var myDialog = app.dialogs.add({ name: "Grep to Index" });
 
    with (myDialog.dialogColumns.add()) {
        with (dialogRows.add()) {
            with (dialogColumns.add()) {
                staticTexts.add({ staticLabel: "색인할 텍스트 GREP:" });
            }
            with (dialogColumns.add()) {
                var myGrepToFindField = textEditboxes.add({ minWidth: myEntryWidth });
                var myIncludesFootnoteCheckbox = checkboxControls.add({ staticLabel: "각주 포함", checkedState: true });
                var myResetsIndexCheckbox = checkboxControls.add({ staticLabel: "기존 색인 삭제", checkedState: false });
            }
        }
    }
 
    var myResult = myDialog.show();
    if (myResult) {
        var myAnswer = [myGrepToFindField.editContents,
                        myIncludesFootnoteCheckbox.checkedState,
                        myResetsIndexCheckbox.checkedState];
        myDialog.destroy();
        return myAnswer;
    }
    else {
        myDialog.destroy();
        return null;
    }
 
};
 
function IndexGrep(myAnswer) {
 
    var doc = app.activeDocument;
    var myIndexCount = 0;
 
    var myGrepToFind = myAnswer[0];
    var myIncludesFootnote = myAnswer[1];
    var myResetsIndex = myAnswer[2];
 
    app.findGrepPreferences = null;
    app.findChangeGrepOptions.properties = {
        // includeLockedLayersForFind: false,
        // includeLockedStoriesForFind: false,
        // includeHiddenLayers: true,
        // includeMasterPages: false,
        includeFootnotes: myIncludesFootnote
    };
 
    if (doc.indexes.length == 0) {
        doc.indexes.add();
    }
    if (myResetsIndex) {
        doc.indexes[0].topics.everyItem().remove();
    }
    
    app.findGrepPreferences.findWhat = myGrepToFind;
 
    var found = doc.findGrep();
    for (var i=0; i < found.length; i++) {
        var myTopic = doc.indexes[0].topics.add(found[i].contents);
        myTopic.pageReferences.add(found[i], PageReferenceType.CURRENT_PAGE);
        myIndexCount++;
    }
 
    return myIndexCount;
    
}

 

최초 게시: 2022. 6. 16.