hilfdirselbst.ch
Facebook Twitter gamper-media
« « 1 2 » »  
Ralf Hobirk p
Beiträge: 5748
11. Nov 2013, 23:17
Beitrag #1 von 17
Bewertung:
(3970 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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?

---
Viele Grüße aus Istrien Cool
Ralf
---
iMac i7 (12,2) 3,4 GHz, 16 GB | MacBook Pro 15" (8,2) 2,0 GHz, 16 GB | Mac Mini (3,1) als Server 2,53 GHz, 8 GB | 10.11.6 El Capitan | CS6 (ID 8.0.1) Top

Anhang:
 
X
Martin Fischer  M  p
Beiträge: 11784
12. Nov 2013, 07:32
Beitrag #2 von 17
Beitrag ID: #519593
Bewertung:
(3929 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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?

Viele Grüße
Martin
als Antwort auf: [#519592] Top
 
WernerPerplies
Beiträge: 2177
12. Nov 2013, 07:42
Beitrag #3 von 17
Beitrag ID: #519594
Bewertung:
(3926 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#519592] Top
 
Hans Haesler  M  p
Beiträge: 5557
12. Nov 2013, 09:07
Beitrag #4 von 17
Beitrag ID: #519599
Bewertung:
(3896 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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] Top

Anhang:
 
WernerPerplies
Beiträge: 2177
12. Nov 2013, 09:38
Beitrag #5 von 17
Beitrag ID: #519602
Bewertung:
(3881 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#519599] Top
 
Hans Haesler  M  p
Beiträge: 5557
12. Nov 2013, 09:47
Beitrag #6 von 17
Beitrag ID: #519603
Bewertung:
(3875 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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] Top
 
WernerPerplies
Beiträge: 2177
12. Nov 2013, 09:55
Beitrag #7 von 17
Beitrag ID: #519605
Bewertung:
(3870 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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! ;-)

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#519603] Top
 
gfellenz
Beiträge: 110
12. Nov 2013, 10:39
Beitrag #8 von 17
Beitrag ID: #519612
Bewertung:
(3819 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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.
--
Grüße aus Köln,
Gregor Fellenz
http://www.indesignblog.com
als Antwort auf: [#519602] Top
 
Ralf Hobirk p
Beiträge: 5748
12. Nov 2013, 14:58
Beitrag #9 von 17
Beitrag ID: #519642
Bewertung:
(3764 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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.

---
Viele Grüße aus Istrien Cool
Ralf
---
iMac i7 (12,2) 3,4 GHz, 16 GB | MacBook Pro 15" (8,2) 2,0 GHz, 16 GB | Mac Mini (3,1) als Server 2,53 GHz, 8 GB | 10.11.6 El Capitan | CS6 (ID 8.0.1)
als Antwort auf: [#519612] Top

Anhang:
 
drerol74 m
Beiträge: 387
12. Nov 2013, 15:24
Beitrag #10 von 17
Beitrag ID: #519645
Bewertung:
(3744 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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] Top
 
Ralf Hobirk p
Beiträge: 5748
12. Nov 2013, 15:37
Beitrag #11 von 17
Beitrag ID: #519646
Bewertung:
(3736 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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…

---
Viele Grüße aus Istrien Cool
Ralf
---
iMac i7 (12,2) 3,4 GHz, 16 GB | MacBook Pro 15" (8,2) 2,0 GHz, 16 GB | Mac Mini (3,1) als Server 2,53 GHz, 8 GB | 10.11.6 El Capitan | CS6 (ID 8.0.1)
als Antwort auf: [#519645] Top
 
WernerPerplies
Beiträge: 2177
12. Nov 2013, 15:38
Beitrag #12 von 17
Beitrag ID: #519647
Bewertung:
(3734 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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;
}


Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#519642] Top
 
Ralf Hobirk p
Beiträge: 5748
12. Nov 2013, 15:49
Beitrag #13 von 17
Beitrag ID: #519648
Bewertung:
(3726 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


Anliegend eine Test-IDML und ein Font, ohne den das Ganze keinen Sinn machen würde (selbstgebauter Picto-Font).

---
Viele Grüße aus Istrien Cool
Ralf
---
iMac i7 (12,2) 3,4 GHz, 16 GB | MacBook Pro 15" (8,2) 2,0 GHz, 16 GB | Mac Mini (3,1) als Server 2,53 GHz, 8 GB | 10.11.6 El Capitan | CS6 (ID 8.0.1)
als Antwort auf: [#519647]
(Dieser Beitrag wurde von Ralf Hobirk am 12. Nov 2013, 15:50 geändert)
Top

Anhang:
 
drerol74 m
Beiträge: 387
12. Nov 2013, 15:57
Beitrag #14 von 17
Beitrag ID: #519649
Bewertung:
(3714 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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] Top
 
Ralf Hobirk p
Beiträge: 5748
12. Nov 2013, 15:59
Beitrag #15 von 17
Beitrag ID: #519651
Bewertung:
(3705 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Ein Script stört das Andere?


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…

---
Viele Grüße aus Istrien Cool
Ralf
---
iMac i7 (12,2) 3,4 GHz, 16 GB | MacBook Pro 15" (8,2) 2,0 GHz, 16 GB | Mac Mini (3,1) als Server 2,53 GHz, 8 GB | 10.11.6 El Capitan | CS6 (ID 8.0.1)
als Antwort auf: [#519649] Top
 
« « 1 2 » »  
X