summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib/zzdummy.py
diff options
context:
space:
mode:
authorCheryl Sabella <cheryl.sabella@gmail.com>2021-01-05 07:26:43 (GMT)
committerGitHub <noreply@github.com>2021-01-05 07:26:43 (GMT)
commite40e2a2cc94c554e7e245a8ca5a7432d31a95766 (patch)
tree0a93499ae4b22a1993bfa52bfdc6d5d4829bce13 /Lib/idlelib/zzdummy.py
parent59f9b4e4509be67494f3d45489fa55523175ff69 (diff)
downloadcpython-e40e2a2cc94c554e7e245a8ca5a7432d31a95766.zip
cpython-e40e2a2cc94c554e7e245a8ca5a7432d31a95766.tar.gz
cpython-e40e2a2cc94c554e7e245a8ca5a7432d31a95766.tar.bz2
bpo-32631: IDLE: Enable zzdummy example extension module (GH-14491)
Make menu items work with formatter, add docstrings, add 100% tests. Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
Diffstat (limited to 'Lib/idlelib/zzdummy.py')
-rw-r--r--Lib/idlelib/zzdummy.py73
1 files changed, 52 insertions, 21 deletions
diff --git a/Lib/idlelib/zzdummy.py b/Lib/idlelib/zzdummy.py
index 3c4b1d2..1247e8f 100644
--- a/Lib/idlelib/zzdummy.py
+++ b/Lib/idlelib/zzdummy.py
@@ -1,42 +1,73 @@
-"Example extension, also used for testing."
+"""Example extension, also used for testing.
+
+See extend.txt for more details on creating an extension.
+See config-extension.def for configuring an extension.
+"""
from idlelib.config import idleConf
+from functools import wraps
+
+
+def format_selection(format_line):
+ "Apply a formatting function to all of the selected lines."
+
+ @wraps(format_line)
+ def apply(self, event=None):
+ head, tail, chars, lines = self.formatter.get_region()
+ for pos in range(len(lines) - 1):
+ line = lines[pos]
+ lines[pos] = format_line(self, line)
+ self.formatter.set_region(head, tail, chars, lines)
+ return 'break'
-ztext = idleConf.GetOption('extensions', 'ZzDummy', 'z-text')
+ return apply
class ZzDummy:
+ """Prepend or remove initial text from selected lines."""
-## menudefs = [
-## ('format', [
-## ('Z in', '<<z-in>>'),
-## ('Z out', '<<z-out>>'),
-## ] )
-## ]
+ # Extend the format menu.
+ menudefs = [
+ ('format', [
+ ('Z in', '<<z-in>>'),
+ ('Z out', '<<z-out>>'),
+ ] )
+ ]
def __init__(self, editwin):
+ "Initialize the settings for this extension."
+ self.editwin = editwin
self.text = editwin.text
- z_in = False
+ self.formatter = editwin.fregion
@classmethod
def reload(cls):
+ "Load class variables from config."
cls.ztext = idleConf.GetOption('extensions', 'ZzDummy', 'z-text')
- def z_in_event(self, event):
+ @format_selection
+ def z_in_event(self, line):
+ """Insert text at the beginning of each selected line.
+
+ This is bound to the <<z-in>> virtual event when the extensions
+ are loaded.
"""
+ return f'{self.ztext}{line}'
+
+ @format_selection
+ def z_out_event(self, line):
+ """Remove specific text from the beginning of each selected line.
+
+ This is bound to the <<z-out>> virtual event when the extensions
+ are loaded.
"""
- text = self.text
- text.undo_block_start()
- for line in range(1, text.index('end')):
- text.insert('%d.0', ztext)
- text.undo_block_stop()
- return "break"
+ zlength = 0 if not line.startswith(self.ztext) else len(self.ztext)
+ return line[zlength:]
- def z_out_event(self, event): pass
ZzDummy.reload()
-##if __name__ == "__main__":
-## import unittest
-## unittest.main('idlelib.idle_test.test_zzdummy',
-## verbosity=2, exit=False)
+
+if __name__ == "__main__":
+ import unittest
+ unittest.main('idlelib.idle_test.test_zzdummy', verbosity=2, exit=False)