В дополнение к time_point_cast<days>
, который усекается в эпоху, также доступны:
floor<days>(x)
: усечение до начала текущего дня.
ceil<days>(x)
: усечение до начала следующего дня.
round<days>(x)
: усечение до ближайшей дневной границы.
time_point_cast<days>(x)
эквивалентно floor<days>(x)
, когда x
находится после эпохи 1970-01-01, и эквивалентно ceil<days>(x)
, когда x
предшествует эпохе 1970-01-01.
Вы могли попытаться проверить, была ли новая строка вставлена для хранения длины строки ниже максимума (иначе трудно переносятся): Просто проверьте на самую длинную строку в тексте. Затем для любой данной строки Вы добавляете первое слово следующей строки к нему. Если получающаяся строка превышает максимальную длину, разрыв строки, вероятно, был твердым переносом.
Еще более простой Вы могли бы просто рассмотреть все перерывы (maxlength - 15) <= length <= maxlength
как являющийся hardwraps (с 15 просто быть образованным предположением). Это, конечно, отфильтровало бы намеренные повреждения как в адресах и материале, и любой пропущенный перерыв в этом диапазоне не будет влиять на результат слишком ужасно.
У меня есть два предложения, следующим образом.
Обратите внимание на пунктуацию: это поможет, Вы для различения "твердый - переносите" новую строку и "конец абзаца" новая строка (потому что, если концы строки с точкой, то более вероятно, что пользователь предназначил это, чтобы быть концом абзаца.
Обратите внимание на то, намного ли строка короче, чем максимальная длина строки: в примере выше, у Вас мог бы быть текст, это "трудно переносится" в 79 символах, плюс Вы имеют строки адреса, которые являются только 30 символами долго; потому что 30 намного меньше чем 79, Вы знаете, что строки адреса были повреждены пользователем а не алгоритмом переноса текста пользователя.
Кроме того, обратите внимание на отступы: строки, которые располагаются с отступом с пробелом слева, как может предполагаться, являются новыми абзацами, поврежденными от предыдущих строк, как они находятся на этом форуме.
Следуя совету Ole выше, я переделал свою реализацию для рассмотрения порога. Это, кажется, обрабатывает большинство сценариев, которые я бросаю в него достаточно хорошо без меня имеющий необходимость сойти с ума и написать код, которые на самом деле понимают английский язык.
В основном я сначала сканирую через входную строку и записываю самую долгую длину строки в переменной inputMaxLineLength
. Затем, поскольку я повторно переношусь, если я встречаюсь с новой строкой, которая имеет индекс между inputMaxLineLength
и 85% inputMaxLineLength
, затем я заменяю ту новую строку пространством, потому что я думаю, что это - трудная новая строка переноса - если это сразу не сопровождается другой новой строкой, потому что затем я предполагаю, что это - просто короткий абзац, который просто происходит с в том диапазоне. Это может произойти, если кто-то выводит короткий маркированный список, например.
Конечно, не прекрасный, но "достаточно хороший" для моего сценария, рассматривая текст обычно полуискажается предыдущим почтовым клиентом для начала.
Вот некоторый код, моя a-few-hours-old реализация что, вероятно, все еще underwraps в нескольких пограничных случаях (использующий C#). Это намного менее сложно, чем мое предыдущее решение, которое хорошо.
И вот некоторые модульные тесты, которые осуществляют тот код (использующий MSTest):
Если у кого-либо будет лучшая реализация (и несомненно лучшая реализация существует), то я буду рад считать Ваши мысли!Спасибо.