假设我为我所工作的公司编写了一个定制的电子邮件管理应用程序。它从公司的支持账户中读取电子邮件,并以清理后的纯文本格式将它们存储在数据库中。在此过程中,它还会执行其他一些不错的操作,如将其与客户账户和订单相关联。当员工回复一条消息时,我的程序将生成一封电子邮件,以格式化的方式向客户发送讨论线程的版本。如果客户回复,该应用程序将查找主题行中的唯一编号以读取传入的消息,剥离前面的讨论,并将其作为新条目添加到线程中。例如:
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
一般而言,这一切都很顺畅,但有一个领域我一直拖延着清理,它涉及文本换行。为了生成上面那样漂亮的电子邮件格式,我需要重新换行客户最初发送的文本。
我写了一个算法来实现这个功能(尽管看着代码,我不太确定它是如何工作的--它可能需要进行一些重构)。但它无法区分硬换行、段落结尾换行和"语义"换行。例如,硬换行是指电子邮件客户端在段落内插入的换行符,以将长文本行"包裹"在79个字符处。段落结尾换行是指用户在段落的最后一句话之后添加的换行符。而"语义"换行就像br
标签一样,比如弗雷德上面输入的地址。
我的算法只将两个换行符连续出现视为新段落的标志,因此客户的电子邮件格式可能如下所示:
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
每当我尝试写一篇能够重新换行这段文字的版本时,我基本上都会遇到难题,因为我需要知道文本的语义,"硬换行"和“我真的是想用br
标签”的“类型换行”的区别,比如客户的地址。(我使用两个连续的换行符来确定何时开始新段落,这与大多数人实际输入电子邮件的方式相符。)
有人有一个可以按预期重新换行文本的算法吗?还是在衡量任何给定解决方案的复杂性时,此实现已经“足够好了”?
谢谢。