diff options
author | Arne Döring <arne.doering@gmx.net> | 2018-11-06 08:39:07 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-11-08 20:52:22 +0100 |
commit | 1d7c36bd8cef74e85cbe9fd2a02a07555b46d0d2 (patch) | |
tree | 30ea40cecedc15a505fd57586b98f0f096d12121 /lib/std | |
parent | 795d7e3217bafee94af9c69374428b63d586eb2d (diff) | |
download | Nim-1d7c36bd8cef74e85cbe9fd2a02a07555b46d0d2.tar.gz |
wordwrap stuff
Diffstat (limited to 'lib/std')
-rw-r--r-- | lib/std/wordwrap.nim | 109 |
1 files changed, 23 insertions, 86 deletions
diff --git a/lib/std/wordwrap.nim b/lib/std/wordwrap.nim index ce5598de8..ff33a2ba9 100644 --- a/lib/std/wordwrap.nim +++ b/lib/std/wordwrap.nim @@ -1,18 +1,5 @@ import unicode -proc addSubstrExcl(self: var string, str: string; a,b: int) = - ## equivalent to ``self.add str.substr(a,b-1)``. Exclusive upper bound. - if a > b: - echo a, " ", b - assert a <= b - - if a < b: - let idx = self.len - self.setLen idx + b - a - copyMem(self[idx].addr, str[a].unsafeAddr, b - a) - -let tmp ="Наши исследования позволяют сделать вывод о том, что субъект выбирает uiaetudtiraeüöätpghiacodöeronfdquiahgoüöädoiaqofhgiaeotrnuiaßqzfgiaoeurnudtitraenuitenruitarenitarenuitarentduiranetduiranetdruianetrnuiaertnuiatdenruiatdrne институциональный психоз. Важность этой функции подчеркивается тем фактом, что объект вызывает эгоцентризм. Самоактуализация аннигилирует генезис. Анима аннигилирует возрастной код. Закон просветляет аутотренинг. Наши исследования позволяют сделать вывод о том, что воспитание заметно осознаёт инсайт." - proc wordWrap*(s: string, maxLineWidth = 80, splitLongWords = true, newLine = "\n"): string = @@ -20,30 +7,15 @@ proc wordWrap*(s: string, maxLineWidth = 80, var currentWordLength: int = 0 var currentWord: string = newStringOfCap(32) var currentLineLength: int = 0 - var currentWordLineEndMark: int = -1 var currentWordLengthAtLineEnd: int = -1 + var longWordMode = false template handleWhitespace(): untyped = if currentWord.len > 0: if currentLineLength + 1 + currentWordLength > maxLineWidth: - var splitWord = splitLongWords - if splitLongWords: - # arbitrary minimum length of words to split - splitWord = currentWordLength > maxLineWidth div 2 - if currentWordLengthAtLineEnd <= 3: - # does the current word fit in the next line? - if currentWordLength <= maxLineWidth: - splitWord = false - - if splitWord: - result.addSubstrExcl(currentWord, 0, currentWordLineEndMark) - result.add newLine - result.addSubstrExcl(currentWord, currentWordLineEndMark, currentWord.len) - currentLineLength = currentWordLength - currentWordLengthAtLineEnd - else: - result.add newLine - currentLineLength = 0 + result.add newLine + currentLineLength = 0 if currentLineLength > 0: result.add ' ' @@ -55,70 +27,35 @@ proc wordWrap*(s: string, maxLineWidth = 80, currentWord.setlen 0 currentWordLength = 0 - currentWordLineEndMark = -1 - for rune in s.runes: if rune.isWhiteSpace: handleWhitespace() else: + if splitLongWords and currentWordLength >= maxLineWidth: + handleWhitespace() + currentWord.add rune inc currentWordLength - if splitLongWords: - # the word reached the end of the current line - if currentLineLength + 1 + currentWordLength == maxLineWidth: - assert(currentWordLineEndMark == -1) - currentWordLineEndMark = currentWord.len - currentWordLengthAtLineEnd = currentWordLength + handleWhitespace() - # the word reached the end of the next line - if currentWordLength - currentWordLengthAtLineEnd == maxLineWidth: - # superlong word, stop being smart. - result.addSubstrExcl(currentWord, 0, currentWordLineEndMark) - result.add newLine - currentWord. -currentWordLineEndMark() - currentWordLength = currentWordLength - currentWordLengthAtLineEnd +when isMainModule: + import strutils - handleWhitespace() - currentWordLineEndMark = maxLineWidth - handleWhitespace() + 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 институциональный психоз. Важность этой функции подчеркивается тем фактом, что объект вызывает эгоцентризм. Самоактуализация аннигилирует генезис. Анима аннигилирует возрастной код. Закон просветляет аутотренинг. Наши исследования позволяют сделать вывод о том, что воспитание заметно осознаёт инсайт." -echo wordWrap(tmp) - - -import strutils - -echo strutils.wordWrap(tmp, splitLongWords=true) -echo strutils.wordWrap(tmp, splitLongWords=false) - - # result = newStringOfCap(s.len + s.len shr 6) - # var spaceLeft = maxLineWidth - # var lastSep = "" - # for word, isSep in tokenize(s, seps): - # if isSep: - # lastSep = word - # spaceLeft = spaceLeft - len(word) - # continue - # if len(word) > spaceLeft: - # if splitLongWords and len(word) > maxLineWidth: - # result.add(substr(word, 0, spaceLeft-1)) - # var w = spaceLeft - # var wordLeft = len(word) - spaceLeft - # while wordLeft > 0: - # result.add(newLine) - # var L = min(maxLineWidth, wordLeft) - # spaceLeft = maxLineWidth - L - # result.add(substr(word, w, w+L-1)) - # inc(w, L) - # dec(wordLeft, L) - # else: - # spaceLeft = maxLineWidth - len(word) - # result.add(newLine) - # result.add(word) - # else: - # spaceLeft = spaceLeft - len(word) - # result.add(lastSep & word) - # lastSep.setLen(0) + checkLineLength(tmp.wordWrap) |