code: def get_textdiff(text1, text2, num_context_lines=0, ignore_whitespace=False):
      r
      import difflib
      text1 = ensure_unicode(text1)
      text2 = ensure_unicode(text2)
      text1_lines = text1.splitlines()
      text2_lines = text2.splitlines()
      if ignore_whitespace:
          text1_lines = [t.rstrip() for t in text1_lines]
          text2_lines = [t.rstrip() for t in text2_lines]
          ndiff_kw = dict(linejunk=difflib.IS_LINE_JUNK,
                          charjunk=difflib.IS_CHARACTER_JUNK)
      else:
          ndiff_kw = {}
      all_diff_lines = list(difflib.ndiff(text1_lines, text2_lines, **ndiff_kw))
      if num_context_lines is None:
          diff_lines = all_diff_lines
      else:
          from utool import util_list
          ismarked_list = [len(line) > 0 and line[0] in '+-?'
                           for line in all_diff_lines]
          isvalid_list = ismarked_list[:]
          for i in range(1, num_context_lines + 1):
              isvalid_list[:-i] = util_list.or_lists(isvalid_list[:-i],
                                                     ismarked_list[i:])
              isvalid_list[i:]  = util_list.or_lists(isvalid_list[i:],
                                                     ismarked_list[:-i])
          USE_BREAK_LINE = True
          if USE_BREAK_LINE:
              diff_lines = []
              prev = False
              visual_break = '\n <... FILTERED CONTEXT ...> \n'
              for line, valid in zip(all_diff_lines, isvalid_list):
                  if valid:
                      diff_lines.append(line)
                  elif prev:
                      if False:
                          diff_lines.append(visual_break)
                  prev = valid
          else:
              diff_lines = util_list.compress(all_diff_lines, isvalid_list)
      return '\n'.join(diff_lines)