Anführungs- und Schlusszeichen automatisch ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 29.02.2016 10:01:24

Ich benutze oft Markdown für Texte, die ich als später nach HTML umwandle und publiziere. Dazu habe ich mir ein Skript geschrieben (md2html), das einige Ersetzungen vornimmt, z.B. zwei Bindestriche (--) durch einen Gedankenstrich (–) und drei Punkte (...) durch typografisch korrekte Auslassungspunkte als einzelnes Zeichen (…).
Ein Problem sind jedoch die Anführungs- und Schlusszeichen, die ich gerne automatisiert verschönern möchte:

Code: Alles auswählen

Er sprach: "Wissen Sie, was er gesagt hat? Er sage: 'Das interessiert mich nicht!' So eine Frechheit!"
Soll umgewandelt werden zu:

Code: Alles auswählen

Er sprach: «Wissen Sie, was er gesagt hat? Er sage: ‹Das interessiert mich nicht!› So eine Frechheit!»
Die Anführungs- und Schlusszeichen ("…") sollen durch doppelte Guillemets («…» ), und die Apostrophe ('…') durch einfache Guillemets (‹…›) ersetzt werden. Ich würde also gerne nach der Logik vorgehen, dass das erste Auftreten eines solchen Zeichens durch ein öffnendes Guillemet, das zweite durch ein schliessendes Guillemet ersetzt wird. Wenn man sie durchnummerieren würde: Ungerade öffnend, gerade schliessend.
Mit sed bin ich für diesen Ansatz auf keine Lösung gekommen. Man brauchte da wohl ein Tool, dass über Variablen verfügt und sich den gegenwärtigen Zustand (geöffnet, geschlossen) merken kann. Geht das mit sed, oder sollte ich besser zu awk oder Perl greifen? Oder gibt es sonst ein UNIX-Standard-Tool, womit sich so etwas bewerkstelligen liesse?
Danke für eure Hilfe!
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
smutbert
Moderator
Beiträge: 8317
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von smutbert » 29.02.2016 10:11:37

Dass im öffnenden Fall davor ein Blank und im schließenden Fall danach ein Blank ist, willst du nicht ausnutzen (vielleicht weil es nicht verlässlich so ist oder weil es zu einfach wäre :wink: )?

(ich meine zumindest das Blank vor dem öffnenden Anführungszeichen sollte doch einigermaßen sicher da sein, dann könnte man im ersten Durchgang alle Vorkommen von [Blank]" durch [Blank]« ersetzen und im zweiten Durchgang alle übrig gebliebenen " durch »)

uname
Beiträge: 12046
Registriert: 03.06.2008 09:33:02

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von uname » 29.02.2016 10:28:09

Leider habe ich keine Lösung. Aber ich denke dein Problem ist in der Chomsky-Hierarchie eine Typ-2-Grammatik (kontextfreie Grammatik).

https://de.wikipedia.org/wiki/Chomsky-Hierarchie.

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 29.02.2016 10:41:54

smutbert hat geschrieben:Dass im öffnenden Fall davor ein Blank und im schließenden Fall danach ein Blank ist, willst du nicht ausnutzen (vielleicht weil es nicht verlässlich so ist oder weil es zu einfach wäre :wink: )?
Das muss nicht immer der Fall sein. Es kann auch ein Interpunktionszeichen folgen:

Code: Alles auswählen

Er sagte: "Sie kommentierte den Zwischenfall mit den Worten: 'Dumm gelaufen.'"
Ich glaube, dass mein "n und n+1"-Ansatz zuverlässiger ist, zumindest was Anführungs- und Schlusszeichen betrifft. Bei Apostrophen kann es viele Ausnahmen geben: Thomas' Fahrrad, Marx' Kapital usw, Rock'n'Roll usw.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von Meillo » 29.02.2016 11:41:58

Wenn du davon ausgehst, dass Anfuehrungszeichen immer paarweise vorkommen, dann koenntest du dich vielleicht von diesem Ansatz von heisenberg inspirieren lassen:
pastebin.php?mode=view&s=38828
pastebin.php?mode=view&s=38735

Dein eigentliches Problem werden aber wohl die Apostrophe sein, weil die zu einer Doppeldeutigkeit fuehren, aber das weisst du ja schon selbst.

Dein Ziel wird eine moeglichst robuste 90%-Loesung sein muessen ... mit Betonung auf ``robust''. ;-)

Hier mal noch ein Codeschnipsel in awk, der Anfuehrungszeichen abwechselnd ersetzt, weil du nach genau so was gefragt hast:

Code: Alles auswählen

{
    for (i=1; i<=NF; i++) {
        if ($i == "\"") {
            printf(closing ? "»" : "«")
            closing = !closing
        } else {
            printf("%s", $i) 
        }   
    }   
    print ""
}
Aufruf mit: awk -F "" -f script <input

Heisenbergs Ansatz mit dem paarweisen Ersetzen ist aber netter. ... am Ende sollte die Frage stehen, was robuster ist.
Use ed once in a while!

mullers

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von mullers » 29.02.2016 12:20:10

Was ich nicht verstehe, macht dein Editor das nicht? Also Guillemets, Geviertstrich usw.

WernerFP
Beiträge: 261
Registriert: 30.07.2013 11:16:58

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von WernerFP » 29.02.2016 20:37:23

Eine schöne Herausforderung am Abend :D
paedubucher hat geschrieben:[…] Ich würde also gerne nach der Logik vorgehen, dass das erste Auftreten eines solchen Zeichens durch ein öffnendes Guillemet, das zweite durch ein schliessendes Guillemet ersetzt wird. […]
Da sich die öffnenden und schließenden Anführungszeichen an der Position der Leerzeichen (sowie der Umbrüche und Tabulatoren) identifizieren lassen, geht es auch mit sed. Weil‘s so unleserlich ist, in Einzelschritten aufgedröselt:

1. Austausch der Anführungszeichen im Fließtext:

Code: Alles auswählen

sed 's/ "/ «/g;s/" /» /g;s/'\'' /› /g;s/ '\''/ ‹/g'
2. Austausch vor und nach Zeilenumbrüchen sowie Dateianfang und -ende:

Code: Alles auswählen

sed 's/^"/«/g;s/"$/»/g;s/^'\''/\‹/g;s/'\''$/\›/g'
3. Austausch vor und nach Tabulatoren:

Code: Alles auswählen

sed 's/\t"/\t«/g;s/"\t/»\t/g;s/\t'\''/\t‹/g;s/'\''\t/›\t/g'
4.Berücksichtigung von Satzzeichen nach schließenden Anführungszeichen:

Code: Alles auswählen

sed 's/"\./»\./g;s/",/»,/g;s/":/»:/g;s/"!/»!/g;s/"?/»?/g;s/"\;/»\;/g;s/"…/»…/g;s/")/»)/g'
sed 's/'\''\./›\./g;s/'\'',/›,/g;s/'\'':/›:/g;s/'\''!/›!/g;s/'\''?/›?/g;s/'\''\;/›\;/g;s/'\''…/›…/g;s/'\'')/›)/g'
4.1 Doppelte Anführungszeichen nachbessern:

Code: Alles auswählen

sed 's/»'\''/»›/g;s/'\''«/‹«/g'
5. Zum Schluss etwaige Zollzeichen wieder reparieren:

Code: Alles auswählen

sed 's/[0-9][0-9]*»/&"/g;s/»"/"/g'
Kompletter Befehl:

Code: Alles auswählen

sed 's/ "/ «/g;s/" /» /g;s/'\'' /› /g;s/ '\''/ ‹/g;s/^"/«/g;s/"$/»/g;s/^'\''/\‹/g;s/'\''$/\›/g;s/\t"/\t«/g;s/"\t/»\t/g;s/\t'\''/\t‹/g;s/'\''\t/›\t/g;s/"\./»\./g;s/",/»,/g;s/":/»:/g;s/"!/»!/g;s/"?/»?/g;s/"\;/»\;/g;s/"…/»…/g;s/")/»)/g;s/'\''\./›\./g;s/'\'',/›,/g;s/'\'':/›:/g;s/'\''!/›!/g;s/'\''?/›?/g;s/'\''\;/›\;/g;s/'\''…/›…/g;s/'\'')/›)/g;s/«'\''/«‹/g;s/'\''»/›»/g;s/[0-9][0-9]*»/&"/g;s/»"/"/g' Textbeispiel.txt
Gruß, Werner

Edit: Hätte mich auch gewundert, wenn ich nicht was vergessen hätte :)
Nach schließenden Anführungszeichen kann ja auch noch ein Satzzeichen stehen. Ich hab‘s entsprechend korrigiert.


Edit, die zweite:
‣ Ergänzung: Schließende Klammer nach Anführungszeichen wird berücksichtigt.
‣ Ein Schnipsel, um den bzw. die oben stehenden sed-Befehle von Guillemets auf deutsche Anführungszeichen umzuschreiben:

Code: Alles auswählen

sed 's/«/„/g;s/»/“/g;s/‹/‚/g;s/›/‘/g'
Edit, die dritte:
‣ Ergänzung: Doppelte Anführungszeichen nachgebessert
Zuletzt geändert von WernerFP am 01.03.2016 18:09:27, insgesamt 3-mal geändert.

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 01.03.2016 08:56:10

@Meillo: Vielen Dank für diesen Ansatz und den Beispielcode!

@mullers: Ich verwende vi, nicht Word ;-)

@WernerFP: Das dürfte wirklich alles abdecken.

Insgesamt scheint mir awk hier der bessere Ansatz zu sein. Meine Faustregel ist, dass wenn es unleserlich ist, man das falsche Werkzeug verwendet. Und den awk-Ansatz verstehe ich sofort, obwohl ich awk seit zwei Jahren nicht mehr verwendet habe.

Ich probiere das ganze am Abend aus und kann dann mein fertiges Skript noch posten, falls sich jemand dafür interessiert.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von Meillo » 01.03.2016 10:42:15

paedubucher hat geschrieben: @mullers: Ich verwende vi, nicht Word ;-)
Aber das ist doch kein Grund dagegen. Wenn dein vi UTF-8-faehig ist, dann kannst du die Zeichen doch direkt eingeben. Und wenn du dir keine Zeichenpositionen merken willst, dann verwendest du einfach die Compose-Taste, z.B. mit:

Code: Alles auswählen

setxkbmap de nodeadkeys caps:escape compose:paus
in der .xinitrc und anschliessend: PAUSE + < + < fuer « bzw. PAUSE + > + > fuer ». ;-)
Use ed once in a while!

mullers

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von mullers » 01.03.2016 13:01:40

paedubucher hat geschrieben:
@mullers: Ich verwende vi, nicht Word ;-)
Die überheblichen vi Benutzer (ich benutze ihn übrigens auch :smile:). Wer lesen kann ist halt eindeutig im Vorteil: Ich habe ja geschrieben: `Editor' und nicht `Textverarbeitung' oder `word processor'.
Und wenn du gleich nochmal draufhaun willst: In diesem Fall geht es sogar um emacs (im vi modus).
Geviertstrich, halber, viertel, als guter Deutscher™ Chevrons, beliebige Unicode Zeichen, meine Oma, deren Papagei, alles direkt eingegeben...

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 01.03.2016 16:17:17

Meillo hat geschrieben:
paedubucher hat geschrieben: @mullers: Ich verwende vi, nicht Word ;-)
Aber das ist doch kein Grund dagegen. Wenn dein vi UTF-8-faehig ist, dann kannst du die Zeichen doch direkt eingeben. Und wenn du dir keine Zeichenpositionen merken willst, dann verwendest du einfach die Compose-Taste, z.B. mit:

Code: Alles auswählen

setxkbmap de nodeadkeys caps:escape compose:paus
in der .xinitrc und anschliessend: PAUSE + < + < fuer « bzw. PAUSE + > + > fuer ». ;-)
Ich habe mich ja zuerst mit Ctrl+V u 00AB bzw. Ctrl+V u 00BB abgemüht... ich probiere den Ansatz bei Gelegenheit! Allerdings schreibe ich manchmal auch über putty, da greift keine .xinitrc.
Und manchmal schreibe ich gar auf einem Windows-System. Das ist auch der Grund, warum ich meinen Text einfach "unsauber" eingeben möchte. Dort wo ich das ganze dann aufbereite, habe ich immer meine gute Umgebung inkl. md2html-Skript.

@muellers Ein Textverarbeitungsprogramm ist ja streng genommen auch eine Form von Editor. Aber betreiben wir keine Haarspalterei, diskutieren wir lieber darüber, warum vi besser ist als emacs :twisted:
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 01.03.2016 17:49:55

Hier noch mein Skript (md2html):

Code: Alles auswählen

#!/bin/bash

TMP_MD=tmp.md

sed -r '/^[^[:digit:]]+.+$/ a \\n' $1 | sed 's/--/‒/g; s/\.\.\./…/g' | awk -F "" -f quotes.awk > $TMP_MD
HTML=`basename --suffix '.md' $1`.html
markdown $TMP_MD | sed '/^\s*$/d' > $HTML
rm $TMP_MD
Zuerst füge nach jeder Zeile, die nicht mit einer Zahl beginnt, eine Leerzeile ein, damit das von Markdown als neuer Absatz erkannt wird. Dann kommen die Ersetzungen der Gedankenstriche und Auslassungspunkte, gefolgt von Meillos Anführungs- und Schlusszeichenskript in AWK. Der letzte sed-Befehl entfernt dann die Leerzeilen wieder.
Ich weiss nicht, vielleicht sollte ich das ganze mal versuchen in Perl umzuschreiben...
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von Meillo » 02.03.2016 09:53:07

OT:
mullers hat geschrieben:beliebige Unicode Zeichen, meine Oma, deren Papagei, alles direkt eingegeben...
Den Papagei deiner Oma? Da lehnst du dich aber ganz schoen weit aus dem Fenster!

Also einen Vogel (U+1F426), einen Pudel (U+1F429) (vielleicht ist das ja derjenige deiner Oma) ... und sogar deine Oma selbst (U+1F475) habe ich in Unicode gefunden, aber den Papagei deiner Oma ... wie du den eingibst, das will ich doch gerne mal sehen! :mrgreen:
Use ed once in a while!

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 02.03.2016 10:57:07

Ich habe gestern doch noch eine einfache Lösung mit sed gefunden, die zwar keinesfalls vollständig ist, für meine aktuellen Texte jedoch hervorragend funktioniert.
Der Trick ist, dass ich zwei Durchläufe mache. Im ersten Durchlauf werden sämtliche ", die auf ein Whitespace-Zeichen folgen, durch « ersetzt. Im zweiten Schritt werden einfach alle anderen " durch » ersetzt.
Dass ich darauf nicht gleich gekommen bin... Egal, Hauptsache, wieder etwas dazugelernt.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von Meillo » 02.03.2016 11:10:17

paedubucher hat geschrieben: Der Trick ist, dass ich zwei Durchläufe mache. Im ersten Durchlauf werden sämtliche ", die auf ein Whitespace-Zeichen folgen, durch « ersetzt. Im zweiten Schritt werden einfach alle anderen " durch » ersetzt.
Aber warum zwei Durchlaeufe, geht's nicht noch einfacher auch so:

Code: Alles auswählen

sed 's, ",«,g; s,",»,g'
... weil bei der zweiten Ersetzung sind in der Zeile ja alle " mit Leerzeichen davor schon ersetzt.

Den Sonderfall /^"/ musst du vielleicht noch separat abfangen.
Use ed once in a while!

mullers

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von mullers » 02.03.2016 11:45:41

Meillo hat geschrieben:OT:
mullers hat geschrieben:beliebige Unicode Zeichen, meine Oma, deren Papagei, alles direkt eingegeben...
Den Papagei deiner Oma? Da lehnst du dich aber ganz schoen weit aus dem Fenster!
Weit ja, aber nicht zu weit.
Es stimmt natürlich, ich habe da nicht den Papagei, wie er später einmal ausgesehen hat, sondern nur kurz nach dem Schlüpfen (1F425). Na ja, so haben wir den Kleinen eben am Liebsten in Erinnerung. :D

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 02.03.2016 14:17:39

Meillo hat geschrieben: Aber warum zwei Durchlaeufe, geht's nicht noch einfacher auch so:

Code: Alles auswählen

sed 's, ",«,g; s,",»,g'
... weil bei der zweiten Ersetzung sind in der Zeile ja alle " mit Leerzeichen davor schon ersetzt.
Stimmt, das macht ja das gleiche, nur schneller und mit weniger Tipparbeit.
Meillo hat geschrieben: Den Sonderfall /^"/ musst du vielleicht noch separat abfangen.
Ja, Whitespace und Zeilenanfang sollte es dann wirklich abdecken. Vielen Dank!
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 08.03.2016 13:33:16

Ich habe übrigens noch eine Implementierung in JavaScript für das Problem gemacht, die den typografischen Anforderungen von Englisch, Deutsch und Französisch genügen sollte. Der Code ist doch ein ziemliches Gewurstel, und für nicht-lateinische Buchstaben dürfte es schlecht funktionieren. Vielleicht kann das mal jemand brauchen... Fehler kann ich aber nicht ausschliessen, gerade was das Französische betrifft. Immerhin, eine schöne Programmierübung war es allemal.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von Meillo » 08.03.2016 14:21:36

paedubucher hat geschrieben:Ich habe übrigens noch eine Implementierung in JavaScript für das Problem gemacht, die den typografischen Anforderungen von Englisch, Deutsch und Französisch genügen sollte. Der Code ist doch ein ziemliches Gewurstel, und für nicht-lateinische Buchstaben dürfte es schlecht funktionieren. Vielleicht kann das mal jemand brauchen... Fehler kann ich aber nicht ausschliessen, gerade was das Französische betrifft. Immerhin, eine schöne Programmierübung war es allemal.
Nett ... nur, so wirklich zu funktionieren scheint es noch nicht.

Auf meine Eingabe:
foo ``bar'' baz
... erschien ploetzlich ein ``undefined'' im Text.

Als ich dann munter zwischen weiter Text eingeben (z.B. ``blah "blubb" blubber'') und dem Umschalten der Sprach gewechselt habe, hat er nicht das letzte Anfuehrungszeichenpaar ersetzt sondern das vorletzte.

Ich fuerchte, du muss noch ein bisschen dran werkeln. ;-)


Als Featurewunsch haette ich gerne noch die dt. Buchvariante, welche »die franzoesischen Zeichen« umgekehrt und ohne Leerraum verwendet. :-)
Use ed once in a while!

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 09.03.2016 10:47:01

Meillo hat geschrieben:
paedubucher hat geschrieben:Ich habe übrigens noch eine Implementierung in JavaScript für das Problem gemacht, die den typografischen Anforderungen von Englisch, Deutsch und Französisch genügen sollte. Der Code ist doch ein ziemliches Gewurstel, und für nicht-lateinische Buchstaben dürfte es schlecht funktionieren. Vielleicht kann das mal jemand brauchen... Fehler kann ich aber nicht ausschliessen, gerade was das Französische betrifft. Immerhin, eine schöne Programmierübung war es allemal.
Nett ... nur, so wirklich zu funktionieren scheint es noch nicht.
Ja, das mit dem "undefined" konnte ich auch reproduzieren... Ich habe anschliessend eine völlig neue Version geschrieben, wobei die Ersetzung nur bei der Eingabe von Space oder Return getriggert wird. Das macht die Sache ungemein einfacher.

Code: Alles auswählen

    var defaultQuotationRules = {
        double : {
            opening : "“",
            closing : "”"
        },
        single : {
            opening : "‘",
            closing : "’"
        }
    };

    var languageQuotationRules = {
        "en" : defaultQuotationRules,
        "de" : {
            double : {
                opening : "„",
                closing : "“"
            },
            single : {
                opening : "‚",
                closing : "‘"
            }
        },
        "es" : defaultQuotationRules,
        "ru" : defaultQuotationRules,
        "zh" : defaultQuotationRules,
        "pt" : defaultQuotationRules,
        "fr" : {
            double : {
                opening : "« ",
                closing : " »"
            },
            single : {
                opening : "‹ ",
                closing : " ›"
            }
        }
    };

    function doReplacements( text, language ) {

        var openingDouble = languageQuotationRules[ language ].double.opening;
        var closingDouble = languageQuotationRules[ language ].double.closing;

        // double quotes
        text = text.replace( /(\s+)"/g, "$1" + openingDouble );
        text = text.replace( /^"/g, openingDouble );
        text = text.replace( /"/g, closingDouble );

        var openingSingle = languageQuotationRules[ language ].single.opening;
        var closingSingle = languageQuotationRules[ language ].single.closing;

        // '80s -> ’80s
        text = text.replace( /'(\d{2}s)/g, "’$1" );

        // "rock 'n' roll" -> "rock ’n’ roll"
        text = text.replace( /(\w+\s+)'(\w{1})'/g, "$1’$2’" );

        // "don't" -> "don’t"
        text = text.replace( /(\w)'(\w)/g, "$1’$2" );

        // single quotes
        text = text.replace( /(\s+)'/g, "$1" + openingSingle );
        text = text.replace( /^'/g, openingSingle );
        text = text.replace( new RegExp( openingDouble + "'" ), openingDouble + openingSingle );
        text = text.replace( /'/g, closingSingle );

        // ... -> …
        text = text.replace( /\.\.\./g, "…" );

        // -- -> –
        text = text.replace( /--/g, "–" );

        return text;
    }
Ich stelle bei Gelegenheit noch eine kleine Demo online.
Meillo hat geschrieben: Als Featurewunsch haette ich gerne noch die dt. Buchvariante, welche »die franzoesischen Zeichen« umgekehrt und ohne Leerraum verwendet. :-)
Das dürfte einfach zu bewerkstelligen sein, ich muss nur folgende Regel hinzufügen:

Code: Alles auswählen

"de_buch" : {
            double : {
                opening : "»",
                closing : "«"
            },
            single : {
                opening : "›",
                closing : "‹"
            }
        }
Das baue ich bei dieser Gelegenheit auch gleich ein.
Nachtrag: da ist es
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von Meillo » 09.03.2016 11:02:11

paedubucher hat geschrieben:Ich habe anschliessend eine völlig neue Version geschrieben, wobei die Ersetzung nur bei der Eingabe von Space oder Return getriggert wird.
Nachtrag: da ist es
Ja, jetzt sieht das schon viel besser aus. Konnte bislang keine Fehler finden. :-)

Danke auch fuer die schnelle Umsetzung meines Featurewunsches.
Use ed once in a while!

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 09.03.2016 11:39:39

Meillo hat geschrieben: Ja, jetzt sieht das schon viel besser aus. Konnte bislang keine Fehler finden. :-)

Danke auch fuer die schnelle Umsetzung meines Featurewunsches.
Kein Problem, schliesslich hatte ich sogenannter Software Engineer das ganze ja so entwickelt, dass es einfach erweiterbar ist 8)
Dass bei dir überhaupt JavaScript läuft, erstaunt mich jedoch :wink:
Andererseits überlege ich mir, auf meiner Webseite mal ein kleines Backend mit Perl zusammenzuhacken. Dann könnte das JavaScript wieder überflüssig werden. Mir reicht es, wenn die Typografie erst nach dem Submit etwas hergibt.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von Meillo » 09.03.2016 12:07:43

paedubucher hat geschrieben: Dass bei dir überhaupt JavaScript läuft, erstaunt mich jedoch :wink:
Zurecht! (War nicht mein normaler Computer, auf dem ich das ausprobiert habe.)
Mir reicht es, wenn die Typografie erst nach dem Submit etwas hergibt.
Faende ich besser. Auch faende ich es sinnvoller, wenn nicht der Originaltext veraendert wird, sondern eine separate veraenderte Version erzeugt wird, dann kann man die naemlich mal im einen und mal im anderen Stil erzeugen lassen und den optischen Eindruck bewundern. (In diesem Zusammenhang haette ich dann noch einen Featurewunsch: den Unix-Stil mit `` und ''. ;-) )

... du koenntest dann auch gleich automatisch alle Stile rausgenerieren lassen, untereinander. Waere vielleicht ganz nett.

Ich sehe schon, das wird noch ein richtig cooles Projekt! :-D
Use ed once in a while!

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von ThorstenS » 09.03.2016 13:37:03

cool! :THX:
Wobei ich mir schon lange angewöhnt habe anstelle von SHIFT+2 für " STRG+V für „ und STRG+B für “ zu tippen.

Benutzeravatar
paedubucher
Beiträge: 850
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Anführungs- und Schlusszeichen automatisch ersetzen

Beitrag von paedubucher » 09.03.2016 14:42:05

ThorstenS hat geschrieben:cool! :THX:
Wobei ich mir schon lange angewöhnt habe anstelle von SHIFT+2 für " STRG+V für „ und STRG+B für “ zu tippen.
Welcher Editor verwendet diese Tastenkombinationen? Oder ist es selbst so konfiguriert?

@meillo: Ich bin auch kein Freund von JavaScript. Das liegt aber nicht an der Technologie selber – obwohl es auch da ein paar wunde Punkte gibt – sondern vielmehr daran, wie es eingesetzt wird. Ein paar DOM-Manipulationen auf einer Webseite oder dem Eingabeformular etwas Logik einhauchen sind meines Erachtens legitime Verwendungszwecke. Aber leider wird JavaScript immer mehr für Tracking-Zwecke oder nervige CSS-Popups und andere Schweinereien verwendet.
Andererseits ist es eine gute Sprache um eben mal etwas mit einem primitiven GUI zu hacken. Texteditor und Browser sind immer da, und das "Deployment" geht ja auch wahnsinnig einfach.
Die ganze Logik kann man aber ebenso gut in sed hacken, wie wir gesehen haben.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Antworten