Frage

Lassen Sie uns sagen, dass ich eine benutzerdefinierte E-Mail-Management-Anwendung für das Unternehmen geschrieben haben, die für die ich arbeite. Er liest E-Mails von dem Support-Konto des Unternehmens und speichert aufgeräumte, Klartextversionen von ihnen in einer Datenbank, wie andere nette Dinge zu tun, es mit Kundenkonto und Aufträgen im Prozess zugeordnet wird. Wenn ein Mitarbeiter auf eine Nachricht antwortet, erzeugt mein Programm eine E-Mail, die an den Kunden mit einer formatierten Version des Disqus gesendet wird. Wenn der Kunde reagiert, sucht die App für eine eindeutige Nummer in der Betreff-Zeile die eingehende Nachricht zu lesen, die vorherige Diskussion Streifen aus, und fügen Sie es als neues Element in dem Thread. Zum Beispiel:

This is a message from Contoso customer service.

Recently, you requested customer support. Below is a summary of your 
request and our reply.

--------------------------------------------------------------------
Contoso (Fred) on Tuesday, December 30, 2008 at 9:04 a.m.
--------------------------------------------------------------------
John:

I've modified your address. You can confirm my work by logging into
"Your Account" on our Web site. Your order should ship out today.

Thanks for shopping at Contoso.

--------------------------------------------------------------------
You on Tuesday, December 30, 2008 at 8:03 a.m.
--------------------------------------------------------------------
Oops, I entered my address incorrectly. Can you change it to

Fred Smith
123 Main St
Anytown, VA 12345

Thanks!

--
Fred Smith
Contoso Product Lover

Im Allgemeinen ist dies alles funktioniert gut, aber es gibt einen Bereich, den ich Art jetzt für eine Weile Reinigung haben aufzuschieben, und beschäftigt sich mit Textumbruch. Um über die hübsche E-Mail-Format wie die zu erzeugen, muss ich neu wickeln Sie den Text, den der Kunde ursprünglich gesendet.

Ich habe einen Algorithmus geschrieben, das dies tut (wenn auch Blick auf den Code, ich bin mir nicht ganz sicher, wie es geht mehr - es könnte etwas Refactoring verwenden). Aber es kann nicht zwischen einem harten Wickel Newline, ein „Ende des Absatz“ Newline und einer „semantischen“ Newline unterscheiden. Zum Beispiel kann ein Newline Fest-wrap ist man, dass die E-Mail Client innerhalb eines Absatzes eingefügt, um eine lange Textzeile zu wickeln, sagen, mit 79 Spalten. Ein Ende des Absatz Newline ist ein, dass der Benutzer nach dem letzten Satz in einem Absatz hinzugefügt. Und eine semantische Newline so etwas wie der br Tag sein würde, wie zum Beispiel der Adresse, die die Fred oben eingegeben hat.

Mein Algorithmus stattdessen sieht nur zwei neue Zeilen in einer Reihe, wie Sie einen neuen Absatz angibt, so würde es die Kunden E-Mail so etwas wie die folgenden werden machen formatiert:

Oops, I entered my address incorrectly. Can you change it to

Fred Smith 123 Main St Anytown, VA 12345

Thanks!

-- Fred Smith Contoso Product Lover

Jedes Mal, wenn ich versuche, eine Version zu schreiben, die diesen Text neu wickeln würden, wie beabsichtigt, traf ich im Grunde eine Mauer, die ich brauche die Semantik des Textes zu wissen, der Unterschied zwischen einem „hard-wrap“ Newline und einem " ich meinte, es wie eine br "-Typ newline wirklich, wie in der Adresse des Kunden. (Ich verwende zwei neue Zeilen in einer Reihe zu bestimmen, wann einen neuen Absatz zu beginnen, die mit übereinstimmt, wie die Mehrheit der Menschen scheinen tatsächlich E-Mails eingeben.)

Wer einen Algorithmus haben, der den Text wie gewünscht neu verpacken können? Oder ist diese Implementierung „gut genug“, wenn die Komplexität einer bestimmten Lösung mit einem Gewicht?

Danke.

War es hilfreich?

Lösung

Sie könnten versuchen, zu überprüfen, ob ein Newline die Zeilenlänge unter einem maximalen (auch bekannt als harter wickeln) zu halten eingefügt wurde: Stell sicher, für die längste Zeile in dem Text ein. Dann wird für jede gegebene Zeile, fügen Sie das erste Wort der folgenden Zeile zu. Wenn die resultierende Linie die maximale Länge überschreitet, war der Zeilenumbruch wahrscheinlich ein harter Umbruch.

Noch einfacher Sie können nur alle Brüche in (maxlength - 15) <= length <= maxlength als hardwraps betrachten (mit 15 nur eine Vermutung ist). Dies würde sicherlich herauszufiltern absichtlich Pausen wie in Adressen und solche Sachen, und jede verpasste Pause in diesem Bereich würde das Ergebnis zu schlecht nicht beeinflussen.

Andere Tipps

Ich habe zwei Vorschläge, wie folgt.

  • Achten Sie auf Zeichensetzung: dies wird Ihnen helfen, zwischen einem „hard-wrap“ Newline und ein „Ende des Absatzes“ Newline zu unterscheiden (weil, wenn die Linie mit einem Punkt endet, dann ist es wahrscheinlicher, dass der Benutzer sollte es eine End-of-Absatz sein.

  • Beachten Sie, ob eine Leitung ist viel kürzer als die maximale Leitungslänge: in dem obigen Beispiel, könnten Sie Text, die „hard-wrapped“ auf 79 Zeichen Wesen, plus Sie Adressleitungen haben, die nur 30 sind Zeichen lang; weil 30 viel kleiner als 79 ist, wissen Sie, dass die Adressleitungen durch den Benutzer aufgebrochen wurden und nicht durch den Text-wrap-Algorithmus des Benutzers.

Auch, achten Sie auf Einzüge. Zeilen, die mit Leerzeichen von links eingerückt sind, kann angenommen werden, neue Absätze zu sein, von den vorhergehenden Linien gebrochen, wie sie auf diesem Forum sind

über Ole Rat Nach ich wieder arbeitete meine Implementierung an einer Schwelle zu suchen. Es scheint den meisten Szenarien zu behandeln ich es gut genug, um zu werfen, ohne mich verrückt zu gehen und Code schreiben, der eigentlich die englische Sprache verstehen.

Grundsätzlich I zuerst durch die Eingabezeichenfolge scannen und die längste Linienlänge in der Variablen inputMaxLineLength aufzuzeichnen. Dann, als ich Umpackzentrums, wenn ich eine neue Zeile auftreten, die einen Index zwischen inputMaxLineLength und 85% der inputMaxLineLength hat, dann ersetze ich das Newline mit einem Raum, weil ich denke, es ist ein harter Umbruch Newline - es sei denn, es sofort von einem anderen Newline gefolgt ist, ich weil dann davon ausgehen, dass es nur ein einzeiliger Absatz, der in diesem Bereich passiert einfach zu. Dies, wenn jemand Typen aus einer kurzen Liste mit Aufzählungszeichen, beispielsweise passieren kann.

Sicher nicht perfekt, aber „gut genug“ für mein Szenario wird den Text unter Berücksichtigung der Regel halb zerfleischt von einem frühen E-Mail-Client zu beginnen.

Hier ist ein Code, meine a-paar-Stunden-alt-Implementierung, die wahrscheinlich noch underwraps in einigen Grenzfällen (C #). Es ist viel weniger kompliziert als meine bisherige Lösung, das ist schön.

Source Code

Und hier einige Unit-Tests, die diesen Code (mit MSTest) ausüben:

Testcode

Wenn jemand eine bessere Implementierung hat (und ohne Zweifel eine bessere Umsetzung vorhanden ist), werde ich glücklich sein, Ihre Gedanken zu lesen! Danke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top