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: Remove a tab from front of lines but allowing dedented lines. 
docstr_tok: ["Remove","a","tab","from","front","of","lines","but","allowing","dedented","lines","."]
code: def looseDetab(self, text: str, level: int = 1) -> str:
      """Remove a tab from front of lines but allowing dedented lines."""
      lines = text.split("\n")
      for i in range(len(lines)):
          if lines[i].startswith(" " * self.tab_length * level):
              lines[i] = lines[i][self.tab_length * level :]
      return "\n".join(lines)
  
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 4 for calling the BlockProcessor obj's underlying member method code with example usage: obj.looseDetab(text, level) and returns: str