class_docstr: Process blocks that are empty or start with an empty line. 
class_docstr_tok: ["Process","blocks","that","are","empty","or","start","with","an","empty","line","."]
code: def run(self, parent: etree.Element, blocks: list[str]) -> None:
      block = blocks.pop(0)
      filler = "\n\n"
      if block:
          # Starts with empty line
          # Only replace a single line.
          filler = "\n"
          # Save the rest for later.
          theRest = block[1:]
          if theRest:
              # Add remaining lines to master blocks for later.
              blocks.insert(0, theRest)
      sibling = self.lastChild(parent)
      if (
          sibling is not None
          and sibling.tag == "pre"
          and len(sibling)
          and sibling[0].tag == "code"
      ):
          # Last block is a code block. Append to preserve whitespace.
          sibling[0].text = util.AtomicString(
              "{}{}".format(sibling[0].text, filler)
          )
  
imports: from __future__ import annotations
  import logging
  import re
  import xml.etree.ElementTree
  from typing import TYPE_CHECKING, Any
  from .None import util
  from .blockparser import BlockParser
label_desc: Use image node_id 2 for calling the EmptyBlockProcessor obj's underlying member method code with example usage: obj.run(parent, blocks) without return types