Issue #23672: Allow Idle to edit and run files with astral chars in name.
Patch by Mohd Sanad Zaki Rizvi.
This commit is contained in:
parent
8c125eb44b
commit
5c28e9f887
|
@ -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()
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
Loading…
Reference in New Issue