[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Ein Script stört das Andere?

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

Ein Script stört das Andere?

Ralf Hobirk
Beiträge gesamt: 5961

11. Nov 2013, 23:17
Beitrag # 1 von 17
Bewertung:
(4830 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

nach dem "11.11. Phänomen" im ID.Forum habe ich jetzt doch noch was Ernsthaftes:

Ich habe ein Script zur Textformatierung (im Grunde jede Menge Text- und GREP- S&E Routinen), das einwandfrei funktioniert. Dann habe ich noch ein zweites Script (PT_2014_final.jsx), das auch einwandfrei funktioniert.

Wenn ich jetzt PT_2014_final.jsx ausführe, funktioniert das erste Script nicht mehr wie gewünscht. Ich muss InDesign beenden und wieder starten, damit es funktioniert. Das tut es dann auch, aber nur solange ich PT_2014_final.jsx nicht wieder ausführe…

Ich habe das Script mal hier angehängt. Nachfolgend der Codeschnipsel, den ich im Verdacht habe, dass er mir "irgendwas verstellt".

Code
// =========================================================================================== 
// Minus (-) durch EmDash ersetzen
// ===========================================================================================

app.findTextPreferences = null;
app.changeTextPreferences = null;
app.findTextPreferences.findWhat = '-';
app.findTextPreferences.appliedParagraphStyle = 'RS Basis';
app.findChangeTextOptions.wholeWord = true;
app.changeTextPreferences.changeTo = '\u2014';
app.activeDocument.changeText();

// ===========================================================================================
// Leere Zellen mit Geviertstrich (em dash) fuellen
// = FillCellsWithEmDash.jsx
// ===========================================================================================

var d = app.documents.firstItem();
for (var s = 0; s < d.stories.length; s++)
{
for (var t = 0; t < d.stories.item(s).tables.length; t++)
{
for (var c = 0; c < d.stories.item(s).tables.item(t).cells.length; c++)
{
var _content = d.stories.item(s).tables.item(t).cells.item(c).texts.firstItem().contents;
if (_content.replace(/\s+/g,'') == '')
{
d.stories.item(s).tables.item(t).cells.item(c).texts.firstItem().contents = '\u2014';
}
}
}
}

app.findTextPreferences = app.changeTextPreferences = null;


Hat irgendjemand eine Idee, wo der Hund begraben liegt?

Anhang:
PT_2014_final.jsx (21.3 KB)
X

Ein Script stört das Andere?

Martin Fischer
  
Beiträge gesamt: 12783

12. Nov 2013, 07:32
Beitrag # 2 von 17
Beitrag ID: #519593
Bewertung:
(4789 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ralf,

wenn ich Deinen Anhang runterlade, kommt nur eine HTML-Datei mit jsx-Endung an.
Kannst Du die betroffene Datei mal zippen und neu anbieten?


als Antwort auf: [#519592]

Ein Script stört das Andere?

WernerPerplies
Beiträge gesamt: 2762

12. Nov 2013, 07:42
Beitrag # 3 von 17
Beitrag ID: #519594
Bewertung:
(4786 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ralf,

das könnte etwas mit der Sichtbarkeit der Variablen zu tun haben. Wenn ich das richtig sehe, deklarierst Du globale Variablen.

Kapsel Deine Skripte bitte so:

Code
main() 

/*void*/function main()
{
// hier gehört Dein Programmcode hin

return;
}


Globale Varablen bleiben auch nach Beendigung des Skriptes in der ausführenden Maschine erhalten.


als Antwort auf: [#519592]

Ein Script stört das Andere?

Hans Haesler
  
Beiträge gesamt: 5826

12. Nov 2013, 09:07
Beitrag # 4 von 17
Beitrag ID: #519599
Bewertung:
(4756 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

Zitat Globale Varablen bleiben auch nach Beendigung des Skriptes in der ausführenden Maschine erhalten.

Demnach sollten die beiden angehängten Schnipsel denselben Dialog zeigen.

"test_global_1.js"
Code
var msg = "Hello World!"; 
alert (msg);

"test_global_2.js"
Code
alert (msg); 

Doch beim zweiten kommt eine Fehlermeldung. Sowohl unter Mac OS X als auch unter Windows XP.

Gruss, Hans


als Antwort auf: [#519594]
Anhang:
test_global_1.js (38 B)   test_global_2.js (12 B)

Ein Script stört das Andere?

WernerPerplies
Beiträge gesamt: 2762

12. Nov 2013, 09:38
Beitrag # 5 von 17
Beitrag ID: #519602
Bewertung:
(4741 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen Hans,

im ESTK:

Fenster 1:
Code
var thisText = "Dieser Text" ; 

ausgeführt
Fenster 2:
Code
alert(thisText); 

ausgeführt:
-> angezeigt: "Dieser Text"

Und jetzt kommt's:

Bei Deinen Beispiel funktioniert es nicht!

Weiter gesucht:

Ergebnis:

Zielmaschine:
Extended Toolkit:
Meine Aussage ist korrekt! - und ich behaupte auch mal, so ist es der Standard.

Zielmaschine InDesign:
Meine Aussage ist nicht korrekt, - aber das ist wohl nicht das Standardverhalten bei JavaScript.

Die Indesignmaschine kapselt das wohl alles in eine Funktion.

Meine Empfehlung nach wie vor:

Immer eine Funktion aufrufen, das entspricht dem Standard und funktioniert in beiden Fällen.


als Antwort auf: [#519599]

Ein Script stört das Andere?

Hans Haesler
  
Beiträge gesamt: 5826

12. Nov 2013, 09:47
Beitrag # 6 von 17
Beitrag ID: #519603
Bewertung:
(4735 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

das ESTK benutze ich höchst selten.

In der Praxis werden doch die InDesign-Scripts ab Bedienfeld (oder per Tastaturkürzel) gestartet und die main()-Verkapselung ist überflüssig.

Aber Ralf wird schon berichten, ob main() sein Problem löst.

Gruss, Hans


als Antwort auf: [#519602]

Ein Script stört das Andere?

WernerPerplies
Beiträge gesamt: 2762

12. Nov 2013, 09:55
Beitrag # 7 von 17
Beitrag ID: #519605
Bewertung:
(4730 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

Zitat In der Praxis werden doch die InDesign-Scripts ab Bedienfeld (oder per Tastaturkürzel) gestartet und die main()-Verkapselung ist überflüssig.


Nicht alles was funktioniert ist beim Programmieren richtig.

Viele der hier gezeigten Code-Schnipsel funktionieren nur, weil zufällig bestimmte Bedingungen gelten.

Ich bleibe dabei, jedes Script sollte so aussehen:

Zitat main();

/*void*/function main()
{
...
return;
}


Oder wenn man globale Variablen braucht, so:
Zitat var global = {};
main();

/*void*/function main()
{
...
return;
}
global = null;

Ab jeder ist seines Glückes Schmied! ;-)


als Antwort auf: [#519603]

Ein Script stört das Andere?

gfellenz
Beiträge gesamt: 121

12. Nov 2013, 10:39
Beitrag # 8 von 17
Beitrag ID: #519612
Bewertung:
(4679 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Meine Aussage ist nicht korrekt, - aber das ist wohl nicht das Standardverhalten bei JavaScript.

Die Indesignmaschine kapselt das wohl alles in eine Funktion.


Das Standardverhalten von JavaScript ist von Werner korrekt beschrieben. Wenn man in InDesign eine
Code
#targetengine engineName 

definiert verhält sich InDesign auch wie erwartet.

Ausschließlich die default Engine main kapselt die Ausführung. Ich hatte das auch mal irgendwo in einem Adobe Doc gelesen, finde aber auf die schnelle nicht die Quelle.
Das ganze erleichtert das Skripting für Anfänger.
Ich würde grundsätzlich dazu raten Skripte mit der hier dargestellte Variante main()... würde ich als Best Practise bezeichnen.


als Antwort auf: [#519602]

Ein Script stört das Andere?

Ralf Hobirk
Beiträge gesamt: 5961

12. Nov 2013, 14:58
Beitrag # 9 von 17
Beitrag ID: #519642
Bewertung:
(4624 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Erstmal danke euch allen!

Ich habe Werners Code vor bzw. hinter meinen Code gesetzt, aber das ändert leider nichts daran, dass das andere Script nicht das macht, was es soll. Erst nach Beenden + Neustart von InDesign.

Ich habe jetzt die beiden Scripts gezippt und angehängt.

Das Script Import_HT.jsx funktioniert nur nach Neustart von InDesign, aber nicht nach Ausführen des Scripts PT_2014_final.jsx.


als Antwort auf: [#519612]
Anhang:
Import_HT.jsx.zip (2.41 KB)   PT_2014_final.jsx.zip (1.61 KB)

Ein Script stört das Andere?

drerol74
Beiträge gesamt: 507

12. Nov 2013, 15:24
Beitrag # 10 von 17
Beitrag ID: #519645
Bewertung:
(4604 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ralf,

hab's jetzt nicht getestet, aber versuch mal die Zeile

Code
app.findChangeTextOptions.wholeWord = false; 

ans Ende des Skripts »PT_2014_final.jsx« zu setzen.

Schöne Grüße
Roland


als Antwort auf: [#519642]

Ein Script stört das Andere?

Ralf Hobirk
Beiträge gesamt: 5961

12. Nov 2013, 15:37
Beitrag # 11 von 17
Beitrag ID: #519646
Bewertung:
(4596 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roland,

bingo! Genau das hat's gebracht. InDesign merkt sich also irgendwo die "Whole Word" Option. :-(

Hiermit:
Code
app.findTextPreferences = app.changeTextPreferences = null; 

setze ich ja die Change Preferences zurück.

Könnte so etwas:
Code
app.findChangeTextOptions = null; 

dann eventuell auch Optionen wie "Whole Word" oder "Case Sensitive" zurücksetzen?

Ich muss anfügen, dass ich relativer Script-Dummy bin. Alles was ich kann, ist verschiedene (meist hier auf HDS von euch erhaltene) Codeschnipsel zusammenzubauen oder auch hier und da zu modifizieren. aber wehe, es geht ans Eingemachte…


als Antwort auf: [#519645]

Ein Script stört das Andere?

WernerPerplies
Beiträge gesamt: 2762

12. Nov 2013, 15:38
Beitrag # 12 von 17
Beitrag ID: #519647
Bewertung:
(4594 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ralf,

und wenn Rolands Tipp nicht hilft, wäre es nett, wenn Du auch noch eine passende IDML-Datei zur Verfügung stellen würdest.

Und noch eine Empfehlung:

Packe einen Deiner Blöcke in ein Funktion und dann rufst Du diese Funktion nur mit den drei Parametern auf.

In etwa so:

main();

Code
/*void */function main() 
{
// noch nicht getestet, sollte aber funktionieren
sar('\\s(\\*)', 'Pictoleiste','$1');
/*void*/function sar(/*string*/findwhat, /*string|ParagraphStyle*/ paraStyle,
/*string*/changeTo)
{
app.findGrepPreferences = null;
app.changeGrepPreferences = null;
app.findGrepPreferences.findWhat = findwhat;
app.findGrepPreferences.appliedParagraphStyle = paraStyle;
app.changeGrepPreferences.changeTo = changeTo;
app.activeDocument.changeGrep();
return;
}
return;
}



als Antwort auf: [#519642]

Ein Script stört das Andere?

Ralf Hobirk
Beiträge gesamt: 5961

12. Nov 2013, 15:49
Beitrag # 13 von 17
Beitrag ID: #519648
Bewertung:
(4586 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Anliegend eine Test-IDML und ein Font, ohne den das Ganze keinen Sinn machen würde (selbstgebauter Picto-Font).


als Antwort auf: [#519647]
(Dieser Beitrag wurde von Ralf Hobirk am 12. Nov 2013, 15:50 geändert)

Anhang:
LagunaTest.idml (170 KB)   RivaPicto-Regular.otf.zip (10.1 KB)

Ein Script stört das Andere?

drerol74
Beiträge gesamt: 507

12. Nov 2013, 15:57
Beitrag # 14 von 17
Beitrag ID: #519649
Bewertung:
(4574 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Könnte so etwas:
Code

app.findChangeTextOptions = null;

dann eventuell auch Optionen wie "Whole Word" oder "Case Sensitive" zurücksetzen?

Damit setzt du dann aber auch die Option "Fußnoten einbeziehen" zurück, die beim Neustart von Indesign erhalten bleibt. Wenn das gewünscht ist, kannst du das so machen.

oder eben mit
Code
app.findChangeTextOptions = NothingEnum.nothing; 

geht auch.

Schöne Grüße
Roland


als Antwort auf: [#519646]

Ein Script stört das Andere?

Ralf Hobirk
Beiträge gesamt: 5961

12. Nov 2013, 15:59
Beitrag # 15 von 17
Beitrag ID: #519651
Bewertung:
(4565 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke!

Fußnoten-Optionen sind mir egal, da es bei meinen Jobs keine Fußnoten gibt. Um mich vollständig zu outen: Ich habe im Leben noch keine Fußnoten gesetzt und auch Null Ahnung davon (außer dass ich hier immer wieder über Probleme mit diesen lese). Aber keine Sorge, ich produziere keine Bücher, sondern ausschließlich Reisekataloge…


als Antwort auf: [#519649]
X