class_docstr: Preprocessors are run after the text is broken into lines.
  
  Each preprocessor implements a `run` method that takes a pointer to a
  list of lines of the document, modifies it as necessary and returns
  either the same pointer or a pointer to a new list.
  
  Preprocessors must extend `Preprocessor`.
docstr: Each subclass of `Preprocessor` should override the `run` method, which
  takes the document as a list of strings split by newlines and returns
  the (possibly modified) list of lines.
docstr_tok: ["Each","subclass","of","`","Preprocessor","`","should","override","the","`","run","`","method",",","which","takes","the","document","as","a","list","of","strings","split","by","newlines","and","returns","the","(","possibly","modified",")","list","of","lines","."]
code: def run(self, lines: list[str]) -> list[str]:
      """
      Each subclass of `Preprocessor` should override the `run` method, which
      takes the document as a list of strings split by newlines and returns
      the (possibly modified) list of lines.
  
      """
      pass
  
file_path: markdown/markdown/preprocessors.py
imports: from __future__ import annotations
  from typing import TYPE_CHECKING, Any
  from .None import util
  from .htmlparser import HTMLExtractor
  import re
label_desc: Use image node_id 1 for calling the Preprocessor obj's underlying member method code with example usage: obj.run(lines) without return types