class_docstr: Base class for block processors.
  
  Each subclass will provide the methods below to work with the source and
  tree. Each processor will need to define it's own `test` and `run`
  methods. The `test` method should return True or False, to indicate
  whether the current block should be processed by this processor. If the
  test passes, the parser will call the processors `run` method.
  
  Attributes:
      BlockProcessor.parser (BlockParser): The `BlockParser` instance this is attached to.
      BlockProcessor.tab_length (int): The tab length set on the `Markdown` instance.
class_docstr_tok: ["Base","class","for","block","processors",".","Each","subclass","will","provide","the","methods","below","to","work","with","the","source","and","tree",".","Each","processor","will","need","to","define","it","'s","own","`","test","`","and","`","run","`","methods",".","The","`","test","`","method","should","return","True","or","False",",","to","indicate","whether","the","current","block","should","be","processed","by","this","processor",".","If","the","test","passes",",","the","parser","will","call","the","processors","`","run","`","method",".","Attributes",":","BlockProcessor.parser","(","BlockParser",")",":","The","`","BlockParser","`","instance","this","is","attached","to",".","BlockProcessor.tab_length","(","int",")",":","The","tab","length","set","on","the","`","Markdown","`","instance","."]
docstr: Run processor. Must be overridden by subclasses.
  
  When the parser determines the appropriate type of a block, the parser
  will call the corresponding processor's `run` method. This method
  should parse the individual lines of the block and append them to
  the `etree`.
  
  Note that both the `parent` and `etree` keywords are pointers
  to instances of the objects which should be edited in place. Each
  processor must make changes to the existing objects as there is no
  mechanism to return new/different objects to replace them.
  
  This means that this method should be adding `SubElements` or adding text
  to the parent, and should remove (`pop`) or add (`insert`) items to
  the list of blocks.
  
  If `False` is returned, this will have the same effect as returning `False`
  from the `test` method.
  
  Keyword arguments:
      parent: An `etree` element which is the parent of the current block.
      blocks: A list of all remaining blocks of the document.
docstr_tok: ["Run","processor",".","Must","be","overridden","by","subclasses",".","When","the","parser","determines","the","appropriate","type","of","a","block",",","the","parser","will","call","the","corresponding","processor","'s","`","run","`","method",".","This","method","should","parse","the","individual","lines","of","the","block","and","append","them","to","the","`","etree","`",".","Note","that","both","the","`","parent","`","and","`","etree","`","keywords","are","pointers","to","instances","of","the","objects","which","should","be","edited","in","place",".","Each","processor","must","make","changes","to","the","existing","objects","as","there","is","no","mechanism","to","return","new\/different","objects","to","replace","them",".","This","means","that","this","method","should","be","adding","`","SubElements","`","or","adding","text","to","the","parent",",","and","should","remove","(","`","pop","`",")","or","add","(","`","insert","`",")","items","to","the","list","of","blocks",".","If","`","False","`","is","returned",",","this","will","have","the","same","effect","as","returning","`","False","`","from","the","`","test","`","method",".","Keyword","arguments",":","parent",":","An","`","etree","`","element","which","is","the","parent","of","the","current","block",".","blocks",":","A","list","of","all","remaining","blocks","of","the","document","."]
code: def run(
      self, parent: etree.Element, blocks: list[str]
  ) -> bool | None:
      """Run processor. Must be overridden by subclasses.
  
      When the parser determines the appropriate type of a block, the parser
      will call the corresponding processor's `run` method. This method
      should parse the individual lines of the block and append them to
      the `etree`.
  
      Note that both the `parent` and `etree` keywords are pointers
      to instances of the objects which should be edited in place. Each
      processor must make changes to the existing objects as there is no
      mechanism to return new/different objects to replace them.
  
      This means that this method should be adding `SubElements` or adding text
      to the parent, and should remove (`pop`) or add (`insert`) items to
      the list of blocks.
  
      If `False` is returned, this will have the same effect as returning `False`
      from the `test` method.
  
      Keyword arguments:
          parent: An `etree` element which is the parent of the current block.
          blocks: A list of all remaining blocks of the document.
      """
      pass
  
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 6 for calling the BlockProcessor obj's underlying member method code with example usage: obj.run(parent, blocks) without return types