Show More
@@ -32,7 +32,7 b' import sys' | |||
|
32 | 32 | |
|
33 | 33 | from IPython.utils import PyColorize |
|
34 | 34 | from IPython.core import ipapi |
|
35 | from IPython.utils import coloransi, io | |
|
35 | from IPython.utils import coloransi, io, openpy | |
|
36 | 36 | from IPython.core.excolors import exception_colors |
|
37 | 37 | |
|
38 | 38 | # See if we can use pydb. |
@@ -352,7 +352,10 b' class Pdb(OldPdb):' | |||
|
352 | 352 | |
|
353 | 353 | start = lineno - 1 - context//2 |
|
354 | 354 | lines = linecache.getlines(filename) |
|
355 | encoding = io.guess_encoding(lines) | |
|
355 | try: | |
|
356 | encoding, _ = openpy.detect_encoding(lambda :lines[:2].pop(0)) | |
|
357 | except SyntaxError: | |
|
358 | encoding = "ascii" | |
|
356 | 359 | start = max(start, 0) |
|
357 | 360 | start = min(start, len(lines) - context) |
|
358 | 361 | lines = lines[start : start + context] |
@@ -363,7 +366,7 b' class Pdb(OldPdb):' | |||
|
363 | 366 | and tpl_line_em \ |
|
364 | 367 | or tpl_line |
|
365 | 368 | ret.append(self.__format_line(linetpl, filename, |
|
366 | start + 1 + i, line.decode(encoding), | |
|
369 | start + 1 + i, line.decode(encoding, errors="replace"), | |
|
367 | 370 | arrow = show_arrow) ) |
|
368 | 371 | return ''.join(ret) |
|
369 | 372 | |
@@ -423,9 +426,12 b' class Pdb(OldPdb):' | |||
|
423 | 426 | tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal) |
|
424 | 427 | src = [] |
|
425 | 428 | lines = linecache.getlines(filename) |
|
426 | encoding = io.guess_encoding(lines) | |
|
429 | try: | |
|
430 | encoding, _ = openpy.detect_encoding(lambda :lines[:2].pop(0)) | |
|
431 | except SyntaxError: | |
|
432 | encoding = "ascii" | |
|
427 | 433 | for lineno in range(first, last+1): |
|
428 | line = lines[lineno].decode(encoding) | |
|
434 | line = lines[lineno].decode(encoding, errors="replace") | |
|
429 | 435 | if not line: |
|
430 | 436 | break |
|
431 | 437 |
@@ -35,6 +35,7 b' from IPython.core import page' | |||
|
35 | 35 | from IPython.testing.skipdoctest import skip_doctest_py3 |
|
36 | 36 | from IPython.utils import PyColorize |
|
37 | 37 | from IPython.utils import io |
|
38 | from IPython.utils import openpy | |
|
38 | 39 | from IPython.utils import py3compat |
|
39 | 40 | from IPython.utils.text import indent |
|
40 | 41 | from IPython.utils.wildcard import list_namespace |
@@ -457,7 +458,7 b' class Inspector:' | |||
|
457 | 458 | # Print only text files, not extension binaries. Note that |
|
458 | 459 | # getsourcelines returns lineno with 1-offset and page() uses |
|
459 | 460 | # 0-offset, so we must adjust. |
|
460 |
page.page(self.format( |
|
|
461 | page.page(self.format(openpy.read_py_file(ofile, skip_encoding_cookie=False)), lineno - 1) | |
|
461 | 462 | |
|
462 | 463 | def _format_fields(self, fields, title_width=12): |
|
463 | 464 | """Formats a list of fields for display. |
@@ -155,30 +155,6 b' class Tee(object):' | |||
|
155 | 155 | self.close() |
|
156 | 156 | |
|
157 | 157 | |
|
158 | def guess_encoding(lines): | |
|
159 | """check list of lines for line matching the source code encoding pattern | |
|
160 | ||
|
161 | Only check first two lines | |
|
162 | """ | |
|
163 | reg = re.compile("#.*coding[:=]\s*([-\w.]+)") | |
|
164 | for row in lines[:2]: #We only need to check the first two lines | |
|
165 | result = reg.match(row) | |
|
166 | if result: | |
|
167 | coding = result.groups()[0] | |
|
168 | break | |
|
169 | else: | |
|
170 | coding = "ascii" | |
|
171 | return coding | |
|
172 | ||
|
173 | def source_to_unicode(txt): | |
|
174 | """Converts string with python source code to unicode | |
|
175 | """ | |
|
176 | if isinstance(txt, unicode): | |
|
177 | return txt | |
|
178 | coding = guess_encoding(txt.split("\n", 2)) | |
|
179 | return txt.decode(coding, errors="replace") | |
|
180 | ||
|
181 | ||
|
182 | 158 | def file_read(filename): |
|
183 | 159 | """Read a file and close it. Returns the file source.""" |
|
184 | 160 | fobj = open(filename,'r'); |
@@ -9,6 +9,7 b' from __future__ import absolute_import' | |||
|
9 | 9 | import io |
|
10 | 10 | from io import TextIOWrapper |
|
11 | 11 | import re |
|
12 | from StringIO import StringIO | |
|
12 | 13 | import urllib |
|
13 | 14 | |
|
14 | 15 | cookie_re = re.compile(ur"coding[:=]\s*([-\w.]+)", re.UNICODE) |
@@ -120,6 +121,17 b' except ImportError:' | |||
|
120 | 121 | text.mode = 'r' |
|
121 | 122 | return text |
|
122 | 123 | |
|
124 | def source_to_unicode(txt): | |
|
125 | """Converts string with python source code to unicode | |
|
126 | """ | |
|
127 | if isinstance(txt, unicode): | |
|
128 | return txt | |
|
129 | try: | |
|
130 | coding, _ = detect_encoding(StringIO(txt).readline) | |
|
131 | except SyntaxError: | |
|
132 | coding = "ascii" | |
|
133 | return txt.decode(coding, errors="replace") | |
|
134 | ||
|
123 | 135 | def strip_encoding_cookie(filelike): |
|
124 | 136 | """Generator to pull lines from a text-mode file, skipping the encoding |
|
125 | 137 | cookie if it is found in the first two lines. |
@@ -38,7 +38,7 b' from IPython.lib.kernel import (' | |||
|
38 | 38 | get_connection_file, get_connection_info, connect_qtconsole |
|
39 | 39 | ) |
|
40 | 40 | from IPython.testing.skipdoctest import skip_doctest |
|
41 | from IPython.utils import io | |
|
41 | from IPython.utils import io, openpy | |
|
42 | 42 | from IPython.utils.jsonutil import json_clean, encode_images |
|
43 | 43 | from IPython.utils.process import arg_split |
|
44 | 44 | from IPython.utils import py3compat |
@@ -355,7 +355,9 b' class KernelMagics(Magics):' | |||
|
355 | 355 | |
|
356 | 356 | cont = open(arg_s).read() |
|
357 | 357 | if arg_s.endswith('.py'): |
|
358 |
cont = self.shell.pycolorize( |
|
|
358 | cont = self.shell.pycolorize(openpy.read_py_file(arg_s, skip_encoding_cookie=False)) | |
|
359 | else: | |
|
360 | cont = open(arg_s).read() | |
|
359 | 361 | page.page(cont) |
|
360 | 362 | |
|
361 | 363 | more = line_magic('more')(less) |
General Comments 0
You need to be logged in to leave comments.
Login now