Алгоритм для переобертывания трудно перенесенного текста?

В дополнение к time_point_cast<days>, который усекается в эпоху, также доступны:

  • floor<days>(x): усечение до начала текущего дня.

    [ 119]
  • 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.

7
задан csl 30 December 2008 в 14:21
поделиться

3 ответа

Вы могли попытаться проверить, была ли новая строка вставлена для хранения длины строки ниже максимума (иначе трудно переносятся): Просто проверьте на самую длинную строку в тексте. Затем для любой данной строки Вы добавляете первое слово следующей строки к нему. Если получающаяся строка превышает максимальную длину, разрыв строки, вероятно, был твердым переносом.

Еще более простой Вы могли бы просто рассмотреть все перерывы (maxlength - 15) <= length <= maxlength как являющийся hardwraps (с 15 просто быть образованным предположением). Это, конечно, отфильтровало бы намеренные повреждения как в адресах и материале, и любой пропущенный перерыв в этом диапазоне не будет влиять на результат слишком ужасно.

3
ответ дан 7 December 2019 в 07:51
поделиться

У меня есть два предложения, следующим образом.

  • Обратите внимание на пунктуацию: это поможет, Вы для различения "твердый - переносите" новую строку и "конец абзаца" новая строка (потому что, если концы строки с точкой, то более вероятно, что пользователь предназначил это, чтобы быть концом абзаца.

  • Обратите внимание на то, намного ли строка короче, чем максимальная длина строки: в примере выше, у Вас мог бы быть текст, это "трудно переносится" в 79 символах, плюс Вы имеют строки адреса, которые являются только 30 символами долго; потому что 30 намного меньше чем 79, Вы знаете, что строки адреса были повреждены пользователем а не алгоритмом переноса текста пользователя.

Кроме того, обратите внимание на отступы: строки, которые располагаются с отступом с пробелом слева, как может предполагаться, являются новыми абзацами, поврежденными от предыдущих строк, как они находятся на этом форуме.

2
ответ дан 7 December 2019 в 07:51
поделиться

Следуя совету Ole выше, я переделал свою реализацию для рассмотрения порога. Это, кажется, обрабатывает большинство сценариев, которые я бросаю в него достаточно хорошо без меня имеющий необходимость сойти с ума и написать код, которые на самом деле понимают английский язык.

В основном я сначала сканирую через входную строку и записываю самую долгую длину строки в переменной inputMaxLineLength. Затем, поскольку я повторно переношусь, если я встречаюсь с новой строкой, которая имеет индекс между inputMaxLineLength и 85% inputMaxLineLength, затем я заменяю ту новую строку пространством, потому что я думаю, что это - трудная новая строка переноса - если это сразу не сопровождается другой новой строкой, потому что затем я предполагаю, что это - просто короткий абзац, который просто происходит с в том диапазоне. Это может произойти, если кто-то выводит короткий маркированный список, например.

Конечно, не прекрасный, но "достаточно хороший" для моего сценария, рассматривая текст обычно полуискажается предыдущим почтовым клиентом для начала.

Вот некоторый код, моя a-few-hours-old реализация что, вероятно, все еще underwraps в нескольких пограничных случаях (использующий C#). Это намного менее сложно, чем мое предыдущее решение, которое хорошо.

Исходный код

И вот некоторые модульные тесты, которые осуществляют тот код (использующий MSTest):

Тестовый код

Если у кого-либо будет лучшая реализация (и несомненно лучшая реализация существует), то я буду рад считать Ваши мысли!Спасибо.

2
ответ дан 7 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: