[GastForen Programme Print/Bildbearbeitung Adobe InDesign [JS] Indexeinträge im Umbruch visualisieren

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

[JS] Indexeinträge im Umbruch visualisieren

zaphodbeeblebroxx
Beiträge gesamt: 408

9. Aug 2006, 10:43
Beitrag # 1 von 8
Bewertung:
(37832 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich habe ein InDesign-Dokument (ID CS 2 4.0.2 auf MAC OSX 10.4.3) mit einem importierten Word-Index.

Damit unser Kunde die indexierten Wörter im Umbruch überprüfen kann, würde ich gerne in einem Duplikat meines Doks die im Index eingetragenen Wörter im Umbruch optisch hervorheben (also mit einem Zeichenformat versehen, z.B. eine bestimmte Farbe oder eine Unterstreichung).

Per JS könnte man vermutlich nach dem Index-Zeichen im Umbruch suchen (0xFEFF), aber dieses Zeichen steht mal vor und mal nach dem indexierten Begriff. Somit kann ich nicht den gesamten Begriff suchen sondern erhalte nur das Index-Zeichen.

Es gibt ja schon ein Skript, um von Wörtern, die mit einem Zeichenformat formatiert sind einen Index zu generieren.
Ich würde gerne den umgekehrten weg gehen und anhand der Index-Begriffe ein Zeichenformat zuweisen.

Meine Frage: Kann mir jemand sagen wie ich in JS anhand der index.topics auf den entsprechenden Begriff im Text referenzieren kann um dem Begriff ein best. Zeichenformat zuzuweisen? (Die SkriptingRererence hat mir nicht wirklich weitergeholfen).

Oder kann man den Begriff per JS nicht referenzieren und ich muss per myDoc.search() anhand der Seitenzahl und des Index-Begriffs auf der enstprechenden Umbruch-Seite nach dem Begriff suchen und diesem mein Zeichenformat zuweisen?

zaphodbeeblebroxx
X

[JS] Indexeinträge im Umbruch visualisieren

Gerald Singelmann
  
Beiträge gesamt: 6269

9. Aug 2006, 11:01
Beitrag # 2 von 8
Beitrag ID: #243656
Bewertung:
(37787 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Vielleicht weiß jemand genaueres, aber soweit ich den Index verstanden habe, ist es keine Eigenschaft des Wortes, im Index zu stehen. Der Index Eintrag ist die Eigenschaft des Sonderzeichens, das Sie ausfindig gemacht haben. Insofern kann der Weg zurück nicht so einfach sein.

Etwas besseres als der Suchen/Ersetzen Weg fällt mir nicht ein.


als Antwort auf: [#243650]

[JS] Indexeinträge im Umbruch visualisieren

Martin Fischer
  
Beiträge gesamt: 12783

9. Aug 2006, 11:58
Beitrag # 3 von 8
Beitrag ID: #243680
Bewertung:
(37773 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gerald und zaphodbeeblebroxx,

Die Sache ist ziemlich kniffelig. Ich hatte mich richtig festgebissen.

> keine Eigenschaft des Wortes, im Index zu stehen
Richtig!

> Etwas besseres als der Suchen/Ersetzen Weg fällt mir nicht ein.
Suchen/Ersetzen geht leider nicht.
"<FEFF>" kann nicht gefunden werden.

Aber es gibt die Kinder "pageReferences" von "topics" von einem "index".
Und diese Kinder haben eine Eigenschaft "sourceText" der Klasse "insertionPoint".
Und dieser InsertionPoint referenziert die Einfügemarke eines Indexbegriffs.
Nun muß man von diesem Einfügepunkt aus noch das dazugehörige Wort referenzieren.
Das geht über "insertionPoint.words[0]".
Da "sourceText" aber gewöhnlich vor dem Wort steht, gibt es kein "insertionPoint.words[0]".
Also gehe ich über den Index des Einfügepunkts im Textfluß zum Zeichen "Index des Einfügepunkts +1" und packe das Wort von dort aus. ;-)

Es kann sein - Du, zaphodbeeblebroxx, hast es so angemerkt, daß die Indexmarke auch am Ende eines Worts steht. In diesem Fall müßte man das Wort über das Zeichen "Index des Einfügepunkts -1" referenzieren. Das mußt Du ausprobieren und ggf. in ein try-Kommando einbinden (in der aktualisierten Fassung ist das jetzt drin).

Vor einer halben Stunde hätte ich selbst nicht dran geglaubt, daß es so funktionieren könnte.
Aber das folgende Skript läuft bei mir. ;-)
Anstatt eines Zeichenformats, welches ein möglicherweise bereits zugewiesenes Zeichenformat überschreiben würde, habe ich eine Textauszeichnungsfarbe "IndexMarker" gewählt, die bei Bedarf neu angelegt wird. Wenn das auch beißt, dann mußt Du eventuell auf Durchstreichen oder Unterstreichen ausweichen.

Hier die Kopfgeburt:
Code
// IndexEntry-highlight.jsx 

var myDoc = app.documents[0];
var mySwatch = getSwatch("IndexMarker");
for (oneIndex = 0; oneIndex < myDoc.indexes.length; oneIndex++)
{
for (oneTopic = 0; oneTopic < myDoc.indexes[oneIndex].topics.length; oneTopic++) {
for (oneRef = 0; oneRef < myDoc.indexes[oneIndex].topics[oneTopic].pageReferences.length; oneRef++) {
var theRef = myDoc.indexes[oneIndex].topics[oneTopic].pageReferences[oneRef];
try {
theRef.sourceText.parentStory.characters[theRef.sourceText.index+1].words[0].fillColor = mySwatch;
}
catch(e1) {
try{
theRef.sourceText.parentStory.characters[theRef.sourceText.index-1].words[0].fillColor = mySwatch;
}
catch(e2){}
}
}
}
}

function getSwatch(aName)
{
try {
aSwatch = myDoc.colors.add({name:aName,space:ColorSpace.rgb,colorValue:Array(250,0,0)});
}
catch (myError) {
aSwatch = myDoc.colors.item(aName);
}
return aSwatch;
}



als Antwort auf: [#243656]
(Dieser Beitrag wurde von Martin Fischer am 9. Aug 2006, 12:27 geändert)

[JS] Indexeinträge im Umbruch visualisieren

Martin Fischer
  
Beiträge gesamt: 12783

9. Aug 2006, 12:12
Beitrag # 4 von 8
Beitrag ID: #243685
Bewertung:
(37765 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Oder kann man den Begriff per JS nicht referenzieren und ich muss per myDoc.search() anhand der Seitenzahl und des Index-Begriffs auf der enstprechenden Umbruch-Seite nach dem Begriff suchen und diesem mein Zeichenformat zuweisen?

Das dürfte problematisch sein.
1. müßtest Du alle Textrahmen der betreffenden Seite nach dem Index-Begriff absuchen und
2. ist es möglich, daß der Index-Begriff im Register nicht identisch ist mit dem Wort an der Fundstelle (z.B. wenn es sich um eine Umschreibung handelt). U.U. steht im Register "Goethe, J.W. v." und im Text steht nur "Goethe" (wird also mit Suche nach "Goethe, J.W. v." gar nicht gefunden).

Aber das obige Skript entbindet hoffentlich von solchen Hilfsmissionen.


als Antwort auf: [#243650]

[JS] Indexeinträge im Umbruch visualisieren

zaphodbeeblebroxx
Beiträge gesamt: 408

9. Aug 2006, 12:24
Beitrag # 5 von 8
Beitrag ID: #243688
Bewertung:
(37754 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

vielen Dank für das tolle Skript!

An der Aufgabenstellung hätte ich mir als JS-Anfänger mit Sicherheit die Zähne ausgebissen.

Das Skript arbeitet einwandfrei, egal ob das Index-Zeichen vor oder hinter dem Begriff steht!

Die Hervorhebung durch eine eigene Farbe ist eine bessere Lösung als ein Index-Zeichenformat (wobei ich als Zeichenformat auch nur eine andere Farbe definiert hätte –
Damit sich in meinem Umbruch nichts verändert hätte ich sowieso mit einem Duplikat des Dokuments gearbeitet.)

Nochmals recht herzlichen Dank!

zaphodbeeblebroxx


als Antwort auf: [#243685]

[JS] Indexeinträge im Umbruch visualisieren

zaphodbeeblebroxx
Beiträge gesamt: 408

10. Aug 2006, 17:31
Beitrag # 6 von 8
Beitrag ID: #243985
Bewertung:
(37725 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

habe Dein Skript zur Visualisierung der Index-Einträge heute nochmal ausgiebig getestet. Dabei sind mir noch folgende 3 Punkte aufgefallen (die in meinem gestrigen Test-Dokument nicht vorgekommen sind):

Das Skript funktioniert nicht bei indexierten Begriffen in Fußnoten und Tabellen. Habe versucht das Skript für Fußnoten und Tabellen abzuändern (2 weitere Schleifen durch die "topics" – programmtechnisch zwar nicht so toll, aber das war für mich die schnellste Lösung), allerdings wird nun in Fußnoten und Tabellen z.T. auch Text rot markiert, der nicht indexiert ist. Wie das zustande kommt kann ich nicht nachvollziehen.

Hier meine geänderten Zeilen für Tabellen bzw. Fussnoten:
Code
theRef.sourceText.parentStory.tables.everyItem().cells.everyItem().characters[theRef.sourceText.index+1].words[0].fillColor = mySwatch;  

theRef.sourceText.parentStory.tables.everyItem().cells.everyItem().characters[theRef.sourceText.index-1].words[0].fillColor = mySwatch;

theRef.sourceText.parentStory.footnotes.everyItem().characters[theRef.sourceText.index+1].words[0].fillColor = mySwatch;

theRef.sourceText.parentStory.footnotes.everyItem().characters[theRef.sourceText.index-1].words[0].fillColor = mySwatch;


Ein weiterer Punkt, der mir aufgefallen ist:
Sollte es sich bei dem Index-Eintrag nicht um ein einzelnes Wort, sondern z.B. um 2 Wörter handeln, so wird (je nachdem wo das Index-Zeichen steht [vor bzw. hinter den indexierten Wörtern]) mit words[0] nur ein Teil des Index-Eintrags im Text markiert. (Im genannten Bsp. das erste oder das zweite Wort aber nicht beide). Vielleicht könnte man über topics.name herausfinden wieviel Wortzwischenräume im Index-Eintrag vorhanden sind und im Text dann die entsprechende Anzahl an Wörtern vor bzw. hinter der Index-Marke einfärben?

Das Skript behandelt nur Index-Einträge der ersten Ebene, für die (3) Unter-Ebenen bei Indexen müsste man vermutlich mit jeweils einer weiteren Schleife die Untereinträge der Index-Einträge durchlaufen?

zaphodbeeblebroxx


als Antwort auf: [#243688]

[JS] Indexeinträge im Umbruch visualisieren

Martin Fischer
  
Beiträge gesamt: 12783

10. Aug 2006, 19:00
Beitrag # 7 von 8
Beitrag ID: #243998
Bewertung:
(37713 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zaphodbeeblebroxx,

ich fiebere und bin zu keinem Geistesblitz mehr in der Lage.
Daß in den Fußnoten überhaupt was geht, das nimmt mich Wunder.
Dort ist mit JS nächmlich nicht allzuviel zu machen (eigentlich keine selection - wie machst Du das nur?). AS ist da stärker.

Bis die Tage
Martin


als Antwort auf: [#243985]

[JS] Indexeinträge im Umbruch visualisieren

Martin Fischer
  
Beiträge gesamt: 12783

5. Dez 2008, 08:07
Beitrag # 8 von 8
Beitrag ID: #377515
Bewertung:
(36534 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Peter Kahrel hat in den letzten Tagen im Adobe Scripting-Forum zwei interessante CS3-Skripte zur Visualisierung von Indexeinträgen veröffentlicht, die ich hier festhalten möchte:

1. Taggen
Mit diesem Skript werden die Indexeinträge an Ort und Stelle in Tags dargestellt:
'<ix>Indexeintrag</ix>'. Untereinträge werden durch '#' separiert.

Code
index2text (app.activeDocument);  
//delete_index (app.activeDocument);

function index2text (doc)
{
var tops = doc.indexes[0].allTopics;
for (var i = 0; i < tops.length; i++)
for (var j = tops[i].pageReferences.length-1; j > -1; j--)
tops[i].pageReferences[j].sourceText.contents =
'<ix>' + topic_path (tops[i], tops[i].name) + '</ix>';
}

// create topic string. Subtopics are separated by '#'
function topic_path (top, str)
{
if (top.parent.constructor.name == 'Index')
return str;
else
return topic_path (top.parent, top.parent.name + '#' + str)
}

function delete_index (doc)
{
// delete page references and topics
doc.indexes[0].topics.everyItem().pageReferences.everyItem().remove();
doc.indexes[0].topics.everyItem().remove();
}


2. Inline-Graphiken
Im Unterschied zum o.g. Skript erscheinen die Indexeinträge nicht zwischen Tags, sondern werden in einen verankerten Textrahmen, der mit dem Objektstil 'sidebar' (muss vor Ausführung des Skripts angelegt sein) ausgezeichnet wird, eingefügt. Sie laufen damit im Text mit.

Code
index2text (app.activeDocument);  
//delete_index (app.activeDocument);

function index2text (doc)
{
var tops = doc.indexes[0].allTopics;
for (var i = 0; i < tops.length; i++)
for (var j = tops[i].pageReferences.length-1; j > -1; j--)
{
var ip = tops[i].pageReferences[j].sourceText;
var p_ref = topic_path (tops[i], tops[i].name);
side_note (ip, p_ref)
}
}

// create topic string. Subtopics are separated by '#'
function topic_path (top, str)
{
if (top.parent.constructor.name == 'Index')
return str;
else
return topic_path (top.parent, top.parent.name + '#' + str)
}

function delete_index (doc)
{
// delete page references and topics
doc.indexes[0].topics.everyItem().pageReferences.everyItem().remove();
doc.indexes[0].topics.everyItem().remove();
}

function side_note (ins_point, s)
{
var sidebar = ins_point.textFrames.add ();
sidebar.geometricBounds = [0,0,10,70];
sidebar.appliedObjectStyle = app.activeDocument.objectStyles.item ('sidebar');
sidebar.contents = s;
sidebar.fit (FitOptions.frameToContent);
}


Diese beiden Skriptversionen haben mir so gut gefallen, dass ich gleich noch eine kleine Änderung für InDesign CS4 vorgenommen habe. Die Indexeinträge werden hier an Ort und Stelle in bedingten Text ('Index') umgesetzt und können damit ein- und ausgeblendet werden.

Code
// index2conditionalText.jsx 
// Original by Peter Kahrel
// modified by Martin Fischer to take use of InDesign CS4 conditional text
// 04.12.2008

Object.prototype.get = function( )
{
try {
var myObject = this.item( arguments[0].name );
myObject.name;
}
catch (e) {
var myObject = this.add( arguments[0] );
}
return myObject;
}

index2text (app.activeDocument);
//delete_index (app.activeDocument);

function index2text (doc)
{
var myConditionSet = app.activeDocument.conditions.get( {name:'Index', indicatorMethod:ConditionIndicatorMethod.USE_HIGHLIGHT} )
var tops = doc.indexes[0].allTopics;
for (var i = 0; i < tops.length; i++)
for (var j = tops[i].pageReferences.length-1; j > -1; j--)
{
var ip = tops[i].pageReferences[j].sourceText;
var p_ref = topic_path (tops[i], tops[i].name);
conditional_note (ip, p_ref, myConditionSet)
}
myConditionSet.visible = false;
}

// create topic string. Subtopics are separated by '#'
function topic_path (top, str)
{
if (top.parent.constructor.name == 'Index')
return str;
else
return topic_path (top.parent, top.parent.name + '#' + str)
}

function delete_index (doc)
{
// delete page references and topics
doc.indexes[0].topics.everyItem().pageReferences.everyItem().remove();
doc.indexes[0].topics.everyItem().remove();
}

function conditional_note (ins_point, s, c)
{
ins_point.appliedConditions = c;
ins_point.contents = s;
}


Nach Ausführung des Skripts ist der bedingte Text 'Index' ausgeblendet.
Bei Bedarf kann der bedingte Text über die Suche-Ersetze Funktion wieder gelöscht werden (etwa für eine erneute Visualisierung der Indexeinträge nach einer Erweiterung derselben).


als Antwort auf: [#243998]
X