From 20f40c71eb6d5ebc3e4c23cef2cb225b92c9af3c Mon Sep 17 00:00:00 2001 From: Taneli Hukkinen Date: Mon, 22 Feb 2021 13:56:26 +0200 Subject: [PATCH 1/7] =?UTF-8?q?=F0=9F=91=8C=20IMPROVE:=20Add=20renderer=20?= =?UTF-8?q?protocol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- markdown_it/main.py | 6 ++++-- markdown_it/renderer.py | 36 +++++++++++++++++++++++++++++++++++- setup.py | 6 +++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/markdown_it/main.py b/markdown_it/main.py index 58403aa4..9f478940 100644 --- a/markdown_it/main.py +++ b/markdown_it/main.py @@ -18,7 +18,7 @@ from .parser_block import ParserBlock # noqa F401 from .parser_inline import ParserInline # noqa F401 from .rules_core.state_core import StateCore -from .renderer import RendererHTML +from .renderer import RendererHTML, RendererProtocolType from .utils import AttrDict try: @@ -38,7 +38,9 @@ class MarkdownIt: def __init__( - self, config: Union[str, Mapping] = "commonmark", renderer_cls=RendererHTML + self, + config: Union[str, Mapping] = "commonmark", + renderer_cls: RendererProtocolType = RendererHTML, ): """Main parser class diff --git a/markdown_it/renderer.py b/markdown_it/renderer.py index 24b51b14..a78a96aa 100644 --- a/markdown_it/renderer.py +++ b/markdown_it/renderer.py @@ -6,11 +6,45 @@ class Renderer rules if you create plugin and adds new token types. """ import inspect -from typing import Optional, Sequence +import sys +from typing import ( + Any, + ClassVar, + Mapping, + MutableMapping, + Optional, + Sequence, + TYPE_CHECKING, +) from .common.utils import unescapeAll, escapeHtml from .token import Token +if TYPE_CHECKING: + from .main import MarkdownIt + +if sys.version_info < (3, 8): + from typing_extensions import Protocol +else: + from typing import Protocol + + +class RendererProtocol(Protocol): + __output__: ClassVar[str] + + def __init__(self, parser: "MarkdownIt") -> None: + ... + + def render( + self, tokens: Sequence[Token], options: Mapping[str, Any], env: MutableMapping + ) -> str: + ... + + +class RendererProtocolType(Protocol): + def __call__(self, parser: "MarkdownIt") -> RendererProtocol: + ... + class RendererHTML: """Contains render rules for tokens. Can be updated and extended. diff --git a/setup.py b/setup.py index 28d0ded2..82f7b43d 100644 --- a/setup.py +++ b/setup.py @@ -40,7 +40,11 @@ def get_version(): ], keywords="markdown lexer parser development", python_requires="~=3.6", - install_requires=["attrs>=19,<21", "mdit-py-plugins~=0.2.1"], + install_requires=[ + "attrs>=19,<21", + "mdit-py-plugins~=0.2.1", + "typing_extensions>=3.7.4; python_version<'3.8'", + ], extras_require={ "code_style": ["pre-commit==2.6"], "testing": [ From 81f353fccb2ae5109bdc0702c24b56d577c8f39b Mon Sep 17 00:00:00 2001 From: Taneli Hukkinen Date: Mon, 22 Feb 2021 14:07:09 +0200 Subject: [PATCH 2/7] More concise name. Remove doubly init type definition --- markdown_it/main.py | 4 ++-- markdown_it/renderer.py | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/markdown_it/main.py b/markdown_it/main.py index 9f478940..4ce1663d 100644 --- a/markdown_it/main.py +++ b/markdown_it/main.py @@ -18,7 +18,7 @@ from .parser_block import ParserBlock # noqa F401 from .parser_inline import ParserInline # noqa F401 from .rules_core.state_core import StateCore -from .renderer import RendererHTML, RendererProtocolType +from .renderer import RendererHTML, RendererType from .utils import AttrDict try: @@ -40,7 +40,7 @@ class MarkdownIt: def __init__( self, config: Union[str, Mapping] = "commonmark", - renderer_cls: RendererProtocolType = RendererHTML, + renderer_cls: RendererType = RendererHTML, ): """Main parser class diff --git a/markdown_it/renderer.py b/markdown_it/renderer.py index a78a96aa..557fc3cf 100644 --- a/markdown_it/renderer.py +++ b/markdown_it/renderer.py @@ -32,16 +32,13 @@ class Renderer class RendererProtocol(Protocol): __output__: ClassVar[str] - def __init__(self, parser: "MarkdownIt") -> None: - ... - def render( self, tokens: Sequence[Token], options: Mapping[str, Any], env: MutableMapping ) -> str: ... -class RendererProtocolType(Protocol): +class RendererType(Protocol): def __call__(self, parser: "MarkdownIt") -> RendererProtocol: ... From 62e16c1af22aa01b9f09e243f7fed2766c31f5da Mon Sep 17 00:00:00 2001 From: Taneli Hukkinen Date: Mon, 22 Feb 2021 14:18:47 +0200 Subject: [PATCH 3/7] Type check RendererHTML against RendererProtocol --- markdown_it/renderer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/markdown_it/renderer.py b/markdown_it/renderer.py index 557fc3cf..24e2bde8 100644 --- a/markdown_it/renderer.py +++ b/markdown_it/renderer.py @@ -43,7 +43,7 @@ def __call__(self, parser: "MarkdownIt") -> RendererProtocol: ... -class RendererHTML: +class RendererHTML(RendererProtocol): """Contains render rules for tokens. Can be updated and extended. Example: From 9d37f8c691283321b053557de2f9ad9bb268a21c Mon Sep 17 00:00:00 2001 From: Taneli Hukkinen Date: Mon, 22 Feb 2021 16:15:04 +0200 Subject: [PATCH 4/7] Replace RendererType with Callable --- markdown_it/main.py | 4 ++-- markdown_it/renderer.py | 9 --------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/markdown_it/main.py b/markdown_it/main.py index 4ce1663d..18fe4ec2 100644 --- a/markdown_it/main.py +++ b/markdown_it/main.py @@ -18,7 +18,7 @@ from .parser_block import ParserBlock # noqa F401 from .parser_inline import ParserInline # noqa F401 from .rules_core.state_core import StateCore -from .renderer import RendererHTML, RendererType +from .renderer import RendererHTML, RendererProtocol from .utils import AttrDict try: @@ -40,7 +40,7 @@ class MarkdownIt: def __init__( self, config: Union[str, Mapping] = "commonmark", - renderer_cls: RendererType = RendererHTML, + renderer_cls: Callable[["MarkdownIt"], RendererProtocol] = RendererHTML, ): """Main parser class diff --git a/markdown_it/renderer.py b/markdown_it/renderer.py index 24e2bde8..3f417c4a 100644 --- a/markdown_it/renderer.py +++ b/markdown_it/renderer.py @@ -14,15 +14,11 @@ class Renderer MutableMapping, Optional, Sequence, - TYPE_CHECKING, ) from .common.utils import unescapeAll, escapeHtml from .token import Token -if TYPE_CHECKING: - from .main import MarkdownIt - if sys.version_info < (3, 8): from typing_extensions import Protocol else: @@ -38,11 +34,6 @@ def render( ... -class RendererType(Protocol): - def __call__(self, parser: "MarkdownIt") -> RendererProtocol: - ... - - class RendererHTML(RendererProtocol): """Contains render rules for tokens. Can be updated and extended. From cc1214e4044aed8838214c581db1384293ba838c Mon Sep 17 00:00:00 2001 From: Taneli Hukkinen Date: Mon, 26 Apr 2021 12:47:45 +0300 Subject: [PATCH 5/7] Address PR review --- markdown_it/renderer.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/markdown_it/renderer.py b/markdown_it/renderer.py index c379b1f6..95b47ca5 100644 --- a/markdown_it/renderer.py +++ b/markdown_it/renderer.py @@ -6,7 +6,6 @@ class Renderer rules if you create plugin and adds new token types. """ import inspect -import sys from typing import ( ClassVar, MutableMapping, @@ -18,10 +17,10 @@ class Renderer from .token import Token from .utils import OptionsDict -if sys.version_info < (3, 8): - from typing_extensions import Protocol -else: +try: from typing import Protocol +except ImportError: # Python <3.8 doesn't have `Protocol` in the stdlib + from typing_extensions import Protocol # type: ignore[misc] class RendererProtocol(Protocol): From 14f64e019878613d7c9fdd2654c8a03416604ad7 Mon Sep 17 00:00:00 2001 From: Taneli Hukkinen Date: Sat, 1 May 2021 01:05:27 +0200 Subject: [PATCH 6/7] Update markdown_it/renderer.py Co-authored-by: Chris Sewell --- markdown_it/renderer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/markdown_it/renderer.py b/markdown_it/renderer.py index 95b47ca5..08726a43 100644 --- a/markdown_it/renderer.py +++ b/markdown_it/renderer.py @@ -28,7 +28,7 @@ class RendererProtocol(Protocol): def render( self, tokens: Sequence[Token], options: OptionsDict, env: MutableMapping - ) -> str: + ) -> Any: ... From f9615ec613aacd72f25556998857ba7ee291b399 Mon Sep 17 00:00:00 2001 From: Taneli Hukkinen Date: Sat, 1 May 2021 01:16:34 +0200 Subject: [PATCH 7/7] Update markdown_it/renderer.py Co-authored-by: Chris Sewell --- markdown_it/renderer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/markdown_it/renderer.py b/markdown_it/renderer.py index 08726a43..9e9c7751 100644 --- a/markdown_it/renderer.py +++ b/markdown_it/renderer.py @@ -7,6 +7,7 @@ class Renderer """ import inspect from typing import ( + Any, ClassVar, MutableMapping, Optional,