[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Seite eines insertionPoints innerhalb einer Story finden

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

Seite eines insertionPoints innerhalb einer Story finden

fabiantheblind
Beiträge gesamt:

5. Feb 2011, 13:11
Beitrag # 1 von 9
Bewertung:
(4707 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo alle in der Werkstatt,

ich versuche gerade aus einem Textfluss Text zu finden und zu extrahieren. Leider bekomme ich es nicht hin mir die Seite des Einfügepunktes an dem ich bin auszugeben.
Kann mir jemand unter die Arme greifen?

Hier mal der Kern des Codes:
Code
main(); 
function main(){
var doc = app.activeDocument;

extract(doc);
}

function extract(doc){
var findGrepPref = app.findGrepPreferences;
var chngGrepPref = app.changeGrepPreferences;
var findTXTPref = app.findTextPreferences;
var chngTXTPref = app.changeTextPreferences;
app.loadFindChangeQuery ("xtrct", SearchModes.grepSearch);

var result = doc.findGrep();

// run thru all results
for (var k = result.length-1; k >= 0; k--){
alert("inside the result loop " + k);
fnText = result[k].contents; // this is a string
fnParent = result[k].parent.getElements()[0];// this is a story
ip = result[k].insertionPoints[0].index; // this is the insertion point
ipPage = "I'M STUCK! that sucks!!!!!"
}
doc.changeGrep();
// Zurücksetzen der Sucheinstellungen
app.findGrepPreferences = null;
// -----------------



}

X

Seite eines insertionPoints innerhalb einer Story finden

Gerald Singelmann
  
Beiträge gesamt: 6269

5. Feb 2011, 14:29
Beitrag # 2 von 9
Beitrag ID: #463859
Bewertung:
(4692 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Siehe Screenshot.

Ein wenig verwirrend ist, wie es möglich sein soll, dass ein InsertionPoint in mehreren Textrahmen gleichzeitig ist. Aber vielleicht gilt das für die Einfügemarken hinter dem letzten Zeichen eines verketteten Rahmens. Oder es ist einfach eine Vererbungsungenauigkeit, weil alle anderen Textobjekte (außer Character) durchaus ein Array brauchen.

Wie immer gehe ich bei fehlender Angabe von der aktuellen Version aus.

<edit>ich hatte den screen vergessen. Aber in CS4 nutzt er eh nichts, also nur fürs Archiv</edit>


als Antwort auf: [#463856]
(Dieser Beitrag wurde von Gerald Singelmann am 5. Feb 2011, 15:28 geändert)

Anhang:
Bildschirmfoto 2011-02-05 um 14.27.22.png (98.0 KB)

Seite eines insertionPoints innerhalb einer Story finden

fabiantheblind
Beiträge gesamt:

5. Feb 2011, 14:43
Beitrag # 3 von 9
Beitrag ID: #463860
Bewertung:
(4685 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Gerald,

leider ist kein Screenshot dabei.

Deshalb verstehe ich deine Antwort wohl auch nicht.

Mein Problem ist, um es nochmal deutlich zu machen, daß der insertionPoint
Code
	ip = result[k].insertionPoints[0]; 

nicht verrät auf welcher Seite er ist.

Ich arbeite derzeit in InDesign CS4.

Grüsse

:F


als Antwort auf: [#463859]

Seite eines insertionPoints innerhalb einer Story finden

Marc Sidon
Beiträge gesamt: 262

5. Feb 2011, 16:13
Beitrag # 4 von 9
Beitrag ID: #463864
Bewertung:
(4655 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Von einem InsertionPoint ausgehend, der sich innerhalb eines Textframes befindet, welches auf der Seite platziert ist, bekommst Du die Seite über:

Code
myIp = result[k].insertionPoints[0]; 
myPage = ip.parentTextFrames[0].parent; // dies ist dann die Seite


Das funktioniert auch bei verketteten Textrahmen.

Gruß,
Marc


als Antwort auf: [#463860]
(Dieser Beitrag wurde von Marc Sidon am 5. Feb 2011, 16:14 geändert)

Seite eines insertionPoints innerhalb einer Story finden

fabiantheblind
Beiträge gesamt:

5. Feb 2011, 16:28
Beitrag # 5 von 9
Beitrag ID: #463865
Bewertung:
(4651 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke. das ist es.

Ich hatte auch
Code
ip.parentTextFrames[0].parent; 


bereits in anderen Skripten gesehen. Dachte aber: "Das kann doch nicht sein? mehrere Textframes? (kopfkratz)".

Jetzt verstehe ich auch eher Geralds post und komme mir ein bisschen blöd vor :).


:f


als Antwort auf: [#463864]

Seite eines insertionPoints innerhalb einer Story finden

Marc Sidon
Beiträge gesamt: 262

5. Feb 2011, 16:42
Beitrag # 6 von 9
Beitrag ID: #463868
Bewertung:
(4643 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich weiß auch nicht genau, warum die parentTextFrames eine Collection sind, aber ich denke genauso wie Gerald, das dies einfach technische Gründe haben wird.

Kann mir jedenfalls keinen Fall vorstellen, in dem in parentTextFrames eines InsertionPoints mehr als ein TextFrame enthalten sein könnte.

Der Vollständigkeit halber nochmal der korrekte Code. Oben hatte sich ein kleiner Fehler eingeschlichen... :)

Code
myIp = result[k].insertionPoints[0];  
myPage = myIp.parentTextFrames[0].parent; // dies ist dann die Seite


Gruß,
Marc


als Antwort auf: [#463865]
(Dieser Beitrag wurde von Marc Sidon am 5. Feb 2011, 16:48 geändert)

Seite eines insertionPoints innerhalb einer Story finden

fabiantheblind
Beiträge gesamt:

5. Feb 2011, 17:41
Beitrag # 7 von 9
Beitrag ID: #463870
Bewertung:
(4621 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hey hey,

als dank für die Hilfe -> extractImages_fromText.jsx
Ich habe dem Post mal ein kleines .Zip mit einem .idml, ein paar Bildern und 2 find/change queries hinzugefügt.
Die queries müssen zu InDesign hinzugefügt werden (in der Datei "install_findChange_queries.txt" steht wo).

Das Script sucht im Text nach:

##![Ich bin de Bildunterschrift, die in ein Textfeld hinein kommt.](myFile.jpg)##
und verschiebt diesen in eine Neue Textbox.
Danach extrahiert es die Dateinamen und gleicht einen Bilder Ordner mit den referenzierten Dateinamen ab.

Der zu suchende Text sollte in einem eigenem Absatz stehen.
Hier der Code:
Code
// extractImages_fromText.jsx 

// this script extracts image references from text
// using markdown syntaximage reference within ## ## (this should be replaced)
// in markdown ## means <h2>

// but still right now it is like this:
// ##![I'm the image subtext, i will be placed](myFile.jpg)##

// Copyright (C) 2011 Fabian "fabiantheblind" Morón Zirfas
// http://www.the-moron.net
// info [at] the - moron . net

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/.

main();
function main(){


var newLocation = Folder.selectDialog("Select the image folder");
var thePath = newLocation;
var theFileType = "*.jpg";
var allImages = thePath.getFiles(theFileType);
var tf = newLocation.fsName;
var doc = app.activeDocument;


extract(doc);
placefile(doc,allImages)
}


function placefile(doc,allImages){
var findGrepPref = app.findGrepPreferences;
var chngGrepPref = app.changeGrepPreferences;
var findTXTPref = app.findTextPreferences;
var chngTXTPref = app.changeTextPreferences;
app.loadFindChangeQuery ("FFF_filename", SearchModes.grepSearch);
var result = doc.findGrep();

for (var k = result.length-1; k >= 0; k--){

var fnText = result[k].contents;
var ip = result[k].insertionPoints[0];
var pp = ip.parentTextFrames[0].parent;

var target = doc.pages.item(pp.name).rectangles.add()//pp.textFrames.add();//
fnText =fnText.replace(/\(/g,"");
fnText =fnText.replace(/\)/g,"");
target.label = fnText;
target.geometricBounds = [0,0,100,100];

for(m = 0; m < allImages.length;m++){

if(allImages[m].name.match(target.label)){
target.place(allImages[m]);
target.fit(FitOptions.CONTENT_TO_FRAME);
break;
}
}

}


}
function extract(doc){
var findGrepPref = app.findGrepPreferences;
var chngGrepPref = app.changeGrepPreferences;
var findTXTPref = app.findTextPreferences;
var chngTXTPref = app.changeTextPreferences;
app.loadFindChangeQuery ("FFF_xtrct_img", SearchModes.grepSearch);

var result = doc.findGrep();

// run thru all results
for (var k = result.length-1; k >= 0; k--){
var fnText = result[k].contents;
var ip = result[k].insertionPoints[0];
var pp = ip.parentTextFrames[0].parent;
var target = doc.pages.item(pp.name).textFrames.add()//pp.textFrames.add();//
target.label = "img subtext fr";
target.geometricBounds = [0,0,100,100];
target.contents = fnText;
result[k].remove();

}
doc.changeGrep();
// Zurücksetzen der Sucheinstellungen
app.findGrepPreferences = null;
// -----------------

}

// unused at the moment
function runTFs(doc){

for(var i = 0 ; i< doc.pages.length; i++){
var p = doc.pages.item(i);
for(var j = 0; j < p.textFrames.length; j++){
var tf = p.textFrames.item(j);
tf.select(SelectionOptions.REPLACE_WITH);
var stry = app.selection[0].parentStory;
if(tf.label.match("img subtext fr")){
continue;
}else{

}
}

}
}


hier die FFF_filename.xml:

Code
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Query>
<Header>
<Version major="5" minor="1">
</Version>
<Application value="Adobe InDesign">
</Application>
<QueryType value="Grep" qid="1">
</QueryType>
</Header>
<Description>
<FindExpression value="\((.*?)\)">
</FindExpression>
<ReplaceExpression value="">
</ReplaceExpression>
<FindChangeOptions>
<IncludeLockedLayers value="0">
</IncludeLockedLayers>
<IncludeLockedStories value="0">
</IncludeLockedStories>
<IncludeMasterPages value="0">
</IncludeMasterPages>
<IncludeHiddenLayers value="0">
</IncludeHiddenLayers>
<IncludeFootnotes value="0">
</IncludeFootnotes>
<KanaSensitive value="1">
</KanaSensitive>
<WidthSensitive value="1">
</WidthSensitive>
</FindChangeOptions>
<FindFormatSettings>
</FindFormatSettings>
<ReplaceFormatSettings>
<TextAttribute type="changecondmode" value="0">
</TextAttribute>
</ReplaceFormatSettings>
</Description>
</Query>


hier die FFF_xtrct_img.xml:

Code
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Query>
<Header>
<Version major="5" minor="1">
</Version>
<Application value="Adobe InDesign">
</Application>
<QueryType value="Grep" qid="1">
</QueryType>
</Header>
<Description>
<FindExpression value="\#\#([^&lt;]+?)\#\#">
</FindExpression>
<ReplaceExpression value="$1">
</ReplaceExpression>
<FindChangeOptions>
<IncludeLockedLayers value="0">
</IncludeLockedLayers>
<IncludeLockedStories value="0">
</IncludeLockedStories>
<IncludeMasterPages value="0">
</IncludeMasterPages>
<IncludeHiddenLayers value="0">
</IncludeHiddenLayers>
<IncludeFootnotes value="0">
</IncludeFootnotes>
<KanaSensitive value="1">
</KanaSensitive>
<WidthSensitive value="1">
</WidthSensitive>
</FindChangeOptions>
<FindFormatSettings>
</FindFormatSettings>
<ReplaceFormatSettings>
<TextAttribute type="changecondmode" value="0">
</TextAttribute>
</ReplaceFormatSettings>
</Description>
</Query>



als Antwort auf: [#463868]
(Dieser Beitrag wurde von fabiantheblind am 5. Feb 2011, 17:55 geändert)

Anhang:
xtract_smll.zip (81.6 KB)

Seite eines insertionPoints innerhalb einer Story finden

Gerald Singelmann
  
Beiträge gesamt: 6269

5. Feb 2011, 19:16
Beitrag # 8 von 9
Beitrag ID: #463873
Bewertung:
(4574 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Kann mir jedenfalls keinen Fall vorstellen, in dem in parentTextFrames eines InsertionPoints mehr als ein TextFrame enthalten sein könnte.

<Raumzeit-Paradoxiediskussion>
Consider the Screenshoot...
Wo ist der Insertion Point Nr 11, der zwischen dem Leerzeichen und dem P?

Wenn man per Pfeiltasten die Einfügemarke vorwärts bewegt ist alles klar: im linken Rahmen. Wenn man per Pfeiltasten die Einfügemarke vom Ende nach links bewegt ist auch alles klar: im rechten Rahmen.
Man sieht's blinken.
Beide Male.

Ok, angenommen, es blinkt rechts. Was sagt mir die Scriptengine über die Auswahl?
Code
$.writeln( app.selection[0].parentTextFrames[0].contents); 

-> "Point"

Einmal Pfeiltaste links, einmal rechts (es blinkt links) -> "Insertion"

Und was gibt
Code
$.writeln( app.activeDocument.stories[0].insertionPoints[10].parentTextFrames[0].contents); 

?
"Point".
Auch wenn's links blinkt?
Ja.
Warum?
Seufz.

<Hornbrille auf>Zwischen zwei verketteten Textrahmen gibt jeweils einen InsertionPoint, der zwei parentTextFrames haben sollte, aber nicht hat. Es sei denn irgendwie virtuell, in Paralleluniversen oder so. Aber nicht im Array, wie es sich gehören würde.
<Hornbrille ab>
</Raumzeit-Paradoxiediskussion>


als Antwort auf: [#463868]
Anhang:
Bildschirmfoto 2011-02-05 um 18.56.54.png (11.1 KB)

Seite eines insertionPoints innerhalb einer Story finden

Dirk Becker
Beiträge gesamt: 193

12. Feb 2011, 14:22
Beitrag # 9 von 9
Beitrag ID: #464558
Bewertung:
(4410 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Warum?


Der InsertionPoint ist intern wie die anderen Text-Referenzen eine erweiterte/spezielle Ausführung einer Text-Selektion (TextSuite).
http://partners.adobe.com/...iptingSuiteBoss.html

Der Kern einer solchen Selektion ist das Target, hier ITextTarget.
http://partners.adobe.com/...lassITextTarget.html

Eine Text-Selektion besteht damit aus
- einem Verweis auf die Story (TextModel)
- einem Bereich (RangeData)
http://partners.adobe.com/.../classRangeData.html

Der Bereich hat 3 Komponenten
- einen Start-Index
- einen End-Index
- eine Ausrichtung (Lean)

Soweit ich mich da richtig erinnere, bestimmt die Ausrichtung unter anderem auch, von welcher Seite beim Einfügen die Attribute übernommen werden, und ob shift-cursor Tasten die Selektion links oder rechts erweitern/verkleinern.

Man könnte experimentell bestimmen, ob beim Erzeugen einer Selektion von einer Basis aus, die den Rahmen nicht impliziert (etwa Story/Text) hier die Default-Ausrichtung des Script (Roman => ltr, Arabisch =>rtl usw.) berücksichtigt wird, oder ganz pragmatisch immer die Default-Ausrichtung von RangeData ohne explizites Lean. Ich würden hoffen, dass der erste/letzte InsertionPoint eines TextFrames aber im Rahmen verbleibt. myTextFrame.insertionPoints.firstItem() / lastItem().

Die Links beziehen sich auf CS(1), weil neuere Versionen nicht auf der Webseite verfügbar sind, aber seitdem hat sich an den Grundlagen nichts geändert.

Dirk


als Antwort auf: [#463873]
X