Add Smarty to Markdown.
| 179 | |
| 180 | |
| 181 | class SmartyExtension(Extension): |
| 182 | """ Add Smarty to Markdown. """ |
| 183 | def __init__(self, **kwargs): |
| 184 | self.config = { |
| 185 | 'smart_quotes': [True, 'Educate quotes'], |
| 186 | 'smart_angled_quotes': [False, 'Educate angled quotes'], |
| 187 | 'smart_dashes': [True, 'Educate dashes'], |
| 188 | 'smart_ellipses': [True, 'Educate ellipses'], |
| 189 | 'substitutions': [{}, 'Overwrite default substitutions'], |
| 190 | } |
| 191 | """ Default configuration options. """ |
| 192 | super().__init__(**kwargs) |
| 193 | self.substitutions: dict[str, str] = dict(substitutions) |
| 194 | self.substitutions.update(self.getConfig('substitutions', default={})) |
| 195 | |
| 196 | def _addPatterns( |
| 197 | self, |
| 198 | md: Markdown, |
| 199 | patterns: Sequence[tuple[str, Sequence[int | str | etree.Element]]], |
| 200 | serie: str, |
| 201 | priority: int, |
| 202 | ): |
| 203 | for ind, pattern in enumerate(patterns): |
| 204 | pattern += (md,) |
| 205 | pattern = SubstituteTextPattern(*pattern) |
| 206 | name = 'smarty-%s-%d' % (serie, ind) |
| 207 | self.inlinePatterns.register(pattern, name, priority-ind) |
| 208 | |
| 209 | def educateDashes(self, md: Markdown) -> None: |
| 210 | emDashesPattern = SubstituteTextPattern( |
| 211 | r'(?<!-)---(?!-)', (self.substitutions['mdash'],), md |
| 212 | ) |
| 213 | enDashesPattern = SubstituteTextPattern( |
| 214 | r'(?<!-)--(?!-)', (self.substitutions['ndash'],), md |
| 215 | ) |
| 216 | self.inlinePatterns.register(emDashesPattern, 'smarty-em-dashes', 50) |
| 217 | self.inlinePatterns.register(enDashesPattern, 'smarty-en-dashes', 45) |
| 218 | |
| 219 | def educateEllipses(self, md: Markdown) -> None: |
| 220 | ellipsesPattern = SubstituteTextPattern( |
| 221 | r'(?<!\.)\.{3}(?!\.)', (self.substitutions['ellipsis'],), md |
| 222 | ) |
| 223 | self.inlinePatterns.register(ellipsesPattern, 'smarty-ellipses', 10) |
| 224 | |
| 225 | def educateAngledQuotes(self, md: Markdown) -> None: |
| 226 | leftAngledQuotePattern = SubstituteTextPattern( |
| 227 | r'\<\<', (self.substitutions['left-angle-quote'],), md |
| 228 | ) |
| 229 | rightAngledQuotePattern = SubstituteTextPattern( |
| 230 | r'\>\>', (self.substitutions['right-angle-quote'],), md |
| 231 | ) |
| 232 | self.inlinePatterns.register(leftAngledQuotePattern, 'smarty-left-angle-quotes', 40) |
| 233 | self.inlinePatterns.register(rightAngledQuotePattern, 'smarty-right-angle-quotes', 35) |
| 234 | |
| 235 | def educateQuotes(self, md: Markdown) -> None: |
| 236 | lsquo = self.substitutions['left-single-quote'] |
| 237 | rsquo = self.substitutions['right-single-quote'] |
| 238 | ldquo = self.substitutions['left-double-quote'] |