1"""Example extension, also used for testing.
2
3See extend.txt for more details on creating an extension.
4See config-extension.def for configuring an extension.
5"""
6
7from idlelib.config import idleConf
8from functools import wraps
9
10
11def format_selection(format_line):
12    "Apply a formatting function to all of the selected lines."
13
14    @wraps(format_line)
15    def apply(self, event=None):
16        head, tail, chars, lines = self.formatter.get_region()
17        for pos in range(len(lines) - 1):
18            line = lines[pos]
19            lines[pos] = format_line(self, line)
20        self.formatter.set_region(head, tail, chars, lines)
21        return 'break'
22
23    return apply
24
25
26class ZzDummy:
27    """Prepend or remove initial text from selected lines."""
28
29    # Extend the format menu.
30    menudefs = [
31        ('format', [
32            ('Z in', '<<z-in>>'),
33            ('Z out', '<<z-out>>'),
34        ] )
35    ]
36
37    def __init__(self, editwin):
38        "Initialize the settings for this extension."
39        self.editwin = editwin
40        self.text = editwin.text
41        self.formatter = editwin.fregion
42
43    @classmethod
44    def reload(cls):
45        "Load class variables from config."
46        cls.ztext = idleConf.GetOption('extensions', 'ZzDummy', 'z-text')
47
48    @format_selection
49    def z_in_event(self, line):
50        """Insert text at the beginning of each selected line.
51
52        This is bound to the <<z-in>> virtual event when the extensions
53        are loaded.
54        """
55        return f'{self.ztext}{line}'
56
57    @format_selection
58    def z_out_event(self, line):
59        """Remove specific text from the beginning of each selected line.
60
61        This is bound to the <<z-out>> virtual event when the extensions
62        are loaded.
63        """
64        zlength = 0 if not line.startswith(self.ztext) else len(self.ztext)
65        return line[zlength:]
66
67
68ZzDummy.reload()
69
70
71if __name__ == "__main__":
72    import unittest
73    unittest.main('idlelib.idle_test.test_zzdummy', verbosity=2, exit=False)
74