[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: 1148

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

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

Code
  1. 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: 12885

14. Mär 2011, 14:14
Beitrag # 2 von 9
Beitrag ID: #466949
Bewertung:
(2835 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
  1. 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
  1. 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
  1. 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: 1148

14. Mär 2011, 15:24
Beitrag # 3 von 9
Beitrag ID: #466958
Bewertung:
(2815 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: 12885

14. Mär 2011, 16:02
Beitrag # 4 von 9
Beitrag ID: #466961
Bewertung:
(2804 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: 1148

14. Mär 2011, 17:53
Beitrag # 5 von 9
Beitrag ID: #466972
Bewertung:
(2783 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
  1. 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: 12885

14. Mär 2011, 18:07
Beitrag # 6 von 9
Beitrag ID: #466973
Bewertung:
(2779 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
  1. 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
  1. 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: 1148

14. Mär 2011, 19:08
Beitrag # 7 von 9
Beitrag ID: #466982
Bewertung:
(2754 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
  1. 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: 12885

14. Mär 2011, 19:39
Beitrag # 8 von 9
Beitrag ID: #466983
Bewertung:
(2749 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: 1148

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

Schönen Abend.
Christoph


als Antwort auf: [#466983]
X