class_docstr: Process blockquotes. 
class_docstr_tok: ["Process","blockquotes","."]
code: def run(self, parent: etree.Element, blocks: list[str]) -> None:
      block = blocks.pop(0)
      m = self.RE.search(block)
      if m:
          before = block[: m.start()]  # Lines before blockquote
          # Pass lines before blockquote in recursively for parsing first.
          self.parser.parseBlocks(parent, [before])
          # Remove `> ` from beginning of each line.
          block = "\n".join(
              [
                  self.clean(line)
                  for line in block[m.start() :].split("\n")
              ]
          )
      sibling = self.lastChild(parent)
      if sibling is not None and sibling.tag == "blockquote":
          # Previous block was a blockquote so set that as this blocks parent
          quote = sibling
      else:
          # This is a new blockquote. Create a new parent element.
          quote = etree.SubElement(parent, "blockquote")
      # Recursively parse block with blockquote as parent.
      # change parser state so blockquotes embedded in lists use `p` tags
      self.parser.state.set("blockquote")
      self.parser.parseChunk(quote, block)
      self.parser.state.reset()
  
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 BlockQuoteProcessor obj's underlying member method code with example usage: obj.run(parent, blocks) without return types