##// END OF EJS Templates
merge functionality in io and openpy relating to encoding...
Jörgen Stenarson -
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(io.source_to_unicode(open(ofile).read())), lineno-1)
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(io.source_to_unicode(cont))
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