def parse(self, source_desc, scope, pxd, full_module_name): if not isinstance(source_desc, FileSourceDescriptor): raise RuntimeError("Only file sources for code supported") source_filename = Utils.encode_filename(source_desc.filename) # Parse the given source file and return a parse tree. try: f = Utils.open_source_file(source_filename, "rU") try: s = PyrexScanner(f, source_desc, source_encoding = f.encoding, scope = scope, context = self) tree = Parsing.p_module(s, pxd, full_module_name) finally: f.close() except UnicodeDecodeError, msg: #import traceback #traceback.print_exc() error((source_desc, 0, 0), "Decoding error, missing or incorrect coding=<encoding-name> at top of source (%s)" % msg)
def save_annotation(self, source_filename, target_filename): self.mark_pos(None) f = Utils.open_source_file(source_filename) lines = f.readlines() for k in range(len(lines)): line = lines[k] for c, cc, html in special_chars: line = line.replace(c, cc) lines[k] = line f.close() all = [] for pos, item in self.annotations: if pos[0] == source_filename: start = item.start() size, end = item.end() if size: all.append((pos, start)) all.append(((source_filename, pos[1], pos[2] + size), end)) else: all.append((pos, start + end)) all.sort() all.reverse() for pos, item in all: _, line_no, col = pos line_no -= 1 col += 1 line = lines[line_no] lines[line_no] = line[:col] + item + line[col:] html_filename = os.path.splitext(target_filename)[0] + ".html" f = codecs.open(html_filename, "w", encoding="UTF-8") f.write(u'<html>\n') f.write(u""" <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style type="text/css"> body { font-family: courier; font-size: 12; } .code { font-size: 9; color: #444444; display: none; margin-left: 20px; } .py_api { color: red; } .pyx_api { color: #FF3000; } .py_macro_api { color: #FF8000; } .error_goto { color: #FF8000; } .tag { } .coerce { color: #008000; border: 1px dotted #008000 } .py_attr { color: #FF0000; font-weight: bold; } .c_attr { color: #0000FF; } .py_call { color: #FF0000; font-weight: bold; } .c_call { color: #0000FF; } .line { margin: 0em } </style> <script> function toggleDiv(id) { theDiv = document.getElementById(id); if (theDiv.style.display == 'none') theDiv.style.display = 'block'; else theDiv.style.display = 'none'; } </script> </head> """) f.write(u'<body>\n') f.write(u'<p>Generated by Cython %s on %s\n' % (Version.version, time.asctime())) c_file = Utils.encode_filename(os.path.basename(target_filename)) f.write(u'<p>Raw output: <a href="%s">%s</a>\n' % (c_file, c_file)) k = 0 py_c_api = re.compile(u'(Py[A-Z][a-z]+_[A-Z][a-z][A-Za-z_]+)') pyx_api = re.compile(u'(__Pyx[A-Za-z_]+)\(') py_marco_api = re.compile(u'(Py[A-Za-z]*_[A-Z][A-Z_]+)') error_goto = re.compile( ur'((; *if .*)? \{__pyx_filename = .*goto __pyx_L\w+;\})') for line in lines: k += 1 try: code = self.code[k] except KeyError: code = '' code, c_api_calls = py_c_api.subn( ur"<span class='py_api'>\1</span>", code) code, pyx_api_calls = pyx_api.subn( ur"<span class='pyx_api'>\1</span>(", code) code, macro_api_calls = py_marco_api.subn( ur"<span class='py_macro_api'>\1</span>", code) code, error_goto_calls = error_goto.subn( ur"<span class='error_goto'>\1</span>", code) code = code.replace(u"<span class='error_goto'>;", u";<span class='error_goto'>") color = u"FFFF%02x" % int( 255 / (1 + (5 * c_api_calls + 2 * pyx_api_calls + macro_api_calls) / 10.0)) f.write( u"<pre class='line' style='background-color: #%s' onclick='toggleDiv(\"line%s\")'>" % (color, k)) f.write(u" %d: " % k) for c, cc, html in special_chars: line = line.replace(cc, html) f.write(line.rstrip()) f.write(u'</pre>\n') code = re.sub(line_pos_comment, '', code) # inline annotations are redundant f.write( u"<pre id='line%s' class='code' style='background-color: #%s'>%s</pre>" % (k, color, code)) f.write(u'</body></html>\n') f.close()
def save_annotation(self, source_filename, target_filename): self.mark_pos(None) f = Utils.open_source_file(source_filename) lines = f.readlines() for k in range(len(lines)): line = lines[k] for c, cc, html in special_chars: line = line.replace(c, cc) lines[k] = line f.close() all = [] for pos, item in self.annotations: if pos[0] == source_filename: start = item.start() size, end = item.end() if size: all.append((pos, start)) all.append(((source_filename, pos[1], pos[2]+size), end)) else: all.append((pos, start+end)) all.sort() all.reverse() for pos, item in all: _, line_no, col = pos line_no -= 1 col += 1 line = lines[line_no] lines[line_no] = line[:col] + item + line[col:] html_filename = os.path.splitext(target_filename)[0] + ".html" f = codecs.open(html_filename, "w", encoding="UTF-8") f.write(u'<html>\n') f.write(u""" <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style type="text/css"> body { font-family: courier; font-size: 12; } .code { font-size: 9; color: #444444; display: none; margin-left: 20px; } .py_c_api { color: red; } .py_macro_api { color: #FF7000; } .pyx_c_api { color: #FF3000; } .pyx_macro_api { color: #FF7000; } .refnanny { color: #FFA000; } .error_goto { color: #FFA000; } .tag { } .coerce { color: #008000; border: 1px dotted #008000 } .py_attr { color: #FF0000; font-weight: bold; } .c_attr { color: #0000FF; } .py_call { color: #FF0000; font-weight: bold; } .c_call { color: #0000FF; } .line { margin: 0em } </style> <script> function toggleDiv(id) { theDiv = document.getElementById(id); if (theDiv.style.display == 'none') theDiv.style.display = 'block'; else theDiv.style.display = 'none'; } </script> </head> """) f.write(u'<body>\n') f.write(u'<p>Generated by Cython %s on %s\n' % (Version.version, time.asctime())) c_file = Utils.encode_filename(os.path.basename(target_filename)) f.write(u'<p>Raw output: <a href="%s">%s</a>\n' % (c_file, c_file)) k = 0 py_c_api = re.compile(u'(Py[A-Z][a-z]+_[A-Z][a-z][A-Za-z_]+)\(') py_marco_api = re.compile(u'(Py[A-Z][a-z]+_[A-Z][A-Z_]+)\(') pyx_c_api = re.compile(u'(__Pyx_[A-Z][a-z_][A-Za-z_]+)\(') pyx_macro_api = re.compile(u'(__Pyx_[A-Z][A-Z_]+)\(') error_goto = re.compile(ur'((; *if .*)? \{__pyx_filename = .*goto __pyx_L\w+;\})') refnanny = re.compile(u'(__Pyx_X?(GOT|GIVE)REF|__Pyx_RefNanny[A-Za-z]+)') for line in lines: k += 1 try: code = self.code[k] except KeyError: code = '' code, py_c_api_calls = py_c_api.subn(ur"<span class='py_c_api'>\1</span>(", code) code, pyx_c_api_calls = pyx_c_api.subn(ur"<span class='pyx_c_api'>\1</span>(", code) code, py_macro_api_calls = py_marco_api.subn(ur"<span class='py_macro_api'>\1</span>(", code) code, pyx_macro_api_calls = pyx_macro_api.subn(ur"<span class='pyx_macro_api'>\1</span>(", code) code, refnanny_calls = refnanny.subn(ur"<span class='refnanny'>\1</span>", code) code, error_goto_calls = error_goto.subn(ur"<span class='error_goto'>\1</span>", code) code = code.replace(u"<span class='error_goto'>;", u";<span class='error_goto'>") score = 5*py_c_api_calls + 2*pyx_c_api_calls + py_macro_api_calls + pyx_macro_api_calls - refnanny_calls color = u"FFFF%02x" % int(255/(1+score/10.0)) f.write(u"<pre class='line' style='background-color: #%s' onclick='toggleDiv(\"line%s\")'>" % (color, k)) f.write(u" %d: " % k) for c, cc, html in special_chars: line = line.replace(cc, html) f.write(line.rstrip()) f.write(u'</pre>\n') code = re.sub(line_pos_comment, '', code) # inline annotations are redundant f.write(u"<pre id='line%s' class='code' style='background-color: #%s'>%s</pre>" % (k, color, code)) f.write(u'</body></html>\n') f.close()