Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Javascript zur Kursivierung von Klammern mit Variabler

Javascript zur Kursivierung von Klammern mit Variabler

Sigrun
Beiträge gesamt: 2

4. Apr 2023, 08:02
Bewertung:

gelesen: 4541

Beitrag als Lesezeichen
Hallo,
ich suche Hilfe bei einem Javascript um recte/regular Klammern um kursiven Text zu kursiveren.
Ich habe dazu ein Script (Klammer_etc_kursiv) von Martin Fischer gefunden. Leider löst es mein Problem nicht, denn:
Schwierigkeit bei lat. Pflanzennamen: Wenn in der Klammer auch nur ein Wort nicht kursiv ist, dürfen die Klammern nicht kursiv werden.
Bsp.: (Pisum sativum) müssen die Klammern italic -> (Pisum sativum)
(P. s. subsp. santivum) „subsp.“ ist Regular - also dürfen die Klammern nicht kursiv werden -> (P. s. subsp. santivum)

Hatte folgendes Script für Komma u.a. hinter Klammern geschrieben

Code
//suchen und ersetzen 
app.findGrepPreferences.findWhat = '\\)[\\.,!?]'
var myFound = app.activeDocument.findGrep();
for (var i = 0; i < myFound.length; i++) {
if (myFound[i].characters[0].fontStyle == 'Italic' &&
myFound[i].characters[-1].fontStyle == 'Regular')
{myFound[i].characters[-1].fontStyle = 'Italic';}
}

und daraus versucht mein Problem zu lösen

Code
app.findGrepPreferences.findWhat = '\\([\\w]\\)' 
var myFound = app.activeDocument.findGrep();
for (var i = 0; i < myFound.length; i++) {
if (myFound[i].characters[0].fontStyle == 'Regular' &&
myFound[i].characters[1].fontStyle == 'Italic')
{myFound[i].characters[-1].fontStyle = 'Italic';}
}


Das funktioniert, aber nur bei einem einzigen Buchstaben in der Klammer.
Ich bräuchte jedoch eine variable Anzahl an Buchstaben - die ALLE kursiv sein müssen - und nur dann müssen die Klammern geändert.
Habe es mit KI versucht:

Code
app.findGrepPreferences.findWhat = '\\([*?]\\)'; 
var myFound = app.activeDocument.findGrep();
for (var i = 0; i < myFound.length; i++) {
var textBetweenBrackets = myFound[i].contents.substring(1, myFound[i].contents.length - 1);
if (myFound[i].characters[0].fontStyle != 'Italic' &&
myFound[i].parentStory.characters.itemByRange(myFound[i].characters[0], myFound[i].characters[-1]).contents == textBetweenBrackets &&
myFound[i].parentStory.characters.itemByRange(myFound[i].characters[0], myFound[i].characters[-1]).fontStyle == 'Italic')
{myFound[i].parentStory.characters.itemByRange(myFound[i].characters[0], myFound[i].characters[-1]).fontStyle = 'Italic';}
}

Es funktioniert jedoch nicht.
Es erscheint mir eigentlich logisch - aber ich habe das Gefühl, ich erkenne den Fehler nicht.

Javascript zur Kursivierung von Klammern mit Variabler

Steve Howe
Beiträge gesamt: 78

5. Mai 2023, 03:29
Bewertung:

gelesen: 3760

Beitrag als Lesezeichen
Hi Sigrun,
ich weiß nicht, wie aktuell das Problem noch ist. Für unsere typografischen Finetuning-Ansprüche habe das Script von Martin Fischer überarbeitet und ein Interface verpasst, sodass auch Leute ohne Scriptkenntnisse es verwenden und einstellen können, wenn z.B. die Anführungszeichen fett gestellt werden müssen. Deine Anforderung war etwas knifflig, weil das Script "anders denkt". Aber jetzt funktioniert's!
viel Erfolg damit, Steve

Code
//DESCRIPTION:Durchsucht das Dokument nach der im Dialogfeld eingestellten Zeichen+Zeichenformatkombination, z.B. können alle Klammern gesucht werden, die vor+nach kursivem Text stehen oder alle Doppelpunkte, die hinter fettem Text stehen, um diese dann richtig auszuzeichnen. 
//© Steve Howe, Fotosatz Buck, 17.4.2024

if (app.documents.length == 0) {alert("kein Dokument geöffnet");}
else {
var alleZeichenformatNamen = new Array();
var meinDokument = app.activeDocument;
var ersetzungenAnzahl = 0;
for (var i=0; i<meinDokument.allCharacterStyles.length; i++) {
var meinZeichenformat = meinDokument.allCharacterStyles[i];
alleZeichenformatNamen.push(meinZeichenformat.name);
checkFormatgruppe(meinZeichenformat);
function checkFormatgruppe(meinZeichenformat) {
if (meinZeichenformat.parent.constructor.name == "CharacterStyleGroup") { //Formatgruppe davorschreiben und diese Funktion nochmal aufrufen, um Formatgruppe in Formatgruppe zu finden
alleZeichenformatNamen[alleZeichenformatNamen.length-1] = meinZeichenformat.parent.name + " &#9654; " + alleZeichenformatNamen[alleZeichenformatNamen.length-1];
checkFormatgruppe(meinZeichenformat.parent);
}
}
}

with (dialogfenster = new Window("dialog {orientation:'row', text:'ein oder mehrere Zeichen vor oder nach einem bestimmten Zeichenformat suchen', alignChildren:['center','fill']}")) { //Fenster erstellen
with (dialogfenster.add("panel {orientation:'column', text:'Suchen', alignChildren:['center','top']}")) {
with (add("group {orientation:'row', alignChildren:'left'}")) {
with (add("group {orientation:'column', alignChildren:'left'}")) {
add("statictext {text:'Zeichen davor:'}");
davorText = add("edittext {characters:10}");
}
with (add("group {orientation:'column', alignChildren:'left'}")) {
add("statictext {text:'Zeichenformat:'}");
suchFormat = add("dropdownlist", undefined, alleZeichenformatNamen);
//suchFormat.preferredSize.width=300;
suchFormat.selection=0;
}
with (add("group {orientation:'column', alignChildren:'left'}")) {
add("statictext {text:'Zeichen danach:'}");
danachText = add("edittext {characters:10}");
}
}
with (add("group {orientation:'column', alignChildren:'left', spacing:0}")) {
var durchgehendesFormat = add("checkbox {text:'nur Stellen finden die vom Zeichen davor bis zum'}");
add("statictext {text:'Zeichen danach durchgehen dieses Zeichenformat haben'}, indent:20");
}
}
with (dialogfenster.add("panel {orientation:'column', text:'Ersetzen', alignChildren:['center','top'], spacing:16}")) {
with (add("group {orientation:'column', alignChildren:'left'}")) {
add("statictext {text:'Zeichenformat:'}");
ersetzFormat = add("dropdownlist", undefined, alleZeichenformatNamen); //add("dropdownlist {properties:{items:alleZeichenformatNamen}}");
ersetzFormat.add("item", "dasselbe wie bei Suchen", 0)
ersetzFormat.add("separator", undefined, 1)
//ersetzFormat.preferredSize.width=300;
ersetzFormat.selection=0;
}
with (add("group {orientation:'row', alignment:'center'}")) {
add("button {text:'OK'}");
add("button {text:'Cancel'}");
}
}
}

if (dialogfenster.show() == 1) { //wenn OK geklickt wurde
if (davorText.text.length>1 || danachText.text.length>1) {alert("Das Script kann nur ein Zeichen suchen");}
suchFormat = meinDokument.allCharacterStyles[suchFormat.selection.index];
if (ersetzFormat.selection == null) {ersetzFormat.selection = 2;} //wenn die Linie ausgewählt wurde
if (ersetzFormat.selection.index == 0) {ersetzFormat=suchFormat;}
else {ersetzFormat = meinDokument.allCharacterStyles[ersetzFormat.selection.index-2];}
//grepCheckbox = grepCheckbox.value;
//if (grepCheckbox) {suchText = new RegExp(suchText,"g");}
if (davorText.text == "" && danachText.text == "") {alert("Es wurde kein Suchtext eingegeben");}
else {
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findChangeGrepOptions.includeFootnotes = true;
app.findChangeGrepOptions.includeHiddenLayers = false;
app.findChangeGrepOptions.includeLockedLayersForFind = false;
app.findChangeGrepOptions.includeLockedStoriesForFind = false;
app.findChangeGrepOptions.includeMasterPages = false;
if (app.scriptPreferences.version >= 10) {app.findChangeGrepOptions.searchBackwards = false;}
app.findGrepPreferences.appliedCharacterStyle = suchFormat;
var alleFundstellen = meinDokument.findGrep();
for (var i=0; i<alleFundstellen.length; i++) { //Fundstellen durchrödeln
var meineFundstelle = alleFundstellen[i];
if (davorText.text != "") {var zeichenDavor = suchZeichen(meineFundstelle, false);}
if (danachText.text != "") {var zeichenDanach = suchZeichen(meineFundstelle, true);}
if (durchgehendesFormat.value == true) {
if (zeichenDavor != undefined && zeichenDanach != undefined) {
if (zeichenDavor.contents == davorText.text && zeichenDanach.contents == danachText.text) {
bearbeiteZeichen(zeichenDavor);
bearbeiteZeichen(zeichenDanach);
}
}
} else {
if (zeichenDavor != undefined) {
if (zeichenDavor.contents == davorText.text) {bearbeiteZeichen(zeichenDavor);}
}
if (zeichenDanach != undefined) {
if (zeichenDanach.contents == danachText.text) {bearbeiteZeichen(zeichenDanach);}
}
}
}
alert(ersetzungenAnzahl+" Fundstellen ersetzt");
}
}
}

function bearbeiteZeichen(meinZeichen) {
if (meinZeichen.appliedCharacterStyle != ersetzFormat) {//wenn es schon das richtige Zeichenformat hat nicht nochmal zuweisen, sonst bekommt ersetzungenAnzahl seltsame Ergebnisse
meinZeichen.appliedCharacterStyle = ersetzFormat;
ersetzungenAnzahl++;
}
}
function suchZeichen(textstelle, richtung) {
if (richtung) {
var textstelleIndex = textstelle.index+textstelle.length;
if (textstelleIndex < textstelle.parent.characters.length) {var meinZeichen = textstelle.parent.characters[textstelleIndex];}
} else {
var textstelleIndex = textstelle.index-1;
if (textstelleIndex > -1) {var meinZeichen = textstelle.parent.characters[textstelleIndex];}
}
if (meinZeichen != undefined) {
while (meinZeichen.contents == "\uFEFF" || meinZeichen.contents == "\uFFFC" || meinZeichen.contents == "\u0004"
|| meinZeichen.contents == "\u0003" || meinZeichen.contents == SpecialCharacters.END_NESTED_STYLE
|| meinZeichen.contents == "\u200C" || meinZeichen.contents == SpecialCharacters.ZERO_WIDTH_NONJOINER
|| meinZeichen.contents == "\u200D" || meinZeichen.contents == SpecialCharacters.ZERO_WIDTH_JOINER
|| meinZeichen.contents == "\u0007" || meinZeichen.contents == SpecialCharacters.INDENT_HERE_TAB
|| meinZeichen.contents == "\u00AD" || meinZeichen.contents == SpecialCharacters.DISCRETIONARY_HYPHEN) {//Sonderzeichen überspringen (es muss immer nach beidem gefragt werden, weil wenn man den String einmal anschaut wird aus dem SpecialCharacter ein Unicode-String)
var meinZeichen=suchZeichen(meinZeichen, richtung);
}
}
return meinZeichen;
}


______________
Bitte mehr Bit!

Javascript zur Kursivierung von Klammern mit Variabler

Sigrun
Beiträge gesamt: 2

5. Mai 2023, 07:52
Bewertung:

gelesen: 3723

Beitrag als Lesezeichen
Hallo Steve,
ganz lieben Dank für dein Script. Verrückterweise hat gerade Gestern ein Bekannter uns ein Script gemacht, das auch funktioniert. Es hat zwar keine Eingabefelder wie deins und kann nur Italic-Klammern, löst aber auch das Problem, falls eine Klammer Italic und ein Regular ist.
Hier ist es
Code
//Set the necessary options 
app.findChangeGrepOptions.includeLockedLayersForFind = true;
app.findChangeGrepOptions.includeLockedStoriesForFind = true;
app.findChangeGrepOptions.includeHiddenLayers = true;
app.findChangeGrepOptions.includeMasterPages = false;
app.findChangeGrepOptions.includeFootnotes = true;
//Reset the preferences
app.findGrepPreferences = app.changeGrepPreferences = null;
//suchen und ersetzen
app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = '\\([^()]+\\)'
var myFound = app.activeDocument.findGrep();
// Schleife über alle Treffer
var all_italic;
for (var i = 0; i < myFound.length; i++) {
// Sind alle Zeichen italic?
all_italic = true;
//alert(myFound[i] + " " + myFound[i].characters.length);
// Überprüfen von "1" bis "Ende - 1", weil die Klammern selbst uns egal sind.
if (myFound[i].characters.length < 3) {
break;
}
for (var j = 1; j < myFound[i].characters.length - 1; j++) {
if (myFound[i].characters[j].fontStyle != 'Italic') {
all_italic = false;
}
}

// Einfärben nur wenn alle italic waren:
if (all_italic) {
myFound[i].appliedCharacterStyle = "ftitalic";
}
}

Javascript zur Kursivierung von Klammern mit Variabler

Quarz
Beiträge gesamt: 3550

6. Mai 2023, 10:56
Bewertung:

gelesen: 3554

Beitrag als Lesezeichen
Hallo Steve,

ich danke Dir :-))
Das ist genau das Script, das mir für das leidige
Problem mit Kursiv und Klammer gefehlt hat.

Ach, hätte ich es doch schon früher gehabt.

Gruß Quarz
--------------------------------------
| CS6 ver 8.1 | Win10/64 Prof. |

Javascript zur Kursivierung von Klammern mit Variabler

Steve Howe
Beiträge gesamt: 78

11. Mai 2023, 00:29
Bewertung:

gelesen: 3101

Beitrag als Lesezeichen
Hi Sigrun,
einen kleinen Fehler hab ich beim Überfliegen deines Scripts entdeckt:
Code
if (myFound[i].characters.length < 3) {break;} 

statt break müsste hier continue stehen, sonst beendet er die i-Schleife komplett. Er soll aber mit dem nächsten i weitermachen.
Die Zeile brauchst du eigentlich auch garnicht, weil die Schleife darunter nur myFound mit mehr als 2 Zeichen durchgeht.

Falls es nützlich ist: Ich habe auch noch ein Script, das die Anzahl der Klammern prüft. Wenn in einem Absatz 3 Klammern aufgehen, dann müssen auch 3 zugehen. Bei umfangreichen Korrekturen wird sowas gerne mal übersehen.

______________
Bitte mehr Bit!

Javascript zur Kursivierung von Klammern mit Variabler

Steve Howe
Beiträge gesamt: 78

24. Mai 2023, 16:26
Bewertung:

gelesen: 2653

Beitrag als Lesezeichen
Hallo Steve,

ich bin sehr glücklich über Dein Script, das ich für die Kursivierung von Klammern benutzten kann.

Jetzt ist meine Frage, ob Du es für mich dahingehend ändern könntest, dass beim Öffnen bereits die Klammern ( + ) und als Zeichenformat '1 italic' erscheint.
Natürlich sollte weiterhin die Möglichkeit bestehen bleiben, etwas anderes einzutragen.

Herzliche Grüße
Quarz
_____________________________________


Hi Quarz

In Zeile 7-9 gibt es jetzt 3 neue Variablen, mit dem eine Voreinstellung getroffen werden kann:

Code
//DESCRIPTION:Durchsucht das Dokument nach der im Dialogfeld eingestellten Zeichen+Zeichenformatkombination, z.B. können alle Klammern gesucht werden, die vor+nach kursivem Text stehen oder alle Doppelpunkte, die hinter fettem Text stehen, um diese dann richtig auszuzeichnen. 
//© s.howe@gmx.net 24.5.2024

if (app.documents.length == 0) {alert("kein Dokument geöffnet");}
else {
var meinDokument = app.activeDocument;
var voreinstellungDavor = "(";
var voreinstellungDanach = ")";
var voreinstellungZeichenformat = "1 Italic";
var alleZeichenformatNamen = [];
var ersetzungenAnzahl = 0;
for (var i=0; i<meinDokument.allCharacterStyles.length; i++) {
var meinZeichenformat = meinDokument.allCharacterStyles[i];
if (meinZeichenformat.name == voreinstellungZeichenformat) {voreinstellungZeichenformat = i;}
alleZeichenformatNamen.push(meinZeichenformat.name);
checkFormatgruppe(meinZeichenformat);
function checkFormatgruppe(meinZeichenformat) {
if (meinZeichenformat.parent.constructor.name == "CharacterStyleGroup") { //Formatgruppe davorschreiben und diese Funktion nochmal aufrufen, um Formatgruppe in Formatgruppe zu finden
alleZeichenformatNamen[alleZeichenformatNamen.length-1] = meinZeichenformat.parent.name + " &#9654; " + alleZeichenformatNamen[alleZeichenformatNamen.length-1];
checkFormatgruppe(meinZeichenformat.parent);
}
}
}

with (dialogfenster = new Window("dialog {orientation:'row', text:'ein oder mehrere Zeichen vor oder nach einem bestimmten Zeichenformat suchen', alignChildren:['center','fill']}")) { //Fenster erstellen
with (dialogfenster.add("panel {orientation:'column', text:'Suchen', alignChildren:['center','top']}")) {
with (add("group {orientation:'row', alignChildren:'left'}")) {
with (add("group {orientation:'column', alignChildren:'left'}")) {
add("statictext {text:'Zeichen davor:'}");
with (davorText = add("edittext")) {characters=10; text=voreinstellungDavor;}
}
with (add("group {orientation:'column', alignChildren:'left'}")) {
add("statictext {text:'Zeichenformat:'}");
suchFormat = add("dropdownlist", undefined, alleZeichenformatNamen);
//suchFormat.preferredSize.width=300;
if (voreinstellungZeichenformat.constructor.name == "String") {suchFormat.selection =0;}
else {suchFormat.selection = voreinstellungZeichenformat;}
}
with (add("group {orientation:'column', alignChildren:'left'}")) {
add("statictext {text:'Zeichen danach:'}");
with (danachText = add("edittext")) {characters=10; text=voreinstellungDanach;}
}
}
with (add("group {orientation:'column', alignChildren:'left', spacing:0}")) {
var durchgehendesFormat = add("checkbox {text:'nur Stellen finden die vom Zeichen davor bis zum'}");
add("statictext {text:'Zeichen danach durchgehen dieses Zeichenformat haben'}, indent:20");
}
}
with (dialogfenster.add("panel {orientation:'column', text:'Ersetzen', alignChildren:['center','top'], spacing:16}")) {
with (add("group {orientation:'column', alignChildren:'left'}")) {
add("statictext {text:'Zeichenformat:'}");
ersetzFormat = add("dropdownlist", undefined, alleZeichenformatNamen); //add("dropdownlist {properties:{items:alleZeichenformatNamen}}");
ersetzFormat.add("item", "dasselbe wie bei Suchen", 0)
ersetzFormat.add("separator", undefined, 1)
//ersetzFormat.preferredSize.width=300;
ersetzFormat.selection =0;
}
with (add("group {orientation:'row', alignment:'center'}")) {
add("button {text:'OK'}");
add("button {text:'Cancel'}");
}
}
}

if (dialogfenster.show() == 1) { //wenn OK geklickt wurde
if (davorText.text.length>1 || danachText.text.length>1) {alert("Das Script kann nur ein Zeichen suchen");}
suchFormat = meinDokument.allCharacterStyles[suchFormat.selection.index];
if (ersetzFormat.selection == null) {ersetzFormat.selection = 2;} //wenn die Linie ausgewählt wurde
if (ersetzFormat.selection.index == 0) {ersetzFormat=suchFormat;}
else {ersetzFormat = meinDokument.allCharacterStyles[ersetzFormat.selection.index-2];}
//grepCheckbox = grepCheckbox.value;
//if (grepCheckbox) {suchText = new RegExp(suchText,"g");}
if (davorText.text == "" && danachText.text == "") {alert("Es wurde kein Suchtext eingegeben");}
else {
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;
app.findChangeGrepOptions.includeFootnotes = true;
app.findChangeGrepOptions.includeHiddenLayers = false;
app.findChangeGrepOptions.includeLockedLayersForFind = false;
app.findChangeGrepOptions.includeLockedStoriesForFind = false;
app.findChangeGrepOptions.includeMasterPages = false;
if (app.scriptPreferences.version >= 10) {app.findChangeGrepOptions.searchBackwards = false;}
app.findGrepPreferences.appliedCharacterStyle = suchFormat;
var alleFundstellen = meinDokument.findGrep();
for (var i=0; i<alleFundstellen.length; i++) { //Fundstellen durchrödeln
var meineFundstelle = alleFundstellen[i];
if (davorText.text != "") {var zeichenDavor = suchZeichen(meineFundstelle, false);}
if (danachText.text != "") {var zeichenDanach = suchZeichen(meineFundstelle, true);}
if (durchgehendesFormat.value == true) {
if (zeichenDavor != undefined && zeichenDanach != undefined) {
if (zeichenDavor.contents == davorText.text && zeichenDanach.contents == danachText.text) {
bearbeiteZeichen(zeichenDavor);
bearbeiteZeichen(zeichenDanach);
}
}
} else {
if (zeichenDavor != undefined) {
if (zeichenDavor.contents == davorText.text) {bearbeiteZeichen(zeichenDavor);}
}
if (zeichenDanach != undefined) {
if (zeichenDanach.contents == danachText.text) {bearbeiteZeichen(zeichenDanach);}
}
}
}
alert(ersetzungenAnzahl+" Fundstellen ersetzt");
}
}
}

function bearbeiteZeichen(meinZeichen) {
if (meinZeichen.appliedCharacterStyle != ersetzFormat) {//wenn es schon das richtige Zeichenformat hat nicht nochmal zuweisen, sonst bekommt ersetzungenAnzahl seltsame Ergebnisse
meinZeichen.appliedCharacterStyle = ersetzFormat;
ersetzungenAnzahl++;
}
}
function suchZeichen(textstelle, richtung) {
if (richtung) {
var textstelleIndex = textstelle.index+textstelle.length;
if (textstelleIndex < textstelle.parent.characters.length) {var meinZeichen = textstelle.parent.characters[textstelleIndex];}
} else {
var textstelleIndex = textstelle.index-1;
if (textstelleIndex > -1) {var meinZeichen = textstelle.parent.characters[textstelleIndex];}
}
if (meinZeichen != undefined) {
while (meinZeichen.contents == "\uFEFF" || meinZeichen.contents == "\uFFFC" || meinZeichen.contents == "\u0004"
|| meinZeichen.contents == "\u0003" || meinZeichen.contents == SpecialCharacters.END_NESTED_STYLE
|| meinZeichen.contents == "\u200C" || meinZeichen.contents == SpecialCharacters.ZERO_WIDTH_NONJOINER
|| meinZeichen.contents == "\u200D" || meinZeichen.contents == SpecialCharacters.ZERO_WIDTH_JOINER
|| meinZeichen.contents == "\u0007" || meinZeichen.contents == SpecialCharacters.INDENT_HERE_TAB
|| meinZeichen.contents == "\u00AD" || meinZeichen.contents == SpecialCharacters.DISCRETIONARY_HYPHEN) {//Sonderzeichen überspringen (es muss immer nach beidem gefragt werden, weil wenn man den String einmal anschaut wird aus dem SpecialCharacter ein Unicode-String)
var meinZeichen=suchZeichen(meinZeichen, richtung);
}
}
return meinZeichen;
}


______________
Bitte mehr Bit!

Javascript zur Kursivierung von Klammern mit Variabler

Quarz
Beiträge gesamt: 3550

24. Mai 2023, 18:32
Bewertung:

gelesen: 2627

Beitrag als Lesezeichen


Anhang:
danke_schön.jpg (16.9 KB)