| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | import os | 
					
						
							|  |  |  | import fnmatch | 
					
						
							|  |  |  | import sys | 
					
						
							| 
									
										
										
										
											2008-05-17 18:39:55 +00:00
										 |  |  | from tkinter import * | 
					
						
							| 
									
										
										
										
											2007-08-22 23:01:33 +00:00
										 |  |  | from idlelib import SearchEngine | 
					
						
							|  |  |  | from idlelib.SearchDialogBase import SearchDialogBase | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def grep(text, io=None, flist=None): | 
					
						
							|  |  |  |     root = text._root() | 
					
						
							|  |  |  |     engine = SearchEngine.get(root) | 
					
						
							|  |  |  |     if not hasattr(engine, "_grepdialog"): | 
					
						
							|  |  |  |         engine._grepdialog = GrepDialog(root, engine, flist) | 
					
						
							|  |  |  |     dialog = engine._grepdialog | 
					
						
							| 
									
										
										
										
											2003-06-07 03:21:17 +00:00
										 |  |  |     searchphrase = text.get("sel.first", "sel.last") | 
					
						
							|  |  |  |     dialog.open(text, searchphrase, io) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class GrepDialog(SearchDialogBase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     title = "Find in Files Dialog" | 
					
						
							|  |  |  |     icon = "Grep" | 
					
						
							|  |  |  |     needwrapbutton = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, root, engine, flist): | 
					
						
							|  |  |  |         SearchDialogBase.__init__(self, root, engine) | 
					
						
							|  |  |  |         self.flist = flist | 
					
						
							|  |  |  |         self.globvar = StringVar(root) | 
					
						
							|  |  |  |         self.recvar = BooleanVar(root) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-07 03:21:17 +00:00
										 |  |  |     def open(self, text, searchphrase, io=None): | 
					
						
							|  |  |  |         SearchDialogBase.open(self, text, searchphrase) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         if io: | 
					
						
							|  |  |  |             path = io.filename or "" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             path = "" | 
					
						
							|  |  |  |         dir, base = os.path.split(path) | 
					
						
							|  |  |  |         head, tail = os.path.splitext(base) | 
					
						
							|  |  |  |         if not tail: | 
					
						
							|  |  |  |             tail = ".py" | 
					
						
							|  |  |  |         self.globvar.set(os.path.join(dir, "*" + tail)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def create_entries(self): | 
					
						
							|  |  |  |         SearchDialogBase.create_entries(self) | 
					
						
							|  |  |  |         self.globent = self.make_entry("In files:", self.globvar) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def create_other_buttons(self): | 
					
						
							|  |  |  |         f = self.make_frame() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         btn = Checkbutton(f, anchor="w", | 
					
						
							|  |  |  |                 variable=self.recvar, | 
					
						
							|  |  |  |                 text="Recurse down subdirectories") | 
					
						
							|  |  |  |         btn.pack(side="top", fill="both") | 
					
						
							|  |  |  |         btn.select() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def create_command_buttons(self): | 
					
						
							|  |  |  |         SearchDialogBase.create_command_buttons(self) | 
					
						
							|  |  |  |         self.make_button("Search Files", self.default_command, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def default_command(self, event=None): | 
					
						
							|  |  |  |         prog = self.engine.getprog() | 
					
						
							|  |  |  |         if not prog: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         path = self.globvar.get() | 
					
						
							|  |  |  |         if not path: | 
					
						
							|  |  |  |             self.top.bell() | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2007-08-22 23:01:33 +00:00
										 |  |  |         from idlelib.OutputWindow import OutputWindow | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         save = sys.stdout | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             sys.stdout = OutputWindow(self.flist) | 
					
						
							|  |  |  |             self.grep_it(prog, path) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             sys.stdout = save | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def grep_it(self, prog, path): | 
					
						
							|  |  |  |         dir, base = os.path.split(path) | 
					
						
							|  |  |  |         list = self.findfiles(dir, base, self.recvar.get()) | 
					
						
							|  |  |  |         list.sort() | 
					
						
							|  |  |  |         self.close() | 
					
						
							|  |  |  |         pat = self.engine.getpat() | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |         print("Searching %r in %s ..." % (pat, path)) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         hits = 0 | 
					
						
							|  |  |  |         for fn in list: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 f = open(fn) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |             except IOError as msg: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |                 print(msg) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |                 continue | 
					
						
							|  |  |  |             lineno = 0 | 
					
						
							|  |  |  |             while 1: | 
					
						
							|  |  |  |                 block = f.readlines(100000) | 
					
						
							|  |  |  |                 if not block: | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |                 for line in block: | 
					
						
							|  |  |  |                     lineno = lineno + 1 | 
					
						
							|  |  |  |                     if line[-1:] == '\n': | 
					
						
							|  |  |  |                         line = line[:-1] | 
					
						
							|  |  |  |                     if prog.search(line): | 
					
						
							|  |  |  |                         sys.stdout.write("%s: %s: %s\n" % (fn, lineno, line)) | 
					
						
							|  |  |  |                         hits = hits + 1 | 
					
						
							|  |  |  |         if hits: | 
					
						
							|  |  |  |             if hits == 1: | 
					
						
							|  |  |  |                 s = "" | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 s = "s" | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print("Found", hits, "hit%s." % s) | 
					
						
							|  |  |  |             print("(Hint: right-click to open locations.)") | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print("No hits.") | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def findfiles(self, dir, base, rec): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             names = os.listdir(dir or os.curdir) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |         except os.error as msg: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print(msg) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |             return [] | 
					
						
							|  |  |  |         list = [] | 
					
						
							|  |  |  |         subdirs = [] | 
					
						
							|  |  |  |         for name in names: | 
					
						
							|  |  |  |             fn = os.path.join(dir, name) | 
					
						
							|  |  |  |             if os.path.isdir(fn): | 
					
						
							|  |  |  |                 subdirs.append(fn) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 if fnmatch.fnmatch(name, base): | 
					
						
							|  |  |  |                     list.append(fn) | 
					
						
							|  |  |  |         if rec: | 
					
						
							|  |  |  |             for subdir in subdirs: | 
					
						
							|  |  |  |                 list.extend(self.findfiles(subdir, base, rec)) | 
					
						
							|  |  |  |         return list | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def close(self, event=None): | 
					
						
							|  |  |  |         if self.top: | 
					
						
							|  |  |  |             self.top.grab_release() | 
					
						
							|  |  |  |             self.top.withdraw() |