2016-07-21 21 views
0

Stolperte über ein sehr seltsames Problem mit Scripting, GREP und Hyperlinks in InDesign. Ich versuche ein Skript (js) zu schreiben, das die Erstellung von Hyperlinks in einem großen Buch (E-Book) automatisiert. Ich habe erfolgreich ein Glossar-Hyperlinking-Skript geschrieben, aber dies ist für Kapitelreferenzen. Die Idee ist eine GREP-Suche, die alle Wörter findet, die einem Überschriftenstil entsprechen (in diesem Fall 20pt) und dann an dieser Stelle ein Hyperlinkziel einfügen. Das Seltsame ist, dass wenn das Skript läuft, es die GREP-Suchergebnisse durcheinanderbringt, die den Text von der vorherigen Zeile finden.Indesign-Skript GREP vermasselt beim Anwenden von Hyperlink Ziel


 
var doc = app.activeDocument; 
 
    
 
doc.hyperlinkTextDestinations.everyItem().remove(); 
 
doc.hyperlinkTextSources.everyItem().remove(); 
 
doc.hyperlinks.everyItem().remove(); 
 
    
 
app.findGrepPreferences = app.changeGrepPreferences = null; 
 
app.findGrepPreferences.pointSize = 20; 
 
app.findGrepPreferences.underline = true; 
 
app.findGrepPreferences.findWhat = ''; 
 
    
 
var results = app.activeDocument.findGrep(); 
 
    
 
for (var i=0; i < results.length; i++) { 
 
    var text = results[i].texts.firstItem(); 
 
    $.writeln(text.contents); 
 
    doc.hyperlinkTextDestinations.add( 
 
     text, 
 
     { 
 
      name: text.contents 
 
     } 
 
    ); 
 
}

läuft dieses Skript über den folgenden Text (indesign Styling entfernt): Ein Titel mit Vertrauen einig Text Kontrolle und Sicherheit einen Text Titel einiger Text Scripting in InDesign ein Text

gibt Folgendes an die Konsole aus:

Ein Titel mit Vertrauen Kontrolle und Sicherheit

Titl xt Scripting in InDesi

Die ersten 2 korrekt sind, aber sein den letzten 2. Wenn ich den Anruf auf Kommentar zu dem Add Hyperlink verkorkste Ziel Methode sehe ich den richtigen Text in der Konsole:

Ein Titel mit Vertrauen Kontrolle und Sicherheit Titel Scripting in InDesign

Jede Hilfe wird wirklich geschätzt.

Danke,

Antwort

1

Ändern Sie den Text vom Ende statt zu starten. Rückwärts Ihre for Schleife oder (einfacher noch) nicht ändern Sie die Reihenfolge, in der Ergebnisse werden zurückgegeben:

var results = app.activeDocument.findGrep(true); 

(siehe an online reference für die Bedeutung des Booleschen Wert hier).

Der Grund, warum es nicht zu Ende funktioniert, liegt darin, dass Sie die result-Liste in einer Variablen speichern, und sie wird nicht aktualisiert, wenn Sie den Text anschließend ändern. Was leider "Einfügen eines Hyperlink-Ziels" bedeutet: Es fügt ein verstecktes Zeichen in den laufenden Text ein. Von diesem Zeitpunkt an können alle zuvor gefundenen Standorte nicht mehr vertrauenswürdig sein. Sie müssen also den Befehl findGrep erneut ausführen (und das erste gefundene Ergebnis überspringen) - oder die Ergebnisse von Anfang bis Ende verarbeiten, also alle Änderungen, die Sie vornehmen Beeinflussen Sie nicht den Text, den Sie noch verarbeiten müssen.