docs: def __ascii_reader(fh, header):
          """
          :param fh:
          :param header:
          :return:
          """
  
          lines = header.split('\n')
          recoverable = [True]
  
          def get(prefix=''):
              if lines:
                  line = lines.pop(0)
              else:
                  raise RuntimeError(recoverable[0], 'Unable to find more lines')
  
              if not lines:
                  recoverable[0] = False
  
                  # Read more lines and make sure we prepend any old data
                  lines[:] = fh.read(Stl.BUFFER_SIZE).split('\n')
                  line += lines.pop(0)
              line = line.lower().strip()
              if prefix:
                  if line.startswith(prefix):
                      values = line.replace(prefix, '', 1).strip().split()
                  elif line.startswith('endsolid'):
                      raise StopIteration()
                  else:
                      raise RuntimeError(recoverable[0],
                                         '%r should start with %r' % (line,
                                                                      prefix))
  
                  if len(values) == 3:
                      vertex = [float(v) for v in values]
                      return vertex
                  else:  # pragma: no cover
                      raise RuntimeError(recoverable[0],
                                         'Incorrect value %r' % line)
              else:
                  return line
  
          line = get()
          if not line.startswith('solid ') and line.startswith('solid'):
              print("Error")
  
          if not lines:
              raise RuntimeError(recoverable[0],
                                 'No lines found, impossible to read')
  
          while True:
              # Read from the header lines first, until that point we can recover
              # and go to the binary option. After that we cannot due to
              # unseekable files such as sys.stdin
              #
              # Numpy doesn't support any non-file types so wrapping with a
              # buffer and/or StringIO does not work.
              try:
                  normals = get('facet normal')
                  assert get() == 'outer loop'
                  v0 = get('vertex')
                  v1 = get('vertex')
                  v2 = get('vertex')
                  assert get() == 'endloop'
                  assert get() == 'endfacet'
                  attrs = 0
                  yield (normals, (v0, v1, v2), attrs)
              except AssertionError as e:
                  raise RuntimeError(recoverable[0], e)
              except StopIteration:
                  if any(lines):
                      # Seek back to where the next solid should begin
                      fh.seek(-len('\n'.join(lines)), os.SEEK_CUR)
                  raise