[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt findchangebylist verhält sich eigenartig (CS4, WIN)

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

findchangebylist verhält sich eigenartig (CS4, WIN)

cwenet
Beiträge gesamt: 1092

14. Mär 2011, 12:49
Beitrag # 1 von 9
Bewertung:
(2704 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Tag,

mit diesen Zeilen möchte ich bei Überschriften das Zeichenformat Bold entfernen:

Code
text	{appliedCharacterStyle:"Bold", appliedParagraphStyle:"U1"}	{appliedCharacterStyle:"[No character style]", changeConditionsMode:1919250519}	{includeLockedStoriesForFind:false, includeLockedLayersForFind:false, includeHiddenLayers:false, includeMasterPages:false, includeFootnotes:true, wholeWord:false, caseSensitive:false}	//Kommentar 
text {appliedCharacterStyle:"Bold", appliedParagraphStyle:"U2"} {appliedCharacterStyle:"[No character style]", changeConditionsMode:1919250519} {includeLockedStoriesForFind:false, includeLockedLayersForFind:false, includeHiddenLayers:false, includeMasterPages:false, includeFootnotes:true, wholeWord:false, caseSensitive:false} //Kommentar
text {appliedCharacterStyle:"Bold", appliedParagraphStyle:"U3"} {appliedCharacterStyle:"[No character style]", changeConditionsMode:1919250519} {includeLockedStoriesForFind:false, includeLockedLayersForFind:false, includeHiddenLayers:false, includeMasterPages:false, includeFootnotes:true, wholeWord:false, caseSensitive:false} //Kommentar
text {appliedCharacterStyle:"Bold", appliedParagraphStyle:"U4"} {appliedCharacterStyle:"[No character style]", changeConditionsMode:1919250519} {includeLockedStoriesForFind:false, includeLockedLayersForFind:false, includeHiddenLayers:false, includeMasterPages:false, includeFootnotes:true, wholeWord:false, caseSensitive:false} //Kommentar
text {appliedCharacterStyle:"Bold", appliedParagraphStyle:"U5"} {appliedCharacterStyle:"[No character style]", changeConditionsMode:1919250519} {includeLockedStoriesForFind:false, includeLockedLayersForFind:false, includeHiddenLayers:false, includeMasterPages:false, includeFootnotes:true, wholeWord:false, caseSensitive:false} //Kommentar
text {appliedCharacterStyle:"Bold", appliedParagraphStyle:"U6"} {appliedCharacterStyle:"[No character style]", changeConditionsMode:1919250519} {includeLockedStoriesForFind:false, includeLockedLayersForFind:false, includeHiddenLayers:false, includeMasterPages:false, includeFootnotes:true, wholeWord:false, caseSensitive:false} //Kommentar



Solange U6 als Absatzformat im Dokument existiert funktioniert alles.
Sobald ich aber das Absatzformat aus dem Dokument lösche und das Script ausführe, werden alle Bold Auszeichnungen im Dokument entfernt. Auch im Absatzformat Normal.
Hat jemand eine Idee was da schief läuft? Es ist zum Verzweifeln.
Ich erlaube doch nirgends, dass woanders als in U1 bis U6 die Formatierung Bold entfernt werden darf.

Gruß
Christoph
X

findchangebylist verhält sich eigenartig (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12691

14. Mär 2011, 14:14
Beitrag # 2 von 9
Beitrag ID: #466949
Bewertung:
(2687 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Ich erlaube doch nirgends, dass woanders als in U1 bis U6 die Formatierung Bold entfernt werden darf.


Das Skript lässt sich eben nicht so einfach was verbieten. ;-)

Im Ernst:
Im Kern des Skripts werden aus den Zeilen in der Liste, die Du zitiert hast, Eigenschaften im Paket an die Sucheinstellungen übergeben. Dabei wird zunächst ein String für ein JavaScript erzeugt, das in der Zeile danach ausgeführt wird.

Code
var myString = "app.findTextPreferences.properties = "+ myFindPreferences + ";";   
app.doScript(myString, ScriptLanguage.javascript);


Wenn im Dokument nun das Absatzformat 'U6' nicht existiert, dann wird diese Eigenschaft einfach nicht übergeben und es wird statt dessen das übergeben, was übergeben werden kann – in Deinem Fall das Zeichenformat '[Bold]'.

Deswegen wirkt Dein Suchstring
Code
text	{appliedCharacterStyle:"Bold", appliedParagraphStyle:"U6"}	{appliedCharacterStyle:"[No character style]", changeConditionsMode:1919250519}	{includeLockedStoriesForFind:false, includeLockedLayersForFind:false, includeHiddenLayers:false, includeMasterPages:false, includeFootnotes:true, wholeWord:false, caseSensitive:false}	//Kommentar 


wie
Code
text	{appliedCharacterStyle:"Bold"}	{appliedCharacterStyle:"[No character style]", changeConditionsMode:1919250519}	{includeLockedStoriesForFind:false, includeLockedLayersForFind:false, includeHiddenLayers:false, includeMasterPages:false, includeFootnotes:true, wholeWord:false, caseSensitive:false}	//Kommentar 


Also: ersetze Text mit dem Zeichenformat 'Bold' durch ZF '[Ohne]'.
Das nicht vorhandene AF 'U6' fällt einfach unter den Tisch.

Die Art und Weise der Übergabe lässt diesen Fehler bzw. das von Dir so nicht erwartete Verhalten zu. Für strengere Maßstäbe müssten die einzelnen Parameter, die vom Dokument abhängen (Formate, Stile, Farben usw.) eigentlich erst auf ihre Existenz (isValid()) geprüft werden.

Einfacher Workaround:
Sorge dafür, dass alle Formate, Stile, Farben usw., die Deine Liste erwartet, im Dokument vorhanden sind.


als Antwort auf: [#466942]

findchangebylist verhält sich eigenartig (CS4, WIN)

cwenet
Beiträge gesamt: 1092

14. Mär 2011, 15:24
Beitrag # 3 von 9
Beitrag ID: #466958
Bewertung:
(2667 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Martin,

da bin ich aber froh, dass es hierfür eine Erkärung gibt.
Hab mich schön für verrückt erklärt.
Danke für Deine ausführliche Erläuterung.

Kann ich denn schon in der Suchen und Ersetzen Liste dafür sorgen, dass das Absatzformat schon erzeugt wird?

Wie mache ich das denn am elegantesten, ohne dass ich jedesmal das Dokument manuell auf fehlende AFs durchsuchen muss?

Die Funktion isValid() muss wahrscheinlich in das Originalscript von Adobe (findchangebylist.jsx) eingbaut werden?
Oder gibt es da schon eine neuere Version, die dies berücksichtig?

Gruss
Christoph


als Antwort auf: [#466949]

findchangebylist verhält sich eigenartig (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12691

14. Mär 2011, 16:02
Beitrag # 4 von 9
Beitrag ID: #466961
Bewertung:
(2656 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Christoph,

Antwort auf: Kann ich denn schon in der Suchen und Ersetzen Liste dafür sorgen, dass das Absatzformat schon erzeugt wird?


Nein, die Liste ist dumm.
Die Intelligenz sitzt im Skript (oder auch nicht).

Es wäre vorstellbar, dass im Skript geprüft wird, ob die einzelnen angegebenen Objekte im Dokument auch zur Verfügung stehen (es geht ja nicht nur um die Absatzformate, sondern auch um andere Formate, Stile, Farbfelder ...).
Dazu müsste man eine Positivliste an Objekten definieren, die ggf. geprüft werden sollen.
Beim Fehlen eines solchen Objekts (Absatzformat 'U6') könnte das Skript entweder veranlassen, den Ersetzevorgang nicht auszuführen oder das entsprechende Objekt zu erzeugen (Absatzformat mit diesem Namen anlegen). Letzteres würde aber nur dann Sinn machen, wenn das Objekt ein Element der Ersetzeeinstellungen wäre.
Beim Suchen ist das uninteressant, denn wenn das Objekt fehlt, wird es auch nicht gefunden, wenn es zwar angelegt, aber keinem Text zugewiesen wird.

Das Obige dürfte etwas mühsam in das vorhandene FCBL zu integrieren sein.

Leider ist es auch nicht möglich, nach Ausführung von app.doScript(myString, ScriptLanguage.javascript); die dann aktiven Sucheinstellungen als String (app.findTextPreferences.properties.toSource();) mit dem zuvor übergebenen String myString zu vergleichen.

Denn in den app.findTextPreferences.properties sind immer alle Eigenschaften aufgeführt und nicht nur die explizit zugewiesenen und scharfen.
Und – interessanterweise wird das AF 'U1' in den properties als Suchparameter aufgelistet, obwohl im Dokument nicht vorhanden und bei der Suche nicht wirksam.

Im Moment will mir keine einfache und wirkungsvolle Lösung einfallen.


als Antwort auf: [#466958]

findchangebylist verhält sich eigenartig (CS4, WIN)

cwenet
Beiträge gesamt: 1092

14. Mär 2011, 17:53
Beitrag # 5 von 9
Beitrag ID: #466972
Bewertung:
(2635 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Martin,

dennoch vielen Dank für Deine Antwort.

Da es in meinem Fall nur um Absatzformate und Zeichenformate geht, habe ich mir gedacht ich könnte folgende Zeilen am Anfang des findchangebylist.jsx Scripts voranstellen und somit die benötigten Absatzformate z. B. U1 bis U6 bereitstellen:

Code
if( app.activeDocument.paragraphStyles.item( 'U6' ) == null )    
{
app.documents[0].paragraphStyles.add().name="U6";
}


Bitte widerspreche mir, wenn der Gedanke nicht gut sein sollte.

Danke und Gruß
Christoph


als Antwort auf: [#466961]
(Dieser Beitrag wurde von cwenet am 14. Mär 2011, 17:54 geändert)

findchangebylist verhält sich eigenartig (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12691

14. Mär 2011, 18:07
Beitrag # 6 von 9
Beitrag ID: #466973
Bewertung:
(2631 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Christoph,

die Zielrichtung ist in Ordnung.
Aber der Prüfung, ob null, müsste eine Setzung der Variable für das Absatzformats vorangehen. app.activeDocument.paragraphStyles.item( 'U6' ) liefert von sich aus keinen Wert null zurück.

Hier ein Beispiel:
Code
var ps = null; 
ps = app.activeDocument.paragraphStyles.itemByName( 'U6' ); // wenn AF U6 vorhanden, dann AF U6; andernfalls bleibt ps null
if( ps == null )
{
ps = app.activeDocument.paragraphStyles.add( {name:"U6"} );
}



Ab CS4 geht auch

Code
if (app.activeDocument.paragraphStyles.itemByName( 'U6' ).isValid == false)  
{
ps = app.activeDocument.paragraphStyles.add( {name:"U6"} );
}


Das Hauptproblem ist die Spezifizierung auf's Konkrete.
Du hättest damit das Problem mit AF 'U6' abgefangen.
Was aber, wenn anderswo AF 'U5' fehlt?

Deswegen wäre es sinnvoller, etwa ein Skript zu entwickeln, das die Liste von FCBL nach erforderlichen Absatzformaten analysiert und dafür sorgt, dass diese bei Bedarf mit einer Funktion analog zu dem o.g. Beispiel neu erstellt werden.

Dieses Skript könnte FindChangeByList.jsx vorgeschaltet oder darin integriert werden.

Aber so richtig glücklich wäre ich mit dieser Lösung noch nicht.
Denn die Konsequenz wäre, dass möglicherweise zuhauf neue Formate im Dokument erstellt werden, für die es keinen konkreten Bedarf über FCBL hinaus gibt.

In FCBL würde es ausreichen, wenn ein nicht vorhandenes AF bei den Suchvoreinstellungen auftaucht, dass die Suche übergangen wird. Anders sieht es bei den Ersetzen-Einstellungen aus. Dort müsste tatsächlich dafür gesorgt werden, dass die entsprechenden Formate bei Bedarf angelegt werden.


als Antwort auf: [#466972]
(Dieser Beitrag wurde von Martin Fischer am 14. Mär 2011, 18:17 geändert)

findchangebylist verhält sich eigenartig (CS4, WIN)

cwenet
Beiträge gesamt: 1092

14. Mär 2011, 19:08
Beitrag # 7 von 9
Beitrag ID: #466982
Bewertung:
(2606 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Lieber Martin,

vielen Dank für die angepassten Codezeilen.
Nun wollte ich das über eine Schleife lösen:

Code
var headlines = ["U1", "U2", "U3", "U4", "U5", "U6"]; 

for (var i=0; i < headlines.length; i++){


if (app.activeDocument.paragraphStyles.itemByName( headlines(i) ).isValid == false)
{
ps = app.activeDocument.paragraphStyles.add( {name: headlines(i)} );
}

}


Indesign meldet aber, dass Array keine Funktion ist.
Hast Du eine Idee, wie ich das anpassen muss?



Gruss
Christoph


als Antwort auf: [#466973]

findchangebylist verhält sich eigenartig (CS4, WIN)

Martin Fischer
  
Beiträge gesamt: 12691

14. Mär 2011, 19:39
Beitrag # 8 von 9
Beitrag ID: #466983
Bewertung:
(2601 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Nimm headlines[i] mit eckigen Klammern, statt den runden.
So sprichst Du ein Element eines Arrays an. Eine runde Klammer hinter einem Bezeichner läßt ihn als Funktionsaufruf erscheinen.


als Antwort auf: [#466982]
(Dieser Beitrag wurde von Martin Fischer am 14. Mär 2011, 19:41 geändert)

findchangebylist verhält sich eigenartig (CS4, WIN)

cwenet
Beiträge gesamt: 1092

14. Mär 2011, 19:46
Beitrag # 9 von 9
Beitrag ID: #466985
Bewertung:
(2595 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
So klappt es.
Vielen Dank Martin.

Schönen Abend.
Christoph


als Antwort auf: [#466983]
X