this repo has no description
at develop 6.3 kB view raw
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)