code: def _get_blocks(lines):
      
      cur_block = []
      pre_lang = None
      pre_in_code = None
      for (l, in_code, cur_lang, _) in _parse_code_lines(lines):
          if in_code != pre_in_code:
              if pre_in_code and len(cur_block) >= 2:
                  cur_block = cur_block[1:-1] # remove ```
              # remove empty lines at head
              while len(cur_block) > 0:
                  if len(cur_block[0]) == 0:
                      cur_block.pop(0)
                  else:
                      break
              # remove empty lines at tail
              while len(cur_block) > 0:
                  if len(cur_block[-1]) == 0:
                      cur_block.pop()
                  else:
                      break
              if len(cur_block):
                  yield (pre_in_code, pre_lang, cur_block)
              cur_block = []
          cur_block.append(l)
          pre_lang = cur_lang
          pre_in_code = in_code
      if len(cur_block):
          yield (pre_in_code, pre_lang, cur_block)
docs: split lines into code and non-code blocks
  
      Returns
      -------
      iterator of (bool, str, list of str)
        - if it is a code block
        - source language
        - lines of source