[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Fehler durch Zuweisen der properties eines Zeichens?!

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

Fehler durch Zuweisen der properties eines Zeichens?!

Kai Rübsamen
Beiträge gesamt: 4684

14. Aug 2016, 14:54
Beitrag # 1 von 9
Bewertung:
(2260 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo!

Mir ist leider kein sinnvollerer Beitragstitel eingefallen.

Ich erhalte Dokumente, wo nur lokal, also komplett ohne Formate gearbeitet wurde. Jetzt ist wichtig, dass ein Return auch die Formatierung des vorherigen Zeichens hat.

Beispiel: Das vorherige Zeichen ist rot, der Return ist schwarz. D.h. ich müsste jetzt den Return finden und die Zeichenfarbe rot zuweisen.

Da ich aber nicht weis, ob die Farbe, die Schrift, die Schriftgröße … abweicht, dachte ich, ich könnte global die properties der beiden Zeichen vergleichen und bei ungleich die properties vom ersten Zeichen dem zweiten Zeichen zuweisen.

Da zu den properties auch der 'contents' gehört, speichere ich den vorher und weise den nachträglich zu.

Problem:
Das erste Zeichen ist z.B. Futura, rot, 16 pt. Mein Skript macht daraus
Minion Pro, schwarz, 12 pt.

Ich dachte zunächst, es würde an der fehlenden Schrift auf meinem Computer liegen. Mit Myriad Pro geht es allerdings auch nicht.

Hat Jemand eine Idee für etwas, dass funktioniert?

Code
app.findGrepPreferences = app.changeGrepPreferences = null; 
app.findGrepPreferences.findWhat = ".\\r";
var allFounds = app.activeDocument.findGrep();

for (var i = 0; i < allFounds.length; i++) {
var curFound = allFounds[i];
var first = curFound.characters[0];
var sec = curFound.characters[1];
var secContents = sec.contents;
if (first.properties != sec.properties) {
sec.properties = first.properties;
sec.contents = secContents;
}
}


Edit: Ich merke gerade, dass first.properties nie sec.properties entspricht, da ja zumindest 'contents' immer anders ist. D.h. die if-Anweisung wird immer ausgeführt :(

(Dieser Beitrag wurde von Kai Rübsamen am 14. Aug 2016, 14:58 geändert)
X

Fehler durch Zuweisen der properties eines Zeichens?!

mdomino
Beiträge gesamt: 76

15. Aug 2016, 08:46
Beitrag # 2 von 9
Beitrag ID: #551942
Bewertung:
(2186 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai!
Also, wenn ich dein Problem richtig verstanden habe, kannst du das auch einfach über zwei GREP-Suchen lösen:

Zuerst suchst du nach dem letzten Zeichen vor dem Umbruch:

Code
.(?=\r) 


und ersetzt dieses durch sich selbst und einen neuen Umbruch:

Code
$0\r 


Dieser neue Umbruch hat dann das Format des Zeichens.
Dann musst du nur noch in einer weiteren GREP-Suche doppelte Umbrüche durch einzelne ersetzen, dann wird der zweite (falsch formatierte) Umbruch entfernt und nur der neue richtig formatierte bleibt.

Vielleicht hilft das weiter?

Grüße, md


als Antwort auf: [#551941]

Fehler durch Zuweisen der properties eines Zeichens?!

Martin Fischer
  
Beiträge gesamt: 12783

15. Aug 2016, 08:53
Beitrag # 3 von 9
Beitrag ID: #551943
Bewertung:
(2185 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

zwei Lösungsvorschläge:


1. quick & dirty;

Suche (via GREP) das letzte Zeichen eines Absatzes kombiniert mit der Absatzschaltung (Return): "(.)\r".
Ersetze die Fundstelle durch das letzte Zeichen und einem Return: "$1\r"
(Möglicherweise funktioniert auch eifnach "$0").

Bei diesem Vorgang sollten alle ersetzten Zeichen die (typographischen) Eigenschaften des ersten Zeichens erhalten.


2. Vergleich der Eigenschaften:
In einer Funktion könntest Du die properties von zwei Objekten (hier zwei Zeichen) miteinander vergleichen.
Bestimmte properties wie id, index, parent, parentTextFrames, properties ... (auch möglicherweise störende wie tabList, bulletChar, numberingRestartPolicies ...) könntest Du über ein Filter-Objekt beim Vergleich herausfiltern.

Oder Du erzeugst eine Positivliste mit den gewünschten zu vergleichenden Eigenschaften.

Bei Unterschieden in den Werten der verglichenen Eigenschaften zwischen dem letzten Zeichen und dem Return weist Du der entsprechenden Eigenschaft des Return den Wert des letzte Zeichens zu.


edit:
=====
mdomino hat - während ich noch am Formulieren war - einen ähnlichen Vorschlag wie meine quick&dirty-Lösung per GREP beigetragen.


als Antwort auf: [#551941]
(Dieser Beitrag wurde von Martin Fischer am 15. Aug 2016, 08:55 geändert)

Fehler durch Zuweisen der properties eines Zeichens?!

Uwe Laubender
Beiträge gesamt: 5316

15. Aug 2016, 09:47
Beitrag # 4 von 9
Beitrag ID: #551944
Bewertung:
(2134 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,
auch wenn Du eine Skriptlösung für Dein Problem findest, wie möchtest Du sicherstellen, dass das vorletzte Zeichen maßgeblich für die Formatierung des gesamten Absatzes ist?

Eine Lösung könnte sein, das Zeichen vor dem Absatzzeichen zu duplizieren und ein Absatzzeichen als Wert für contents zuzuweisen. Danach das alte Absatzzeichen löschen.

Hier dieser Vorschlag als Code:

Code
app.findGrepPreferences = app.changeGrepPreferences = null;  
app.findGrepPreferences.findWhat = ".\\r";
var allFounds = app.activeDocument.findGrep();

for(var n=0; n<allFounds.length; n++)
{
var curFound = allFounds[n];
var first = curFound.characters[0];
var sec = curFound.characters[1];
var indexSec = sec.index;
var story = first.parent;

first.duplicate(LocationOptions.AFTER , first);
story.characters[indexSec].contents = "\r";
story.characters[indexSec+1].remove();
};


//EDIT: Geht natürlich auch ohne die Variable paragraph. Die habe ich nun gestrichen und das Zeichen über den Index der Story angesteuert.


als Antwort auf: [#551941]
(Dieser Beitrag wurde von Uwe Laubender am 15. Aug 2016, 09:59 geändert)

Fehler durch Zuweisen der properties eines Zeichens?!

Kai Rübsamen
Beiträge gesamt: 4684

15. Aug 2016, 10:18
Beitrag # 5 von 9
Beitrag ID: #551945
Bewertung:
(2113 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo md und Martin,

danke für eure Beiträge:

md: das funktioniert

Martin: Deine Quick & Dirty-Lösung funktioniert nicht. Ich nehme an, weil die Anzahl der Zeichen nicht verändert wird.


als Antwort auf: [#551943]

Fehler durch Zuweisen der properties eines Zeichens?!

Martin Fischer
  
Beiträge gesamt: 12783

15. Aug 2016, 10:42
Beitrag # 6 von 9
Beitrag ID: #551946
Bewertung:
(2094 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Kai Rübsamen ] Martin: Deine Quick & Dirty-Lösung funktioniert nicht. Ich nehme an, weil die Anzahl der Zeichen nicht verändert wird.


Ja, ein Denkfehler.


als Antwort auf: [#551945]

Fehler durch Zuweisen der properties eines Zeichens?!

Uwe Laubender
Beiträge gesamt: 5316

15. Aug 2016, 10:53
Beitrag # 7 von 9
Beitrag ID: #551947
Bewertung:
(2082 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,
hast Du mal meine Lösung weiter oben getestet?

Die sollte funktionieren.

Und ist insofern sauber, da im Anschluß nach keinen doppelten Absatzzeichen gesucht werden und diese ersetzt werden müssen wie bei der GREP-Lösung von mdomino. Doppelte Absatzzeichen können ja auch mal gewollt sein.


als Antwort auf: [#551945]

Fehler durch Zuweisen der properties eines Zeichens?!

Uwe Laubender
Beiträge gesamt: 5316

15. Aug 2016, 11:13
Beitrag # 8 von 9
Beitrag ID: #551948
Bewertung:
(2056 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Kai und ich haben uns gerade über mein Snippet off-Forum ausgetauscht.

Das Ergebnis will ich mal reinstellen. Es benutzt den zweiten InsertionPoint des ersten Characters und weist diesem ein Absatzzeichen zu. So spart man sich den duplicate()-Befehl:

Code
app.findGrepPreferences = app.changeGrepPreferences = null;  
app.findGrepPreferences.findWhat = ".\\r";
var allFounds = app.activeDocument.findGrep();

for(var n=0; n<allFounds.length; n++)
{
var curFound = allFounds[n];
var first = curFound.characters[0];
var sec = curFound.characters[1];
var indexSec = sec.index;
var story = first.parent;

// ÄNDERUNG:
first.insertionPoints[1].contents = "\r";
story.characters[indexSec+1].remove();
};



als Antwort auf: [#551947]

Fehler durch Zuweisen der properties eines Zeichens?!

Kai Rübsamen
Beiträge gesamt: 4684

15. Aug 2016, 12:07
Beitrag # 9 von 9
Beitrag ID: #551949
Bewertung:
(2011 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Bekanntlich erfährt man die Wahrheit immer häppchenweise …

Ich suche nicht nur ein Zeichen vor einem Return, sondern auch einen falsch formatierten Return vor dem Return. In dem Fall hat der insertionPoint nicht funktioniert und Uwe und ich haben beschlossen, dass der duplicate()-Befehl doch die richtige Wahl war:

Code
var curDoc = app.activeDocument; 

checkReturns(".\\r", "\r");
checkReturns("\\r{2}", "\r");

function checkReturns(f, insert) {

app.findGrepPreferences.findWhat = f;
var allFounds = app.activeDocument.findGrep();

for (var n = 0; n<allFounds.length; n++) {
var curFound = allFounds[n];
curFound.select();
var first = curFound.characters[0];
var sec = curFound.characters[1];
var indexSec = sec.index;
var story = first.parent;

first.duplicate(LocationOptions.AFTER , first);
story.characters[indexSec].contents = insert;
story.characters[indexSec+1].remove();
}
}


Erklärung: Durch …insertionPoints[-1] stehe ich im Fall vom Return bereits im nächsten Absatz und nehme mit contents auch die Formatierung von diesem auf. Das ist bei duplicate() nicht der Fall.

Warum habe ich jetzt die Variante von Uwe und nicht die einfachere von md genommen? Weil bei Uwes Variante gleich der falsche Return gelöscht wird und ich so nicht nachträglich zwischen einem "guten" und einem "bösen" zweiten Return unterscheiden muss.

Danke an alle fürs Mitdenken :)


als Antwort auf: [#551948]
(Dieser Beitrag wurde von Kai Rübsamen am 15. Aug 2016, 12:13 geändert)
X