我正在寻找一种描述智能自动换行功能/算法的实现或伪代码。
我有一个不包含任何换行符的线性文本字符串,算法应在达到最大宽度之前插入换行符。
还应该考虑在换行达到最大宽度之前插入换行,但也检测它在块内(括号,引号,括号等),并尝试在此块之前插入换行符,增加块不会分成多行的概率。
例如:
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.
这些例子是正确的,第一个在单词之后断开, 跳过这个词之后的第二个休息..
答案 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
}
}