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