[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

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

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

cwenet
Beiträge gesamt: 1139

14. Jul 2021, 16:26
Beitrag # 1 von 20
Bewertung:
(8350 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Tag,

hiermit durchsuche ich alle offenen Dokumente nach einem bestimmten Zeichenformat. Die Ziffern, die mit diesem Zeichenformat formatiert sind, stellen gleichzeitig die Seitenzahlen dar. Nun soll das Script alle Fundstellen auf die passenden Seiten in allen Dokumenten verlinken. Das funktioniert innerhalb eines Dokuments prima. Wie kann ich nun dem Script beibringen, dass es auch über den "Tellerrand" schaut und auch in ein anderes Dokument verlinken kann?

Code
for (var d=0; d<app.documents.length; d++) 
{
myTempDoc = app.documents[d];

var myHyperlinkStyle = myTempDoc.characterStyles.item("mycharstyle");

app.findTextPreferences = app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences.appliedCharacterStyle = myHyperlinkStyle;
var mSource = myTempDoc.findText();

for (var k = 0; k <mSource.length; k++){
var item = mSource[k].contents; // the destination page
var myDestPage = myTempDoc.pages.itemByName(item);

try {
var mHyperlinkDestination = myTempDoc.hyperlinkPageDestinations.add(myDestPage);
var mHyperlinkTextSource = myTempDoc.hyperlinkTextSources.add(mSource[k]);
mHyperlink = myTempDoc.hyperlinks.add(mHyperlinkTextSource,mHyperlinkDestination);
mHyperlink.name = mSource[k].contents + '_' + k;
mHyperlink.visible = true;
mHyperlink.borderColor = [255,0,0];
mHyperlink.width = HyperlinkAppearanceWidth.thin;
mHyperlink.borderStyle = HyperlinkAppearanceStyle.dashed; // dashed oder solid
}
catch(e) {
}

}

}


Zum Testen:
https://www.dropbox.com/s/shvy4yyqfwaam3k/eins.idml?dl=0
https://www.dropbox.com/s/l5gx41ko28ol4v5/zwei.idml?dl=0

Bitte um Hilfe
Grüße
Christoph
X

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

WernerPerplies
Beiträge gesamt: 2762

14. Jul 2021, 16:52
Beitrag # 2 von 20
Beitrag ID: #580507
Bewertung:
(8320 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Christoph,

schau noch mal in die Doku, es gibt blödsinnigerweise zwei unterschiedliche Seitenziele:
1. HyperlinkExternalPageDestination
2. HyperlinkPageDestination

Du musst da einfach diesen Sachverhalt berücksichtigen und eine Fallunterscheidung machen.


als Antwort auf: [#580504]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

cwenet
Beiträge gesamt: 1139

14. Jul 2021, 17:38
Beitrag # 3 von 20
Beitrag ID: #580508
Bewertung:
(8292 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke Werner für den Hinweis.

D.h. ich könnte ja mit mHyperlinkDestination.constructor.name herausfinden, wo die Seiten sind?
Irgendwie zeigt er mir aber nur HyperlinkPageDestination an.
Ich steh irgendwie auf dem Schlauch.
Woher weiß das Script wann "external" und wann "internal"?
Das ist irgendwie wie die Frage nach dem Huhn und dem Ei.
Ich drehe mich gerade im Kreis.

Gruß
Christoph


als Antwort auf: [#580507]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

Uwe Laubender
Beiträge gesamt: 5317

14. Jul 2021, 17:56
Beitrag # 4 von 20
Beitrag ID: #580509
Bewertung:
(8285 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Christoph,
das Skript weiß das nicht direkt.

mSource[n] ist ja ein Stück Text, das gefunden wurde.
In einer der geöffneten InDesign-Dateien. Diese kannst Du ermitteln.

Beispielsweise über:
Code
mSource[n].parentTextFrames[0].parentPage.parent.parent 


Aber Vorsicht, wenn Du Text auf der Montagefläche findest oder gar in Übersatz!
In dem einen Fall gibt's keine parentPage, im anderen Fall kein parentTextFrame.

Wenn das Dokument, das in Variable myTempDoc gespeichert ist der ermittelten nicht entspricht, dann brauchst Du ein externes Ziel. Nicht getestet, sollte aber so funktionieren.


als Antwort auf: [#580508]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

WernerPerplies
Beiträge gesamt: 2762

14. Jul 2021, 17:59
Beitrag # 5 von 20
Beitrag ID: #580510
Bewertung:
(8276 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Christoph,

ich habe mir jetzt aus Zeitgründen Deinen Code nicht angesehen, aber wenn Du das Seitenobjekt hast, dann kannst Du auch die zugehörige Datei über page.parent.parent ermitteln.
Und wenn Parentdocument von Source ungleich von Parentdocument von Destination ist, benötigst Du "external", andernfalls die interne Form.


als Antwort auf: [#580508]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

cwenet
Beiträge gesamt: 1139

14. Jul 2021, 18:41
Beitrag # 6 von 20
Beitrag ID: #580511
Bewertung:
(8246 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke an Uwe und Werner,
ich schaffe es leider nicht. Es ist irgendwie zu abstrakt für mich.
Ich sehe zwar die Dokumentnamen, aber ich bin ja in dem Moment immer in einem Dokument gleichzeitig unterwegs.

Code
for (var d=0; d<app.documents.length; d++) 
{
myTempDoc = app.documents[d];

var myHyperlinkStyle = myTempDoc.characterStyles.item("mycharstyle");

app.findTextPreferences = app.changeTextPreferences = NothingEnum.nothing;
app.findTextPreferences.appliedCharacterStyle = myHyperlinkStyle;
var mSource = myTempDoc.findText();



for (var k = 0; k <mSource.length; k++){
var item = mSource[k].contents; // the destination page
var myDestPage = myTempDoc.pages.itemByName(item);

try {

//alert(mSource[k].parentTextFrames[0].parentPage.parent.parent.name +" - "+myDestPage.parent.parent.name);

if (mSource[k].parentTextFrames[0].parentPage.parent.parent.name == myDestPage.parent.parent.name) {

var mHyperlinkDestination = myTempDoc.hyperlinkPageDestinations.add(myDestPage);
} else {
var mHyperlinkDestination = myTempDoc.HyperlinkExternalPageDestination.add(myDestPage);
}



var mHyperlinkTextSource = myTempDoc.hyperlinkTextSources.add(mSource[k]);
mHyperlink = myTempDoc.hyperlinks.add(mHyperlinkTextSource,mHyperlinkDestination);
mHyperlink.name = mSource[k].contents + '_' + k;
mHyperlink.visible = true;
mHyperlink.borderColor = [255,0,0];
mHyperlink.width = HyperlinkAppearanceWidth.thin;
mHyperlink.borderStyle = HyperlinkAppearanceStyle.dashed; // dashed oder solid
}
catch(e) {
}

}

}



als Antwort auf: [#580510]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

Uwe Laubender
Beiträge gesamt: 5317

15. Jul 2021, 10:33
Beitrag # 7 von 20
Beitrag ID: #580517
Bewertung:
(8136 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Mach' den Vergleich nicht über den Namen.
Könnte ja sein, dass verschiedene Dateien mit dem gleichen Namen geöffnet sind.

Du könntest beispielsweise die id des einen mit der id des anderen Dokuments vergleichen. Sind sie gleich, dann hyperlinkPageDestinations, falls unterschiedlich, hyperlinkExternalPageDestination.

Die Werte für id der Dokumente bleiben während einer Session stabil. Auch wenn Du laufend Dokumente schließt und öffnest. Beim Wert für beispielsweise index ist das nicht der Fall. Um das zu testen, kannst Du ja mal ein paar Dokumente öffnen, dann diesen Code laufen lassen:

Code
$.writeln( app.documents.everyItem().id ); 
$.writeln( app.documents.everyItem().index );


Dann schließt Du ein Dokument und öffnest ein neues.
Danach wieder das Code-Schnipsel laufen lassen. Die beiden Ergebnisse miteinander vergleichen. Sollte erhellend sein.

Ach ja: Du hast im Code einen Flüchtigkeitsfehler:
myTempDoc.HyperlinkExternalPageDestination.add(myDestPage)


als Antwort auf: [#580511]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

WernerPerplies
Beiträge gesamt: 2762

15. Jul 2021, 11:03
Beitrag # 8 von 20
Beitrag ID: #580519
Bewertung:
(8099 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Uwe,

Zitat Die Werte für id der Dokumente bleiben während einer Session stabil.


Das ist nach meiner Erfahrung nicht so, speziell nach zurück zur letzten Version habe ich schon manche Überraschung erlebt, ich verifiziere deshalb den Vergleich mit document.fullName.fullName.


als Antwort auf: [#580517]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

Uwe Laubender
Beiträge gesamt: 5317

15. Jul 2021, 12:06
Beitrag # 9 von 20
Beitrag ID: #580523
Bewertung:
(8084 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat von Werner …speziell nach zurück zur letzten Version habe ich schon manche Überraschung erlebt…


Ah! Interessant.
Danke, Werner!


als Antwort auf: [#580519]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

cwenet
Beiträge gesamt: 1139

15. Jul 2021, 15:05
Beitrag # 10 von 20
Beitrag ID: #580524
Bewertung:
(8004 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke Uwe und Werner,

ich habe den Flüchtigkeitsfehler repariert und lasse in diesem Fall die Prüfung beim Dokumentnamen.
Dennoch findet das Script nicht über den "Tellerand" hinaus.
Was habe ich noch übersehen?


als Antwort auf: [#580523]
(Dieser Beitrag wurde von cwenet am 15. Jul 2021, 15:06 geändert)

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

Uwe Laubender
Beiträge gesamt: 5317

15. Jul 2021, 15:45
Beitrag # 11 von 20
Beitrag ID: #580527
Bewertung:
(7989 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hm. Du meinst, Du könntest keine Textstellen in anderen geöffneten Dokumenten finden?

Findet denn die GREP-Suche Textstellen ohne das Skript?
Also ab der Stelle, an der Du per Skript definiert hast, was genau gesucht werden soll?

Würde ich mal testen.


als Antwort auf: [#580524]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

cwenet
Beiträge gesamt: 1139

15. Jul 2021, 15:50
Beitrag # 12 von 20
Beitrag ID: #580528
Bewertung:
(7980 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Also die Textstellen werden in allen Dokumenten gefunden.
Nur das Verlinken bereitet mir Kopfzerbrechen.
Die Fundstelle enthält ja jeweils eine Ziffer.
Diese Ziffer stellt eine Seitenzahl dar.
Nun soll das Script auf diese Ziffer einen Hyperlink legen.
Das Ziel soll jeweils auf die passende Seitenzahl zeigen.
Mit meinen beiden Testdokumenten läuft das ja schon zur Hälfte.
Aber sobald eben im aktuellen Dokument die Seitenzahl nicht existiert, soll das Script im nächsten Dokument auf die Seite verlinken.


als Antwort auf: [#580527]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

cwenet
Beiträge gesamt: 1139

15. Jul 2021, 16:49
Beitrag # 13 von 20
Beitrag ID: #580532
Bewertung:
(7926 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich lege noch zum Verständnis die zwei Testdateien (bearbeitet) dazu.
So soll es nach dem Script aussehen. Zu sehen in der Hyperlink-Palette.

https://www.dropbox.com/s/08s1ykkongetpco/eins_nachher.idml?dl=0
https://www.dropbox.com/s/wi97gsyxwt7w9g1/zwei_nachher.idml?dl=0


als Antwort auf: [#580528]

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

WernerPerplies
Beiträge gesamt: 2762

15. Jul 2021, 17:37
Beitrag # 14 von 20
Beitrag ID: #580533
Bewertung:
(7903 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Christoph,

da ich weiß, wie sehr Du meine "einfachen" Skripte liebst, siehst Du hier meine Lösung. :-)

Notwendige Dateien findest Du hier:
Christoph.zip
Code
 #include "wpsFindGrepWithAppliedStyle.jsx"; 
#include "wpsFindGrep.jsx";
#include "wpsGetParentPageOfObjectIfPossible.jsx";
main();
/*Void*/function main(){
try{
var /*Array*/docs = app.documents.everyItem().getElements();
/*Array*/founds = findAnyTextWithCharStyle(docs, "mycharstyle"),
/*Array*/docs;
createHyperlinks(founds);
}
catch (error){
wpsHandleError(/*Error*/error);
}
return;
/*Array*/function findAnyTextWithCharStyle(/*Array*/docs, /*String*/charStyleName){
try{
var /*Int*/l = docs.length,
/*Array*/founds = [];

for (var i = 0; i < l; i++ ){
founds = founds.concat(
wpsFindGrepWithAppliedStyle(docs[i], docs[i].characterStyles.itemByName(charStyleName))
);
}
// prepare founds
l = founds.length;
for (var i = 0; i < l; i++ ){
page = wpsGetParentPageOfObjectIfPossible(founds[i]);
founds[i] = {found: founds[i], page: page, doc: (page.isValid) ? page.parent.parent : docs[0]};
}
}
catch (error){
wpsHandleError(/*Error*/error);
}
return founds;
}
/*Array*/function createHyperlinks(/*Array*/founds){
try{
var /*Int*/l = founds.length,
/*String*/pageName = "",
/*Page*/page = null,
/*HyperlinkTextSource*/hS = null,
/*Hyperlink*/hL = null,
/*HyperlinkDestination*/hD = null;

for (var i = 0; i < l; i++ ){
// get destination page
hS = founds[i].doc.hyperlinkTextSources.add(founds[i].found);
if (hS.isValid){
// get destination page
page = getDestinationPage(founds[i].found.contents);
if (page.isValid){
// create a hyperlinkTextSource
// is the Destination in same document as source?
if (founds[i].doc.pages.itemByName(page.name).isValid){
// yes! create an internal link
hD = founds[i].doc.hyperlinkPageDestinations.add(page);
}
else {
// no - create an external link!
hD = founds[i].doc.hyperlinkExternalPageDestinations.add(page);
}
if (hD.isValid ){
// create a hyperlink
hL = founds[i].doc.hyperlinks.add(hS, hD);
}
else{
// remove not needed source
hS.remove();
}
if (!(hL.isValid)){
if (hS.isValid)
hS.remove();
hl.remove();
}
}
}
}
}
catch (error){
wpsHandleError(/*Error*/error);
}
return founds;
}
/*Array*/function getDestinationPage(/*String*/pageName){
try{
var /*Int*/l = docs.length,
/*Page*/page = docs[0].pages.itemByName(""); // creates an invalid page
for (var i = 0; i < l; i++){
page = docs[i].pages.itemByName(pageName);
if (page.isValid)
break;
}
}
catch (error){
wpsHandleError(/*Error*/error);
}
return page;
}
/*Void*/function wpsHandleError(/*Error*/error){
alert(error.message + "\nFehlernummer: " + error.number.toString() + "\nin Zeile: " + error.line.toString())
}
}


Falls Du etwas nicht verstehst, kanns Du mich gerne fragen.


als Antwort auf: [#580532]
(Dieser Beitrag wurde von WernerPerplies am 15. Jul 2021, 17:40 geändert)

Mehrere Dokumente durchsuchen plus Hpyerlinks [Indd16, WIN10]

cwenet
Beiträge gesamt: 1139

15. Jul 2021, 17:48
Beitrag # 15 von 20
Beitrag ID: #580534
Bewertung:
(7887 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Werner,

du hast mich durchschaut. Dein "einfaches Script" erschlägt mich.
Ich verstehe nur Bahnhof.
Dennoch natürlich tausend Dank.
Da war ich ja Meilen weit weg.

Viele Grüße
Christoph


als Antwort auf: [#580533]
X