Реализация интеллектуального переноса слов

Я ищу реализацию или псевдокод, который описывает интеллектуальную функцию / алгоритм переноса слов.

У меня есть линейная строка текста, которая не включает в себя какие-либо переводы строки, алгоритм должен вставить перевод строки, прежде чем она достигнет максимальной ширины.

Следует также рассмотреть возможность вставки перевода строки до того, как он достигнет максимальной ширины, но также определить, что он находится внутри блока (фигурные скобки, кавычки, скобки и т. Д.), И попытаться вставить перевод строки непосредственно перед этим блоком, чтобы увеличить вероятность того, что блок не будет разбит на несколько строк.

Например:

the quick brown fox jumped ( with much effort ) over the lazy dog.

Предполагая, что мой порог максимальная ширина =40

Простая переноска слов сломала бы это как:

the quick brown fox jumped ( with much 
effort ) over the lazy dog.

То, что я хочу, это что-то, что обнаруживает специальные символы (в этом примере фигурную скобку), так что это будет выглядеть так:

the quick brown fox jumped 
( with much effort ) over the lazy dog.

Примеры верны, первый разрывается после слова много, второй разрывается после слова скачок..

2 ответа

Решение

Какой-то начальный псевдокод я написал. Пока не проверял все угловые случаи, но дайте мне знать, если эта первоначальная версия работает для вас.

int maxPerLine = [input from user]
String feed = [input from user]
int initialPosition = 0
int currPosition = 0
boolean withBracket = NO

for(character in feed) {
    if(withBracket == YES) {
        while(character != ')') {
            currPosition++;
            if(currPosition-initialPosition == maxPerLine-1) {
                print feed.substring(initialPosition,currPosition)
                initialPosition = ++currPosition
            }
        }
        withBracket = NO
    }

    if(currPosition-initialPosition == (maxPerLine-1) && withBracket == NO) {
        print feed.substring(initialPosition,currPosition)
        initialPosition = ++currPosition
    }

    if(character != '(') {
        currPosition++;
    }
    else {
        print feed.substring(initialPosition,currPosition)
        initialPosition = ++currPosition
        withBracket = YES
    }
} 

Если вы хотите действительно умного разрыва строки, проверьте алгоритм, используемый TeX. Он использует алгоритм динамического программирования, чтобы находить лучшие точки разрыва в абзаце, стараясь не переносить слова, сохранять лишние пробелы в строках разумно постоянными (никаких свободных и плотных линий вместе...). Проверьте перенос слов в Википедии, в частности алгоритм Кнута.

Другие вопросы по тегам