this repo has no description
1from docutils.parsers.rst.roles import register_canonical_role, set_classes
2from docutils.parsers.rst import directives
3from docutils import nodes, utils
4import re
5
6def code_role(role, rawtext, text, lineno, inliner, options={}, content=[]):
7 r'''code_role override or create if older docutils used.
8
9 This only creates a literal node without parsing the code. This will
10 be done later in sphinx. This override is not really needed, but it
11 might give some speed
12 '''
13
14 set_classes(options)
15
16 language = options.get('language', '')
17 classes = ['code']
18
19 if 'classes' in options:
20 classes.extend(options['classes'])
21
22 if language and language not in classes:
23 classes.append(language)
24
25 node = nodes.literal(rawtext, utils.unescape(text, 1), classes=classes, language=language)
26
27 #import rpdb2 ; rpdb2.start_embedded_debugger('foo')
28
29 return [node], []
30
31code_role.options = { 'class': directives.class_option,
32 'language': directives.unchanged }
33
34register_canonical_role('code', code_role)
35
36
37from sphinx.writers.html import HTMLTranslator, BaseTranslator
38
39DIV_PRE_RE = re.compile(r'^<div[^>]*><pre>')
40PRE_DIV_RE = re.compile(r'\s*</pre></div>\s*$')
41
42def html_visit_literal(self, node):
43 env = self.settings.env
44
45 shall_highlight = False
46
47 if node.rawsource.startswith('``') or 'code' in node['classes']:
48 #if node.rawsource != node.astext():
49 # most probably a parsed-literal block -- don't highlight
50 #return BaseTranslator.visit_literal(self, node)
51
52
53 if env.config.inline_highlight_respect_highlight:
54 lang = self.highlightlang
55 else:
56 lang = None
57
58 highlight_args = node.get('highlight_args', {})
59
60 if node.has_key('language'):
61 # code-block directives
62 lang = node['language']
63 highlight_args['force'] = True
64
65 def warner(msg):
66 self.builder.warn(msg, (self.builder.current_docname, node.line))
67
68 # determine if shall_highlight
69 shall_highlight = True
70
71 #import rpdb2 ; rpdb2.start_embedded_debugger('foo')
72
73 attrs = node.attributes
74
75 if 'role' in attrs: # e.g. for :file:`...`
76 shall_highlight = False
77
78 elif 'code' in attrs['classes'] and attrs.get('language'):
79 shall_highlight = True
80
81 else:
82 shall_highlight = env.config.inline_highlight_literals ## DEFAULT FROM SETTINGS
83
84 if (
85 shall_highlight and
86 env.config.inline_highlight_respect_highlight and
87 not attrs.get('language')
88 ):
89 lang = self.highlightlang
90
91 if not lang:
92 shall_highlight = False
93
94 if shall_highlight:
95
96 highlighted = self.highlighter.highlight_block(
97 node.astext(), lang, warn=warner, **highlight_args)
98
99 # highlighted comes as <div class="highlighted"><pre>...</pre></div>
100
101 highlighted = DIV_PRE_RE.sub('', highlighted)
102 highlighted = PRE_DIV_RE.sub('', highlighted)
103
104 # import rpdb2 ; rpdb2.start_embedded_debugger('foo')
105
106 starttag = self.starttag(node, 'code', suffix='',
107 CLASS='docutils literal highlight highlight-%s' % lang)
108 self.body.append(starttag + highlighted + '</code>')
109
110 else:
111 self.body.append(self.starttag(node, 'tt', '', CLASS='docutils literal')
112 + node.astext() + '</tt>')
113
114# self.protect_literal_text += 1
115
116 raise nodes.SkipNode
117
118
119def html_depart_literal(self, node):
120 #self.protect_literal_text -= 1
121 #self.body.append('</tt>')
122 pass
123
124import types
125
126
127HTMLTranslator.visit_literal = html_visit_literal
128HTMLTranslator.depart_literal = html_depart_literal
129
130
131import sphinx.builders.latex
132from sphinx.writers.latex import LaTeXTranslator
133
134def latex_visit_literal(self, node):
135 env = self.builder.env
136
137 shall_highlight = False
138
139
140 if node.rawsource.startswith('``') or 'code' in node['classes']:
141
142 if env.config.inline_highlight_respect_highlight:
143 lang = self.highlightlang
144 else:
145 lang = None
146
147 highlight_args = node.get('highlight_args', {})
148
149 if node.has_key('language'):
150 # code-block directives
151 lang = node['language']
152 highlight_args['force'] = True
153
154 def warner(msg):
155 self.builder.warn(msg, (self.builder.current_docname, node.line))
156
157 # determine if shall_highlight
158 shall_highlight = True
159
160 #import rpdb2 ; rpdb2.start_embedded_debugger('foo')
161
162 attrs = node.attributes
163
164 if 'role' in attrs: # e.g. for :file:`...`
165 shall_highlight = False
166
167 elif 'code' in attrs['classes'] and attrs.get('language'):
168 shall_highlight = True
169
170 else:
171 shall_highlight = env.config.inline_highlight_literals ## DEFAULT FROM SETTINGS
172
173 if (
174 shall_highlight and
175 env.config.inline_highlight_respect_highlight and
176 not attrs.get('language')
177 ):
178 lang = self.highlightlang
179
180 if not lang:
181 shall_highlight = False
182
183 if shall_highlight:
184
185 highlighted = self.highlighter.highlight_block(
186 node.astext(), lang, warn=warner, **highlight_args)
187
188 highlighted = highlighted.replace(r'\begin{Verbatim}[commandchars=\\\{\}]',r'\Verb[commandchars=\\\{\}]@')
189 highlighted = highlighted.replace('\\end{Verbatim}','@')
190 highlighted = highlighted.replace('\n','')
191
192 self.body.append(highlighted)
193
194 else:
195 if self.in_title:
196 self.body.append(r'\sphinxstyleliteralintitle{')
197 else:
198 self.body.append(r'\sphinxcode{')
199 self.visit_Text(node)
200 self.body.append('}')
201
202 raise nodes.SkipNode
203
204
205def latex_depart_literal(self, node):
206 pass
207
208LaTeXTranslator.visit_literal = latex_visit_literal
209LaTeXTranslator.depart_literal = latex_depart_literal
210
211def setup(app):
212 app.add_config_value('inline_highlight_literals', True, 'env')
213 app.add_config_value('inline_highlight_respect_highlight', True, 'env')
214
215 # add option if ``...`` (literal without node.role attribute, shall be highlighted)