docs: def snipstr(string, width=79, snipat=None, ellipsis='...'):
      """Return string cut to specified length.
  
      >>> snipstr('abcdefghijklmnop', 8)
      'abc...op'
  
      """
      if snipat is None:
          snipat = 0.5
      if ellipsis is None:
          if isinstance(string, bytes):
              ellipsis = b'...'
          else:
              ellipsis = u'\u2026'  # does not print on win-py3.5
      esize = len(ellipsis)
  
      splitlines = string.splitlines()
      # TODO: finish and test multiline snip
  
      result = []
      for line in splitlines:
          if line is None:
              result.append(ellipsis)
              continue
          linelen = len(line)
          if linelen <= width:
              result.append(string)
              continue
  
          split = snipat
          if split is None or split == 1:
              split = linelen
          elif 0 < abs(split) < 1:
              split = int(math.floor(linelen * split))
          if split < 0:
              split += linelen
              if split < 0:
                  split = 0
  
          if esize == 0 or width < esize + 1:
              if split <= 0:
                  result.append(string[-width:])
              else:
                  result.append(string[:width])
          elif split <= 0:
              result.append(ellipsis + string[esize-width:])
          elif split >= linelen or width < esize + 4:
              result.append(string[:width-esize] + ellipsis)
          else:
              splitlen = linelen - width + esize
              end1 = split - splitlen // 2
              end2 = end1 + splitlen
              result.append(string[:end1] + ellipsis + string[end2:])
  
      if isinstance(string, bytes):
          return b'\n'.join(result)
      return '\n'.join(result)