summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTerry Jan Reedy <tjreedy@udel.edu>2015-08-06 04:54:07 (GMT)
committerTerry Jan Reedy <tjreedy@udel.edu>2015-08-06 04:54:07 (GMT)
commit5c28e9f887d8a8089d4e5ed6060e61a0da5afbe2 (patch)
tree3986f06cc566919ce3c52518a10a8acd4cee4de8
parent8c125eb44b528ba22b43cdf5da49e408082865fa (diff)
downloadcpython-5c28e9f887d8a8089d4e5ed6060e61a0da5afbe2.zip
cpython-5c28e9f887d8a8089d4e5ed6060e61a0da5afbe2.tar.gz
cpython-5c28e9f887d8a8089d4e5ed6060e61a0da5afbe2.tar.bz2
Issue #23672: Allow Idle to edit and run files with astral chars in name.
Patch by Mohd Sanad Zaki Rizvi.
-rw-r--r--Lib/idlelib/EditorWindow.py16
-rw-r--r--Lib/idlelib/ScriptBinding.py4
-rw-r--r--Lib/idlelib/idle_test/test_editor.py16
3 files changed, 27 insertions, 9 deletions
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index 6dbbe09..3ac68bb 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -344,19 +344,19 @@ class EditorWindow(object):
def _filename_to_unicode(self, filename):
- """convert filename to unicode in order to display it in Tk"""
- if isinstance(filename, str) or not filename:
- return filename
- else:
+ """Return filename as BMP unicode so diplayable in Tk."""
+ # Decode bytes to unicode.
+ if isinstance(filename, bytes):
try:
- return filename.decode(self.filesystemencoding)
+ filename = filename.decode(self.filesystemencoding)
except UnicodeDecodeError:
- # XXX
try:
- return filename.decode(self.encoding)
+ filename = filename.decode(self.encoding)
except UnicodeDecodeError:
# byte-to-byte conversion
- return filename.decode('iso8859-1')
+ filename = filename.decode('iso8859-1')
+ # Replace non-BMP char with diamond questionmark.
+ return re.sub('[\U00010000-\U0010FFFF]', '\ufffd', filename)
def new_callback(self, event):
dirname, basename = self.io.defaultfilename()
diff --git a/Lib/idlelib/ScriptBinding.py b/Lib/idlelib/ScriptBinding.py
index d700525..e8cb2fc 100644
--- a/Lib/idlelib/ScriptBinding.py
+++ b/Lib/idlelib/ScriptBinding.py
@@ -36,6 +36,7 @@ To fix case 2, change all tabs to spaces by using Edit->Select All followed \
by Format->Untabify Region and specify the number of columns used by each tab.
"""
+
class ScriptBinding:
menudefs = [
@@ -142,7 +143,8 @@ class ScriptBinding:
return 'break'
interp = self.shell.interp
if PyShell.use_subprocess:
- interp.restart_subprocess(with_cwd=False, filename=code.co_filename)
+ interp.restart_subprocess(with_cwd=False, filename=
+ self.editwin._filename_to_unicode(filename))
dirname = os.path.dirname(filename)
# XXX Too often this discards arguments the user just set...
interp.runcommand("""if 1:
diff --git a/Lib/idlelib/idle_test/test_editor.py b/Lib/idlelib/idle_test/test_editor.py
new file mode 100644
index 0000000..a31d26d
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_editor.py
@@ -0,0 +1,16 @@
+import unittest
+from tkinter import Tk, Text
+from idlelib.EditorWindow import EditorWindow
+from test.support import requires
+
+class Editor_func_test(unittest.TestCase):
+ def test_filename_to_unicode(self):
+ func = EditorWindow._filename_to_unicode
+ class dummy(): filesystemencoding = 'utf-8'
+ pairs = (('abc', 'abc'), ('a\U00011111c', 'a\ufffdc'),
+ (b'abc', 'abc'), (b'a\xf0\x91\x84\x91c', 'a\ufffdc'))
+ for inp, out in pairs:
+ self.assertEqual(func(dummy, inp), out)
+
+if __name__ == '__main__':
+ unittest.main(verbosity=2)