[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Abfrage index eines paragraphs in paragraphs-collection

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

Abfrage index eines paragraphs in paragraphs-collection

WernerPerplies
Beiträge gesamt: 2730

20. Jul 2011, 07:57
Beitrag # 1 von 12
Bewertung:
(4617 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi,

um des Problem in Thema
http://www.hilfdirselbst.ch/..._P476314.html#476314
eventuell umgehen zu können, bräuchte ich den Index des Absatzes innerhalb der paragraphs.

Wie kann man den abfragen?

paragraph.index ist es offensichtlich nicht, sondern bezieht sich wohl auf den Textinhalt der Story.

any ideas?
X

Abfrage index eines paragraphs in paragraphs-collection

Martin Fischer
  
Beiträge gesamt: 12732

20. Jul 2011, 08:34
Beitrag # 2 von 12
Beitrag ID: #476350
Bewertung:
(4602 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zähle die Anzahl der Absätze vom ersten Einfügepunkt des Textabschnitts bis zum ersten Einfügepunkt des Absatzes, dessen Index Du ermitteln möchtest:

Code
var s = app.selection[0]; 
//var p_index = s.parentStory.insertionPoints.itemByRange(0,s.paragraphs.firstItem().insertionPoints.firstItem().index).paragraphs.length;
var p_index = s.parentStory.insertionPoints.itemByRange(0,s.paragraphs.firstItem().insertionPoints.firstItem().index).paragraphs.count();
s.parentStory.paragraphs.item(p_index).select();



als Antwort auf: [#476347]
(Dieser Beitrag wurde von Martin Fischer am 20. Jul 2011, 08:36 geändert)

Abfrage index eines paragraphs in paragraphs-collection

WernerPerplies
Beiträge gesamt: 2730

20. Jul 2011, 09:26
Beitrag # 3 von 12
Beitrag ID: #476354
Bewertung:
(4581 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

vielen Dank für Deine Antwort, ich hatte eigentlich gehofft, dass es einfach ein Property gibt.

Ich habe inzwischen noch die folgende Alternative entwickelt:

Zitat var regExp = new RegExp("\\/paragraph\\[\\d{1,5}\\]");
var index = parseInt(p.toSource().match(regExp)[0].substr("/paragraph[".length));
alert(index);



als Antwort auf: [#476350]

Abfrage index eines paragraphs in paragraphs-collection

Martin Fischer
  
Beiträge gesamt: 12732

20. Jul 2011, 09:53
Beitrag # 4 von 12
Beitrag ID: #476357
Bewertung:
(4568 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Funktioniert hier nicht.

p ist ein Absatz-Objekt

p.toSource(): resolve("/document[@name=\"Unbenannt-2\"]//story[@id=241]/insertion-point[61]/paragraph[@location=first]")

p.toSource().match(regExp) liefert demnach null und die weiteren Auswertungen gehen schief.

Ist das unter Windows anders?
Steht da anstelle von @location=first was anderes, etwa eine Zahl?


Ah, es kömmt auf die Art, wie ein Absatz adressiert wird, an.
Wird er über seinen Index innerhalb der story angesprochen, dann wird auch ein Index geliefert.
Code
var p = app.selection[0].parentStory.paragraphs.item(4); 


Wird er jedoch relativ zur Auswahl (erster Absatz) ermittelt, dann bietet toSource() auch die relative Adressierung.
Code
var p = app.selection[0].paragraphs.firstItem(); 


Aber wenn ich den Index weiß, brauche ich ihn doch nicht mehr zu ermitteln.
Oder?
Aber egal, vielleicht hilft's ja in der bestimmten Situation.


als Antwort auf: [#476354]
(Dieser Beitrag wurde von Martin Fischer am 20. Jul 2011, 09:55 geändert)

Abfrage index eines paragraphs in paragraphs-collection

WernerPerplies
Beiträge gesamt: 2730

20. Jul 2011, 10:06
Beitrag # 5 von 12
Beitrag ID: #476359
Bewertung:
(4554 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

jetzt gebe ich bald auf, der Zuweisungsfehler bei paragraph.contents schafft mich (nebenbei: könntest Du das Problem nicht mal verifizieren? ich denke, ich habe kompletten Code dafür geliefert)

Doch zurück zu diesem Thema, ich erhalte
resolve("/document[@name=\"Jahresübersicht_4.indd\"]//story[@id=229]/table[0]/cell[1]/paragraph[0]")!

Ich denke nicht, dass es sich um Betriebssystemproblem handelt, sondern eher um die Parents der Paragraphs!

Ist Dein Absatz ein erster Absatz? Wenn ja, wie sehen die Folgeabsätze aus?


als Antwort auf: [#476357]

Abfrage index eines paragraphs in paragraphs-collection

Martin Fischer
  
Beiträge gesamt: 12732

20. Jul 2011, 10:16
Beitrag # 6 von 12
Beitrag ID: #476360
Bewertung:
(4541 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Mein Absatz war einmal der erste Absatz der Auswahl (var p = app.selection[0].paragraphs.firstItem();).
Dort wurde er mit @location=first angegeben.

Bei var p = app.selection[0].paragraphs.item(1); lautet das Ergebnis 1.

Ein andermal habe ich den Absatz über seinen Index innerhalb der story adressiert (var p = app.selection[0].parentStory.paragraphs.item(5);).
Dort wurde er dann mit 5 angegeben.

Sprich: die Form der Angabe eines bestimmten Absatzes bestimmt die Form des Ergebnisses (Index).

Aber ich muss jetzt außer Haus und für ne Weile aussteigen.


als Antwort auf: [#476359]
(Dieser Beitrag wurde von Martin Fischer am 20. Jul 2011, 10:22 geändert)

Abfrage index eines paragraphs in paragraphs-collection

WernerPerplies
Beiträge gesamt: 2730

20. Jul 2011, 10:22
Beitrag # 7 von 12
Beitrag ID: #476361
Bewertung:
(4534 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

da war ich mit meiner Antwort wohl zu schnell (vor Deiner Änderung!).

Ok, wenn das so ist, könnte ich damit leben.

Zitat Ist Dein Absatz ein erster Absatz? Wenn ja, wie sehen die Folgeabsätze aus?


Du hast wohl meinen anderen Beitrag nicht gelesen:

Ich sammle ausgewählte Absätze in Arrays, denen ich neue Inhalte zuweise.

Dabei gehen in diesen gesammelten Absätzen Informationen verloren, die aber im Dokument gespeichert werden.

Den Index kann ich nicht mitspeichern, denn es könnte ja durch Bearbeitung eine Verschiebung entstehen.

Ich muss also zu jeder Zeit über Parent erneut auf den Absatz zugreifen können.

Und das versuche ich so:
Code
function correctParagraphApplyingContentBug(pHC) 
{
for (i=0; i<pHC.length; i++)
{
for(j=0;j<pHC[i].length; j++)
{
var index = getIndexOfParagraphInCollection(pHC[i][j][0]);
pHC[i][j][0] = pHC[i][j][0].parent.paragraphs[index];
}
}
}

function getIndexOfParagraphInCollection(p)
{
var regExp = new RegExp("\\/paragraph\\[\\d{1}\\]");
return parseInt(p.toSource().match(regExp)[0].substr("/paragraph[".length));
}



Alles klar?

Ich würde aber gerne eine einfachere Lösung haben.


als Antwort auf: [#476359]

Abfrage index eines paragraphs in paragraphs-collection

Martin Fischer
  
Beiträge gesamt: 12732

20. Jul 2011, 10:27
Beitrag # 8 von 12
Beitrag ID: #476363
Bewertung:
(4530 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: da war ich mit meiner Antwort wohl zu schnell (vor Deiner Änderung!).


Meine Änderung betraf lediglich eine Ergänzung/Präzisierung des ursprünglich veröffentlichten Beitrags.

Nachdem es die Verständigung offensichtlich erschwert, werde ich mich nun mit dem Schreiben und Ändern (das gehört zu meinem persönlichen Stil) zurückhalten (bin weg).


als Antwort auf: [#476361]

Abfrage index eines paragraphs in paragraphs-collection

WernerPerplies
Beiträge gesamt: 2730

20. Jul 2011, 10:37
Beitrag # 9 von 12
Beitrag ID: #476364
Bewertung:
(4519 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Martin,

Zitat Meine Änderung betraf lediglich eine Ergänzung/Präzisierung des ursprünglich veröffentlichten Beitrags.


Klar, und meine Anmerkung bezog sich doch nur darauf, dass ich Fragen stellte, die Du in Deinem geänderten Beitrag zwischenzeitlich schon beantwortet hattest.

Zitat Nachdem es die Verständigung offensichtlich erschwert, werde ich mich nun mit dem Schreiben und Ändern (das gehört zu meinem persönlichen Stil) zurückhalten.


Das würde ich außerordentlich bedauern. Du solltest solche Anmerkungen nicht als persönliche Kritik verstehen.


als Antwort auf: [#476363]

Abfrage index eines paragraphs in paragraphs-collection

WernerPerplies
Beiträge gesamt: 2730

20. Jul 2011, 12:22
Beitrag # 10 von 12
Beitrag ID: #476376
Bewertung:
(4481 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
grrrrrr!!!! ;-)

Zitat Den Index kann ich nicht mitspeichern, denn es könnte ja durch Bearbeitung eine Verschiebung entstehen.

Ich muss also zu jeder Zeit über Parent erneut auf den Absatz zugreifen können.


Das geht alles nicht:

Beispiel:

Absatz1
Absatz2 ---> wird nach p gespeichert (index 1!)
Absatz3
Absatz4

Absatz1
eingefügter Absatz
Absatz2 ---> wurde nach p gespeichert (index 1!)
Absatz3
Absatz4

p -> jetzt immer noch Index 1
p.contents -> "eingefügter Absatz" !!!!!!

Das Abspeichern eines Absatzes ist also völlig sinnfrei!

Ich müsste also jedem Absatz ein Label verpassen, um ihn wieder zu finden, ein property "label" gibt's ja leider für Absatze nicht.


als Antwort auf: [#476361]

Abfrage index eines paragraphs in paragraphs-collection

Uwe Laubender
Beiträge gesamt: 5298

20. Jul 2011, 13:04
Beitrag # 11 von 12
Beitrag ID: #476381
Bewertung: ||
(4470 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Werner!
Es gibt weder die Property label noch id für den einzelnen Absatz.

Es stellt sich dann ja auch die Frage, was die Entität "Absatz" für Dich ausmacht (halb philosophische, halb praktische Frage):

Möchtest Du etwa keinen Absatz memorieren, sondern einen bestimmten TextStyleRange oder eine bestimmte Abfolge von TextStyleRanges, die sich genau über die Länge eines Absatzes hinzieht. Nach Kriterien, die mir erstmal unbekannt sind?
Oder machst Du die Entität Absatz ausschließlich am Inhalt contents fest?

Du könntest mit duplicate() z.B. die Absätze gesondert in Textrahmen vereinzeln und deren IDs in einem Array zur Wiederverwendung speichern.

Ich glaube, wir müssen uns erst mal über Absichten und Begrifflichkeiten unterhalten…

MacBook Pro 2.4GHz | OS X 10.5.8 | Adobe CS3/CS4/CS5/CS5.5 Design Premium


als Antwort auf: [#476376]

Abfrage index eines paragraphs in paragraphs-collection

WernerPerplies
Beiträge gesamt: 2730

20. Jul 2011, 14:07
Beitrag # 12 von 12
Beitrag ID: #476385
Bewertung:
(4453 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

zuerst einmal danke für Dein Interesse.

Die Antwort auf Deine Fragen ist ziemlich kompliziert, ich versuche sie mal zumindestens teilweise zu beantworten.

Hintergrund meiner Aktivitäten ist im Moment mein versprochenes Kalendermodul, aber die Logik geht weit darüber diese Anwendung hinaus.

Ich möchte, und ich mache so etwas schon seit Jahren, das Füllen von Dateien ausschließlich über Vorlagen steuern, ich glaube, so etwas läuft hier unter Datenzusammenführung.

vereinfacht:

Der Anwender erstellt eine Vorlage eines sich wiederholendes Blockes und baut in die Vorlage Platzhalter ein.

Diese Platzhalter können unterschiedliche Bedeutung haben, wie z. B. numerischer Kalendertag, zugehöriger Namen des Kalendertages, Feiertage, Kalenderwoche, wenn der zugehörige Tag ein Wochenanfang ist, oder aber auch eine Anmerkungshinweis, bei dem die eigentliche Anmerkung an beleibiebiger anderer Stelle steht usw.

Um diesen Ansprüchen zu genügen, scanne ich normalerweise den Block und sammle alle Platzhalter mit einem Pointer auf ihr Vorkommen in Collections oder Arrays.

Anschließend sortiere ich diese Einträge in die notwendige Reihenfolge und arbeite sie dann ab.

Warum dieser Aufwand:

Beispiel Kalender:

Ein einfacher Monatskalender kann die Monate in Spalten oder in Zeilen enthalten, oder auch chaotisch -> Adventskalender ;-)

Die Tageseinträge können nebeneinander, untereinander oder wie auch immer angeordnet sein.

Als ich jetzt mit der InDesignlösung anfing, ging ich, wohl etwas naiv, davon aus, das InDesign die Vorteile der objektorientieren Programmierung konsequent nutzt, aber es scheint da Brüche zu geben.

Normaler repräsentiert ein Objekt eine Speicherdadresse, an der wiederum Adressen auf andere Objekte abgespeichert sind.

Das schien auch für Absätze zu gelten:

Suchen ich mir einen Absatz, speichere Ihn in eine Variable, dann reicht es, wenn ich den Inhalt in der Variable ändere. Alle Verweise auf diesen Absatz erhalten dann diesen neuen Inhalt.

So die Theorie, bei InDesign habe ich bis jetzt schon zwei Brüche gefunden:

1. Problem mit dem verschwunden Text:
ändere ich den Text des Absatzes in meiner Variable und mache ihn länger, dann wird diese Änderung im Ursprungsabsatz korrekt angezeigt, in meiner Variable merkwürdigerweise nur die ursprüngliche Länge.

2. Paragraphs Collections:
Hier hatte ich erwartet, wie recht üblich, dass eine Verschiebung der Absätze nur die Verschiebung der Pointer auf die Objekte Absatz bedeutet und musste jetzt feststellen, dass InDesign bei der Verschiebung wohl auch Inhalte austauscht und damit bin ich dann auf den Bauch gefallen.

Ich muss jetzt wohl jeden Absatz mit einer Marke versehen, die entweder im Text sitzt (braucht Platz und die Suche dauert relativ lange) oder aber in irgendeiner Form an den Absatz angeklebt wird.

Dies könnten z. B. Notizen, Variablen, verankerte Rahmen und ähnliches sein.

Aber das macht leider alles unendlich viel zusätzliche Arbeit.

So, ich hoffe, ich habe mein Anliegen einigermaßen erklären können.

Vergessen:
Ich möchte jedes mehrmalige Suchen in der Gesamtdatei weitgehend verweiden.


als Antwort auf: [#476381]
(Dieser Beitrag wurde von WernerPerplies am 20. Jul 2011, 14:08 geändert)
X