17db96d56Sopenharmony_ci"""Example extension, also used for testing.
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciSee extend.txt for more details on creating an extension.
47db96d56Sopenharmony_ciSee config-extension.def for configuring an extension.
57db96d56Sopenharmony_ci"""
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_cifrom idlelib.config import idleConf
87db96d56Sopenharmony_cifrom functools import wraps
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_cidef format_selection(format_line):
127db96d56Sopenharmony_ci    "Apply a formatting function to all of the selected lines."
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci    @wraps(format_line)
157db96d56Sopenharmony_ci    def apply(self, event=None):
167db96d56Sopenharmony_ci        head, tail, chars, lines = self.formatter.get_region()
177db96d56Sopenharmony_ci        for pos in range(len(lines) - 1):
187db96d56Sopenharmony_ci            line = lines[pos]
197db96d56Sopenharmony_ci            lines[pos] = format_line(self, line)
207db96d56Sopenharmony_ci        self.formatter.set_region(head, tail, chars, lines)
217db96d56Sopenharmony_ci        return 'break'
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci    return apply
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ciclass ZzDummy:
277db96d56Sopenharmony_ci    """Prepend or remove initial text from selected lines."""
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci    # Extend the format menu.
307db96d56Sopenharmony_ci    menudefs = [
317db96d56Sopenharmony_ci        ('format', [
327db96d56Sopenharmony_ci            ('Z in', '<<z-in>>'),
337db96d56Sopenharmony_ci            ('Z out', '<<z-out>>'),
347db96d56Sopenharmony_ci        ] )
357db96d56Sopenharmony_ci    ]
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci    def __init__(self, editwin):
387db96d56Sopenharmony_ci        "Initialize the settings for this extension."
397db96d56Sopenharmony_ci        self.editwin = editwin
407db96d56Sopenharmony_ci        self.text = editwin.text
417db96d56Sopenharmony_ci        self.formatter = editwin.fregion
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci    @classmethod
447db96d56Sopenharmony_ci    def reload(cls):
457db96d56Sopenharmony_ci        "Load class variables from config."
467db96d56Sopenharmony_ci        cls.ztext = idleConf.GetOption('extensions', 'ZzDummy', 'z-text')
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci    @format_selection
497db96d56Sopenharmony_ci    def z_in_event(self, line):
507db96d56Sopenharmony_ci        """Insert text at the beginning of each selected line.
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci        This is bound to the <<z-in>> virtual event when the extensions
537db96d56Sopenharmony_ci        are loaded.
547db96d56Sopenharmony_ci        """
557db96d56Sopenharmony_ci        return f'{self.ztext}{line}'
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci    @format_selection
587db96d56Sopenharmony_ci    def z_out_event(self, line):
597db96d56Sopenharmony_ci        """Remove specific text from the beginning of each selected line.
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci        This is bound to the <<z-out>> virtual event when the extensions
627db96d56Sopenharmony_ci        are loaded.
637db96d56Sopenharmony_ci        """
647db96d56Sopenharmony_ci        zlength = 0 if not line.startswith(self.ztext) else len(self.ztext)
657db96d56Sopenharmony_ci        return line[zlength:]
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ciZzDummy.reload()
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ciif __name__ == "__main__":
727db96d56Sopenharmony_ci    import unittest
737db96d56Sopenharmony_ci    unittest.main('idlelib.idle_test.test_zzdummy', verbosity=2, exit=False)
74