blob: 85cde6f0d6960cb184c609954b994d7b0588aed4 (
plain) (
tree)
|
|
import unicode
proc wordWrap*(s: string, maxLineWidth = 80,
splitLongWords = true,
newLine = "\n"): string =
## This function breaks all words that reach over `maxLineWidth`
## measured in number of runes. When `splitLongWords` is `true`
## words that are longer than `maxLineWidth` are splitted. Multiple
## spaces and newlines are converted to a single space. All
## whitespace is treated equally. Non-breaking whitespace is
## ignored.
var currentWordLength: int = 0
var currentWord: string = newStringOfCap(32)
var currentLineLength: int = 0
var currentWordLengthAtLineEnd: int = -1
var longWordMode = false
template handleWhitespace(): untyped =
if currentWord.len > 0:
if currentLineLength + 1 + currentWordLength > maxLineWidth:
result.add newLine
currentLineLength = 0
if currentLineLength > 0:
result.add ' '
currentLineLength += 1
result.add currentWord
currentLineLength += currentWordLength
currentWord.setlen 0
currentWordLength = 0
for rune in s.runes:
if rune.isWhiteSpace:
handleWhitespace()
else:
if splitLongWords and currentWordLength >= maxLineWidth:
handleWhitespace()
currentWord.add rune
inc currentWordLength
handleWhitespace()
when isMainModule:
import strutils
proc checkLineLength(arg: string): void =
for line in splitlines(arg):
var numRunes = 0
for rune in runes(line):
numRunes += 1
assert numRunes <= 80
let longlongword = "abc uitdaeröägfßhydüäpydqfü,träpydqgpmüdträpydföägpydörztdüöäfguiaeowäzjdtrüöäp psnrtuiydrözenrüöäpyfdqazpesnrtulocjtüöäzydgyqgfqfgprtnwjlcydkqgfüöezmäzydydqüüöäpdtrnvwfhgckdumböäpydfgtdgfhtdrntdrntydfogiayqfguiatrnydrntüöärtniaoeydfgaoeiqfglwcßqfgxvlcwgtfhiaoenrsüöäapmböäptdrniaoydfglckqfhouenrtsüöäptrniaoeyqfgulocfqclgwxßqflgcwßqfxglcwrniatrnmüböäpmöäbpümöäbpüöämpbaoestnriaesnrtdiaesrtdniaesdrtnaetdriaoenvlcyfglwckßqfgvwkßqgfvlwkßqfgvlwckßqvlwkgfUIαοιαοιαχολωχσωχνωκψρχκψρτιεαοσηζϵηζιοεννκεωνιαλωσωκνκψρκγτφγτχκγτεκργτιχνκιωχσιλωσλωχξλξλξωχωχξχλωωχαοεοιαεοαεοιαεοαεοιαοεσναοεκνρκψγκψφϵιηαααοε"
checkLineLength(longlongword.wordWrap)
let tmp ="Наши исследования позволяют сделать вывод о том, что субъект выбирает xxxuiaetudtiraeüöätpghiacodöeronfdquiahgoüöädoiaqofhgiaeotrnuiaßqzfgiaoeurnudtitraenuitenruitarenitarenuitarentduiranetduiranetdruianetrnuiaertnuiatdenruiatdrne институциональный психоз. Важность этой функции подчеркивается тем фактом, что объект вызывает эгоцентризм. Самоактуализация аннигилирует генезис. Анима аннигилирует возрастной код. Закон просветляет аутотренинг. Наши исследования позволяют сделать вывод о том, что воспитание заметно осознаёт инсайт."
checkLineLength(tmp.wordWrap)
|