Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » hyperlinkURLDestinations schon von einem anderen Objekt verwendet

hyperlinkURLDestinations schon von einem anderen Objekt verwendet

Gaby Leuenberger
Beiträge gesamt: 29

4. Dez 2017, 14:30
Bewertung:

gelesen: 3500

Beitrag als Lesezeichen
Hallo zusammen

Ich habe ein Problem mit identischen URLs im selben Dokument, die ich in Hyperlinks umwandeln möchte.

Wenn ich in der for-Schleife die gefundenen URLs abarbeite, beschwert sich das Skript bei 'hyperlinkURLDestinations.add()', dass diese Destination schon von einem anderen Objekt verwendet wir.
Hier mein Code dazu:
Code
var _myURL = _myDoc.findGrep(); 

for (var x = 0; x < _myURL.length; x++){ //Schleife durch alle gefundenen URLs, verlinke neu
var _URL = _myURL[x]; // Text-Objekt
var _source = _myDoc.hyperlinkTextSources.add(_URL); //hier muss Text sein, weil die Quelle ein Text-Objekt sein muss
var _URLstring = _myURL[x].contents; // String
var _dest = _myDoc.hyperlinkURLDestinations.add(_URLstring, {name: _URLstring}); //Destination will einen String
var _hyperlink = _myDoc.hyperlinks.add(_source, _dest, {name: _URLstring});
}


Ich habe versucht, die Destination über die ID oder den Namen anzusteuern, bin aber von der Syntax grade überfordert.

Vielleicht hat jemand eine Idee?

Danke und Gruss
Gaby

hyperlinkURLDestinations schon von einem anderen Objekt verwendet

Martin Fischer
  
Beiträge gesamt: 12779

4. Dez 2017, 14:44
Bewertung:

gelesen: 3499

Beitrag als Lesezeichen
Hallo Gaby,

ein Textobjekt (Zeichen, Wort, ...) kann nur für je einen Hyperlink als Quelle dienen.
Was sollte dabei herauskommen, wenn Text auf mehrere unterschiedliche Ziele zielt. :-)

Prüfe vor der Zuweisung eines Hyperlinks, ob der Text bereits als Quelle für einen Hyperlink dient.
Wenn ja, entscheide, ob der alte Hyperlink weiter gelten oder gelöscht und durch den neuen ersetzt werden soll.

Viele Grüße
Martin


hyperlinkURLDestinations schon von einem anderen Objekt verwendet

Gaby Leuenberger
Beiträge gesamt: 29

4. Dez 2017, 14:52
Bewertung:

gelesen: 3495

Beitrag als Lesezeichen
Hallo Martin

Vielen Dank für deine rasche Antwort! Das ist mir im Prinzip ja klar, aber ich habe doch mehrere Textobjekte, an unterschiedlicher Stelle im Dokument, sie haben einfach denselben Inhalt, also der String ist identisch...?

Allfällige alte Hyperlinks, Quellen und Ziele habe ich vorgängig gelöscht, die können das Problem nicht sein.

Entschuldige, ich steh ich grad etwas auf dem Schlauch.

Lieber Gruss
Gaby
Gaby Leuenberger

hyperlinkURLDestinations schon von einem anderen Objekt verwendet

Kai Rübsamen
Beiträge gesamt: 4684

4. Dez 2017, 16:20
Bewertung:

gelesen: 3471

Beitrag als Lesezeichen
Kann es sein, dass das nicht sauber programmiert ist? Wenn ich z.B. ein Hyperlinkziel per Skript anlege, das danach im UI lösche (es ist nicht mehr in der Liste), dann das Skript erneut starte, erhalte ich den Fehler auch. Offenbar spukt da noch etwas im Hintergrund …

Gruß Kai Rübsamen

hyperlinkURLDestinations schon von einem anderen Objekt verwendet

Gaby Leuenberger
Beiträge gesamt: 29

5. Dez 2017, 11:13
Bewertung:

gelesen: 3375

Beitrag als Lesezeichen
Guten Morgen Kai

Ja, das dachte ich anfangs auch, weswegen ich ja alle Sources, Hyperlinks und Destinations zuerst entferne, und zwar je einzeln, weil die Arrays verschieden lang sein können.

Hier mal der ausführlichere Code (Warnung: Anfängerin):
Code
var  _myURL; 
var _myDoc = app.activeDocument;
var _oldDest = _myDoc.hyperlinkURLDestinations.everyItem().getElements();
var _oldSource = _myDoc.hyperlinkTextSources.everyItem().getElements();
var _aHyperlink = _myDoc.hyperlinks.everyItem().getElements(); //Array mit existierenden Hyperlinks

for (var i=_aHyperlink.length-1; i>=0; i--){//Hyperlinks entfernen
var _aHyperlinkRemove = _aHyperlink[i].remove();
_aHyperlink.pop();
}
for (var i=_oldDest.length-1; i>=0; i--){//Ziele entfernen
var _oldDestRemove = _oldDest[i].remove();
_oldDest.pop();
}
for (var i=_oldSource.length-1; i>=0; i--){//Quellen entfernen
var _oldSourceRemove = _oldSource[i].remove();
_oldSource.pop();
}




app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
//matche ALLE URLs
app.findGrepPreferences.findWhat = '((?:(?:https?|ftp|file)://|www\\.|ftp\\.)[-A-Za-z0-9+&@#/%=~_|$?!:,.]*[A-Za-z0-9+&@#/%=~_|$])';
var _myURL = _myDoc.findGrep();

for (var x = 0; x < _myURL.length; x++){ //Schleife durch alle gefundenen URLs, verlinke neu
var _URL = _myURL[x]; // Text-Objekt
try{
var _source = _myDoc.hyperlinkTextSources.add(_URL); //hier muss Text sein, weil die Quelle ein Text-Objekt sein muss
var _URLstring = _myURL[x].contents; // String
var _dest = _myDoc.hyperlinkURLDestinations.add(_URLstring, {name: _URLstring}); //Destination will einen String
var _hyperlink = _myDoc.hyperlinks.add(_source, _dest, {name: _URLstring}); }
catch (e){}
}


Und hier auch noch ein Muster meines Test-Dokuments:
Code
<https://www.revision.ch/liquiditaetsplanung.html> 
(zuletzt besucht am 29.06.2017).
https://www.nzz.ch
Blablabla
https://www.irgendeinewebseite.ch/index.html#id-1

https://www.irgendeinewebseite.ch/#a2343

https://www.nzz.ch


InDesign hätte ja das nette Hyperlink-Interface, das URLs zu Hyperlinks macht, aber das matcht a) die admin.ch-URL mit den # nicht korrekt und b) fügt es bei zwei identischen URLs auch nur einen Link ein. Ich verstehe aber auch nicht genau, was Martin denn nun meinte, aber vielleicht reden wir da nicht vom selben? Jedenfalls führt das Skript auch mit dem try-Block nicht zum Ziel.

Vielen Dank fürs Mitdenken, mir raucht schon der Kopf!

LG
Gaby
Gaby Leuenberger

hyperlinkURLDestinations schon von einem anderen Objekt verwendet

Gaby Leuenberger
Beiträge gesamt: 29

5. Dez 2017, 11:24
Bewertung:

gelesen: 3375

Beitrag als Lesezeichen
Ich glaube, ich habe das Problem gefunden:

Ich kann nicht denselben Namen vergeben für identische URLs...

Wenn ich bei
Code
   var _dest = _myDoc.hyperlinkURLDestinations.add( _URLtext, {name: _URLtext}); //Destination will einen String 
var _hyperlink = _myDoc.hyperlinks.add(_source, _dest, {name: _URLtext});


je die Option name: rauslösche, läuft es durch und setzt die Links (nummeriert sie dann halt und sie sind im Hyperlink-Panel dann nicht ohne weiteres zu identifizieren...

Vielleicht hat mir jemand eine schlaue Lösung?
Gaby Leuenberger

hyperlinkURLDestinations schon von einem anderen Objekt verwendet

Kai Rübsamen
Beiträge gesamt: 4684

5. Dez 2017, 11:37
Bewertung:

gelesen: 3371

Beitrag als Lesezeichen
Hallo Gaby,

ich hab leider keine Zeit das heute zu testen. Ich löse das bei mir in der Praxis so, dass ich für alles einen Zähler mitlaufen lasse und damit gibt es quasi nichts doppelt.

Gruß Kai Rübsamen

hyperlinkURLDestinations schon von einem anderen Objekt verwendet

Gaby Leuenberger
Beiträge gesamt: 29

5. Dez 2017, 11:45
Bewertung:

gelesen: 3368

Beitrag als Lesezeichen
Hallo Kai

Kein Stress, ich muss auch gleich wegrennen, und kann erst morgen wieder weitermachen.

Ich werd das mit dem Zähler mal versuchen, aber ich weiss grad noch nicht so recht, wie ich den der name-Option mitgeben soll.

Interessant: Wenn ich zu Fuss verlinke, macht ID auch einen Zähler hinter den URL-Namen, wenn ich über das Panel automatisch verlinke, dann setzt mir ID nummerierte Links unter ein- und dieselbe URL, oh Objektmodell, du treibst mich in den Wahnsinn...

Merci und Gruss
Gaby
Gaby Leuenberger

hyperlinkURLDestinations schon von einem anderen Objekt verwendet

WernerPerplies
Beiträge gesamt: 2760

5. Dez 2017, 12:18
Bewertung:

gelesen: 3351

Beitrag als Lesezeichen
Hallo Gaby,

ja Hyperlinks haben es in sich, und mit dem Namen liegst Du richtig.

Ich habe das bei meinen Skripten , z. B. bei (
WpsHyperlinkInspector – Alle Hyperlinkinformationen einer Adobe InDesign Datei auf einen Blick), gelöst, indem ich entweder eine eigene Buchhaltung der Links gepflegt oder alternativ vor Erzeugung das Vorhanden sein geprüft habe.

Wenn ein Link schon vorhanden ist und voll gültig ist, erzeuge ich einen neuen Namen + (Zähler).

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

hyperlinkURLDestinations schon von einem anderen Objekt verwendet

Gaby Leuenberger
Beiträge gesamt: 29

6. Dez 2017, 08:29
Bewertung:

gelesen: 3285

Beitrag als Lesezeichen
Hallo Werner (und Kai)

Danke für die Antwort. Heute morgen bin ich wacher und mir hat auch gleich gedämmert, wie ich den Zähler beim Namen setzen kann. Jetzt flutscht alles wunderbar! :)

Vielen Dank allen fürs Mitdenken, ich finde es immer wieder faszinierend, wie sehr ich mich vor eine Wand fahren kann und dann gar nichts mehr durchschaue, und einen Tag später fällt es wie Schuppen von den Augen ... (leider nicht immer :)).

Einen schönen Nikolaus wünsch ich

Liebe Grüsse
Gaby