[GastForen Programme Print/Bildbearbeitung Adobe InDesign Kerning nur in der Auswahl

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

Kerning nur in der Auswahl

sabine_hamann
Beiträge gesamt: 419

11. Dez 2006, 12:03
Beitrag # 1 von 10
Bewertung:
(2975 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich habe mit Hilfe des tollen JavaScript-Handbuchs von Peter Kahrel ein Kerningscript geschrieben.
Es funktioniert prima … nur leider immer für das ganze Dokument.
Ich möchte gern eine Auswahl treffen, ob das ganze Dokument, eine bestimmte Ebene, ein aktivierter Textrahmen oder ein ausgewählter Text im Rahmen durch das Script bearbeitet werden soll.
Die Abweichungen von der Kerningtabelle habe ich mit TextCleanup realisieren können. Und daher die nächste Frage, wie kann ich diese beiden Scripte so verbinden, dass erst die Auswahl kommt, dann das Kerning und anschließend die Aufräumarbeit mit der Suchen-und-Ersetzen-Tabelle.
Ich hab grad erst mit Scripten angefangen und schaffs scheinbar nicht allein.
Lieben Dank für eure Mühe.
X

Kerning nur in der Auswahl

Martin Fischer
  
Beiträge gesamt: 12714

11. Dez 2006, 13:53
Beitrag # 2 von 10
Beitrag ID: #266366
Bewertung:
(2949 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Sabine,

> Ich möchte gern eine Auswahl treffen, ob das ganze Dokument,

Das wäre elegant über einen Dialog möglich - oder etwas weniger elegant über eine Abfrage, ob etwas ausgewählt ist (und wenn ja, was) zu realisieren.

> eine bestimmte Ebene,
Hier müßte bei jedem "Treffer" überprüft werden, auf welcher Ebene das parent-Objekt (also das, was auf der Seite platziert ist; bei tieferen Verschachtelungen ggf. parent.parent....) liegt. Wenn auf Ebene xy, dann mach das, wenn nicht, mach nix oder was anderes.

> ein aktivierter Textrahmen
app.selection[0] (wenn app.selection[0].constructor.name == "TextFrame")

> oder ein ausgewählter Text im Rahmen durch das Script bearbeitet werden soll.
ebenfalls app.selection[0] (wenn app.seectio[0].constructor.name == [Textobjekt].

Suche hier im Forum mal nach dem isText-Funktionsobjekt von Dave Saunders. Damit kannst Du die Textobjekte abfragen.

Kopplung von Skripten sind mit dem doScript()-Befehl möglich (siehe JavaScript Referenz und Beispiele im Forum; z.B. http://www.hilfdirselbst.ch/..._P220145.html#220145).

Hoffe, Du kommst mit diesen Stichworten weiter.
Ansonsten wäre ein bißchen Code von Dir zur genaueren Angaben hilfreich.


als Antwort auf: [#266345]
(Dieser Beitrag wurde von Martin Fischer am 11. Dez 2006, 14:29 geändert)

Kerning nur in der Auswahl

zaphodbeeblebroxx
Beiträge gesamt: 408

11. Dez 2006, 14:42
Beitrag # 3 von 10
Beitrag ID: #266375
Bewertung:
(2927 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Sabine, Hallo Martin,

habe letzten Freitag ebenfalls auf der Grundlage von Peter Kahrels "kern-pairs"-Skript ein Skript gebastelt, dass mir bei bestimmten Zeichenkombinationen (Vokale + Akzentzeichen, die es in der zu verwendenden Schrift nicht gibt) diese per Kerning "übereinander" schiebt.

Allerdings soll mein Skript im gesamten Dok. arbeiten. Deshalb habe ich keine Einschränkung auf eine Auswahl benötigt.

Möchtest Du (Sabine) Deine Kerning-Ausnahmen nicht im gesamten Dokument anwenden? Gibt es dafür einen best. Grund?

Kannst Du die Kerning-Fälle nicht einschränken, indem Du zunächst in Deinem Dokumnet nach einem best. Text oder einem best. Absatz-/Zeichenformat oder einer best. Schrift in einer best. Größe suchst und dann auf die gefundenen Objekte Dein Kerning-Skript anwendest?

(So habe ich dass zumindest gelöst).

zaphodbeeblebroxx


als Antwort auf: [#266366]

Kerning nur in der Auswahl

sabine_hamann
Beiträge gesamt: 419

11. Dez 2006, 14:57
Beitrag # 4 von 10
Beitrag ID: #266380
Bewertung:
(2922 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich muss leider die Auswahl zulassen, da es sich teilweise um Sonderfälle handelt. Der Anwender soll selbst entscheiden, ob beispielsweise auch das Inhaltsverzeichnis gekernt werden soll, oder nicht. Da ich nicht garantieren kann, dass hier sauber mit Formaten gearbeitet wurde, soll eine Auswahl möglich sein.

Danke Martin, das mit dem doScript funktioniert schon mal, falls die beiden zusammen nicht funktionieren sollten.

Anbei mein Versuch die beiden Scripte zu verschmelzen. Die Ebenenfunktionalität kann ich später vielleicht noch hinzufügen. Das wäre jetzt im ersten Step nicht so wichtig.


Code
//KerningVersuch1.jsx 

var myObject;
var myCheckSelection = false;
if(app.documents.length != 0){
if(app.activeDocument.stories.length != 0){
if(app.selection.length != 0){
switch(app.selection[0].constructor.name){
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
var myArray = myDisplayDialog();
myObject = myArray[0];
myCheckSelection = myArray[1];
break;
default:
myObject = app.activeDocument;
break;
}
}
else{
myObject = app.activeDocument;
}
if(myObject != "None"){
myTextCleanup(myObject, myCheckSelection);
}
}
else{
alert("The current document contains no text. Please open a document containing text and try again.");
}
}
else{
alert("No documents are open. Please open a document and try again.");
}
function myDisplayDialog(){
var myCheckSelection = false;
var myDialog = app.dialogs.add({name:"TextCleanup"});
with(myDialog.dialogColumns.add()){
with(dialogRows.add()){
with(dialogColumns.add()){
staticTexts.add({staticLabel:"Search Range"});
}
var myRangeButtons = radiobuttonGroups.add();
with(myRangeButtons){
radiobuttonControls.add({staticLabel:"Selected Story", checkedState:true});
radiobuttonControls.add({staticLabel:"Document"});
if(app.selection[0].contents != ""){
radiobuttonControls.add({staticLabel:"Selection"});
}
}
}
}
var myResult = myDialog.show();
if(myResult == true){
switch(myRangeButtons.selectedButton){
case 0:
switch(app.selection[0].constructor.name){
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
myObject = app.selection[0].parentStory;
break;
default:
myObject = "None";
break;
}
break;
case 1:
myObject = app.activeDocument;
break;
case 2:
switch(app.selection[0].constructor.name){
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
if(app.selection[0].contents != ""){
myObject = app.selection[0].texts.item(0);
myCheckSelection = true;
}
else{
myObject = "None";
}
break;
default:
myObject = "None";
break;
}
break;
}
}
else{
myObject = "None";
}
myDialog.destroy();
return [myObject, myCheckSelection];
}

app.findPreferences = app.changePreferences = null;
app.findPreferences.appliedFont = 'Times';
app.findPreferences.fontStyle = 'Regular';
Times( '10', -75 );
Times( '01', -25 );
Times( '11', -75 );
Times( '12', -75 );
Times( '13', -75 );
Times( '14', -75 );
Times( '15', -75 );
Times( '16', -75 );
Times( '17', -75 );
Times( '18', -75 );
Times( '19', -75 );
Times( '1.', -150 );
Times( '1,', -100 );
Times( ',7', -50 );
Times( '7+', -50 );
Times( '1)', -100 );
Times( '+8', +75 );
Times( '-7', -100 );
Times( '1-', -100 );
Times( '-3', +25 );
Times( '1+', -100 );
Times( '+2', +25 );
Times( '6+', +25 );
Times( '2/', +100 );
Times( '/3', +100 );
Times( '6/', +100 );
Times( '/7', +100 );
Times( '0/', +100 );
Times( '/1', +100 );
Times( '(1', -50 );
Times( '31', -50 );
Times( '1°', -50 );
Times( '6:', +75 );
Times( ':9', +75 );
Times( '21', -25 );
Times( '75', -25 );
Times( '37', -25 );
Times( '7,', -100 );
Times( '87', -25 );
Times( '0-', +100 );
Times( '6-', +100 );
Times( '-1', -75 );
Times( '1:', -50 );
Times( ':1', -75 );
Times( '.B', +100 );
Times( '*B', +100 );
Times( '7-', -50 );
Times( '+1', -50 );
Times( '+9', +25 );
Times( ' 1', -100 );
Times( ' 7', -50 );
Times( '7 ', -100 );
Times( ' x', +100 );



function Times( kPair, kValue )

{

//All Paar-Vorkommen finden
var myPairs = myObject.search( kPair, false, true );

//Einfügen der Kerningwerte zwischen erstem und zweitem Buchstaben
for( var i = 0; i < myPairs.length; i++ )
myPairs[i].insertionPoints[1].kerningValue = kValue;

}

function myTextCleanup(myObject, myCheckSelection){
var myScriptFileName, myFindChangeFile, myFindChangeFileName, myScriptFile, myResult;
var myFindChangeFile = myFindFile("TextCleanup.txt")
if(myFindChangeFile != null){
var myResult = myFindChangeFile.open("r", undefined, undefined);
if(myResult == true){
//Clear any existing find/change settings.
app.changePreferences = NothingEnum.nothing;
app.findPreferences = NothingEnum.nothing;
//Loop through the find/change operations.
do{
myLine = myFindChangeFile.readln();
//Ignore comment lines and blank lines.
if((myLine.substring(0,2)!="//")&&(myLine != "")){
myFindChangeArray = myLine.split("\t");
//The first field in the line is the FindWhat string.
eval("app.findPreferences.properties = " + myFindChangeArray[0]);
//The second field in the line is the ChangeTo string.
eval ("app.changePreferences.properties = " + myFindChangeArray[1]);
//The third field in the line can be either "once" or "all".
//If it's "all", keep on searching until no instances of the
//search text are found, if it's "once," search just once.
myFindLimit = myFindChangeArray[2];
if(myFindLimit == "once"){
myFoundItems = myObject.search(app.findPreferences.findText, undefined, undefined, app.changePreferences.changeText);
}
else{
var myLoopLimit = 0;
outsideloop:
do{
//Because it's easy to end up in an endless loop when you set myFindLimit to "all", we need
//to provide a way to get out of the loop.
myFoundItems = myObject.search(app.findPreferences.findText, undefined, undefined, app.changePreferences.changeText);
myLoopLimit ++;
if(myLoopLimit > 100){
var myResult = confirm("Your find/change operation has been run 100 times. Do you want to continue?");
if(myResult == false){
break outsideloop;
}
else{
myLoopLimit = 0;
}
}
if(myCheckSelection == true){
//If myCheckSelection is true, reacquire a reference to the selection each time through the loop.
//You need to do this because deleting/adding characters has the potential to invalidate the
//text reference you're using.
myObject = app.selection[0];
}
}while(myFoundItems.length > 0);
}
//Reset the find/change preferences after each search.
app.changePreferences = NothingEnum.nothing;
app.findPreferences = NothingEnum.nothing;
if(myCheckSelection == true){
//If myCheckSelection is true, reacquire a reference to the selection each time through the loop.
//You need to do this because deleting/adding characters has the potential to invalidate the
//text reference you're using.
myObject = app.selection[0];
}
}
} while(myFindChangeFile.eof == false);
myFindChangeFile.close();
}
}
}
function myFindFile(myFileName){
var myFile;
try{
var myScriptFileName = app.activeScript;
//Get a file reference to the script.
var myScriptFile = File(myScriptFileName);
//Get a reference to the folder containing the script.
var myFolder = myScriptFile.parent;
//Look for the file name in the folder.
if(myFolder.getFiles(myFileName).length != 0){
var myFile = myFolder.getFiles(myFileName)[0];
}
else{
throw "error"
}
}
catch (myError){
myFile = File.openDialog("Choose the file containing your find/change list");
}
return myFile;
}


Danke für eure Mühe.

Sabine


als Antwort auf: [#266366]
(Dieser Beitrag wurde von Martin Fischer am 11. Dez 2006, 15:36 geändert)

Kerning nur in der Auswahl

Martin Fischer
  
Beiträge gesamt: 12714

12. Dez 2006, 09:03
Beitrag # 5 von 10
Beitrag ID: #266499
Bewertung:
(2856 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Sabine,

in dem Skript wäre mir noch "etwas zu viel Luft" drin.
Die Abfragen der Auswahlklasse finden vor dem Dialog und in dem Dialog statt.
Und wenn im Dialog nichts ausgewählt wird, dann scheitern alle Abfragen, weil das Skript dann nicht abbricht, sondern mit einem "myObject = 'None'" weitermacht und dann an dem Code ab Zeile 117 - "Times( '10', -75 );" - hängen bleibt.

Wenn in dem Dialog nichts ausgewählt wird, dann kann das Skript nicht vernünftig weitermachen. Das bedeutet "exit()", basta. ;-)
Und nicht ein Herumgeeiere um "None", das dann doch nicht ausgewertet wird.

Ich vermute, daß es u.a. deswegen zu dem Zeile 117-Problem gekommen ist, weil Hauptcode und Funktionen nicht klar getrennt worden sind und durch den langen Dialogcode ein Teil des Hauptcodes sich zwischen den Funktionen versteckt hat und übersehen worden ist.

Ferner würde ich die Auswertungen innerhalb eines Dialogs (z.B. den Auswahltyp) auf's für den Dialog notwendige beschränken und wenn es für den Dialog relevant ist, in eine weitere Funktion ausgliedern. Der Dialog strotzt wg. den vielen notwendigen Reihen- und Spaltendefinitionen und den Definitionen der Dialogelemente so vor Code, daß er unübersichtlich wird, wenn dann auch noch Auswertungen darin stattfinden.

Das Kochgeschirr in den Küchenschrank, die Speisen in die Speisekammer und das Auto in die Garage. Du würdest bestimmt nicht auf die Idee kommen, das Paniermehl unter der Motorhaube des Autos suchen zu müssen.

Der Code ist aus verschiedenen Bausteinen aus mehreren Skripten zusammengestückelt, das merkt man ihm an. Spätestens in zwei Wochen, wenn Du aus der Entwicklung des Codes raus bist, verstehst Du den nicht mehr ohne ausführliches Studium. Also möglichst früh aufräumen und Luft rauslassen.

Aufräumen ist die langweiligste Arbeit, aber für den späteren gezielten Zugriff entscheidend.
Dabei lassen sich oft Blöcke in Form von Funktionen herstellen, die später in anderen Skripten das Neuerfinden des Rads ersparen: Funktion rüberkopieren und erledigt. Je allgemeiner und unspezifischer die Funktion, desto leichter die Wiederverwendbarkeit an anderer Stelle.

Peter Kahrel und Dave Saunders sind Meister im Aufräumen in Blöcken.
In Ihren Skripten ist kein i-Punkt zu viel.
Aber es gibt eben auch so Palaverer wie mich, die sich dazu erst disziplinieren müssen (vielleicht hätte ich meine Socken heute früh doch besser gleich in den Wäschekorb gesteckt, als sie vor ungebremster Neugierde kurzfristig neben meiner Maus zu parken).


Alles in allem scheint das Skript nun aber genau das zu tun, was Du damit beabsichtigt hast.
Und das aus dem Stand - unter Zurhilfenahme von ein paar Beispielskripten.
Bravo!

Du hast bestimmt schon anderswo geskriptet.
Oder ist der Code oben allein das Ergebnis der Instruktion durch Peters Einführung (was sehr für selbige sprechen würde)?

Hast Du noch technische Fragen?


als Antwort auf: [#266380]

Kerning nur in der Auswahl

sabine_hamann
Beiträge gesamt: 419

12. Dez 2006, 20:28
Beitrag # 6 von 10
Beitrag ID: #266639
Bewertung:
(2820 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

lieben Dank für das ausführliche Feedback. Ich hab aber immer noch ein Problem mit dem Script. Es führt nämlich nur die zweite Funktion aus. Das Kerning wird außer acht gelassen und nur das Suchen und Ersetzen wird ausgeführt. Ich denke, dass ich den Funktionsaufruf schlicht vergessen hatte. Also hab ich diesen eben noch eingefügt und bin an einem undefinierten Objekt gescheitert. Nun meint die Konsole, dass das myObjekt für die Times-Funktion nicht durchsucht werden könne.

Hast du noch einen Tipp?

Übrigens hab ich vorher nur etwas mit AppleScript rumgespielt. Das Handbuch von Peter Kahrel und das offizielle Adobe Scripthandbuch sind meine Lehrmeister gewesen. Also Peter, nochmal Dank an dich.


als Antwort auf: [#266499]

Kerning nur in der Auswahl

Martin Fischer
  
Beiträge gesamt: 12714

13. Dez 2006, 10:38
Beitrag # 7 von 10
Beitrag ID: #266687
Bewertung:
(2790 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Sabine,

Deine Frage ist bei mir angekommen.
Allein es mangelt mir gerade an Zeit, die Testanordnung herzustellen und das Problem einzukreisen. Ich möchte Dich hiermit also noch etwas vertrösten: Ich kümmere mich darum, wenn ich wieder etwas Luft habe (heute Abend?).


als Antwort auf: [#266639]

Kerning nur in der Auswahl

Peter Kahrel
Beiträge gesamt: 182

13. Dez 2006, 16:55
Beitrag # 8 von 10
Beitrag ID: #266778
Bewertung:
(2750 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Sabine,

Danke vielemals für Deine freundliche Anmerkungen. Was das Skript angeht, ich glaube, Martin hat Recht dass das kombinieren von verschiedene Skripte manchmal problematisch ist. Dein Skript (ein grosser Erfolg, sowie Martin schon sagte), ist jetzt schon nicht einfach, und es wird schwierig sein, es zu modifizieren. Es wäre vielleicht besser, das Skript zu ändern sowie Martin das angegeben hat:

- Stell fest, was ausgewahlt ist
- nichts ausgewahlt: verarbeite das ganze Dokument
- etwas ausgewahlt: verarbeite des Auswahl

Das kernen und das 'tekstaufräumen' sind ganz verschiedene Sachen, also wäre es vielleicht besser, sie in separate Dateien zu stecken, und sie mit der doScript() funktion an zu rufen. Die separate dateien sind dann einfacher zu warten.

Peter

(Pardon my terrible German--you're lucky you can't hear me speak it!)


als Antwort auf: [#266687]

Kerning nur in der Auswahl

Martin Fischer
  
Beiträge gesamt: 12714

13. Dez 2006, 22:14
Beitrag # 9 von 10
Beitrag ID: #266848
Bewertung:
(2728 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Sabine,

nun habe ich Dein Skript etwas genauer unter die Lupe genommen.
Zitat Es führt nämlich nur die zweite Funktion aus. Das Kerning wird außer acht gelassen und nur das Suchen und Ersetzen wird ausgeführt.


Wird bei Dir das Kerning tatsächlich außer Acht gelassen?
Was hast Du ausgewählt?

In allen meinen Versuchen wurde das Kerning korrekt ausgeführt.


Zitat Ich denke, dass ich den Funktionsaufruf schlicht vergessen hatte.

Die Funktion wird z.B. mit "Times( '10', -75 );" aufgerufen.
Und die Funktion "Times()" ist definiert.
Ich kann keine Fehler entdecken.
Und hier funktioniert alles wie erwartet.

Zitat Also hab ich diesen eben noch eingefügt und bin an einem undefinierten Objekt gescheitert. Nun meint die Konsole, dass das myObjekt für die Times-Funktion nicht durchsucht werden könne.


Was für einen Funktionsaufruf hast Du eingefügt?
Und was für ein Objekt hast Du ausgewählt, wenn Du diesen Fehler ausgespuckt bekommst (was ist myObjekt)?
Wird Dir eine Zeile mit problematischen Code genannt?

Kann es sein, daß Du mir etwas verheimlichst?
Etwa einen neuen, modifizierten Code?

@ Peter: Schön, hier von Dir zu lesen. - Nice to read you here.

> (Pardon my terrible German--you're lucky you can't hear me speak it!)

Your German looks and reads very well and I would like to hear it spoken, somewhere along the way.
But you cannot hide that you are typing with an international keyboard: I'm missing the Umlauts.
It's just a kind of drinking bears, isn't it. ;-)


Ah, sorry, after all I've found one Umlaut now:

> tekstaufräumen

This reads as if you have spoken the word while typing it.
The words are spelled correct like this "Text aufräumen".

Hol di stief


als Antwort auf: [#266639]

Kerning nur in der Auswahl

sabine_hamann
Beiträge gesamt: 419

14. Dez 2006, 12:07
Beitrag # 10 von 10
Beitrag ID: #266959
Bewertung:
(2697 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin, Hallo Peter,

ach, es ist alles bestens. Ich hab das Script vergeigt und nun nochmal frisch gespeichert. Jetzt ist alles fein. Ich danke euch noch einmal sehr.


als Antwort auf: [#266848]
X