Замечание: ТЗ заранее в этой задаче описать нереально, так как задача эта пусть и небольшая, но всё-таки "из этой жизни". Даже входные и выходные данные не поддаются никакой категоризации в виду почти бесконечного их разнообразия (читая дальше, вы это увидите). Тем не менее, задача решаема, и решаема через достаточно краткие алгоритмы и программы.
С форматированием по ширине как-то разобралися. Не такая и простенькая как кажется сначала задачка. А эта задача является в какой-то мере обратной первой и звучит кратко и "просто":
Мы получили отформатированный plain-text. Восстановите "исходный материал" из plain-text, выцепив из него как можно больше оформления.
То есть на входе мы получаем текст отформатированный по ширине. Правую границу нам надо выяснять самостоятельно (для вас это должно быть лишь цветочками).
Под "восстановлением его обратно" понимается приведение текста к виду "одна строка -- один абзац".
Кроме ширины правой границы нам нужно будет делать допуски в алгоритме и для других вариаций возможного форматирования, как-то:
1. Пустые строки между абзацами. Они могут быть, а могут и не быть.
2. Заголовки. Они могут быть отбиты пробелами. Перед ними (после них) могут стоять пустые строки. А могут и не стоять.
3. Часто делают такие разрывы разделов в виде горизонтальных чёрточек в тексте: "----------"
3. Цитаты и эпиграфы. Аналогично.
4. "Красная строка" абзаца. Опять же, её может и не быть.
5. Переносы слов.
(и это ещё я не прошу правильно обрабатывать псевдографику, таблицы, номера страниц с колонтитулами и сноски)..
За примерами "форматированных текстов" далеко ходить не надо: зайдите на тот же
lib.ru и скачайте пару текстов в формате 'plain text'. Но могу предоставить и тех же кошек на которых тренировал некогда своего питомца:
Дуглас Адамс "Всего хорошего, и спасибо за рыбу!" (7-Zip, 105 Кб)
Роберт Асприн "Другой отличный миф" (7-Zip, 114 Кб)
Покажем примерный образец входного текста:
Код:
РОБЕРТ АСПРИН
ДРУГОЙ ОТЛИЧНЫЙ МИФ
Эта книга посвящается Борку Неуничтожимому (известному меньшим
смертным как Джордж Хант), чья грубоватая, но верная дружба помогла мне
преодолеть много кризисов в прошлом... и, вероятно, в будущем!
ГЛАВА 1
"Есть многое на свете,
друг Горацио, что чело-
веку знать не положено"
Есть многое на свете,
друг Горацио,
что и не снилось
нашим мудрецам.
Гамлет.
Одно из немногих все искупляющих качеств наставников, думаю я,
заключается в том, что их при случае можно одурачить. Это было верно,
когда мать учила меня читать, это было верно, когда отец пытался
научить меня быть фермером, и верно теперь, когда я обучаюсь магии.
- Ты не практиковался! - прервал мои размышления резкий упрек
Гаркина.
- А вот и нет! - возразил я.- Это просто трудное упражнение.
[аттракцион невиданного тщеславия]
Чтобы дать ориентир скажу что с задачей этой я столкнулся лет пять назад и решал её несколькими разными алгоритмами и на нескольких языках в течении нескольких лет. Наиболее удобным решением в конце концов стала для меня программка (8 Кб обильно комментированных исходников в виде одного файла, 50 Кб исполняемого модуля) которая умела: правильно обрабатывать две кодировки (ANSI и OEM -- KOI в художественных текстах был редок); распознавать абзацы, учитывая пункты, указанных выше; распознавать и оформлять заголовки (при этом, в сомнительных случаях, когда заголовки не отбивались пробелами для центровки, программа брала на вооружение некоторую "эвристику", автоматом считая короткие абзацы начинающиеся со "Глава" или "Часть" -- заголовками, а также обращая внимание на то что все буквы в строке -- большие); распознавать чёрточки-разделители, как заголовки; учитывать "красные строки"; учитывать и оформлять переносы строк (в выходном документе эти переносы делались "мягкими"); делать дополнительные типографские уснащения в виде распознавания тире (отдельно от дефисов и минусов!), многоточий и кавычек; при этом на выходе получался файл с расширением doc, который если открыть в Word'е, можно было сразу печатать, так как у него уже было наложено оформление для плотной печати в виде альбомной ориентации, узких полей страницы, трёх колонок, мелкого шрифта, и установки что Word сам должен правильно проставить в трёх колонках переносы слов.
[/аттракцион невиданного тщеславия]
Я понимаю что задача достаточно масштабная (прежде всего из-за почти незакреплённого и очень "человеческого" входного формата), но, как решения сойдут и программы, просто отделяющие один абзац от другого. Выделение заголовков, цитат и эпиграфов -- это уж вам как время и задор позволят.
Выходной формат не закрепляется, хотя наиболее удобным будет наверное, или HTML, если захотитет делать оформля ть больше чем просто абзацы. Если вам удобней будет скажем RTF -- это на самом деле неважно. Или можно форматировать в какую-нибудь вику-разметку или даже bbcode -- не суть важно. Если же обходимся простыми абзацами то тот же plain-text в формате "один абзац -- одна строка" вполне подойдёт.
Также можно показать и примерный образец в виде скриншота, как хорошо бы видеть выходной документ (после окончания обработки текста моей программой ничего не делал, просто открыл в Word'е, там даже видны дефекты распознавания абзацев):
Задача эта взята из жизни исключительно и озадачивались ей многие. Например, есть программа ClearTXT. Или в библиотеке Мошкова есть скрипты на Perl'е (кажется) для обработки книг заданных с оформлением в тексте.
Повторюсь -- напрягаться сильно не надо. Просто распознавания абзацов должно хватить, а там посмотрим.