Допустим, я написал специальное приложение для управления электронной почтой для компании, в которой я работаю. Он считывает электронные письма из учетной записи службы поддержки компании и сохраняет в базе данных очищенные текстовые версии в чистом виде, выполняя другие аккуратные вещи, например, связывая их с учетными записями клиентов и заказами. Когда сотрудник отвечает на сообщение, моя программа генерирует электронное письмо, которое отправляется клиенту с отформатированной версией ветки обсуждения. Если клиент отвечает, приложение ищет уникальный номер в строке темы, чтобы прочитать входящее сообщение, вычеркнуть предыдущее обсуждение и добавить его в качестве нового элемента в ветке. Например:
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
", например, в адресе клиента. (Я использую две новые строки подряд, чтобы определить, когда начинать новый абзац, что совпадает с тем, как большинство людей на самом деле набирают электронные письма.)
У кого-нибудь есть алгоритм, который может перематывать текст, как задумано? Или эта реализация "достаточно хороша" при оценке сложности любого конкретного решения?
Спасибо.