Aufgrund einer Anfrage im Scripting-Forum (
CS3 IndexFromList.jsx with a twist ) hier eine kleine Erweiterung des IndexFromList-Skripts.
Das Skript verarbeitet nun auch einen(!) Untereintrag.
Die Indexliste könnte etwa so aufgebaut sein:
Code Meilenstein Stein | Steinwall Stein | Steinbeißer Beim ersten Begriff werden alle Vorkommen von 'Meilenstein' im Dokument gesucht. Im Index wird ein Eintrag 'Meilenstein' erzeugt mit Referenzen zu den Vorkommen von 'Meilenstein' im Dokument.
Bei den nächsten beiden Einträgen ('Stein | Steinwall' und 'Stein | Steinbeißer') wird ein Hauptstichwort 'Stein' angelegt. Darunter wird ein Unterstichwort 'Steinwall' mit Referenzen zu den Vorkommen von 'Steinwall' und ein Unterstichwort 'Steinbeißer' mit Referenzen zu den Vorkommen von 'Steinbeißer' angelegt.
Die erwartete Strukur ist also folgende:
Code Hauptstichwort Hauptstichwort | Unterstichwort Also entweder ein Hauptstichwort allein oder ein Hauptstichwort, kombiniert mit einem Unterstichwort. Als Trennzeichen dient ' | ' (also senkrechter Strich mit Leerzeichen davor und danach!).
Code // IndexFromList_withOneSubtopic_CS3.jsx //DESCRIPTION: Erzeugt Indexeinträge anhand einer externen Konkordanzdatei, die über einen Dialog ausgewählt wird. var myDoc = app.activeDocument; var myList = File.openDialog ("Liste mit Indexbegriffen"); if (!myList) exit(); clearFindChangeSettings(); app.findChangeTextOptions.wholeWord = true; app.findChangeTextOptions.caseSensitive = true; app.findChangeTextOptions.includeFootnotes = true; var myEntries = getWords(myList); proceedWithList(myEntries); alert("Erledigt!"); // Konkordanzliste einlesen function getWords (aFile) { if (aFile.exists) { aFile.open ('r', undefined, undefined); var aText = aFile.read()+'\n'; // löschen von Leerzeichen am Ende der Zeile + löschen von leeren Zeilen aText = aText.replace(/ +\n/g, '\n').replace(/\n+/g, '\n'); // ersetzen von mehrfach aufeinander folgende Leerzeichen aller Art durch ein Leerzeichen aText = aText.replace(/ {2,}/g, ' '); var words = aText.split('\n'); var myPairs = getPairs( words ); aFile.close(); return myPairs; } else { exit(); } } function getPairs( w ) { var thePairs = new Array; for (i = 0; i < w.length; i++ ) thePairs.push( w[i].split(' | ') ); return thePairs; } // Begriffsliste abarbeiten function proceedWithList (w) { // bei Bedarf wird ein neuer Index erzeugt if (myDoc.indexes.length == 0) myDoc.indexes.add(); for (var i = 0; i < w.length; i++) if (w[i] != "") makeEntry(w[i]); // Aktualisieurng des Index myDoc.indexes[0].update(); } // Indexeintrag erzeugen function makeEntry(oneEntry) { if ( oneEntry.length == 1 ) app.findTextPreferences.findWhat = oneEntry[0]; else app.findTextPreferences.findWhat = oneEntry[1]; var myResult = myDoc.findText(); for (var i = myResult.length-1; i >=0; i--) { // Fehler abfangen, z.B. Fußnoten ausnehmen try { // Hinzufügen des Themas myDoc.indexes[0].topics.add(oneEntry[0]); // Hinzufügen der Referenz if ( oneEntry.length == 1 ) myDoc.indexes[0].topics.item(myResult[i].contents).pageReferences.add(myResult[i], PageReferenceType.currentPage); else { //myDoc.indexes[0].topics.add( oneEntry[0]); myDoc.indexes[0].topics.item( oneEntry[0] ).topics.add( oneEntry[1]); myDoc.indexes[0].topics.item( oneEntry[0] ).topics.item( myResult[i].contents ).pageReferences.add(myResult[i], PageReferenceType.currentPage); } } catch(e) {} } } //Clear any existing find/change settings. function clearFindChangeSettings() { app.findTextPreferences = NothingEnum.nothing; app.changeTextPreferences = NothingEnum.nothing; } Das Skript verarbeitet so zwei Indexstufen.
Bei Gelegenheit könnte es noch auf eine tiefere Untergliederung ausgebaut werden.
Tipp:
Mit der obigen Version könnten nun auch mehrere unterschiedliche Register verwaltet werden: Namenregister, Sachregister. Verwende 'Namen' und 'Sachen' als ersten Eintrag und die eigentlichen Indexeinträge als weiterer Eintrag:
Code Namen | Kafka Namen | Peirce Namen | Beck Sachen | Geldbörse Sachen | Augentropfen