diff options
-rw-r--r-- | docs/extensions/smarty.txt | 26 | ||||
-rw-r--r-- | markdown/extensions/smarty.py | 46 |
2 files changed, 49 insertions, 23 deletions
diff --git a/docs/extensions/smarty.txt b/docs/extensions/smarty.txt index 394df5c..1c21d50 100644 --- a/docs/extensions/smarty.txt +++ b/docs/extensions/smarty.txt @@ -22,13 +22,24 @@ ASCII symbol | Replacements | HTML Entities `--` | – | `–` `---` | — | `—` -Using the options `smart_lsquo` etc. you can reconfigure the replacements for `'` and `"`. Use e.g. the following config to get correct quotes for the German language: +Using the configuration option 'smart_substitutions' you can overwrite the +default substitutions. Just pass a dict mapping (a subset of) the following +keys to the substitution strings. + + 'mdash', 'ndash', 'ellipsis', + 'left-angle-quote', 'right-angle-quote', + 'left-single-quote', 'right-single-quote', + 'left-double-quote', 'right-double-quote' + +Use e.g. the following config to get correct quotes for the German language: extensionConfigs = { - 'smarty': [('smart_lsquo', '‚'), # sb is not a typo! - ('smart_rsquo', '‘'), - ('smart_ldquo', '„'), - ('smart_rdquo', '“')] + 'smarty': [('smart_substitutions', { + 'left-single-quote': '‚', # sb is not a typo! + 'right-single-quote': '‘', + 'left-double-quote': '„', + 'right-double-quote': '“' + })] } !!! note @@ -60,10 +71,7 @@ Option | Default value | Description `smart_quotes` | enabled | whether to convert straight quotes `smart_angled_quotes` | disabled | whether to convert angled quotes `smart_ellipses` | enabled | whether to convert ellipses -`smart_lsquo` | ‘ | Replacement text for single left quote -`smart_rsquo` | ’ | Replacement text for single right quote -`smart_ldquo` | “ | Replacement text for double left quote -`smart_rdquo` | ” | Replacement text for double right quote +`smart_substitutions` | {} | Overwrite default substitutions Further reading --------------- diff --git a/markdown/extensions/smarty.py b/markdown/extensions/smarty.py index 16d2936..cc6b694 100644 --- a/markdown/extensions/smarty.py +++ b/markdown/extensions/smarty.py @@ -85,7 +85,20 @@ openingQuotesBase = ( '|&[mn]dash;' # or named dash entities '|–|—' # or decimal entities ')' -) +) + +substitutions = { + 'mdash': '—', + 'ndash': '–', + 'ellipsis': '…', + 'left-angle-quote': '«', + 'right-angle-quote': '»', + 'left-single-quote': '‘', + 'right-single-quote': '’', + 'left-double-quote': '“', + 'right-double-quote': '”', +} + # Special case if the very first character is a quote # followed by punctuation at a non-word-break. Close the quotes by brute force: @@ -138,12 +151,12 @@ class SmartyExtension(Extension): 'smart_angled_quotes': [False, 'Educate angled quotes'], 'smart_dashes': [True, 'Educate dashes'], 'smart_ellipses': [True, 'Educate ellipses'], - 'smart_lsquo' : ['‘', 'Replacement text for single left quote'], - 'smart_rsquo' : ['’', 'Replacement text for single right quote'], - 'smart_ldquo' : ['“', 'Replacement text for double left quote'], - 'smart_rdquo' : ['”', 'Replacement text for double right quote'], + 'smart_substitutions' : [{}, 'Overwrite default substitutions'], } super(SmartyExtension, self).__init__(*args, **kwargs) + self.substitutions = dict(substitutions) + self.substitutions.update(self.getConfig('smart_substitutions', + default={})) def _addPatterns(self, md, patterns, serie): for ind, pattern in enumerate(patterns): @@ -154,19 +167,24 @@ class SmartyExtension(Extension): self.inlinePatterns.add(name, pattern, after) def educateDashes(self, md): - emDashesPattern = SubstituteTextPattern(r'(?<!-)---(?!-)', ('—',), md) - enDashesPattern = SubstituteTextPattern(r'(?<!-)--(?!-)', ('–',), md) + emDashesPattern = SubstituteTextPattern(r'(?<!-)---(?!-)', + (self.substitutions['mdash'],), md) + enDashesPattern = SubstituteTextPattern(r'(?<!-)--(?!-)', + (self.substitutions['ndash'],), md) self.inlinePatterns.add('smarty-em-dashes', emDashesPattern, '_begin') self.inlinePatterns.add('smarty-en-dashes', enDashesPattern, '>smarty-em-dashes') def educateEllipses(self, md): - ellipsesPattern = SubstituteTextPattern(r'(?<!\.)\.{3}(?!\.)', ('…',), md) + ellipsesPattern = SubstituteTextPattern(r'(?<!\.)\.{3}(?!\.)', + (self.substitutions['ellipsis'],), md) self.inlinePatterns.add('smarty-ellipses', ellipsesPattern, '_begin') def educateAngledQuotes(self, md): - leftAngledQuotePattern = SubstituteTextPattern(r'\<\<', ('«',), md) - rightAngledQuotePattern = SubstituteTextPattern(r'\>\>', ('»',), md) + leftAngledQuotePattern = SubstituteTextPattern(r'\<\<', + (self.substitutions['left-angle-quote'],), md) + rightAngledQuotePattern = SubstituteTextPattern(r'\>\>', + (self.substitutions['right-angle-quote'],), md) self.inlinePatterns.add('smarty-left-angle-quotes', leftAngledQuotePattern, '_begin') self.inlinePatterns.add('smarty-right-angle-quotes', @@ -174,10 +192,10 @@ class SmartyExtension(Extension): def educateQuotes(self, md): configs = self.getConfigs() - lsquo = configs['smart_lsquo'] - rsquo = configs['smart_rsquo'] - ldquo = configs['smart_ldquo'] - rdquo = configs['smart_rdquo'] + lsquo = self.substitutions['left-single-quote'] + rsquo = self.substitutions['right-single-quote'] + ldquo = self.substitutions['left-double-quote'] + rdquo = self.substitutions['right-double-quote'] patterns = ( (singleQuoteStartRe, (rsquo,)), (doubleQuoteStartRe, (rdquo,)), |