Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ jobs:
- name: Upload to Codecov
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
name: mdit-py-plugins-pytests
flags: pytests
file: ./coverage.xml
Expand Down
20 changes: 6 additions & 14 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,30 +12,22 @@ exclude: >
repos:

- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
rev: v4.6.0
hooks:
- id: check-json
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace

- repo: https://github.com/PyCQA/isort
rev: 5.13.2
hooks:
- id: isort

- repo: https://github.com/psf/black
rev: 23.12.1
hooks:
- id: black

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.1.13
rev: v0.4.4
hooks:
- id: ruff
- id: ruff
args: [--fix]
- id: ruff-format

- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.8.0
rev: v1.10.0
hooks:
- id: mypy
additional_dependencies: [markdown-it-py~=3.0]
Expand Down
8 changes: 4 additions & 4 deletions mdit_py_plugins/admon/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from contextlib import suppress
import re
from typing import TYPE_CHECKING, Callable, List, Sequence, Tuple
from typing import TYPE_CHECKING, Callable, Sequence

from markdown_it import MarkdownIt
from markdown_it.rules_block import StateBlock
Expand All @@ -17,7 +17,7 @@
from markdown_it.utils import EnvType, OptionsDict


def _get_multiple_tags(params: str) -> Tuple[List[str], str]:
def _get_multiple_tags(params: str) -> tuple[list[str], str]:
"""Check for multiple tags when the title is double quoted."""
re_tags = re.compile(r'^\s*(?P<tokens>[^"]+)\s+"(?P<title>.*)"\S*$')
match = re_tags.match(params)
Expand All @@ -27,7 +27,7 @@ def _get_multiple_tags(params: str) -> Tuple[List[str], str]:
raise ValueError("No match found for parameters")


def _get_tag(_params: str) -> Tuple[List[str], str]:
def _get_tag(_params: str) -> tuple[list[str], str]:
"""Separate the tag name from the admonition title."""
params = _params.strip()
if not params:
Expand Down Expand Up @@ -212,7 +212,7 @@ def renderDefault(
_options: OptionsDict,
env: EnvType,
) -> str:
return self.renderToken(tokens, idx, _options, env) # type: ignore
return self.renderToken(tokens, idx, _options, env) # type: ignore[attr-defined,no-any-return]

render = render or renderDefault

Expand Down
5 changes: 3 additions & 2 deletions mdit_py_plugins/amsmath/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
"""An extension to capture amsmath latex environments."""

from __future__ import annotations

import re
from typing import TYPE_CHECKING, Callable, Optional, Sequence
from typing import TYPE_CHECKING, Callable, Sequence

from markdown_it import MarkdownIt
from markdown_it.common.utils import escapeHtml
Expand Down Expand Up @@ -57,7 +58,7 @@


def amsmath_plugin(
md: MarkdownIt, *, renderer: Optional[Callable[[str], str]] = None
md: MarkdownIt, *, renderer: Callable[[str], str] | None = None
) -> None:
"""Parses TeX math equations, without any surrounding delimiters,
only for top-level `amsmath <https://ctan.org/pkg/amsmath>`__ environments:
Expand Down
10 changes: 5 additions & 5 deletions mdit_py_plugins/attrs/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ def _span_rule(state: StateInline, silent: bool) -> bool:
state.pos = labelStart
state.posMax = labelEnd
token = state.push("span_open", "span", 1)
token.attrs = attrs # type: ignore
token.attrs = attrs # type: ignore[assignment]
state.md.inline.tokenize(state)
token = state.push("span_close", "span", -1)

Expand Down Expand Up @@ -190,7 +190,7 @@ def _attr_block_rule(
return True

token = state.push("attrs_block", "", 0)
token.attrs = attrs # type: ignore
token.attrs = attrs # type: ignore[assignment]
token.map = [startLine, startLine + 1]

state.line = startLine + 1
Expand All @@ -211,9 +211,9 @@ def _attr_resolve_block_rule(state: StateCore) -> None:

# classes are appended
if "class" in state.tokens[i].attrs and "class" in next_token.attrs:
state.tokens[i].attrs[
"class"
] = f"{state.tokens[i].attrs['class']} {next_token.attrs['class']}"
state.tokens[i].attrs["class"] = (
f"{state.tokens[i].attrs['class']} {next_token.attrs['class']}"
)

if next_token.type == "attrs_block":
# subsequent attribute blocks take precedence, when merging
Expand Down
1 change: 1 addition & 0 deletions mdit_py_plugins/attrs/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class <- '.' name
bareval <- (ASCII_ALPHANUM | ':' | '_' | '-')+
quotedval <- '"' ([^"] | '\"') '"'
"""

from __future__ import annotations

from enum import Enum
Expand Down
3 changes: 2 additions & 1 deletion mdit_py_plugins/container/index.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Process block-level custom containers."""

from __future__ import annotations

from math import floor
Expand Down Expand Up @@ -56,7 +57,7 @@ def renderDefault(
if tokens[idx].nesting == 1:
tokens[idx].attrJoin("class", name)

return self.renderToken(tokens, idx, _options, env) # type: ignore
return self.renderToken(tokens, idx, _options, env) # type: ignore[attr-defined,no-any-return]

min_markers = 3
marker_str = marker
Expand Down
1 change: 1 addition & 0 deletions mdit_py_plugins/deflist/index.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Process definition lists."""

from markdown_it import MarkdownIt
from markdown_it.rules_block import StateBlock

Expand Down
14 changes: 7 additions & 7 deletions mdit_py_plugins/dollarmath/index.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from __future__ import annotations

import re
from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Sequence
from typing import TYPE_CHECKING, Any, Callable, Sequence

from markdown_it import MarkdownIt
from markdown_it.common.utils import escapeHtml, isWhiteSpace
Expand All @@ -24,9 +24,9 @@ def dollarmath_plugin(
allow_digits: bool = True,
allow_blank_lines: bool = True,
double_inline: bool = False,
label_normalizer: Optional[Callable[[str], str]] = None,
renderer: Optional[Callable[[str, Dict[str, Any]], str]] = None,
label_renderer: Optional[Callable[[str], str]] = None,
label_normalizer: Callable[[str], str] | None = None,
renderer: Callable[[str, dict[str, Any]], str] | None = None,
label_renderer: Callable[[str], str] | None = None,
) -> None:
"""Plugin for parsing dollar enclosed math,
e.g. inline: ``$a=1$``, block: ``$$b=2$$``
Expand All @@ -53,7 +53,7 @@ def dollarmath_plugin(

"""
if label_normalizer is None:
label_normalizer = lambda label: re.sub(r"\s+", "-", label)
label_normalizer = lambda label: re.sub(r"\s+", "-", label) # noqa: E731

md.inline.ruler.before(
"escape",
Expand All @@ -76,7 +76,7 @@ def dollarmath_plugin(

_label_renderer: Callable[[str], str]
if label_renderer is None:
_label_renderer = (
_label_renderer = ( # noqa: E731
lambda label: f'<a href="#{label}" class="mathlabel" title="Permalink to this equation">¶</a>'
)
else:
Expand Down Expand Up @@ -286,7 +286,7 @@ def _math_inline_dollar(state: StateInline, silent: bool) -> bool:

def math_block_dollar(
allow_labels: bool = True,
label_normalizer: Optional[Callable[[str], str]] = None,
label_normalizer: Callable[[str], str] | None = None,
allow_blank_lines: bool = False,
) -> Callable[[StateBlock, int, int, bool], bool]:
"""Generate block dollar rule."""
Expand Down
3 changes: 2 additions & 1 deletion mdit_py_plugins/field_list/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Field list plugin"""

from contextlib import contextmanager
from typing import Iterator, Optional, Tuple

Expand Down Expand Up @@ -176,7 +177,7 @@ def _fieldlist_rule(

has_first_line = contentStart < maximum
if block_indent is None: # no body content
if not has_first_line: # noqa SIM108
if not has_first_line: # noqa: SIM108
# no body or first line, so just use default
block_indent = 2
else:
Expand Down
13 changes: 7 additions & 6 deletions mdit_py_plugins/footnote/index.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"""Process footnotes"""

from __future__ import annotations

from typing import TYPE_CHECKING, List, Optional, Sequence
from typing import TYPE_CHECKING, Sequence

from markdown_it import MarkdownIt
from markdown_it.helpers import parseLinkLabel
Expand Down Expand Up @@ -184,7 +185,7 @@ def footnote_inline(state: StateInline, silent: bool) -> bool:
refs = state.env.setdefault("footnotes", {}).setdefault("list", {})
footnoteId = len(refs)

tokens: List[Token] = []
tokens: list[Token] = []
state.md.inline.parse(
state.src[labelStart:labelEnd], state.md, state.env, tokens
)
Expand Down Expand Up @@ -270,7 +271,7 @@ def footnote_tail(state: StateCore) -> None:
if "footnotes" not in state.env:
return

current: List[Token] = []
current: list[Token] = []
tok_filter = []
for tok in state.tokens:
if tok.type == "footnote_reference_open":
Expand All @@ -290,7 +291,7 @@ def footnote_tail(state: StateCore) -> None:
if insideRef:
current.append(tok)

tok_filter.append((not insideRef))
tok_filter.append(not insideRef)

state.tokens = [t for t, f in zip(state.tokens, tok_filter) if f]

Expand Down Expand Up @@ -329,7 +330,7 @@ def footnote_tail(state: StateCore) -> None:

state.tokens.extend(tokens)
if state.tokens[len(state.tokens) - 1].type == "paragraph_close":
lastParagraph: Optional[Token] = state.tokens.pop()
lastParagraph: Token | None = state.tokens.pop()
else:
lastParagraph = None

Expand Down Expand Up @@ -482,4 +483,4 @@ def render_footnote_anchor(
ident += ":" + str(tokens[idx].meta["subId"])

# ↩ with escape code to prevent display as Apple Emoji on iOS
return ' <a href="#fnref' + ident + '" class="footnote-backref">\u21a9\uFE0E</a>'
return ' <a href="#fnref' + ident + '" class="footnote-backref">\u21a9\ufe0e</a>'
1 change: 1 addition & 0 deletions mdit_py_plugins/front_matter/index.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Process front matter."""

from markdown_it import MarkdownIt
from markdown_it.rules_block import StateBlock

Expand Down
31 changes: 23 additions & 8 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,30 @@ exclude = [
"tests/",
]

[tool.isort]
profile = "black"
force_sort_within_sections = true
known_first_party = ["mdit_py_plugins", "tests"]
[tool.ruff.lint]
extend-select = [
"B", # flake8-bugbear
"C4", # flake8-comprehensions
"I", # isort
"ICN", # flake8-import-conventions
"ISC", # flake8-implicit-str-concat
"N", # pep8-naming
"PERF", # perflint (performance anti-patterns)
"PGH", # pygrep-hooks
"PIE", # flake8-pie
"PTH", # flake8-use-pathlib
"RUF", # Ruff-specific rules
"SIM", # flake8-simplify
"UP", # pyupgrade
"T20", # flake8-print
]
extend-ignore = ["ISC001", "N802", "N803", "N806"]

[tool.ruff.lint.per-file-ignores]
"tests/**.py" = ["T201"]

[tool.ruff]
line-length = 110
extend-select = ["B0", "C4", "ICN", "ISC", "N", "RUF", "SIM"]
extend-ignore = ["E731", "N802", "N803", "N806"]
[tool.ruff.lint.isort]
force-sort-within-sections = true

[tool.mypy]
show_error_codes = true
Expand Down
Loading