Zwischenablagespeicher  GELÖST

Anwenderaustausch zur PhraseExpress Makroprogrammierung
Post Reply
low
Posts: 44
Joined: 21 Jul 15, 07:37

Zwischenablagespeicher

Post by low » 16 Apr 19, 13:55

Hallo miteinander,

eine der Funktionen von PEX die im Alltag am häufigsten benutze ist der Zwischenablagespeicher.
Es kommt recht häufig vor, dass ich kurze Passagen aus Fachbüchern im .pdf Format in anderen Dokumente (z.B. Word) übertragen möchte.

Beispiel:
In der nun vorliegenden 16. Auflage des Lehrbuches der analytischen und präpa-<cr><lf>
rativen anorganischen Chemie haben wir einige Ergänzungen und Aktualisierun-<cr><lf>
gen eingefügt und die noch vorhandenen Druckfehler korrigiert. Ein Teil der Ab-<cr><lf>
bildungen wurde neu gestaltet.
Dabei kopiert man die beiden blau hervorgehobene Steuerzeichen cr (carriage return) und lf (line feed) mit. Diese bewirken den Zeilenumbruch.
Möchte man das Ganze dann in schön in seiner Zielanwendung haben, muss man den Bindestrich, den cr und das line feed manuell löschen. Das macht Arbeit die ich mir gerne sparen würde.

Dank RegEx wäre das auch leicht zu machen:
Suche: '\r|\n-'
Ersetze durch: ''

Dafür nutzen würde ich die Makros "Zwischenablage einfügen" in Kombination mit "Text ersetzen".
Allerdings kann ich dieses ja nur auf einen konkret anhand der Nummer benannten Eintrag des Zwischenablagespeichers anwenden.

Hat jemand eine Idee wie ich das auf alle Elemente der Liste anwenden kann?

@ Phraseexpress Team:
Für eine zukünftige Version würde ich mir unter den Optionen des Zwischenablagespeichers eine neue à la "folgendes (RegEx) aus Zwischenablagespeicher entfernen" wünschen.
Oder noch besser: den Button "Ausgabe weiterverarbeiten" in Zusammenhang mit dem Zwischenablagespeicher.

Peter Stotz
PhraseExpress Expert
Posts: 921
Joined: 27 Feb 08, 15:07

Post by Peter Stotz » 16 Apr 19, 20:50

@low
Dieses Makroprogramm enfernt alle Zeilenwechsel CRLF aus dem kopierten Textabschnitt,
die Silbentrennung (und vor und nach CRLF vorhande whitespaces) werden ggf. berücksichtigt:

Code: Select all

(* 20190416 • Textmarkierung ohne Zeilenwechsel bereitstellen - Silbentrennungen werden entfernt (RegEx)
*){#setclipboard}{#clipboard -copy}(* 
  Zeichenkombinationen vor und/oder nach dem Zeilenwechsel CRLF mit Silbentrennung bearbeiten:
  Whitespaces, Silbentrennzeichen und Zeilenwechsel CRLF entfernen
*){#setclipboard {#regexrep -text {#insertclipboard} -expr -\h+\R\h+ -repexpr }}(* 
*){#setclipboard {#regexrep -text {#insertclipboard} -expr -\R\h+ -repexpr }}(* 
*){#setclipboard {#regexrep -text {#insertclipboard} -expr -\h+\R -repexpr }}(* 
*){#setclipboard {#regexrep -text {#insertclipboard} -expr -\R -repexpr }}(*
  Zeichenkombinationen vor und/oder nach dem Zeilenwechsel CRLF bearbeiten:
  Mit einem Leerzeichen ersetzen
*){#setclipboard {#regexrep -text {#insertclipboard} -expr \h+\R\h+ -repexpr  }}(*
*){#setclipboard {#regexrep -text {#insertclipboard} -expr \R\h+ -repexpr  }}(*
*){#setclipboard {#regexrep -text {#insertclipboard} -expr \h+\R -repexpr  }}(*
*){#setclipboard {#regexrep -text {#insertclipboard} -expr \R -repexpr  }}(* 
  Balloonmeldung und optionale Ausgabe
*){#balloon -title Alle Zeilenwechsel entfernt! -text Ausgabe an der Cursorposition: Anklicken oder STGR+v ... -onclick {#insertclipboard}}
Der überarbeitete Text lässt sich in einer Zielanwendung an der Cursorposition ausgeben (dazu die
Sprechblasenmeldung anklicken oder STGR+v).

Jeder Zeilenwechsel CRLF kann von Minus, Leerzeichen und Tabs in unterschiedlicher Kombination umgeben sein, diese Kombinationen werden vom Makro in der erforderlichen Abfolge behandelt.

Ideal wäre ein regulärer Ausdruck, der alle entsprechenden Zeichenkombinationen um \R herum erfasst - den habe ich leider noch nicht gefunden...
Für die Ersetzungen von CRLF habe ich \R verwendet, mit \r\n funktioniert #regexrep hier NICHT -
vielleicht kann der Technische Support oder ein RegEx-Kenner dies erklären !?


Peter
Windows 10 - PhraseExpress v14.0.138

El Schwalmo
PhraseExpress Expert
Posts: 26
Joined: 29 Aug 06, 19:35

Post by El Schwalmo » 17 Apr 19, 08:53

@Peter Stotz

danke für dieses Makro, ich kann das gut gebrauchen. Ich habe das bisher mit der Textverarbeitung gemacht, hatte aber Nachteile.

Ich habe damit nur ein Problem (allerdings mit PEX 13.6.7p, die letzte Anweisung mit dem Meldungsfenster habe ich entfernt): nach diesem Makro funktioniert der Fokus-Wechsel nicht mehr.

low
Posts: 44
Joined: 21 Jul 15, 07:37

Post by low » 17 Apr 19, 14:37

Hallo Peter,

ich habe das mal mit meinem Lieblings-RegEx-Try-And-Error-Tool angesehen.

https://regex101.com/ sagt dazu:
\R matches any Unicode newline sequence; can be modified using verbs
\r matches a carriage return (ASCII 13)
\n matches a line-feed (newline) character (ASCII 10)
Wenn ich das richtig deute, ist \R scheinbar so eine Art plattformübergreifender Universal-Ausdruck, der nicht auf die ASCII Codes angewiesen ist.
Das scheint mir auch plausibel, da mein erster Ausdruck \r\n aus Notepad++ stammt und ich diesen leichtfertigerweise für meinen Thread kopiert habe, ohne ihn vorher in Phraseexpress zu testen.

Ich vermute daher einfach einen Konflikt in Bezug auf die RegEx Edition.
Phraseexpress verwendet ja Python-RegEx wenn ich mich nicht täusche. Vielleicht ist das in Notepad++ was anderes.

Ich werde jetzt nochmal etwas testen und mich dann wieder melden.

low
Posts: 44
Joined: 21 Jul 15, 07:37

Post by low » 17 Apr 19, 14:57

Ideal wäre ein regulärer Ausdruck, der alle entsprechenden Zeichenkombinationen um \R herum erfasst - den habe ich leider noch nicht gefunden...
Ich habe jetzt eine recht einfache Lösung gefunden, die per RegEx zumindest in der Zwischenablage in zwei Schritten macht was ich möchte.
(Ein genauer Test steht allerdings noch aus.)

Code: Select all

{#set -name temp1 -content {#regexrep -text {#insertclipboard -variablename Zwischenablage einfügen} -expr (-)\R -repexpr  -variablename Text ersetzen} -variablename Variableninhalt definieren}{#set -name temp2 -content {#regexrep -text {{temp1}} -expr \R -repexpr   -variablename Text ersetzen} -output -variablename Variableninhalt definieren}
Funktionsweise:
  • In der Zwischenablage "(-)\R" durch nichts ersetzen. Dies entfernt alle Umbrüche denen ein Bindestrich vorangeht.
  • Das Ergebnis der Variable temp1 zuweisen.
  • In Variable temp1 "\R" suchen und durch ein Leerzeichen ersetzen. Dies entfernt alle Umbrüche denen keine Worttrennung vorangeht und setzt stattdessen das Leerzeichen ein, um die Worte voneinander zu trennen.
  • Das Ergebnis Variable temp2 zuweisen.
  • Variable temp2 ausgeben.
Erläuterung:
  • Ich habe statt in der Zwischenablage zu arbeiten Variablen benutzt. Dies scheint mir performanter. Ich benutze die USB Version und zumindest in dieser fällt der Unterschied auf.
  • Im Beispiel sind die Variablen permanent. Dieses dient nur Testzwecken. Wenn alles läuft werde ich sie zu temporären machen.
  • Ebenso dient das Zwischenspeichern in temp2 Testzwecken. Dies werde ich wenn sich das Makro in allen Fällen als zuverlässig erweist ändern. Dann werde ich das Ergebnis des zweiten Durchlaufs direkt ausgeben, statt es in eine Variable zu schreiben.
Was dann allerdings noch fehlt, ist die Anwendbarkeit auf den Zwischenablagenspeicher. Bisher funktioniert das ja nur mit der einfachen Zwischenablage.
Dazu habe ich bisher keine Idee.

Peter Stotz
PhraseExpress Expert
Posts: 921
Joined: 27 Feb 08, 15:07

Post by Peter Stotz » 17 Apr 19, 19:10

@low
1. Zu \r\n bzw. \R
Ich meine, dass #regexrep 'eigentlich' \r\n akzeptieren sollte...
2. Zur Verwendung der Zwischenablage:
Ja, aufwändige Operationen sind mit der Zwischenablage nicht zu empfehlen,
siehe auch die Antwort des technischen Supports hier: http://www.bartelsmedia.com/forum/viewt ... 47&t=17214
3. Zur Aufgabenstellung:
Da sich - abgesehen vom Silbentrennungszeichen vor und/oder nach den CRLF auch ein oder
mehrere whitespaces (Leerzeichen und Tabs) befinden können, sollten diese Fälle auch
berücksichtigt werden. Beispiel (symbolisch _ für Space, → für Tab, ¶ für CRLF)
Aus…
Zeile1 Silben →→¶
trennung Zeile2__¶
__Zeile3→→¶
→→→Zeile 4¶
Zeile5

… soll dies werden:
Zeile1 Silbentrennung Zeile2 Zeile3 Zeile 4 Zeile5

Mit meinem Lösungsbeispiel funktioniert das, macht aber mehrere #regexrep-Anwendungen in einer bestimmten Abfolge erforderlich. Eine einzelne oder auch zwei 'ideale Regex' habe ich dafür (noch) nicht gefunden...
Peter
Windows 10 - PhraseExpress v14.0.138

low
Posts: 44
Joined: 21 Jul 15, 07:37

Post by low » 24 Apr 19, 14:46

Hallo Peter,

ich glaube ich habe eine erschreckend einfache Lösung für die Aufgabenstellung mit den Whitespaces gefunden (ausführliche Tests stehen noch aus):

Code: Select all

\s+
Erläuterung:
\s
matches any whitespace character (equal to [\r\n\t\f\v ])

+ Quantifier
Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)

Wenn man also einfach alle auftretenden Whitespaces (die dank des + jeweils in Folge nur als eines gezählt werden) durch ein Leerzeichen ersetzt ist alles weg was stört.

siehe: https://regex101.com/r/qsSH5t/1

low
Posts: 44
Joined: 21 Jul 15, 07:37

Post by low » 24 Apr 19, 15:14

Eine Gesamtlösung in zwei Schritten könnte dann so aussehen:

Code: Select all

{#set -name temp2 -content {#regexrep -text {#insertclipboard -variablename Zwischenablage einfügen} -expr -\R -repexpr }}{#set -name temp1 -content {#regexrep -text {{temp2}} -expr \s+ -repexpr  } -output}
erster Schritt:
-\R um Silbentrennungen zu entfernen (ersetzen durch nichts). Wichtig ist, dies als ersten Schritt durchzuführen, da zu diesem Zeitpunkt noch das \R zur Unterscheidung von zu erhaltenen Trennungen vorhanden ist.

Dann per \s+ alle aufsummierten Whitespaces durch ein Leerzeichen ersetzen.

Peter Stotz
PhraseExpress Expert
Posts: 921
Joined: 27 Feb 08, 15:07

Post by Peter Stotz » 24 Apr 19, 17:58

@low
… erschreckend einfache Lösung“ – das gefällt mir sehr, solche Lösungen sind mir am aller-aller-liebsten... ;-)
Aber -\R erfasst nur "Standard-Sibentrennungen" mit der Zeichenabfolge …–CRLF…
jedoch NICHT Silbentrennungen mit Zeichenabfolgen wie …–__CRLF__… oder …–→→CRLF→→… und/oder Kombinationen davon (Symbole: _ für Space, → für Tabs, … für Text).
Dafür muss dann so etwas wie (-)(\s+)?\R(\s+)? verwendet werden.
Mein (vorläufiger) Favorit mit drei #regexrep-Aufrufen:

Code: Select all

{#clipboard -copy}{#setclipboard {#regexrep -text {#insertclipboard} -expr (-)(\s+)?\R(\s+)? -repexpr }}{#setclipboard {#regexrep -text {#insertclipboard} -expr \R -repexpr  }}{#setclipboard {#regexrep -text {#insertclipboard} -expr \s+ -repexpr  }}{#balloon -title Alle Zeilenwechsel entfernt! -text Ausgabe an der Cursorposition: Anklicken oder STGR+v ... -onclick {#insertclipboard}}
Peter
Windows 10 - PhraseExpress v14.0.139

low
Posts: 44
Joined: 21 Jul 15, 07:37

Post by low » 26 Apr 19, 10:44

Hallo Peter,

ich gebe nicht auf. Hier mein nächster Versuch in zwei Schritten:
;-)

Code: Select all

{#settemp -name t1 -content {#regexrep -text {#insertclipboard -variablename Zwischenablage einfügen} -expr \s*-\s*(?<!.) -repexpr }}{#set -name t1 -content {#regexrep -text {{t1}} -expr \s+ -repexpr  } -output}
zur Erläuterung:

1. Schritt

Code: Select all

\s*-\s*(?<!.)
sucht nach keinem oder mehreren Whitespaces, die von einem Trennstrich, von keinem oder mehreren Whitespaces aber von keinem character gefolgt sind. So wird verhindert, dass gewollte Trennungen wie z.B. "Nacht- und Nebelaktion" nicht beeinflusst werden. Gleiches gilt für die unsäglichen Bindestriche die man heute vermehrt zwischen zusammengesetzten Nomen findet.

https://regex101.com/r/qsSH5t/3

2. Schritt

Code: Select all

\s+
Ersetzt dann wie bereits in der ersten Version alle Whitespaces durch ein Leerzeichen.

Peter Stotz
PhraseExpress Expert
Posts: 921
Joined: 27 Feb 08, 15:07

Post by Peter Stotz » 26 Apr 19, 12:31

@low
Getestet und ich bin begeistert!

Damit ist aus meiner Sicht nur noch eine Anwendungssituation ungelöst:
Wenn in der Zeile nach einer Silbentrennung eine Einrückung mit einem oder mehreren whitspaces besteht,
wird aus:
Silben-
__trennung
dies:
Silben trennung

Solche Anwendungsfälle sind vermutlich eher selten, können aber schon vorkommen...
Und ja - ich bin schon ein arg pingeliger Perfektionist. Ingenieur halt ... ;-)
Peter
Windows 10 - PhraseExpress v14.0.139

low
Posts: 44
Joined: 21 Jul 15, 07:37

Post by low » 26 Apr 19, 13:36

Richtig so. Wenn wir hier schon an Lösungen arbeiten, dann an welchen die immer funktionieren.
;-)

Ich glaube mit dieser RegEx im ersten Schritt sollte auch dieser letzte Fall abgedeckt sein:

Code: Select all

\s*-\s*(?<!.)\s*
https://regex101.com/r/qsSH5t/7

Peter Stotz
PhraseExpress Expert
Posts: 921
Joined: 27 Feb 08, 15:07

Post by Peter Stotz » 26 Apr 19, 14:01

@low
Bei uns hier sagt man „nicht schlecht!“ (das ist schwäbische Ekstase).
Kompakt und Perfekt!
Als Makro kann das dann so aussehen:

Code: Select all

(* 20190428 • Zeilenwechsel, Silbentrennungen, alle Leerzeilen und alle mehrfach aufeinanderfolgenden whitespaces 
              aus der Textmarkierung entfernen (RegEx by low http://www.bartelsmedia.com/forum/viewtopic.php?f=147&t=17279)
*){#setclipboard}{#clipboard -copy}(* 
  1. Den Zeilenwechsel CRLF ggf. mit Silbentrennungszeichen und whitespace-Zeichenfolgen vor und/oder nach dem Zeilenwechsel
  mit einem Leerzeichen ersetzen 
  2. Leerzeilen und mehrfach aufeinanderfolgende whitespaces mit einem whitespace ersetzen
*){#setclipboard {#regexrep -text {#regexrep -text {#insertclipboard} -expr \s*-\s*(?<!.)\s* -repexpr } -expr \s+ -repexpr  }}(* 
  Balloonmeldung und optionale Ausgabemöglichkeiten
*){#balloon -title Alle Zeilenwechsel entfernt! -text Ausgabe an der Cursorposition: Anklicken oder STGR+v ... -onclick {#insertclipboard}}
Vielen Dank für deine Zeit und Mühe!
Und gut, dass ich jemanden kenne, der sich mit regulären Ausdrücken auskennt...
Peter
Windows 10 - PhraseExpress v14.0.139
Update am 28.04.2019 - Codeoptimierung: Ich habe die beiden #regexrep-Makros noch verschachtelt ...
Die Veröffentlichung des Makros unter "Kostenlose Erweiterungen" ist eine gute Idee!

low
Posts: 44
Joined: 21 Jul 15, 07:37

Post by low » 26 Apr 19, 17:13

@Peter
Bei uns hier sagt man „nicht schlecht!“ (das ist schwäbische Ekstase).
Kompakt und Perfekt!
Danke für die Blumen. ;-)
Es freut mich sehr, dass speziell Dir das RegEx gefällt, denn deine engagierte Mitarbeit im Forum hat mir schon sehr oft weiter geholfen.
Daher sehe ich als eine Art "Rückzahlung" für Hilfe die mir bereits entgegengebracht wurde. Außerdem tüftele ich gerne.

Dein Einverständnis vorausgesetzt, stelle ich das Makro das Du daraus gemacht hast unter "Kostenlose Erweiterungen" zur Verfügung, damit es auch andere finden und nutzen können.

low
Posts: 44
Joined: 21 Jul 15, 07:37

Post by low » 26 Apr 19, 17:18

Jetzt habe ich abschließend zu dem Thema nur noch einen Wunsch an das Phraseexpress-Team:

Bitte, bitte, bitte spendiert dem Zwischenanblagespeicher die Funktion "Ausgabe weiterverarbeiten".

m-s
Posts: 19
Joined: 31 Jan 11, 12:47

Post by m-s » 16 Sep 19, 17:59

Was Ihr da zusammengebaut habt ist wirklich super!
Was habe ich in den letzten 30 Jahren alles schon per Hand umformatiert :)

Beim Testen Eures Makros habe ich erstaunt festgestellt, dass der Microsoft Edge die Funktion auch erledigt, einfach beim Einfügen von Text aus einem PDF in die Zwischenablage.Ob der alle Fälle beachtet, die Ihr beachtet habt, habe ich nicht versucht.

Post Reply