假设我为我工作的公司编写了一个自定义电子邮件管理应用程序。它从公司的支持帐户中读取电子邮件,并将其清理后的纯文本版本存储在数据库中,并在此过程中执行其他简洁的操作,例如将其与客户帐户和订单相关联。当员工回复消息时,我的程序会生成一封电子邮件,该电子邮件将与讨论线程的格式化版本一起发送给客户。如果客户做出回应,应用程序会在主题行中查找唯一编号以读取传入消息,删除之前的讨论,并将其作为新项目添加到线程中。例如:
这是来自 Contoso 客户服务的消息。 最近,您请求客户支持。以下是您的摘要 请求和我们的答复。 -------------------------------------------------- ------------------ Contoso (Fred) 于 2008 年 12 月 30 日星期二上午 9:04 -------------------------------------------------- ------------------ 约翰: 我已经修改了你的地址。您可以通过登录来确认我的工作 我们网站上的“您的帐户”。您的订单应该今天发货。 感谢您在 Contoso 购物。 -------------------------------------------------- ------------------ 您于 2008 年 12 月 30 日星期二上午 8:03 -------------------------------------------------- ------------------ 糟糕,我输入了错误的地址。你能把它改成 弗雷德·史密斯 主街 123 号 弗吉尼亚州任何镇 12345 谢谢! -- 弗雷德·史密斯 Contoso 产品爱好者
一般来说,这一切都很好,但有一个领域我现在有点推迟清理,它处理文本换行。为了生成像上面这样漂亮的电子邮件格式,我需要重新包装客户最初发送的文本。
我已经编写了一个算法来执行此操作(尽管查看代码,我并不完全确定它是如何工作的——它可以使用一些重构)。但它无法区分硬换行换行、“段落结尾”换行和“语义”换行。例如,硬换行换行是电子邮件客户端在段落中插入的换行,以换行一长行文本,例如 79 列。段落结尾换行符是用户在段落最后一句之后添加的换行符。语义换行符类似于br
标签,例如 Fred 在上面键入的地址。
相反,我的算法只看到一行中的两个换行符表示一个新段落,因此它会使客户的电子邮件格式如下:
糟糕,我输入了错误的地址。你能把它改成 弗雷德·史密斯 123 Main St Anytown, VA 12345 谢谢! -- Fred Smith Contoso 产品爱好者
每当我尝试编写一个可以按预期重新换行该文本的版本时,我基本上都会碰壁,因为我需要知道文本的语义,“硬换行”换行符和“我的意思是它就像一个br
"-type 换行符,例如在客户的地址中。(我连续使用两个换行符来确定何时开始一个新段落,这与大多数人似乎实际键入电子邮件的方式一致。)
任何人都有可以按预期重新包装文本的算法?或者在权衡任何给定解决方案的复杂性时,这种实现是否“足够好”?
谢谢。