[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Skript zum Index generieren

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Skript zum Index generieren

Martin Eckert
Beiträge gesamt: 102

2. Mär 2007, 11:51
Beitrag # 1 von 117
Bewertung:
(606024 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, scheinbar gibt es ein Skript zur Erzeugung eines Index mit Hilfe einer Textdatei. Kann mir da jemand einen Tipp geben wo ich das finde? Hintergrund: Ich habe ein Textdokument in dem ich Wörter habe, und muß diese nun innerhalb eines Buchs den passenden Seiten zuweisen und anschließend ein Register zu erstellen. Würde mir viel manuelles Gebastel ersparen.

(Dieser Beitrag wurde von Martin Eckert am 2. Mär 2007, 12:05 geändert)
X

Skript zum Index generieren

Martin Fischer
  
Beiträge gesamt: 12783

2. Mär 2007, 12:15
Beitrag # 2 von 117
Beitrag ID: #279438
Bewertung:
(605903 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

eine Übersicht über im Forum publizierte und diskutierte Skripte findest Du über den Link oben im Kasten (http://www.hilfdirselbst.org/indesign.php)

Das Skript "IndexFromList.js" findest Du hier:
IndexFromList.js

Könntest Du nach Deinen Versuchen mit dem Skript eine Rückmeldung geben, ob es das leistet, was Du erwartet hast?

Es ist im Zusammenhang mit einem Bug in JavaScript für InDesign mit Problemen bei Einträgen in Fußnoten zu rechnen. Außerdem bin ich mir nicht sicher, ob Text in Tabellen berücksichtigt wird.


als Antwort auf: [#279429]
(Dieser Beitrag wurde von Martin Fischer am 2. Mär 2007, 14:29 geändert)

Skript zum Index generieren

Martin Eckert
Beiträge gesamt: 102

2. Mär 2007, 14:24
Beitrag # 3 von 117
Beitrag ID: #279506
Bewertung:
(605880 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,
danke für die schnelle Hilfe. Kann das sein, daß das unter CS2 nicht läuft? Gibt es da eine passende Variante? Der von Dir angegebene Link tut nicht und das im Forum scheint CS1 zu sein.


als Antwort auf: [#279438]

Skript zum Index generieren

Martin Fischer
  
Beiträge gesamt: 12783

2. Mär 2007, 14:51
Beitrag # 4 von 117
Beitrag ID: #279523
Bewertung:
(605873 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Martin,

sorry, bei der Eingabe des Links ist mir ein Fehler passiert (ist jetzt korrigiert).

Habe das Skript auf die Schnelle überprüft.
Es läuft nicht auf CS2.

Das Skript ist mir ohnehin etwas seltsam gestrickt, deswegen hatte ich beim Verweis darauf auch etwas Unbehagen.

Es gibt ein tolles Skript von Peter Kahrel zur Indizierung von Begriffen, die mit einem bestimmten Zeichenformat ausgezeichnet sind.

Dieses Skript wollte ich mir immer schon mal als Grundlage nehmen für ein überarbeitetes Skript zur Herstellung der Indizierung über eine Konkordanzdatei. Im Prinzip bräuchte es dazu nur eine andere Methode, die Quelle zu bestimmen (nicht über das Zeichenformat, sondern über die Begriffe selbst, die über eine externe Datei eingelesen werden).

Bislang hatte sich mir der konkrete Bedarf nicht so dringend gestellt, daß ich mir dafür eine Stunde geopfert hätte. Und jetzt finde ich keine Stunde, in der ich das nachholen könnte.


als Antwort auf: [#279506]
(Dieser Beitrag wurde von Martin Fischer am 2. Mär 2007, 22:50 geändert)

Skript zum Index generieren

zaphodbeeblebroxx
Beiträge gesamt: 408

2. Mär 2007, 22:59
Beitrag # 5 von 117
Beitrag ID: #279612
Bewertung:
(605841 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 
Hallo Martin + Martin,

habe mich vor längerer Zeit auch mal mit dem Skript IndexFromList.js befasst. Aber bei mir lief es auch nicht.

Habe mir dann selbst eine Lösung gebastelt (Auf Basis von Peter Kahrels Ausführungen), die ich aber momentan in meinem "Skripte-Chaos" nicht auffinden kann.

Ausgangsbasis war eine Textdatei mit den zu suchenden Index-Einträgen/Begriffen (nur eine Index-Ebene). Zeilen jeweils mit einer Zeilenschaltung abgeschlossen.

Habe die komplette Textdatei in ein InDesign Textrahmen kopiert. (Damals wusste ich noch nicht so richtig, wie man per JS eine txt-Datei öffnen/auslesen kann).

Vor dem Starten des Skripts mußte dieser Rahmen mit den zu suchenden Begriffen aktiviert werden.

mit dem split()-Befehl wurden die Absätze (= Suchbegriffe) in ein Array eingelesen.

Dann wurde der aktivierte Textrahmen gelöscht (sonst wird der mitindexiert).

Dann eine Schleife durch die Array-Elemente und mittels myDoc.search() das geöffnete Dokument durchsucht.

Bei Übereinstimmungen einen Index-Eintrag mit dem Array-Element und der PageReference erzeugen (habe ich bei Peter "abgeschaut").

Am Ende der Schleife den Index updaten.

Fertig!

Fussnoten gab es bei mir nicht, deshalb weiß ich nicht, ob es auch mit Fussnoten funktioniert.

Bei der search()-Methode habe ich mit den Optionen caseSensitiv = true und wholeWord = true gearbeitet.

Das setzt natürlich dann bei der gelieferten Index-Liste voraus, dass es sich um komplette Suchbegriff und nicht um Teilbegriffe handelt.

D.h. wenn in der gelieferten Liste das Wort "Schlange" steht wird nur nach diesem Wort gesucht und nicht nach der Mehrzahl "Schlangen" oder einem Begriff wie z.B. "Schlagenlinie".

zaphodbeeblebroxx


als Antwort auf: [#279523]

Skript zum Index generieren

Martin Fischer
  
Beiträge gesamt: 12783

5. Mär 2007, 08:48
Beitrag # 6 von 117
Beitrag ID: #279797
Bewertung:
(605746 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Mit folgendem Skript lassen sich Indexeinträge basierend auf einer Konkordanzliste (Liste mit aufzunehmenden Begriffen) erzeugen. Ein Dialog fordert zur Auswahl der Textdatei mit der Begriffsliste auf. Die Begriffe müssen durch Zeilenschaltung voneinander getrennt sein (je Begriff eine neue Zeile).

Code
// IndexFromList.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();

var myWords = getWords(myList);
proceedWithList(myWords);
alert("Habe fertig!");


// 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 und von RETURNs durch RETURNs
aText = aText.replace(/\s+/g, '\n');

var words = aText.split('\n');
aFile.close();
return words;
}
else {
exit();
}
}

// Begriffsliste abarbeiten
function proceedWithList (w) {
// bei Bedarf wird ein neuer Index erzeugt
if (myDoc.indexes.length == 0)
myDoc.indexes.add();

app.findPreferences = app.changePreferences = null;

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(oneWord) {
var myResult = myDoc.search(oneWord, true, true, undefined);
for (var oneEntry = myResult.length-1; oneEntry >=0; oneEntry--) {
// Fehler abfangen, z.B. Fußnoten ausnehmen
try {
// Hinzufügen des Themas
myDoc.indexes[0].topics.add(oneWord);
// Hinzufügen der Referenz
myDoc.indexes[0].topics.item(myResult[oneEntry].contents).pageReferences.add(myResult[oneEntry], PageReferenceType.currentPage);
}
catch(e) {}
}
}


Das Skript basiert auf Peter Kahrels IndexFromCharacterStyle_shortVersion.js (Dank für die Vorlage).

Aktuell ist es so eingestellt, daß es Groß-/Kleinschreibung unterscheidet ("fischen" ungleich "Fischen") und daß es nach ganzen Worten sucht ("Fisch" findet "Fisch", aber nicht "Fischer").
Diese Einschränkung könnte bei Bedarf später per Dialog mit Optionen geöffnet werden.

Ferner ignoriert diese Version Fundstellen in Fußnoten.
Um letztere zu berücksichtigen, müßten die Fußnoten z.B. über das Skript notes2text.jsx von Peter Kahrel zunächst in Endnoten umgewandelt und nach der Erzeugung der Indexeinträge mit demselben Skript wieder in Fußnoten zurückkonvertiert werden.

edit (16.11.2007):
Eine aktualisierte Fassung (für InDesign CS2) findet sich in Indexhilfe erwünscht.


als Antwort auf: [#279612]
(Dieser Beitrag wurde von Martin Fischer am 16. Nov 2007, 23:51 geändert)

Skript zum Index generieren

zaphodbeeblebroxx
Beiträge gesamt: 408

5. Mär 2007, 09:27
Beitrag # 7 von 117
Beitrag ID: #279802
Bewertung:
(605741 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

bei Dir gibt es anscheinend kein Wochenende!?

Wie ich sehe, hast Du bereits Deine Endfassung ins Forum gestellt.

Habe mir mal (kurz – wieder mal kaum Zeit während der Produktion) den Code angesehen. Das sieht m.E. sehr gut aus.

Beim Einlesen der Konkordanzliste könnte man evtl. noch auf doppelte Leerzeichen prüfen und durch einzelne ersetzen ...

Code
		aText = aText.replace(/\s+/g, ' '); 



zaphodbeeblebroxx


als Antwort auf: [#279797]

Skript zum Index generieren

Martin Fischer
  
Beiträge gesamt: 12783

5. Mär 2007, 09:33
Beitrag # 8 von 117
Beitrag ID: #279804
Bewertung:
(605739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Matthias,

> Beim Einlesen der Konkordanzliste könnte man evtl. noch auf doppelte Leerzeichen
> prüfen und durch einzelne ersetzen ...

Schaden tut's gewiß nicht.
Auf diese Fehlerquelle bin ich spontan nicht gekommen, auch wenn ich mich den überflüssigen Leerzeichen am Ende einer Zeile und überflüssigen Zeilen gewidmet habe.

Was könnte in der Konkordanzliste sonst noch alles falsch notiert werden?
Wer nicht ordentlich arbeitet, den betraft eben das Skript mit Nichtbeachtung fehlerhafter Einträge.


als Antwort auf: [#279802]

Skript zum Index generieren

zaphodbeeblebroxx
Beiträge gesamt: 408

5. Mär 2007, 09:59
Beitrag # 9 von 117
Beitrag ID: #279808
Bewertung:
(605728 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

alle Fehler wird man in der Tat nicht abfangen können ...

Die Wortliste sollte schon ordentlich angeliefert/vorbereitet werden.
Hatte ja auch bereits auf die möglichen Probleme mit verschiedenen Wortendungen aus dem jeweiligen textlichen Zusammenhang und der Groß-/Kleinschreibung hingewiesen.

Das entfernen der Leerzeilen halte ich aber für sehr sinnvoll. Sonst gibt es unnötige Index-Einträge.

zaphodbeeblebroxx


als Antwort auf: [#279804]

Skript zum Index generieren

Martin Fischer
  
Beiträge gesamt: 12783

5. Mär 2007, 19:42
Beitrag # 10 von 117
Beitrag ID: #279958
Bewertung:
(605688 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Matthias,

> Beim Einlesen der Konkordanzliste könnte man evtl. noch auf doppelte Leerzeichen
> prüfen und durch einzelne ersetzen ...

Das habe ich gerade ausprobiert.
Funktioniert - aber zu weit.
Die RETURNs gehören zu den white space characters.
Deswegen werden die auch durch Leerzeichen ersetzt.
Das ist solange kein Problem, solange einer nicht zwei oder mehr aufeinanderfolgende Wörter (kommt das vor?) in das Register aufnehmen will. Dann kann man den white space einfach durch RETURN ersetzen:
Code
aText = aText.replace(/\s+/g, '\n'); 


Oder man ersetzt vorher die RETURNs temporär durch eine besondere Kombination, die man hinterher wieder in RETURNs auflöst.


als Antwort auf: [#279802]

Skript zum Index generieren

zaphodbeeblebroxx
Beiträge gesamt: 408

6. Mär 2007, 09:44
Beitrag # 11 von 117
Beitrag ID: #280029
Bewertung:
(605654 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Martin,

anstatt den "white space characters" könnte man auch nur die "normalen" mehrfachen Leerzeichen ersetzen (+ mehrfach Returns durch einzelne). Ich hatte auch schon den Fall, das mehrere aufeinanderfolgende Wörter indexiert werden mussten.

Code
aText = aText.replace(/ +/g, ' ');  
aText = aText.replace(/\n+/g, '\n');


zaphodbeeblebroxx


als Antwort auf: [#279958]

Skript zum Index generieren

Peter Kahrel
Beiträge gesamt: 182

6. Mär 2007, 11:23
Beitrag # 12 von 117
Beitrag ID: #280050
Bewertung:
(605637 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
aText = aText.replace(/\n+/g, '\n');

ersetzt auch einzelne \n, also folgendes wäre es besser:

aText = aText.replace(/\n\n+/g, '\n');

oder

aText = aText.replace(/\n{2,}/g, '\n');

Peter


als Antwort auf: [#280029]
(Dieser Beitrag wurde von Peter Kahrel am 6. Mär 2007, 11:24 geändert)

Skript zum Index generieren

zaphodbeeblebroxx
Beiträge gesamt: 408

6. Mär 2007, 11:47
Beitrag # 13 von 117
Beitrag ID: #280054
Bewertung:
(605626 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

vielen Dank für den Hinweis!

Das hatte ich trotz Lesen Deiner beiden O'Reilly-Bücher übersehen.

zaphodbeeblebroxx


als Antwort auf: [#280050]

Skript zum Index generieren

RONNY-LE
Beiträge gesamt: 2

21. Sep 2007, 11:32
Beitrag # 14 von 117
Beitrag ID: #313542
Bewertung:
(604612 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo! Jetzt muss ich diesen Thread nochmal ausgraben und um eine Frage bereichern. Für ein Stichwortverzeichnis von Personen mit Vor- und Nachnamen habe ich mir dieses Script angesehen und unter ID CS3 getestet. Das Auslesen und Erstellen des Indexes funktioniert wunderbar, nachdem ich folgend Zeile am Anfang in das Script eingfügt habe:

app.scriptPreferences.version = 4.0;

Nun stellt sich mir die Frage, ob es möglich ist, beim Indizieren den Nachnamen alphabetisch zu sortieren, anstelle des Vornamens. Mittels des Tastaturkürzels: Umschalt + Strg + Alt + ö lässt sich dies nämlich manuell in den Index aufnehmen und es steht anstelle von (Vorname Nachname) (Nachname, Vorname) im Index. Leider lässt sich dies m.W. nachträglich nicht mehr ändern.

Lässt sich dieses Script diesbezüglich ändern? Vielen Dank für eine Antwort und beste Grüße, Ronny


als Antwort auf: [#280054]

Skript zum Index generieren

Martin Fischer
  
Beiträge gesamt: 12783

21. Sep 2007, 12:22
Beitrag # 15 von 117
Beitrag ID: #313546
Bewertung:
(604591 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Stehen in der Konkordanzliste immer genau ein Vorname und ein Nachname in der Zeile?
Gibt es auch einen "Franz Xaver Fleischer"?
Oder eine "Hildegard Däumling, geb. Fletscher"?

Mach mal einen Versuch und ersetze die Zeilen
Code
// Hinzufügen des Themas  
myDoc.indexes[0].topics.add(oneWord);
// Hinzufügen der Referenz
myDoc.indexes[0].topics.item(myResult[oneEntry].contents).pageReferences.add(myResult[oneEntry], PageReferenceType.currentPage);


durch folgende Zeilen:
Code
// Hinzufügen des Themas  
aText = oneWord.split(" ");
nText = aText.pop() + ", " + aText.join(" ");
myTopic = myDoc.indexes[0].topics.add(nText);
// Hinzufügen der Referenz
myTopic.pageReferences.add(myResult[oneEntry], PageReferenceType.currentPage);


Ferner mußt Du die folgende Anweisung auskommentieren (zwei Schrägstriche vor aText setzen):

Code
// ersetzen von mehrfach aufeinander folgende Leerzeichen aller Art und von RETURNs durch RETURNs  
aText = aText.replace(/\s+/g, '\n');



als Antwort auf: [#313542]
(Dieser Beitrag wurde von Martin Fischer am 21. Sep 2007, 12:36 geändert)
X