annotate piecrust/formatting/hoedownformatter.py @ 694:b917ae071994

formatting: Add a `hoedown` formatter. The `hoedown` library is not yet in the dependency list however since I have to figure out its availability on most platforms.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 23 Mar 2016 08:35:51 -0700
parents
children 0c688063890f
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 import hoedown
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 from piecrust.formatting.base import Formatter
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
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 logger = logging.getLogger(__name__)
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
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 class HoedownFormatter(Formatter):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 FORMAT_NAMES = ['hoedown']
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 OUTPUT_FORMAT = 'html'
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 def __init__(self):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 super(HoedownFormatter, self).__init__()
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 self._formatter = None
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 def render(self, format_name, txt):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 assert format_name in self.FORMAT_NAMES
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 self._ensureInitialized()
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 return self._formatter.render(txt)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 def _ensureInitialized(self):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 if self._formatter is not None:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24 return
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 # 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
27 # 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
28 # baking so do show them either way.
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29 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
30
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 config = self.app.config.get('hoedown')
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 if config is None:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 config = {}
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 elif not isinstance(config, dict):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35 raise Exception("The `hoedown` configuration setting must be "
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36 "a dictionary.")
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 extensions = config.get('extensions', [])
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 if isinstance(extensions, str):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 extensions = [e.strip() for e in extensions.split(',')]
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 # Compatibility with PieCrust 1.x
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 if config.get('use_markdown_extra'):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43 extensions.append('extra')
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 render_flags = config.get('render_flags')
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 if render_flags is None:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 render_flags = []
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 # Translate standard Markdown formatter extensions to Hoedown
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 # 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
51 # replacement.
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 exts = 0
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 rdrf = 0
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 other = 0
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 for n in extensions:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56 # Try an extension?
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57 e = getattr(hoedown, 'EXT_' + n.upper(), None)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 if e is not None:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 exts |= e
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60 continue
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 # Try a render flag?
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 f = getattr(hoedown, 'HTML_' + n.upper(), None)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64 if f is not None:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65 rdrf |= f
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 # Other flag?
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68 f = getattr(hoedown, 'TABLE_' + n.upper(), None)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69 if f is not None:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 other |= f
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 # Try translating from a Markdown extension name.
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 t = ext_translate.get(n)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 if t is None:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 if show_warnings:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 logger.warning("Unknown Hoedown Markdown extension or flag: "
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 "%s" % n)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78 continue
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79 if not isinstance(t, list):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 t = [t]
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 for i in t:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 if i.startswith('EXT_'):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 exts |= getattr(hoedown, i)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84 elif i.startswith('HTML_'):
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 rdrf |= getattr(hoedown, i)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 elif show_warnings:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87 logger.warning("Unknown Hoedown Markdown extension or flag:"
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 "%s" % n)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 if n == 'extra' and show_warnings:
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 # Special warning for the 'extra' extension.
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 logger.warning(
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 "The 'extra' extension doesn't have a full equivalent "
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 "in Hoedown Markdown. Only 'fenced_code', 'footnotes' and "
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94 "'tables' extensions will be active. "
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 "To remove this warning, replace 'extra' with those 3 "
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 "specific extensions.")
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 # Enable a few things by default.
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 exts |= hoedown.EXT_NO_INTRA_EMPHASIS
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 renderer = hoedown.HtmlRenderer(flags=rdrf)
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 self._formatter = hoedown.Markdown(
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 renderer, extensions=(exts | other))
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106 ext_translate = {
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107 'fenced_code': 'EXT_FENCED_CODE',
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 'footnotes': 'EXT_FOOTNOTES',
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 'tables': 'EXT_TABLES',
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 'nl2br': 'HTML_HARD_WRAP',
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111 'smarty': 'HTML_SMARTYPANTS',
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 'smartypants': 'HTML_SMARTYPANTS',
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 'toc': 'HTML_TOC',
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 'extra': ['EXT_FENCED_CODE', 'EXT_FOOTNOTES', 'EXT_TABLES']
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115 }
b917ae071994 formatting: Add a `hoedown` formatter.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116