summary refs log tree commit diff stats
path: root/lib/std
diff options
context:
space:
mode:
authorArne Döring <arne.doering@gmx.net>2018-11-06 08:39:07 +0100
committerAndreas Rumpf <rumpf_a@web.de>2018-11-08 20:52:22 +0100
commit1d7c36bd8cef74e85cbe9fd2a02a07555b46d0d2 (patch)
tree30ea40cecedc15a505fd57586b98f0f096d12121 /lib/std
parent795d7e3217bafee94af9c69374428b63d586eb2d (diff)
downloadNim-1d7c36bd8cef74e85cbe9fd2a02a07555b46d0d2.tar.gz
wordwrap stuff
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/wordwrap.nim109
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)