annotate piecrust/formatting/hoedownformatter.py @ 1034:96f1e5e377ef

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