智能自动换行的实现

时间:2014-05-13 21:18:21

标签: algorithm text-processing

我正在寻找一种描述智能自动换行功能/算法的实现或伪代码。

我有一个不包含任何换行符的线性文本字符串,算法应在达到最大宽度之前插入换行符。

还应该考虑在换行达到最大宽度之前插入换行,但也检测它在块内(括号,引号,括号等),并尝试在此块之前插入换行符,增加块不会分成多行的概率。

例如:

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

假设我的阈值是max width = 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 个答案:

答案 0 :(得分:2)

如果您希望真正智能换行,请检查TeX使用的算法。它使用动态编程算法来查找段落中的最佳断点,尝试不对单词进行连字,使行中的额外空格保持合理的恒定(没有松散和紧密的线条,......)。查看word wrap on Wikipedia,尤其是Knuth's algorithm

答案 1 :(得分:1)

我写了一些初始的伪代码。还没有检查所有角落的情况,但请告诉我这个初始版本是否适合你。

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
    }
}