Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Verankerte Rahmen lösen (WIN CS4 JS)

Verankerte Rahmen lösen (WIN CS4 JS)

cwenet
Beiträge gesamt: 1139

15. Apr 2010, 15:45
Bewertung:

gelesen: 2243

Beitrag als Lesezeichen
Guten Tag,

mit diesem Script (habe ich hier gefunden) möchte ich meine Mariginalflächen als Text wieder in den Fliesstext zurückführen. Wie schaffe ich es, das ich noch ein Absatzformat zuweisen kann?
Meine eingefügte Scriptzeile will nicht funktionieren.
Ausserdem soll der gefundene Marginaltext vor den aktuellen Absatz platziert werden.

Code
var myStartTag = "\r<Marg>";  
var myEndTag = "</Marg>\r";

Object.prototype.isText = function()
{
switch(this.constructor.name)
{
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
return true;
default :
return false;
}
}

if ((app.selection.length > 0) && (app.selection[0].isText))
{
var myItems = app.selection[0].allPageItems;
for (oneItem = myItems.length-1; oneItem >= 0; oneItem--)
{
if (myItems[oneItem].constructor.name == "TextFrame")
{
//myItems[oneItem].parent.insertionPoints[0].fillColor = "Red";
myItems[oneItem].parent.insertionPoints[0].contents = myStartTag; // Einfügen des Start-Tags

//myItems[oneItem].parent.insertionPoints[-1].fillColor = "Red";
myItems[oneItem].parent.insertionPoints[-1].contents = myEndTag; // Einfügen des End-Tags
// Verschieben des Inhalts des verankerten Textrahmens
myItems[oneItem].texts[0].move(LocationOptions.before, myItems[oneItem].parent.insertionPoints[0]);
myItems[oneItem].paragraphs[0].appliedParagraphStyle = "Marginalie";
myItems[oneItem].remove(); // Löschen des verankerten Textrahmens
}
}
}


Über Hilfe freut sich Christoph, Grüße

Verankerte Rahmen lösen (WIN CS4 JS)

Martin Fischer
  
Beiträge gesamt: 12783

16. Apr 2010, 07:41
Bewertung:

gelesen: 2208

Beitrag als Lesezeichen
Hallo Christoph,

Du verschiebst erst den Text aus dem verankerten Textrahmen
myItems[oneItem].texts[0].move(LocationOptions.before, myItems[oneItem].parent.insertionPoints[0]);,

dann versuchst Du, dem ersten Absatz in dem verankerten Textrahmen ein Absatzformat zuzuweisen
myItems[oneItem].paragraphs[0].appliedParagraphStyle = "Marginalie";

und schließlich löscht Du den verankerten Textrahmen
myItems[oneItem].remove();.



Du solltest das Absatzformat vor dem Verschieben des Texts aus dem verankerten Textrahmen zuweisen. Und zwar dem gesamten Text im Textabschnitt des verankerten Textrahmens: myItems[oneItem].parentStory.texts[0].appliedParagraphStyle = "Marginalie";

Die Tags würde ich vor der Formatzuweisung oder danach (auf jeden Fall aber vor dem Verschieben) dem Text des verankerten Rahmens hinzufügen.

Die Position für den Start-Tag wäre myItems[oneItem].insertionPoints[0].
Die des End-Tags myItems[oneItem].parentStory.texts[0].insertionPoints[-1].
Bestimme jeweils deren contents.

----
Ach ja, das Ziel für das Verschieben wäre nicht die Position am Anker des verankerten Textrahmens, sondern am ersten Einfügepunkt des ersten Absatzes des Ankerpunkts.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 16. Apr 2010, 07:43 geändert)

Verankerte Rahmen lösen (WIN CS4 JS)

cwenet
Beiträge gesamt: 1139

16. Apr 2010, 08:33
Bewertung:

gelesen: 2192

Beitrag als Lesezeichen
Vielen Dank Martin,

nun habe ich das Script wie folgt umgebaut:

Code
if ((app.selection.length > 0) && (app.selection[0].isText))   
{
var myItems = app.selection[0].allPageItems;
for (var oneItem=0; oneItem<myItems.length; oneItem++)
{
if (myItems[oneItem].constructor.name == "TextFrame")
{

myItems[oneItem].parentStory.texts[0].appliedParagraphStyle = "Marginalie";

myItems[oneItem].insertionPoints[0].contents = myStartTag; // Einfügen des Start-Tags

myItems[oneItem].parentStory.texts[0].insertionPoints[-1].contents = myEndTag; // Einfügen des End-Tags

// Verschieben des Inhalts des verankerten Textrahmens
myItems[oneItem].texts[0].move(LocationOptions.before, myItems[oneItem].parent.texts[0].paragraphs[0].insertionPoints[0]);

myItems[oneItem].remove(); // Löschen des verankerten Textrahmens
}
}
}


Klappt sehr gut. Ich habe die Schleife umgedreht, damit die Reihenfolge der neu platzierten Marginal-Absätze stimmt.
Bin mir nicht sicher, ob das so in Ordnung geht. Kann ich in diesem Fall ohne Bedenken in beide Richtungen das Dokument durchgehen? Da bin ich mir auch nie sicher, wann vorwärts und wann rückwärts abgearbeitet werden soll.

Wie kann ich das Script noch anpassen, dass nich der gesamte Text markiert werden muss?

Gruss Christoph

Verankerte Rahmen lösen (WIN CS4 JS)

Martin Fischer
  
Beiträge gesamt: 12783

16. Apr 2010, 08:55
Bewertung:

gelesen: 2183

Beitrag als Lesezeichen
Hallo Christoph,

das sieht gut aus.
Bis auf die Richtungsumkehrung der Schleife.
Funktioniert diese so?

Bei jedem Durchgang der Schleife wird ein Element der Sammlung, durch die Du schleifst, weggenommen. Und zwar von vorne her. Damit veränderst Du die Indexierung der weiteren Elemente.
In so einem Fall würde ich sicherheitshalber die Elemente von hinten her abarbeiten.
Das hat keine Nachteile, verhindert aber ggf. Probleme, die durch die Veränderung der Indexe der Elemente der Sammlung entstehen könnten.

> Da bin ich mir auch nie sicher, wann vorwärts und wann rückwärts abgearbeitet werden soll.

Grundsätzlich ist rückwärts in den meisten Fällen sicherer.
Weitere Schritte innerhalb des Skripts können es aber auch gelegentlich erforderlich machen, dass von vorne nach hinten gearbeitet wird.
Und das Voranschreiten entspricht eher dem manuellen Vorgehen eines Anwenders.


> Wie kann ich das Script noch anpassen, dass nich der gesamte Text markiert werden muss?

Du hat oben sehr guten Gebrauch von parentStory gemacht.
Das hilft Dir auch hier weiter.

Viele Grüße
Martin


Verankerte Rahmen lösen (WIN CS4 JS)

cwenet
Beiträge gesamt: 1139

16. Apr 2010, 19:26
Bewertung:

gelesen: 2137

Beitrag als Lesezeichen
Lieber Martin,

dankeschön. So habe ich es nun zum Laufen gebracht. Die Schleife habe sicherheitshalber wieder umgedreht.
Code
if ((app.selection.length > 0) && (app.selection[0].isText))   
{
var myItems = app.selection[0].parentStory.textFrames; /////////<--

for (oneItem = myItems.length-1; oneItem >= 0; oneItem--)
{

if (myItems[oneItem].constructor.name == "TextFrame")
{

myItems[oneItem].parentStory.texts[0].appliedParagraphStyle = "Marginalie";

myItems[oneItem].insertionPoints[0].contents = myStartTag; // Einfügen des Start-Tags

myItems[oneItem].parentStory.texts[0].insertionPoints[-1].contents = myEndTag; // Einfügen des End-Tags

// Verschieben des Inhalts des verankerten Textrahmens
myItems[oneItem].texts[0].move(LocationOptions.before, myItems[oneItem].parent.texts[0].paragraphs[0].insertionPoints[0]);

myItems[oneItem].remove(); // Löschen des verankerten Textrahmens
}
}
}

Die Zeile müßte in Ordnung sein, oder?

Was mir jetzt aufgefallen ist:

Sobald in einer Marginalfläche ein einzelnes Wort steht, das mehr als 16 Buchstaben hat, funktioniert der move nicht mehr.
Kannst Du das bestätigen?

Gruss
Christoph

(Dieser Beitrag wurde von cwenet am 16. Apr 2010, 19:28 geändert)

Verankerte Rahmen lösen (WIN CS4 JS)

Martin Fischer
  
Beiträge gesamt: 12783

16. Apr 2010, 21:13
Bewertung:

gelesen: 2123

Beitrag als Lesezeichen
Antwort auf: Sobald in einer Marginalfläche ein einzelnes Wort steht, das mehr als 16 Buchstaben hat, funktioniert der move nicht mehr.

Verschiebe nicht nur den Inhalt des Textrahmens (myItems[oneItem].texts[0]),
sondern den Textabschnitt im Textrahmen mit möglichem Überlauf:
myItems[oneItem].parentStory.texts[0]

Viele Grüße
Martin


Verankerte Rahmen lösen (WIN CS4 JS)

cwenet
Beiträge gesamt: 1139

17. Apr 2010, 08:14
Bewertung:

gelesen: 2093

Beitrag als Lesezeichen
Vielen Dank Martin,

so funktioniert es prima. Da wäre ich nie draufgkommen.

Grüße
Christoph