@@ -17,9 +17,9 @@ class Ruler
17
17
"""
18
18
from __future__ import annotations
19
19
20
- from collections .abc import Callable , Iterable
20
+ from collections .abc import Iterable
21
21
from dataclasses import dataclass , field
22
- from typing import TYPE_CHECKING , TypedDict
22
+ from typing import TYPE_CHECKING , Generic , TypedDict , TypeVar
23
23
import warnings
24
24
25
25
from markdown_it ._compat import DATACLASS_KWARGS
@@ -57,33 +57,30 @@ def srcCharCode(self) -> tuple[int, ...]:
57
57
return self ._srcCharCode
58
58
59
59
60
- # The first positional arg is always a subtype of `StateBase`. Other
61
- # arguments may or may not exist, based on the rule's type (block,
62
- # core, inline). Return type is either `None` or `bool` based on the
63
- # rule's type.
64
- RuleFunc = Callable # type: ignore
65
-
66
-
67
60
class RuleOptionsType (TypedDict , total = False ):
68
61
alt : list [str ]
69
62
70
63
64
+ RuleFuncTv = TypeVar ("RuleFuncTv" )
65
+ """A rule function, whose signature is dependent on the state type."""
66
+
67
+
71
68
@dataclass (** DATACLASS_KWARGS )
72
- class Rule :
69
+ class Rule ( Generic [ RuleFuncTv ]) :
73
70
name : str
74
71
enabled : bool
75
- fn : RuleFunc = field (repr = False )
72
+ fn : RuleFuncTv = field (repr = False )
76
73
alt : list [str ]
77
74
78
75
79
- class Ruler :
76
+ class Ruler ( Generic [ RuleFuncTv ]) :
80
77
def __init__ (self ) -> None :
81
78
# List of added rules.
82
- self .__rules__ : list [Rule ] = []
79
+ self .__rules__ : list [Rule [ RuleFuncTv ] ] = []
83
80
# Cached rule chains.
84
81
# First level - chain name, '' for default.
85
82
# Second level - diginal anchor for fast filtering by charcodes.
86
- self .__cache__ : dict [str , list [RuleFunc ]] | None = None
83
+ self .__cache__ : dict [str , list [RuleFuncTv ]] | None = None
87
84
88
85
def __find__ (self , name : str ) -> int :
89
86
"""Find rule index by name"""
@@ -112,7 +109,7 @@ def __compile__(self) -> None:
112
109
self .__cache__ [chain ].append (rule .fn )
113
110
114
111
def at (
115
- self , ruleName : str , fn : RuleFunc , options : RuleOptionsType | None = None
112
+ self , ruleName : str , fn : RuleFuncTv , options : RuleOptionsType | None = None
116
113
) -> None :
117
114
"""Replace rule by name with new function & options.
118
115
@@ -133,7 +130,7 @@ def before(
133
130
self ,
134
131
beforeName : str ,
135
132
ruleName : str ,
136
- fn : RuleFunc ,
133
+ fn : RuleFuncTv ,
137
134
options : RuleOptionsType | None = None ,
138
135
) -> None :
139
136
"""Add new rule to chain before one with given name.
@@ -148,14 +145,16 @@ def before(
148
145
options = options or {}
149
146
if index == - 1 :
150
147
raise KeyError (f"Parser rule not found: { beforeName } " )
151
- self .__rules__ .insert (index , Rule (ruleName , True , fn , options .get ("alt" , [])))
148
+ self .__rules__ .insert (
149
+ index , Rule [RuleFuncTv ](ruleName , True , fn , options .get ("alt" , []))
150
+ )
152
151
self .__cache__ = None
153
152
154
153
def after (
155
154
self ,
156
155
afterName : str ,
157
156
ruleName : str ,
158
- fn : RuleFunc ,
157
+ fn : RuleFuncTv ,
159
158
options : RuleOptionsType | None = None ,
160
159
) -> None :
161
160
"""Add new rule to chain after one with given name.
@@ -171,12 +170,12 @@ def after(
171
170
if index == - 1 :
172
171
raise KeyError (f"Parser rule not found: { afterName } " )
173
172
self .__rules__ .insert (
174
- index + 1 , Rule (ruleName , True , fn , options .get ("alt" , []))
173
+ index + 1 , Rule [ RuleFuncTv ] (ruleName , True , fn , options .get ("alt" , []))
175
174
)
176
175
self .__cache__ = None
177
176
178
177
def push (
179
- self , ruleName : str , fn : RuleFunc , options : RuleOptionsType | None = None
178
+ self , ruleName : str , fn : RuleFuncTv , options : RuleOptionsType | None = None
180
179
) -> None :
181
180
"""Push new rule to the end of chain.
182
181
@@ -185,7 +184,9 @@ def push(
185
184
:param options: new rule options (not mandatory).
186
185
187
186
"""
188
- self .__rules__ .append (Rule (ruleName , True , fn , (options or {}).get ("alt" , [])))
187
+ self .__rules__ .append (
188
+ Rule [RuleFuncTv ](ruleName , True , fn , (options or {}).get ("alt" , []))
189
+ )
189
190
self .__cache__ = None
190
191
191
192
def enable (
@@ -252,7 +253,7 @@ def disable(
252
253
self .__cache__ = None
253
254
return result
254
255
255
- def getRules (self , chainName : str ) -> list [RuleFunc ]:
256
+ def getRules (self , chainName : str = "" ) -> list [RuleFuncTv ]:
256
257
"""Return array of active functions (rules) for given chain name.
257
258
It analyzes rules configuration, compiles caches if not exists and returns result.
258
259
0 commit comments