hilfdirselbst.ch
Facebook Twitter gamper-media
cwenet S
Beiträge: 858
23. Okt 2013, 19:06
Beitrag #1 von 8
Bewertung:
(1839 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurze Textzeilen finden (CS6, Win7)


Guten Tag,

hiermit versuche ich gerade in ausgewählter Story kurze Textzeilen aufzuspüren und anzuspringen:

Code
#targetengine "session";  

var win = new Window("palette", 'Kurze Zeilen finden', [0,0,155,132]);
var weiter = win.add( "button", [5,105,75,127], 'Weiter' );

win.center();


weiter.onClick = function()
{
var curSel = app.selection;
var curStory = curSel[0].parent;
var allLines = curStory.lines;

for (var p=0; p<allLines.length; p++) {

if (allLines[p].length < 5) {
allLines[p].select();
}
}

}

var result = win.show();


Wie kann ich nun auch alle nachfolgende kurze Zeilen finden?
Also nach jedem Buttonklick soll die nächste kurze Zeile angesprungen werden.
Im Moment wird nur die erste Stelle angesprungen.

Bitte um Hilfe.
Kleines Demodok anbei.

Gruss
Christoph
Top

Anhang:
 
X
Hans Haesler  M  p
Beiträge: 5581
23. Okt 2013, 21:50
Beitrag #2 von 8
Beitrag ID: #518868
Bewertung:
(1801 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurze Textzeilen finden (CS6, Win7)


Guten Abend Christoph,

mit Deinem Code wird nach jedem Klick auf "Weiter" erneut der ganze Inhalt des Rahmens von Anfang an abgecheckt und jedes Mal wird das erste Vorkommen ausgewählt.

Eine mögliche Lösung: Die Schleife nicht jedes Mal mit p=0 starten, sondern nur zu Beginn mit p=oldCtr und dann mit dem aktuellen Wert von p plus 1:

Code
#targetengine "session"; 

var win = new Window("palette", "Kurze Zeilen finden", [0,0,155,132]);
win.center();
var weiter = win.add("button", [5,105,75,127], "Weiter");

var curSel = app.selection;
var curStory = curSel[0].parent;
var allLines = curStory.lines;
var oldCtr = 0;

weiter.onClick = function() {
for (var p=oldCtr; p<allLines.length; p++) {
if (allLines[p].length < 5) {
allLines[p].select();
oldCtr = p+1;
break;

}
}
}

var result = win.show();

Hier funktioniert es. Und bei Dir?

Gruss, Hans
als Antwort auf: [#518864]
(Dieser Beitrag wurde von Hans Haesler am 23. Okt 2013, 21:51 geändert)
Top
 
cwenet S
Beiträge: 858
24. Okt 2013, 07:04
Beitrag #3 von 8
Beitrag ID: #518873
Bewertung:
(1753 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurze Textzeilen finden (CS6, Win7)


Guten Morgen Hans,

vielen Dank für die Scriptanpassung und auch die erklärenden Worte.
Es funktioniert, wie gewünscht.

Die If-Abfrage habe ich noch geändert, da sonst auch Leerzeilen angesprungen werden.

Code
if ((allLines[p].length > 1) && (allLines[p].length < 5)){ 


Schöne Grüße
Christoph
als Antwort auf: [#518868] Top
 
WernerPerplies
Beiträge: 2200
24. Okt 2013, 07:55
Beitrag #4 von 8
Beitrag ID: #518874
Bewertung:
(1745 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurze Textzeilen finden (CS6, Win7)


Hallo Chrstoph,

Ursache ist, wie von Hans erwähnt, der falsche Platz der Zählerdefinition.
Bei meinem Alternativorschlag löse ich dieses Problem, in dem ich die Zählervariable außerhalb der onClick-Methode definiere.

Ich würde die Sache insgesamt so angehen:
Code
#targetengine "session";   
#target indesign
main();

/*void*/function main()
{
try
{
var win = new Window("palette", 'Kurze Zeilen finden', [0,0,155,132]);
var weiter = win.add( "button", [5,105,75,127], 'Weiter' );
win.center();
// außerhalb onClick definieren, damit die Definition nicht mit jedem Klick wiederholt wird.
// ggf. für einen Neustart einen eigenen Button definieren -> neue Story wählen
var allLines = app.selection[0].parentStory.lines;
// Zähler außerhalb von onCLick definieren
var p = 0;
// auf die erste Fundstelle springen
next();
weiter.onClick = function()
{
next();
}
function next()
{
// Startvaiable nicht neu definieren
for (; p<allLines.length; p++)
{
if (allLines[p].length < 30)
{
// Zeile gefunden
allLines[p++].select();
if (p>=allLines.length)
p=0; // zurück auf Los!
// Schleife bis zum nächsten Klick verlassen
return;
}
}
return;
}
// welche Rückgabe erwartest Du hier?
// Palette ist ein nicht modales Fenster!
// var result = win.show();
win.show();
}
catch (error)
{
alert(error.message + "\ninSteile: " + error.line);
}
return;
}

Vielleicht wäre es auch noch gut, wenn Du ein Cancel-Button stiften würdest.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING
als Antwort auf: [#518864] Top
 
Martin Fischer  M  p
Beiträge: 11838
24. Okt 2013, 09:09
Beitrag #5 von 8
Beitrag ID: #518877
Bewertung:
(1722 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurze Textzeilen finden (CS6, Win7)


Hallo Hans und Christoph,

ein kleiner Tipp noch.

Mit der folgenden Zeile, einzufügen unter allLines[p].select(); wird die jeweils gefundene Stelle herangezoomt.

Code
app.activeWindow.zoomPercentage = app.activeWindow.zoomPercentage; 

Das ist vor allem dann hilfreich, wenn sich die gefundene Stelle nicht auf der aktiven Seite befindet.

Viele Grüße
Martin
als Antwort auf: [#518873]
(Dieser Beitrag wurde von Martin Fischer am 24. Okt 2013, 09:26 geändert)
Top
 
cwenet S
Beiträge: 858
24. Okt 2013, 09:53
Beitrag #6 von 8
Beitrag ID: #518880
Bewertung:
(1696 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurze Textzeilen finden (CS6, Win7)


Hallo Werner, Martin und Hans,

vielen Dank für die tollen Ergänzungen.
In der Tat, habe ich übersehen, dass select() nicht alleine reicht,
um auf nächste Seiten zu springen.
So ist es jetzt prima.

Hintergrund für das Script war:
Eine Art Endkontrolle für unschöne, kurze Absatzauslaufzeilen (sagt man so?).
Deshalb auch das nicht-modale Fenster um direkt nach Fund einzugreifen und
dort weiter zu suchen.

Danke und einen schönen Tag
Christoph
als Antwort auf: [#518877]
(Dieser Beitrag wurde von cwenet am 24. Okt 2013, 09:59 geändert)
Top
 
WernerPerplies
Beiträge: 2200
24. Okt 2013, 10:02
Beitrag #7 von 8
Beitrag ID: #518883
Bewertung:
(1683 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurze Textzeilen finden (CS6, Win7)


Hallo Christoph,

Zitat Deshalb auch das nicht-modale Fenster um direkt nach Fund einzugreifen und
dort weiter zu suchen.

Das war schon klar, ich wollte nur darauf hinweisen, das win.show() bei nicht modalen Fenstern keinen oder keinen vernünftigen Rückgabewert hat, deshalb ist
var result = win.show();
sinnlos.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING
als Antwort auf: [#518880] Top
 
cwenet S
Beiträge: 858
24. Okt 2013, 10:10
Beitrag #8 von 8
Beitrag ID: #518886
Bewertung:
(1674 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurze Textzeilen finden (CS6, Win7)


Hallo Werner,

achso. Vielen Dank für den Hinweis.

Schönen Tag
Christoph
als Antwort auf: [#518883] Top
 
X