summary refs log blame commit diff stats
path: root/lib/std/wordwrap.nim
blob: 85cde6f0d6960cb184c609954b994d7b0588aed4 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11

              


                                            

                                                                  



                                                                     



                                              
                                          
                          




                                                                  

                             










                                            



                         


                                                              


                           
                    
 
 

                  
 
 












                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
 
                               
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)