annotate piecrust_hoedown.py @ 0:8e0f125ef135 default tip

Initial commit.
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 13 Feb 2018 13:37:39 -0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import logging
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 from piecrust.plugins.base import PieCrustPlugin
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 from piecrust.formatting.base import Formatter
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 logger = logging.getLogger(__name__)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 class HoedownPlugin(PieCrustPlugin):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 name = 'Hoedown'
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 def getFormatters(self):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 return [
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 HoedownFormatter()]
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 __piecrust_plugin__ = HoedownPlugin
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 class HoedownFormatter(Formatter):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 FORMAT_NAMES = ['hoedown']
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 OUTPUT_FORMAT = 'html'
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 def __init__(self):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 super(HoedownFormatter, self).__init__()
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 self._formatter = None
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 def render(self, format_name, txt):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 assert format_name in self.FORMAT_NAMES
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30 self._ensureInitialized()
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 return self._formatter(txt)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 def _ensureInitialized(self):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 if self._formatter is not None:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 return
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 import misaka
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 # Don't show warnings once for each worker when baking, so only
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 # show them for the first. If the variable is not set, we're not
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 # baking so do show them either way.
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 show_warnings = (self.app.config.get('baker/worker_id', 0) == 0)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44 config = self.app.config.get('hoedown')
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 if config is None:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 config = self.app.config.get('markdown')
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 if config is None:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 config = {}
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 elif not isinstance(config, dict):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 raise Exception("The `hoedown` configuration setting must be "
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 "a dictionary.")
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 extensions = config.get('extensions', [])
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 if isinstance(extensions, str):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 extensions = [e.strip() for e in extensions.split(',')]
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 # Compatibility with PieCrust 1.x
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 if config.get('use_markdown_extra'):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 extensions.append('extra')
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 render_flags = config.get('render_flags')
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61 if render_flags is None:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 render_flags = []
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 # Translate standard Markdown formatter extensions to Hoedown
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 # extension/render flags to make it easier to use Hoedown as a drop-in
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 # replacement.
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 exts = 0
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 rdrf = 0
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 other = 0
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 use_smartypants = False
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 for n in extensions:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 # Special case for Smartypants.
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 if n.lower() in ['smarty', 'smartypants']:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 use_smartypants = True
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 continue
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 # Try an extension?
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 e = getattr(misaka, 'EXT_' + n.upper(), None)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 if e is not None:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 exts |= e
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 continue
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 # Try a render flag?
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 f = getattr(misaka, 'HTML_' + n.upper(), None)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 if f is not None:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 rdrf |= f
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 # Other flag?
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 f = getattr(misaka, 'TABLE_' + n.upper(), None)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 if f is not None:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 other |= f
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 # Try translating from a Markdown extension name.
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 t = ext_translate.get(n)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 if t is None:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 if show_warnings:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 logger.warning("Unknown Hoedown Markdown extension or flag: "
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 "%s" % n)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 continue
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100 if not isinstance(t, list):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 t = [t]
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 for i in t:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 if i.startswith('EXT_'):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 exts |= getattr(misaka, i)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 elif i.startswith('HTML_'):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 rdrf |= getattr(misaka, i)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 elif show_warnings:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 logger.warning("Unknown Hoedown Markdown extension or flag:"
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 "%s" % n)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 if n == 'extra' and show_warnings:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 # Special warning for the 'extra' extension.
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 logger.warning(
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 "The 'extra' extension doesn't have a full equivalent "
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 "in Hoedown Markdown. Only 'fenced_code', 'footnotes' and "
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 "'tables' extensions will be active. "
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 "To remove this warning, replace 'extra' with those 3 "
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 "specific extensions.")
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 # Enable a few things by default.
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 exts |= misaka.EXT_NO_INTRA_EMPHASIS
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 renderer = misaka.HtmlRenderer(flags=rdrf)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 self._formatter = misaka.Markdown(renderer, extensions=(exts | other))
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 if use_smartypants:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 self._formatter = _SmartypantsFormatter(self._formatter,
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 misaka.smartypants)
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 ext_translate = {
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 'fenced_code': 'EXT_FENCED_CODE',
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 'footnotes': 'EXT_FOOTNOTES',
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 'tables': 'EXT_TABLES',
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 'nl2br': 'HTML_HARD_WRAP',
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
135 'toc': 'HTML_TOC',
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
136 'extra': ['EXT_FENCED_CODE', 'EXT_FOOTNOTES', 'EXT_TABLES']
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
137 }
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
138
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
139
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
140 class _SmartypantsFormatter:
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
141 def __init__(self, formatter, smartier):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
142 self._fmt = formatter
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
143 self._sp = smartier
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
144
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
145 def __call__(self, txt):
8e0f125ef135 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
146 return self._sp(self._fmt(txt))