code: def _gradient_rgb_lines(
              self, text, start, stop, step=1,
              fore=None, back=None, style=None, movefactor=None):
          
          morphlist = list(self._morph_rgb(start, stop, step=step))
          if movefactor:
              # Moving means we need the morph to wrap around.
              morphlist.extend(self._morph_rgb(stop, start, step=step))
              if movefactor < 0:
                  # Increase the start for each line.
                  def move():
                      popped = []
                      for _ in range(abs(movefactor)):
                          try:
                              popped.append(morphlist.pop(0))
                          except IndexError:
                              pass
                      morphlist.extend(popped)
                      return morphlist
              else:
                  # Decrease start for each line.
                  def move():
                      for _ in range(movefactor):
                          try:
                              val = morphlist.pop(-1)
                          except IndexError:
                              pass
                          else:
                              morphlist.insert(0, val)
                      return morphlist
  
          return '\n'.join((
              self._gradient_rgb_line_from_morph(
                  line,
                  move() if movefactor else morphlist,
                  fore=fore,
                  back=back,
                  style=style,
              )
              for i, line in enumerate(text.splitlines())
          ))
docs: Yield colorized characters, morphing from one rgb value to
              another. This treats each line separately.