Hallo, ich habe mich seit heute mit Indesign-Scripting beschäftigt, weil ich gerade eine wissenschaftliche Arbeit von DokuWiki in Indesign importieren möchte. Nun habe ich die Daten als XML-Datei vorliegen. Die Absatz- und Zeichenstile werden einwandfrei übernommnen. Nur bei den Fußnoten hapert es noch. Diese sollen als Marginalien an den Rand.
Es existiert ein ObjektStil "Marginalia", welcher einen verankerten Textrahmen definiert. Von Hand geht die Zuweisung wunderbar, aber es soll ja jetzt automatisch laufen. Die Marginalien selber sind XML-Tags im Fließtext und momentan noch im Haupttextrahmen zu sehen.
Ein Script soll jetzt den XML-Baum nach Tags mit dem Namen "Marginalia" durchsuchen und deren Inhalt in einen neuerstellten Textrahmen des Stils "Marginalia" verschieben. Durch die Suche in diesem Forum habe ich mir schonmal folgenden Code zusammengeklickt:
Das Traversieren ist nichts besonderes, aber beim Verschieben des Inhaltes bin ich sehr unsicher, kenne das Objektmodell von Indesign zu schlecht. Der Text wird zwar verschoben, aber ungetagged. Im Haupttextrahmen bleibt ein leeres Element zurück. Außerdem landet der verankerte Textrahmen immer am Anfang, aber ich setze ja auch den Cursor (noch) nicht.
Mir geht es eigentlich hauptsächlich darum, die Marginalie samt XML-Tag in den neuen Textrahmen zu verschieben.
Wäre dankbar, wenn mir jemand dabei auf die Sprünge helfen könnte.
Richard
PS: Warum wird mein Beitrag samt Code ab der Hälfte kursiv dargestellt?
(Dieser Beitrag wurde von Martin Fischer am 7. Jan 2008, 07:50 geändert)
Marginalien via Tags automatisch in Textrahmen verschieben
erst einmal willkommen auf HDS Beim Scripten kann ich Dir leider nicht helfen.
Hier gibt es wahrscheinlich eine Kollision mit der foreneigenen Formatierung. [i] Sample Text [/i] ergibt zum Beispiel Kursiven Text = Sample Text
Damit Du jetzt [i] sehen kannst habe ich vor dem "i" einen Punkt eingefügt, also [.i] (Damit du jetzt "[.i]" sehen kannst, mußte ich beim Schreiben 2 Punkte einfügen.)
Viele Grüße pixxxelschubser
Was wir wissen, ist ein Tropfen; was wir nicht wissen, ein Ozean. Isaac Newton
Marginalien via Tags automatisch in Textrahmen verschieben
Das liegt an der Definition des Objekts "element.texts[0]", das verschoben werden soll:
texts ist ein reines Textobjekt.
Da ich mich in XML nicht so gut auskenne, um eine qualifizierte Antwort geben zu können, kann ich nur zu einem Versuch ermutigen: Definiere statt "element.texts[0]" zum Verschieben mal nur "element" (damit sollte das ganze Element verschoben werden). Oder in einem zweiten Versuch (falls der erste scheitert): "element.xmlContent" (wobei dies wahrscheinlich auch nur den ungetaggten Inhalt verschiebt).
Das liegt an der Definition des Ursprungs des Textrahmens: 'var myFrame = paragraphs.item(0).insertionPoints[0].textFrames.add();' - am ersten Einfügepunkt des ersten Absatzes (also vor dem ersten Zeichen des ersten Absatzes).
Wo soll er denn hin? An die Stelle, wo der Cursor steht? app.selection[0].insertionPoints[0]
Viele Grüße Martin
Marginalien via Tags automatisch in Textrahmen verschieben
Besten Dank erstmal für den Hinweis. Habs versucht, aber das ganze Element konnte ich nicht verschieben. Entweder kam es zum Absturz oder ID hat sich geweigert; weiß nicht mehr genau.
Folgendes Script geht jetzt durch sämtliche Tags, erzeugt Textrahmen, kopiert die Inhalte und weist den neuen Rahmen das existierende Tag zu.
Bleiben noch zwei offene Fragen:
Das ist ja lustig. Hab's umbenannt.
Danke nochmal für die Antworten. Richard
(Dieser Beitrag wurde von madram am 8. Jan 2008, 09:58 geändert)
Marginalien via Tags automatisch in Textrahmen verschieben
die von Dir verwandte Methode, einen Objektstil zuzuweisen ist zwar die bessere (weil man damit bestimmen kann, daß Abweichungen gelöscht werden). Es gibt aber noch eine Alternative:
Könntest Du mal testen, ob ID damit weiter abstürzt oder zumindest das Absturzproblem damit behoben ist?
Versuchs mal folgendermaßen: Ersetze
durch
Eventuell geht die Bestimmung des myPointBeforeElement etwas einfacher (über previousItem). Das müßte ich selbst erst noch konkret prüfen.
Viele Grüße Martin
(Dieser Beitrag wurde von Martin Fischer am 8. Jan 2008, 10:20 geändert)
Marginalien via Tags automatisch in Textrahmen verschieben
=== Stil zuweisen === Die "alternative" und offizielle weil dokumentierte Variante, welche Sie vorgeschlagen haben, bringt hier nicht viel, weil sämtliche wichtigen Stile nicht übernommen werden.
ID (CS2) stürzt übrigens immer nur dann beim Objektstilzuweisen ab, wenn im Objektstil unter "Text Frame General Options" das Häkchen bei "Fixed Column Width" gesetzt ist. Marginalien sollten bei eine feste Breite besitzen, darum habe ich die Option gesetzt. Wird wohl ein Bug sein. Wenn ich die Option erben lasse, läuft alles wie geschmiert. Ebenso, wenn ich den Objektstil von Hand zuweise.
=== Textrahmen verschieben === Auch das läuft jetzt wunderbar. Die von Ihnen vorgeschlagene zweite Variante, das Vorgängerelement zu finden, bietet CS2 nicht an, aber ich habe ja auch nicht geschrieben, dass ich kein CS3 verwende.
Vielen Dank für die Hilfe. Ich probier noch ein bisschen und poste dann irgendwann das Script komplett.
Mit herzlichen Grüßen Richard Weickelt
Marginalien via Tags automatisch in Textrahmen verschieben
Ist es möglich, diese Häkchen zunächst mal wegzulassen und nach Aufführung des Skripts zu setzen?
Wenn ja - Ist es möglich, das Häkchen per Skript temporär zu deaktivieren, die Prozeduren auszuführen und am Ende das Häkchen über das Skript wieder zu aktivieren?
Viele Grüße Martin
Marginalien via Tags automatisch in Textrahmen verschieben
Hallo, ich arbeite mich seit letzter Woche in InDesign, den Import von XML in InDesign und nun auch in das Skripting mit InDesign ein. Ich bin vorher nie mit DTP-Programmen in Berührung gekommen.
Auf jeden Fall habe ich (neben vielen weiteren) ziemlich genau die selbe Anforderung an ein Skript wie es durch madram beschrieben wurde. Deshalb bin ich froh das in diesem Thema bereits ein so gutes Skript erarbeitet wurde. Einige Fragen und Anmerkungen habe ich jedoch noch.
Dieses Problem habe ich versucht nachzustellen, konnte es aber in CS3 nicht mehr feststellen (allerdings weiss ich nicht genau was die Option "erben" im Kontext von InDesign bedeutet).
Bei dieser Zeile wirft mir ID einen JavaScript Fehler.
element.texts[0].parentStory.insertionPoints.itemBefore ist keine Funktion
Das Objektmodell für CS3 kennt nur previousItem(obj): InsertionPoint, und damit funktioniert es auch.
Als nächstes musste ich die Reihenfolge der Ereignisse anpassen (im Gegensatz zu der in Beitrag #4). 1. Zuerst die Cursorposition setzen
var myPointBefore = elem... myPointBefore.select();
2. und erst dann ein neues Frame erzeugen
var newFrame = actDoc...
3. Text verschieben
element.texts[0].move(... newFrame.markup(...
4. Objektstiel zuweisen
var margStyle = actDoc.... newFrame.applyObjectStyle(...
Nun meine Fragen: Wenn der Text auf mehreren Textrahmen (bzw. die Story auf mehreren sog. 'textContainers') verteilt ist funktioniert das nur für den ersten Textrahmen (textContainers[0]). Ich habe überlegt eine Schleife über die entsprechenden Textrahmen zu durchlaufen (for(j=0; j<currentStory.textContainers.length; ++j)), aber das Skript wird ja über die deepSearch()-Funktion nicht auf einem Textrahmen aufgerufen, sondern auf dem Dokument. Und das iteriert über die XML-Elemente. Da bin ich gerade etwas überfordert und würde mich freuen wenn mir jemand einen Hilfreichen Tip geben könnte.
Marginalien via Tags automatisch in Textrahmen verschieben
ich hoffe es ist in Ordnung, dass ich mich hier anschließe. Solch ein Sktipt habe ich nun auf der Basis des hier vorgestellten aufgebaut und für unsere Zwecke angepasst. Es funktioniert wunderbar und ich möchte mich bei allen Beteiligten bedanken, ich habe viel dadurch gelernt.
Nun erstelle ich gerade ein zweites Skript, welches global alle XML Tags durchläuft und die größen der Rahmen, egal ob Bilder oder Texte. Diesen Wert wende ich dann beim nächsten Objekt an, eshandelt sich um viele Rahmen die als verankerte Objekte in einem Fließtext eingebunden sind und über Objektstile ausgerichtet wurden, um dessen "y Versatz" Wert um die Höhe des vorhergehenden Rahmens zu verändern.
Das Funktioniert auch, solange der Rahmen, dessen Wert ich abgreifen möchte nicht einer von denen ist, die mit dem MarginalienScript erzeugt wurden. Ich bekomme zwar einen Wert, dieser ist aber die Höhe des Rahmens, in dem sich alle verankerten Objekte befinden und nicht der des neu erzeugten Rahmens.
Kann mir jemand sagen wo bei mir der Fehler liegt? Das wäre super.
var objectHeight;
traversexmlelements(app.activeDocument); function traversexmlelements(elm){ var i; for (i = 0; i < elm.xmlElements.length; i++){ if (elm.xmlElements[i].markupTag.name == "Artikelgruppe") { $.writeln("Artikelgruppe"); } if (elm.xmlElements[i].markupTag.name == "Fotografie-Produktbild") { dothething(elm.xmlElements[i]); } if(elm.xmlElements[i].markupTag.name == "Fotografie-Schmuckbild") { dothething(elm.xmlElements[i]); } if(elm.xmlElements[i].markupTag.name == "Artikelgruppenname") { dothething(elm.texts[i].parentTextFrames[i]); } if(elm.xmlElements[i].markupTag.name == "Artikelgruppentext") { dothething(elm.xmlElements[i]); } if(elm.xmlElements[i].markupTag.name == "Guetesiegel") { dothething(elm.xmlElements[i]); } if(elm.xmlElements[i].markupTag.name == "Logo") { dothething(elm.xmlElements[i]); } traversexmlelements(elm.xmlElements[i]); } }
function dothething(elm){ var obj = null; if (elm.pageItems.length != 0){ obj = elm; } else if (elm.images.length !=0 ){ obj = elm.xmlContent.parent; } else if (elm.epss.length != 0){ obj = elm.xmlContent.parent; } else if (elm.pdfs.length !=0){ obj = elm.xmlContent.parent; } else if (elm.texts.length !=0){ obj = elm.xmlContent.parent; } if (obj != null){ if(objectHeight) { obj.anchoredObjectSettings.anchorYoffset = objectHeight; } objectHeight = obj.geometricBounds[2] - obj.geometricBounds[0]; //alert(objectHeight); } }
--------------------------------------------------------------------------------- Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1
(Dieser Beitrag wurde von Martin Fischer am 12. Feb 2008, 14:29 geändert)
Marginalien via Tags automatisch in Textrahmen verschieben
Ich bekomme zwar einen Wert, dieser ist aber die Höhe des Rahmens, in dem sich alle verankerten Objekte befinden und nicht der des neu erzeugten Rahmens.
Mal ins Blaue rein: Ist es möglich, daß Du ein Parent bzw. parentTextFrames[0] zu hoch gegangen bist? Etwa bei "Artikelgruppenname"?
Viele Grüße Martin
Marginalien via Tags automatisch in Textrahmen verschieben
vielleicht liegt es auch daran, dass Du mit Deinem ersten Skript verankerte Textrahmen erzeugst. Wenn Du dann mit Deinem 2. Skript über die XML-Tags auf diese verankerten Textrahmen (bzw. den Content) zugreifst und Dich über die parents "hochangelst" erhälst Du als parent evtl. insertionPoints, die keine geometricBounds besitzten. Mit parentTextFrames[0] erhälst Du dann (wie Martin schon vermutet hat) den TF in dem Dein Text mit dem verankerten Rahmen liegt und nicht den TF des verankerten Rahmens. Somit die falschen Werte.
Matthias
Marginalien via Tags automatisch in Textrahmen verschieben
das stimmt so. Allerdings habe ich jetzt hier die ganze Zeit nach einer Möglichkeit im Datenbrowser gesucht den Textframe zu bekommen, der den Text an sich enthällt. Dabei habe ich festgestellt, dass der neu erzeugte Textrahmen das entsprechende Tag erbt und das wenn ich vom Content eine Ebene höher gehe, immer sofort im Vatertextframe lande. Weiß jemand wie ich diesen dazwischenliegenden Textframe von der Story ausgehend aufrufen kann?
Sollte as jemand nachvollziehen wollen ist das ganz einfach möglich indem man einen großen Textrahmen erzeugt und diesem das Tag Artikelgruppe zuweist. Anschließend erzeugt man einen verankterten Rahmen und weißt diesem das Tag Artikelgruppentext zu. dann noch ein bischen Kauderwelch in den verankerten Rahmen getippt und das Script laufen lassen.
Ich hoffe jemand hat einen Tip für mich, es kann ja nicht sein, dass man diesen Rahmen nicht zu packen bekommt.
vielen Dank für eure Hilfe,
Gruß, Andreas --------------------------------------------------------------------------------- Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1
Marginalien via Tags automatisch in Textrahmen verschieben
Weiß jemand wie ich diesen dazwischenliegenden Textframe von der Story ausgehend aufrufen kann?
Es ist ein aStory.textFrames[x] (in CS3; in CS2 wahrscheinlich auch - da muß man aber aufpassen, daß man nicht die verknüpften Textrahmen der story erwischt)
Das x ermittelst Du über ein itemByRange vom ersten Zeichen der story bis zum besagten Textrahmen und zählst die darin enthaltenen Textrahmen.
Wahrscheinlich geht es sogar noch einfacher über den index des Textrahmens. Der müßte eigentlich je story bei 0 beginnen.
Viele Grüße Martin
Marginalien via Tags automatisch in Textrahmen verschieben
Weiß jemand wie ich diesen dazwischenliegenden Textframe von der Story ausgehend aufrufen kann?
Es ist ein aStory.textFrames[x] (in CS3; in CS2 wahrscheinlich auch - da muß man aber aufpassen, daß man nicht die verknüpften Textrahmen der story erwischt)
Das x ermittelst Du über ein itemByRange vom ersten Zeichen der story bis zum besagten Textrahmen und zählst die darin enthaltenen Textrahmen.
Wahrscheinlich geht es sogar noch einfacher über den index des Textrahmens. Der müßte eigentlich je story bei 0 beginnen.
Also ich versuche da sjetzt mal ohne die XML Elemente, ich muss eh alle Elemente durchgehen, deshalb kann ich die XML Elemente aussen vor lassen.
Dazu habe ich jetzt folgendes Script erstellt und versuche jetzt die Inhalte des Textrahmens, welchen ich auf diese Weise erhalte durch zu gehen. Das funktioniert auch, aber wie bekomme ich jetzt raus ob der aktuelle Character ein Rahmen oder ein Buchstabe ist?
Hier mein Code bis jetzt:
alignElements(app.selection[0]); function alignElements(elm) { if(elm.constructor.name == "TextFrame") { var i; for(i = 0; i < elm.characters.length;i++) { //alert(elm.characters[i].content); switch (elm.characters[i].content) { case "TextFrame": alert(elm.textFrames[0]); break; } } } else { alert("Ausgewähltes Element ist kein Textrahmen."); } }
Hat jemand eine Idee wo es bei mir hapert? Für Denkanstöße wäre ich dankbar. --------------------------------------------------------------------------------- Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1
(Dieser Beitrag wurde von Martin Fischer am 13. Feb 2008, 12:10 geändert)
Marginalien via Tags automatisch in Textrahmen verschieben
Das könnte hilfreich sein, wenn ich denn dann auch weiß das ich zum jetzigen Zeitpunkt einen verankerten Rahmen habe. Ist das aktuelle Zeichen aber tatsächlich ein Buchstabe, so bekomme ich eine Fehlermeldung.
Für mich wäre es wichtig zuerst einmal zu wissen was ich da im Moment überhaupt habe. Das bringt mich gerade etwas zur Verzweiflung, wo ich doch scheinbar so kurz vor dem Ziel bin... --------------------------------------------------------------------------------- Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1
Marginalien via Tags automatisch in Textrahmen verschieben
das Skript läuft nun mit Hilfe von PageItems. Damit bekomme ich alle verankerten Bildrahmen und Textrahmen abgefangen. Allerdings nicht Texte bzw. Tabellen die im Rahmen stehen.
Reine Texte sind auch nicht das Problem, die kann man ignorieren, aber Tabellen sollten von meinem Skript einbezogen werden. Das wird allerdings nur gehen schätze ich, wenn ich alle Zeichen durch gehe und prüfe.
mit elm.characters[i].constructor.name erhalte ich allerdings auch bei verankerten Textrahmen als Rückgabe "Character". Gibt es noch eine andere Funktion bzw ein anderes Attribut im constructor ausser name, mit dem man vielleicht den Typ abfragen kann?
alignElements(app.selection[0]);
function alignElements(elm) { if(elm.constructor.name == "TextFrame") { var i, objectHeight; for(i = 0; i < elm.characters.length; i++) { alert(elm.characters[i].constructor.name); try { if(objectHeight) { elm.pageItems[i].anchoredObjectSettings.anchorYoffset = objectHeight; objectHeight = elm.pageItems[i].geometricBounds[2] - elm.pageItems[i].geometricBounds[0] + objectHeight; } else { objectHeight = elm.pageItems[i].geometricBounds[2] - elm.pageItems[i].geometricBounds[0]; } } catch(err) { alert(err); } } } else { alert("Ausgewähltes Element ist kein Textrahmen."); } }
Gruß, Andreas --------------------------------------------------------------------------------- Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1
(Dieser Beitrag wurde von Martin Fischer am 13. Feb 2008, 19:02 geändert)
Marginalien via Tags automatisch in Textrahmen verschieben
Reine Texte sind auch nicht das Problem, die kann man ignorieren, aber Tabellen sollten von meinem Skript einbezogen werden. Das wird allerdings nur gehen schätze ich, wenn ich alle Zeichen durch gehe und prüfe.
Du könntest nach den Tabellen in einem Textabschnitt suchen und durch das Ergebnis iterieren.
mit elm.characters[i].constructor.name erhalte ich allerdings auch bei verankerten Textrahmen als Rückgabe "Character". Gibt es noch eine andere Funktion bzw ein anderes Attribut im constructor ausser name, mit dem man vielleicht den Typ abfragen kann?
Bist Du dem Link von Matthias oben gefolgt? Da wird das sehr ausführlich und gründlich diskutiert. U.a. gibt es noch 'instanceof' - aber mit Vorsicht zu genießen.
Viele Grüße Martin
(Dieser Beitrag wurde von Martin Fischer am 13. Feb 2008, 19:33 geändert)
Marginalien via Tags automatisch in Textrahmen verschieben
ich hatte mir den Link angesehen, aber nur vier Beiträge bekommen die für mich irgendwie völlig unzusammenhängend waren. Nach dem Du mich eben danach gefragt hast habe ich mir das noch mal angesehen. Und jetzt habe ich es auch gefunden. Danke dafür.
Nun bekomme ich den verankerten Rahmen zu sehen. Allerdings als eine Art Zeichen und noch nicht so, dass ich auf seine geometricBonds zugreifen kann. Aber ich werde mich morgen noch weiter damit beschäftigen.
Danke für die tolle Hilfe. :-) --------------------------------------------------------------------------------- Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1
Marginalien via Tags automatisch in Textrahmen verschieben
die geometricBounds eines verankerten Rahmens kannst Du über pageItems[0] erhalten. Wenn Du als Rückgabe von constructor.name "Character" erhälst, dann prüfe per "try" ob das Objekt pageItems[0] vorhanden ist. Wenn ja, handelt es sich um einen verankerten Textrahmen; wenn nicht handelt es sich um einen "normalen Text-Character".
Als Beispiel kannst Du mal einen Textrahmen in einem Text verankern und dann den verankerten Rahmen markieren. Mit alert(app.selection[0].parent.pageItems[0].geometricBounds) erhälst Du die entsprechenden Werte und kannst diese ändern.
Matthias
Marginalien via Tags automatisch in Textrahmen verschieben
Den Link habe ich gefunden und mich da durch gelesen. ;-)
Und dank der abschließenden Erklärung von zaphodbeeblebroxx habe ich es nun auch entgültig verstanden und nun funktioniert alles wie gewünscht. Sogar Tabellen werden berücksichtigt.
Die Frage ist, ob das nicht sogar noch eleganter geht, aber ich habe eine Menge dabei gelernt, und das ist das wichtigste.
--------------------------------------------------------------------------------- Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1