diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 50921671..b9b3f0c0 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -23,6 +23,11 @@ repos:
- id: end-of-file-fixer
- id: trailing-whitespace
+ - repo: https://github.com/pycqa/isort
+ rev: 5.10.1
+ hooks:
+ - id: isort
+
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
diff --git a/benchmarking/bench_core.py b/benchmarking/bench_core.py
index d8808d59..6834989f 100644
--- a/benchmarking/bench_core.py
+++ b/benchmarking/bench_core.py
@@ -1,4 +1,5 @@
from pathlib import Path
+
import pytest
import markdown_it
diff --git a/benchmarking/bench_packages.py b/benchmarking/bench_packages.py
index afa39ead..1158750e 100644
--- a/benchmarking/bench_packages.py
+++ b/benchmarking/bench_packages.py
@@ -1,7 +1,8 @@
from pathlib import Path
-import pytest
from shutil import which
+import pytest
+
@pytest.fixture
def spec_text():
diff --git a/docs/conf.py b/docs/conf.py
index 56ded533..786eff04 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -92,6 +92,7 @@ def run_apidoc(app):
"""
import os
import shutil
+
import sphinx
from sphinx.ext import apidoc
diff --git a/markdown_it/cli/parse.py b/markdown_it/cli/parse.py
index e159aad2..2d74f55a 100644
--- a/markdown_it/cli/parse.py
+++ b/markdown_it/cli/parse.py
@@ -13,7 +13,6 @@
from markdown_it import __version__
from markdown_it.main import MarkdownIt
-
version_str = "markdown-it-py [version {}]".format(__version__)
diff --git a/markdown_it/common/normalize_url.py b/markdown_it/common/normalize_url.py
index 4ecf2ef4..afec9284 100644
--- a/markdown_it/common/normalize_url.py
+++ b/markdown_it/common/normalize_url.py
@@ -2,13 +2,12 @@
from collections.abc import Callable
import re
-from urllib.parse import urlparse, urlunparse, quote, unquote # noqa: F401
+from urllib.parse import quote, unquote, urlparse, urlunparse # noqa: F401
import mdurl
from .. import _punycode
-
RECODE_HOSTNAME_FOR = ("http:", "https:", "mailto:")
diff --git a/markdown_it/helpers/__init__.py b/markdown_it/helpers/__init__.py
index f76bd444..3dbbdd1d 100644
--- a/markdown_it/helpers/__init__.py
+++ b/markdown_it/helpers/__init__.py
@@ -1,6 +1,6 @@
"""Functions for parsing Links
"""
__all__ = ("parseLinkLabel", "parseLinkDestination", "parseLinkTitle")
-from .parse_link_label import parseLinkLabel
from .parse_link_destination import parseLinkDestination
+from .parse_link_label import parseLinkLabel
from .parse_link_title import parseLinkTitle
diff --git a/markdown_it/helpers/parse_link_destination.py b/markdown_it/helpers/parse_link_destination.py
index 74dbec08..58b76f3c 100644
--- a/markdown_it/helpers/parse_link_destination.py
+++ b/markdown_it/helpers/parse_link_destination.py
@@ -2,7 +2,7 @@
Parse link destination
"""
-from ..common.utils import unescapeAll, charCodeAt
+from ..common.utils import charCodeAt, unescapeAll
class _Result:
diff --git a/markdown_it/helpers/parse_link_title.py b/markdown_it/helpers/parse_link_title.py
index 0cb1365b..842c83bc 100644
--- a/markdown_it/helpers/parse_link_title.py
+++ b/markdown_it/helpers/parse_link_title.py
@@ -1,6 +1,6 @@
"""Parse link title
"""
-from ..common.utils import unescapeAll, charCodeAt
+from ..common.utils import charCodeAt, unescapeAll
class _Result:
diff --git a/markdown_it/main.py b/markdown_it/main.py
index 508b5ce4..7faac5ad 100644
--- a/markdown_it/main.py
+++ b/markdown_it/main.py
@@ -1,17 +1,17 @@
from __future__ import annotations
-from contextlib import contextmanager
from collections.abc import Callable, Generator, Iterable, Mapping, MutableMapping
+from contextlib import contextmanager
from typing import Any
from . import helpers, presets # noqa F401
from .common import normalize_url, utils # noqa F401
-from .token import Token
-from .parser_core import ParserCore # noqa F401
from .parser_block import ParserBlock # noqa F401
+from .parser_core import ParserCore # noqa F401
from .parser_inline import ParserInline # noqa F401
-from .rules_core.state_core import StateCore
from .renderer import RendererHTML, RendererProtocol
+from .rules_core.state_core import StateCore
+from .token import Token
from .utils import OptionsDict
try:
diff --git a/markdown_it/parser_block.py b/markdown_it/parser_block.py
index f5768058..f331ec54 100644
--- a/markdown_it/parser_block.py
+++ b/markdown_it/parser_block.py
@@ -3,10 +3,10 @@
import logging
+from . import rules_block
from .ruler import Ruler
-from .token import Token
from .rules_block.state_block import StateBlock
-from . import rules_block
+from .token import Token
LOGGER = logging.getLogger(__name__)
diff --git a/markdown_it/parser_core.py b/markdown_it/parser_core.py
index f0c3ad22..32209b32 100644
--- a/markdown_it/parser_core.py
+++ b/markdown_it/parser_core.py
@@ -6,10 +6,9 @@
"""
from __future__ import annotations
-from .ruler import Ruler, RuleFunc
+from .ruler import RuleFunc, Ruler
+from .rules_core import block, inline, linkify, normalize, replace, smartquotes
from .rules_core.state_core import StateCore
-from .rules_core import normalize, block, inline, replace, smartquotes, linkify
-
_rules: list[tuple[str, RuleFunc]] = [
("normalize", normalize),
diff --git a/markdown_it/parser_inline.py b/markdown_it/parser_inline.py
index 826665db..b61c990b 100644
--- a/markdown_it/parser_inline.py
+++ b/markdown_it/parser_inline.py
@@ -2,10 +2,10 @@
"""
from __future__ import annotations
-from .ruler import Ruler, RuleFunc
-from .token import Token
-from .rules_inline.state_inline import StateInline
from . import rules_inline
+from .ruler import RuleFunc, Ruler
+from .rules_inline.state_inline import StateInline
+from .token import Token
# Parser rules
_rules: list[tuple[str, RuleFunc]] = [
diff --git a/markdown_it/renderer.py b/markdown_it/renderer.py
index 88ee36fe..b8bfe4da 100644
--- a/markdown_it/renderer.py
+++ b/markdown_it/renderer.py
@@ -11,7 +11,7 @@ class Renderer
import inspect
from typing import Any, ClassVar
-from .common.utils import unescapeAll, escapeHtml
+from .common.utils import escapeHtml, unescapeAll
from .token import Token
from .utils import OptionsDict
diff --git a/markdown_it/ruler.py b/markdown_it/ruler.py
index 2217bcd6..06576520 100644
--- a/markdown_it/ruler.py
+++ b/markdown_it/ruler.py
@@ -19,6 +19,7 @@ class Ruler
from collections.abc import Callable, Iterable, MutableMapping
from typing import TYPE_CHECKING
+
import attr
if TYPE_CHECKING:
diff --git a/markdown_it/rules_block/__init__.py b/markdown_it/rules_block/__init__.py
index c1660b89..bcf138df 100644
--- a/markdown_it/rules_block/__init__.py
+++ b/markdown_it/rules_block/__init__.py
@@ -13,15 +13,15 @@
"table",
)
-from .state_block import StateBlock
-from .paragraph import paragraph
-from .heading import heading
-from .lheading import lheading
+from .blockquote import blockquote
from .code import code
from .fence import fence
+from .heading import heading
from .hr import hr
+from .html_block import html_block
+from .lheading import lheading
from .list import list_block
+from .paragraph import paragraph
from .reference import reference
-from .blockquote import blockquote
-from .html_block import html_block
+from .state_block import StateBlock
from .table import table
diff --git a/markdown_it/rules_block/blockquote.py b/markdown_it/rules_block/blockquote.py
index 52616167..7f72b896 100644
--- a/markdown_it/rules_block/blockquote.py
+++ b/markdown_it/rules_block/blockquote.py
@@ -3,8 +3,8 @@
import logging
-from .state_block import StateBlock
from ..common.utils import isSpace
+from .state_block import StateBlock
LOGGER = logging.getLogger(__name__)
diff --git a/markdown_it/rules_block/code.py b/markdown_it/rules_block/code.py
index 6d9c87a3..c4fdba33 100644
--- a/markdown_it/rules_block/code.py
+++ b/markdown_it/rules_block/code.py
@@ -1,5 +1,6 @@
"""Code block (4 spaces padded)."""
import logging
+
from .state_block import StateBlock
LOGGER = logging.getLogger(__name__)
diff --git a/markdown_it/rules_block/heading.py b/markdown_it/rules_block/heading.py
index 3ccc3059..8d4ef3e2 100644
--- a/markdown_it/rules_block/heading.py
+++ b/markdown_it/rules_block/heading.py
@@ -3,8 +3,8 @@
import logging
-from .state_block import StateBlock
from ..common.utils import isSpace
+from .state_block import StateBlock
LOGGER = logging.getLogger(__name__)
diff --git a/markdown_it/rules_block/hr.py b/markdown_it/rules_block/hr.py
index 01c68552..804cd9db 100644
--- a/markdown_it/rules_block/hr.py
+++ b/markdown_it/rules_block/hr.py
@@ -7,7 +7,6 @@
from ..common.utils import isSpace
from .state_block import StateBlock
-
LOGGER = logging.getLogger(__name__)
diff --git a/markdown_it/rules_block/html_block.py b/markdown_it/rules_block/html_block.py
index 335d7cd0..31afab76 100644
--- a/markdown_it/rules_block/html_block.py
+++ b/markdown_it/rules_block/html_block.py
@@ -4,9 +4,9 @@
import logging
import re
-from .state_block import StateBlock
from ..common.html_blocks import block_names
from ..common.html_re import HTML_OPEN_CLOSE_TAG_STR
+from .state_block import StateBlock
LOGGER = logging.getLogger(__name__)
diff --git a/markdown_it/rules_block/list.py b/markdown_it/rules_block/list.py
index 59789350..a7617ad2 100644
--- a/markdown_it/rules_block/list.py
+++ b/markdown_it/rules_block/list.py
@@ -1,8 +1,8 @@
# Lists
import logging
-from .state_block import StateBlock
from ..common.utils import isSpace
+from .state_block import StateBlock
LOGGER = logging.getLogger(__name__)
diff --git a/markdown_it/rules_block/reference.py b/markdown_it/rules_block/reference.py
index 1704d806..35adde2a 100644
--- a/markdown_it/rules_block/reference.py
+++ b/markdown_it/rules_block/reference.py
@@ -1,9 +1,8 @@
import logging
-from ..common.utils import isSpace, normalizeReference, charCodeAt
+from ..common.utils import charCodeAt, isSpace, normalizeReference
from .state_block import StateBlock
-
LOGGER = logging.getLogger(__name__)
diff --git a/markdown_it/rules_block/state_block.py b/markdown_it/rules_block/state_block.py
index b2c71892..4b32219f 100644
--- a/markdown_it/rules_block/state_block.py
+++ b/markdown_it/rules_block/state_block.py
@@ -2,9 +2,9 @@
from typing import TYPE_CHECKING
-from ..token import Token
-from ..ruler import StateBase
from ..common.utils import isSpace
+from ..ruler import StateBase
+from ..token import Token
if TYPE_CHECKING:
from markdown_it.main import MarkdownIt
diff --git a/markdown_it/rules_block/table.py b/markdown_it/rules_block/table.py
index 8c2c5927..e3db8584 100644
--- a/markdown_it/rules_block/table.py
+++ b/markdown_it/rules_block/table.py
@@ -1,9 +1,8 @@
# GFM table, https://github.github.com/gfm/#tables-extension-
import re
+from ..common.utils import charCodeAt, isSpace
from .state_block import StateBlock
-from ..common.utils import isSpace, charCodeAt
-
headerLineRe = re.compile(r"^:?-+:?$")
enclosingPipesRe = re.compile(r"^\||\|$")
diff --git a/markdown_it/rules_core/__init__.py b/markdown_it/rules_core/__init__.py
index 7f5de3e4..f80034c5 100644
--- a/markdown_it/rules_core/__init__.py
+++ b/markdown_it/rules_core/__init__.py
@@ -8,10 +8,10 @@
"linkify",
)
-from .state_core import StateCore
-from .normalize import normalize
from .block import block
from .inline import inline
+from .linkify import linkify
+from .normalize import normalize
from .replacements import replace
from .smartquotes import smartquotes
-from .linkify import linkify
+from .state_core import StateCore
diff --git a/markdown_it/rules_core/linkify.py b/markdown_it/rules_core/linkify.py
index 0acc6f11..49bb4ef3 100644
--- a/markdown_it/rules_core/linkify.py
+++ b/markdown_it/rules_core/linkify.py
@@ -1,9 +1,8 @@
import re
from ..common.utils import arrayReplaceAt
-from .state_core import StateCore
from ..token import Token
-
+from .state_core import StateCore
LINK_OPEN_RE = re.compile(r"^\s]", flags=re.IGNORECASE)
LINK_CLOSE_RE = re.compile(r"^", flags=re.IGNORECASE)
diff --git a/markdown_it/rules_core/normalize.py b/markdown_it/rules_core/normalize.py
index 14b2f679..bf16fd7a 100644
--- a/markdown_it/rules_core/normalize.py
+++ b/markdown_it/rules_core/normalize.py
@@ -3,7 +3,6 @@
from .state_core import StateCore
-
# https://spec.commonmark.org/0.29/#line-ending
NEWLINES_RE = re.compile(r"\r\n?|\n")
NULL_RE = re.compile(r"\0")
diff --git a/markdown_it/rules_core/replacements.py b/markdown_it/rules_core/replacements.py
index bced7026..45377d3e 100644
--- a/markdown_it/rules_core/replacements.py
+++ b/markdown_it/rules_core/replacements.py
@@ -19,8 +19,8 @@
import logging
import re
-from .state_core import StateCore
from ..token import Token
+from .state_core import StateCore
LOGGER = logging.getLogger(__name__)
diff --git a/markdown_it/rules_core/smartquotes.py b/markdown_it/rules_core/smartquotes.py
index 7c297269..93f8be28 100644
--- a/markdown_it/rules_core/smartquotes.py
+++ b/markdown_it/rules_core/smartquotes.py
@@ -5,11 +5,9 @@
import re
from typing import Any
-from .state_core import StateCore
-from ..common.utils import charCodeAt
-from ..common.utils import isWhiteSpace, isPunctChar, isMdAsciiPunct
+from ..common.utils import charCodeAt, isMdAsciiPunct, isPunctChar, isWhiteSpace
from ..token import Token
-
+from .state_core import StateCore
QUOTE_TEST_RE = re.compile(r"['\"]")
QUOTE_RE = re.compile(r"['\"]")
diff --git a/markdown_it/rules_core/state_core.py b/markdown_it/rules_core/state_core.py
index 3521df2f..15b7c605 100644
--- a/markdown_it/rules_core/state_core.py
+++ b/markdown_it/rules_core/state_core.py
@@ -3,8 +3,8 @@
from collections.abc import MutableMapping
from typing import TYPE_CHECKING
-from ..token import Token
from ..ruler import StateBase
+from ..token import Token
if TYPE_CHECKING:
from markdown_it import MarkdownIt
diff --git a/markdown_it/rules_inline/__init__.py b/markdown_it/rules_inline/__init__.py
index 0cce406b..f27907ce 100644
--- a/markdown_it/rules_inline/__init__.py
+++ b/markdown_it/rules_inline/__init__.py
@@ -14,17 +14,16 @@
"html_inline",
"strikethrough",
)
-from .state_inline import StateInline
-from .text import text
-from .text_collapse import text_collapse
+from . import emphasis, strikethrough
+from .autolink import autolink
+from .backticks import backtick
from .balance_pairs import link_pairs
+from .entity import entity
from .escape import escape
-from .newline import newline
-from .backticks import backtick
-from . import emphasis
+from .html_inline import html_inline
from .image import image
from .link import link
-from .autolink import autolink
-from .entity import entity
-from .html_inline import html_inline
-from . import strikethrough
+from .newline import newline
+from .state_inline import StateInline
+from .text import text
+from .text_collapse import text_collapse
diff --git a/markdown_it/rules_inline/autolink.py b/markdown_it/rules_inline/autolink.py
index 6a55e49a..a4ee61c3 100644
--- a/markdown_it/rules_inline/autolink.py
+++ b/markdown_it/rules_inline/autolink.py
@@ -1,5 +1,6 @@
# Process autolinks ''
import re
+
from .state_inline import StateInline
EMAIL_RE = re.compile(
diff --git a/markdown_it/rules_inline/emphasis.py b/markdown_it/rules_inline/emphasis.py
index ef32c8d9..9001b09e 100644
--- a/markdown_it/rules_inline/emphasis.py
+++ b/markdown_it/rules_inline/emphasis.py
@@ -1,7 +1,7 @@
# Process *this* and _that_
#
-from .state_inline import StateInline, Delimiter
+from .state_inline import Delimiter, StateInline
def tokenize(state: StateInline, silent: bool):
diff --git a/markdown_it/rules_inline/entity.py b/markdown_it/rules_inline/entity.py
index 8354e6c7..883a9666 100644
--- a/markdown_it/rules_inline/entity.py
+++ b/markdown_it/rules_inline/entity.py
@@ -2,7 +2,7 @@
import re
from ..common.entities import entities
-from ..common.utils import isValidEntityCode, fromCodePoint
+from ..common.utils import fromCodePoint, isValidEntityCode
from .state_inline import StateInline
DIGITAL_RE = re.compile(r"^((?:x[a-f0-9]{1,6}|[0-9]{1,7}));", re.IGNORECASE)
diff --git a/markdown_it/rules_inline/escape.py b/markdown_it/rules_inline/escape.py
index 64d9a678..36bd0402 100644
--- a/markdown_it/rules_inline/escape.py
+++ b/markdown_it/rules_inline/escape.py
@@ -1,9 +1,8 @@
"""
Process escaped chars and hardbreaks
"""
-from .state_inline import StateInline
from ..common.utils import isSpace
-
+from .state_inline import StateInline
ESCAPED = [0 for _ in range(256)]
for ch in "\\!\"#$%&'()*+,./:;<=>?@[]^_`{|}~-":
diff --git a/markdown_it/rules_inline/html_inline.py b/markdown_it/rules_inline/html_inline.py
index 7333e370..295cc5c7 100644
--- a/markdown_it/rules_inline/html_inline.py
+++ b/markdown_it/rules_inline/html_inline.py
@@ -1,6 +1,6 @@
# Process html tags
-from .state_inline import StateInline
from ..common.html_re import HTML_TAG_RE
+from .state_inline import StateInline
def isLetter(ch: int):
diff --git a/markdown_it/rules_inline/image.py b/markdown_it/rules_inline/image.py
index eb3824b1..d2a08d47 100644
--- a/markdown_it/rules_inline/image.py
+++ b/markdown_it/rules_inline/image.py
@@ -1,9 +1,9 @@
# Process 
from __future__ import annotations
-from .state_inline import StateInline
-from ..token import Token
from ..common.utils import isSpace, normalizeReference
+from ..token import Token
+from .state_inline import StateInline
def image(state: StateInline, silent: bool):
diff --git a/markdown_it/rules_inline/link.py b/markdown_it/rules_inline/link.py
index 919ccf12..2394d6c3 100644
--- a/markdown_it/rules_inline/link.py
+++ b/markdown_it/rules_inline/link.py
@@ -1,6 +1,6 @@
# Process [link]( "stuff")
-from ..common.utils import normalizeReference, isSpace
+from ..common.utils import isSpace, normalizeReference
from .state_inline import StateInline
diff --git a/markdown_it/rules_inline/newline.py b/markdown_it/rules_inline/newline.py
index b4b8a67f..3034e408 100644
--- a/markdown_it/rules_inline/newline.py
+++ b/markdown_it/rules_inline/newline.py
@@ -1,8 +1,8 @@
# Proceess '\n'
import re
-from .state_inline import StateInline
from ..common.utils import charCodeAt, isSpace
+from .state_inline import StateInline
endSpace = re.compile(r" +$")
diff --git a/markdown_it/rules_inline/state_inline.py b/markdown_it/rules_inline/state_inline.py
index a6f72a92..430357d1 100644
--- a/markdown_it/rules_inline/state_inline.py
+++ b/markdown_it/rules_inline/state_inline.py
@@ -6,9 +6,9 @@
import attr
-from ..token import Token
+from ..common.utils import isMdAsciiPunct, isPunctChar, isWhiteSpace
from ..ruler import StateBase
-from ..common.utils import isWhiteSpace, isPunctChar, isMdAsciiPunct
+from ..token import Token
if TYPE_CHECKING:
from markdown_it import MarkdownIt
diff --git a/markdown_it/rules_inline/strikethrough.py b/markdown_it/rules_inline/strikethrough.py
index fced7e32..107ea26b 100644
--- a/markdown_it/rules_inline/strikethrough.py
+++ b/markdown_it/rules_inline/strikethrough.py
@@ -1,7 +1,7 @@
# ~~strike through~~
from __future__ import annotations
-from .state_inline import StateInline, Delimiter
+from .state_inline import Delimiter, StateInline
def tokenize(state: StateInline, silent: bool):
diff --git a/markdown_it/rules_inline/text.py b/markdown_it/rules_inline/text.py
index 0773a9d4..ec6ee0fa 100644
--- a/markdown_it/rules_inline/text.py
+++ b/markdown_it/rules_inline/text.py
@@ -3,7 +3,6 @@
from .state_inline import StateInline
-
# Rule to skip pure text
# '{}$%@~+=:' reserved for extensions
@@ -11,6 +10,8 @@
# !!!! Don't confuse with "Markdown ASCII Punctuation" chars
# http://spec.commonmark.org/0.15/#ascii-punctuation-character
+
+
def isTerminatorChar(ch):
return ch in {
0x0A, # /* \n */:
diff --git a/markdown_it/tree.py b/markdown_it/tree.py
index b17103e5..09476b22 100644
--- a/markdown_it/tree.py
+++ b/markdown_it/tree.py
@@ -6,12 +6,7 @@
from collections.abc import Generator, Sequence
import textwrap
-from typing import (
- NamedTuple,
- Any,
- TypeVar,
- overload,
-)
+from typing import Any, NamedTuple, TypeVar, overload
from .token import Token
from .utils import _removesuffix
diff --git a/pyproject.toml b/pyproject.toml
index 55106e49..1ef8304c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -80,6 +80,10 @@ exclude = [
"benchmarking/"
]
+[tool.isort]
+profile = "black"
+force_sort_within_sections = true
+
[tool.mypy]
show_error_codes = true
warn_unused_ignores = true
diff --git a/tests/test_api/test_token.py b/tests/test_api/test_token.py
index df4a0390..a35616b2 100644
--- a/tests/test_api/test_token.py
+++ b/tests/test_api/test_token.py
@@ -1,6 +1,6 @@
import warnings
-from markdown_it.token import Token, nest_tokens, NestedTokens
+from markdown_it.token import NestedTokens, Token, nest_tokens
def test_token():
diff --git a/tests/test_port/test_misc.py b/tests/test_port/test_misc.py
index 8e7a5239..62b5bf85 100644
--- a/tests/test_port/test_misc.py
+++ b/tests/test_port/test_misc.py
@@ -1,5 +1,4 @@
-from markdown_it import MarkdownIt
-from markdown_it import presets
+from markdown_it import MarkdownIt, presets
def test_highlight_arguments():