diff options
Diffstat (limited to 'Mac/Tools/IDE/PyDocSearch.py')
-rw-r--r-- | Mac/Tools/IDE/PyDocSearch.py | 444 |
1 files changed, 222 insertions, 222 deletions
diff --git a/Mac/Tools/IDE/PyDocSearch.py b/Mac/Tools/IDE/PyDocSearch.py index 1abd4cd..ec666b6 100644 --- a/Mac/Tools/IDE/PyDocSearch.py +++ b/Mac/Tools/IDE/PyDocSearch.py @@ -13,244 +13,244 @@ app = W.getapplication() _titlepat = re.compile('<title>\([^<]*\)</title>') def sucktitle(path): - f = open(path) - text = f.read(1024) # assume the title is in the first 1024 bytes - f.close() - lowertext = text.lower() - matcher = _titlepat.search(lowertext) - if matcher: - return matcher.group(1) - return path + f = open(path) + text = f.read(1024) # assume the title is in the first 1024 bytes + f.close() + lowertext = text.lower() + matcher = _titlepat.search(lowertext) + if matcher: + return matcher.group(1) + return path def verifydocpath(docpath): - try: - tut = os.path.join(docpath, "tut") - lib = os.path.join(docpath, "lib") - ref = os.path.join(docpath, "ref") - for path in [tut, lib, ref]: - if not os.path.exists(path): - return 0 - except: - return 0 - return 1 + try: + tut = os.path.join(docpath, "tut") + lib = os.path.join(docpath, "lib") + ref = os.path.join(docpath, "ref") + for path in [tut, lib, ref]: + if not os.path.exists(path): + return 0 + except: + return 0 + return 1 _resultscounter = 1 class Results: - - def __init__(self, hits): - global _resultscounter - hits = map(lambda (path, hits): (sucktitle(path), path, hits), hits) - hits.sort() - self.hits = hits - nicehits = map( - lambda (title, path, hits): - title + '\r' + string.join( - map(lambda (c, p): "%s (%d)" % (p, c), hits), ', '), hits) - nicehits.sort() - self.w = W.Window((440, 300), "Search results %d" % _resultscounter, minsize = (200, 100)) - self.w.results = W.TwoLineList((-1, -1, 1, -14), nicehits, self.listhit) - self.w.open() - self.w.bind('return', self.listhit) - self.w.bind('enter', self.listhit) - _resultscounter = _resultscounter + 1 - - def listhit(self, isdbl = 1): - if isdbl: - for i in self.w.results.getselection(): - path = self.hits[i][1] - url = "file://" + "/".join(path.split(":")) - webbrowser.open(url) + + def __init__(self, hits): + global _resultscounter + hits = map(lambda (path, hits): (sucktitle(path), path, hits), hits) + hits.sort() + self.hits = hits + nicehits = map( + lambda (title, path, hits): + title + '\r' + string.join( + map(lambda (c, p): "%s (%d)" % (p, c), hits), ', '), hits) + nicehits.sort() + self.w = W.Window((440, 300), "Search results %d" % _resultscounter, minsize = (200, 100)) + self.w.results = W.TwoLineList((-1, -1, 1, -14), nicehits, self.listhit) + self.w.open() + self.w.bind('return', self.listhit) + self.w.bind('enter', self.listhit) + _resultscounter = _resultscounter + 1 + + def listhit(self, isdbl = 1): + if isdbl: + for i in self.w.results.getselection(): + path = self.hits[i][1] + url = "file://" + "/".join(path.split(":")) + webbrowser.open(url) class Status: - - def __init__(self): - self.w = W.Dialog((440, 64), "Searching\xc9") - self.w.searching = W.TextBox((4, 4, -4, 16), "") - self.w.hits = W.TextBox((4, 24, -4, 16), "Hits: 0") - self.w.canceltip = W.TextBox((4, 44, -4, 16), "Type cmd-period (.) to cancel.") - self.w.open() - - def set(self, path, hits): - self.w.searching.set(path) - self.w.hits.set('Hits: %r' % (hits,)) - app.breathe() - - def close(self): - self.w.close() + + def __init__(self): + self.w = W.Dialog((440, 64), "Searching\xc9") + self.w.searching = W.TextBox((4, 4, -4, 16), "") + self.w.hits = W.TextBox((4, 24, -4, 16), "Hits: 0") + self.w.canceltip = W.TextBox((4, 44, -4, 16), "Type cmd-period (.) to cancel.") + self.w.open() + + def set(self, path, hits): + self.w.searching.set(path) + self.w.hits.set('Hits: %r' % (hits,)) + app.breathe() + + def close(self): + self.w.close() def match(text, patterns, all): - hits = [] - hitsappend = hits.append - stringcount = string.count - for pat in patterns: - c = stringcount(text, pat) - if c > 0: - hitsappend((c, pat)) - elif all: - hits[:] = [] - break - hits.sort() - hits.reverse() - return hits + hits = [] + hitsappend = hits.append + stringcount = string.count + for pat in patterns: + c = stringcount(text, pat) + if c > 0: + hitsappend((c, pat)) + elif all: + hits[:] = [] + break + hits.sort() + hits.reverse() + return hits def dosearch(docpath, searchstring, settings): - (docpath, kind, case, word, tut, lib, ref, ext, api) = settings - books = [(tut, 'tut'), (lib, 'lib'), (ref, 'ref'), (ext, 'ext'), (api, 'api')] - if not case: - searchstring = string.lower(searchstring) - - if kind == 1: - patterns = string.split(searchstring) - all = 1 - elif kind == 2: - patterns = string.split(searchstring) - all = 0 - else: - patterns = [searchstring] - all = 0 # not relevant - - ospathjoin = os.path.join - stringlower = string.lower - status = Status() - statusset = status.set - _match = match - _open = open - hits = {} - try: - if hasattr(MacOS, 'EnableAppswitch'): - MacOS.EnableAppswitch(0) - try: - for do, name in books: - if not do: - continue - bookpath = ospathjoin(docpath, name) - if not os.path.exists(bookpath): - continue - files = os.listdir(bookpath) - for file in files: - fullpath = ospathjoin(bookpath, file) - if fullpath[-5:] <> '.html': - continue - statusset(fullpath, len(hits)) - f = _open(fullpath) - text = f.read() - if not case: - text = stringlower(text) - f.close() - filehits = _match(text, patterns, all) - if filehits: - hits[fullpath] = filehits - finally: - if hasattr(MacOS, 'EnableAppswitch'): - MacOS.EnableAppswitch(-1) - status.close() - except KeyboardInterrupt: - pass - hits = hits.items() - hits.sort() - return hits + (docpath, kind, case, word, tut, lib, ref, ext, api) = settings + books = [(tut, 'tut'), (lib, 'lib'), (ref, 'ref'), (ext, 'ext'), (api, 'api')] + if not case: + searchstring = string.lower(searchstring) + + if kind == 1: + patterns = string.split(searchstring) + all = 1 + elif kind == 2: + patterns = string.split(searchstring) + all = 0 + else: + patterns = [searchstring] + all = 0 # not relevant + + ospathjoin = os.path.join + stringlower = string.lower + status = Status() + statusset = status.set + _match = match + _open = open + hits = {} + try: + if hasattr(MacOS, 'EnableAppswitch'): + MacOS.EnableAppswitch(0) + try: + for do, name in books: + if not do: + continue + bookpath = ospathjoin(docpath, name) + if not os.path.exists(bookpath): + continue + files = os.listdir(bookpath) + for file in files: + fullpath = ospathjoin(bookpath, file) + if fullpath[-5:] <> '.html': + continue + statusset(fullpath, len(hits)) + f = _open(fullpath) + text = f.read() + if not case: + text = stringlower(text) + f.close() + filehits = _match(text, patterns, all) + if filehits: + hits[fullpath] = filehits + finally: + if hasattr(MacOS, 'EnableAppswitch'): + MacOS.EnableAppswitch(-1) + status.close() + except KeyboardInterrupt: + pass + hits = hits.items() + hits.sort() + return hits class PyDocSearch: - - def __init__(self): - prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) - try: - (docpath, kind, case, word, tut, lib, ref, ext, api) = prefs.docsearchengine - except: - (docpath, kind, case, word, tut, lib, ref, ext, api) = prefs.docsearchengine = \ - ("", 0, 0, 0, 1, 1, 0, 0, 0) - - if docpath and not verifydocpath(docpath): - docpath = "" - - self.w = W.Window((400, 200), "Search the Python Documentation") - self.w.searchtext = W.EditText((10, 10, -100, 20), callback = self.checkbuttons) - self.w.searchbutton = W.Button((-90, 12, 80, 16), "Search", self.search) - buttons = [] - - gutter = 10 - width = 130 - bookstart = width + 2 * gutter - self.w.phraseradio = W.RadioButton((10, 38, width, 16), "As a phrase", buttons) - self.w.allwordsradio = W.RadioButton((10, 58, width, 16), "All words", buttons) - self.w.anywordsradio = W.RadioButton((10, 78, width, 16), "Any word", buttons) - self.w.casesens = W.CheckBox((10, 98, width, 16), "Case sensitive") - self.w.wholewords = W.CheckBox((10, 118, width, 16), "Whole words") - self.w.tutorial = W.CheckBox((bookstart, 38, -10, 16), "Tutorial") - self.w.library = W.CheckBox((bookstart, 58, -10, 16), "Library reference") - self.w.langueref = W.CheckBox((bookstart, 78, -10, 16), "Lanuage reference manual") - self.w.extending = W.CheckBox((bookstart, 98, -10, 16), "Extending & embedding") - self.w.api = W.CheckBox((bookstart, 118, -10, 16), "C/C++ API") - - self.w.setdocfolderbutton = W.Button((10, -30, 100, 16), "Set doc folder", self.setdocpath) - - if docpath: - self.w.setdefaultbutton(self.w.searchbutton) - else: - self.w.setdefaultbutton(self.w.setdocfolderbutton) - - self.docpath = docpath - if not docpath: - docpath = "(please select the Python html documentation folder)" - self.w.docfolder = W.TextBox((120, -28, -10, 16), docpath) - - [self.w.phraseradio, self.w.allwordsradio, self.w.anywordsradio][kind].set(1) - - self.w.casesens.set(case) - self.w.wholewords.set(word) - self.w.tutorial.set(tut) - self.w.library.set(lib) - self.w.langueref.set(ref) - self.w.extending.set(ext) - self.w.api.set(api) - - self.w.open() - self.w.wholewords.enable(0) - self.w.bind('<close>', self.close) - self.w.searchbutton.enable(0) - - def search(self): - hits = dosearch(self.docpath, self.w.searchtext.get(), self.getsettings()) - if hits: - Results(hits) - elif hasattr(MacOS, 'SysBeep'): - MacOS.SysBeep(0) - - def setdocpath(self): - docpath = EasyDialogs.AskFolder() - if docpath: - if not verifydocpath(docpath): - W.Message("This does not seem to be a Python documentation folder...") - else: - self.docpath = docpath - self.w.docfolder.set(docpath) - self.w.setdefaultbutton(self.w.searchbutton) - - def close(self): - prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) - prefs.docsearchengine = self.getsettings() - - def getsettings(self): - radiobuttons = [self.w.phraseradio, self.w.allwordsradio, self.w.anywordsradio] - for i in range(3): - if radiobuttons[i].get(): - kind = i - break - docpath = self.docpath - case = self.w.casesens.get() - word = self.w.wholewords.get() - tut = self.w.tutorial.get() - lib = self.w.library.get() - ref = self.w.langueref.get() - ext = self.w.extending.get() - api = self.w.api.get() - return (docpath, kind, case, word, tut, lib, ref, ext, api) - - def checkbuttons(self): - self.w.searchbutton.enable(not not self.w.searchtext.get()) + + def __init__(self): + prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) + try: + (docpath, kind, case, word, tut, lib, ref, ext, api) = prefs.docsearchengine + except: + (docpath, kind, case, word, tut, lib, ref, ext, api) = prefs.docsearchengine = \ + ("", 0, 0, 0, 1, 1, 0, 0, 0) + + if docpath and not verifydocpath(docpath): + docpath = "" + + self.w = W.Window((400, 200), "Search the Python Documentation") + self.w.searchtext = W.EditText((10, 10, -100, 20), callback = self.checkbuttons) + self.w.searchbutton = W.Button((-90, 12, 80, 16), "Search", self.search) + buttons = [] + + gutter = 10 + width = 130 + bookstart = width + 2 * gutter + self.w.phraseradio = W.RadioButton((10, 38, width, 16), "As a phrase", buttons) + self.w.allwordsradio = W.RadioButton((10, 58, width, 16), "All words", buttons) + self.w.anywordsradio = W.RadioButton((10, 78, width, 16), "Any word", buttons) + self.w.casesens = W.CheckBox((10, 98, width, 16), "Case sensitive") + self.w.wholewords = W.CheckBox((10, 118, width, 16), "Whole words") + self.w.tutorial = W.CheckBox((bookstart, 38, -10, 16), "Tutorial") + self.w.library = W.CheckBox((bookstart, 58, -10, 16), "Library reference") + self.w.langueref = W.CheckBox((bookstart, 78, -10, 16), "Lanuage reference manual") + self.w.extending = W.CheckBox((bookstart, 98, -10, 16), "Extending & embedding") + self.w.api = W.CheckBox((bookstart, 118, -10, 16), "C/C++ API") + + self.w.setdocfolderbutton = W.Button((10, -30, 100, 16), "Set doc folder", self.setdocpath) + + if docpath: + self.w.setdefaultbutton(self.w.searchbutton) + else: + self.w.setdefaultbutton(self.w.setdocfolderbutton) + + self.docpath = docpath + if not docpath: + docpath = "(please select the Python html documentation folder)" + self.w.docfolder = W.TextBox((120, -28, -10, 16), docpath) + + [self.w.phraseradio, self.w.allwordsradio, self.w.anywordsradio][kind].set(1) + + self.w.casesens.set(case) + self.w.wholewords.set(word) + self.w.tutorial.set(tut) + self.w.library.set(lib) + self.w.langueref.set(ref) + self.w.extending.set(ext) + self.w.api.set(api) + + self.w.open() + self.w.wholewords.enable(0) + self.w.bind('<close>', self.close) + self.w.searchbutton.enable(0) + + def search(self): + hits = dosearch(self.docpath, self.w.searchtext.get(), self.getsettings()) + if hits: + Results(hits) + elif hasattr(MacOS, 'SysBeep'): + MacOS.SysBeep(0) + + def setdocpath(self): + docpath = EasyDialogs.AskFolder() + if docpath: + if not verifydocpath(docpath): + W.Message("This does not seem to be a Python documentation folder...") + else: + self.docpath = docpath + self.w.docfolder.set(docpath) + self.w.setdefaultbutton(self.w.searchbutton) + + def close(self): + prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) + prefs.docsearchengine = self.getsettings() + + def getsettings(self): + radiobuttons = [self.w.phraseradio, self.w.allwordsradio, self.w.anywordsradio] + for i in range(3): + if radiobuttons[i].get(): + kind = i + break + docpath = self.docpath + case = self.w.casesens.get() + word = self.w.wholewords.get() + tut = self.w.tutorial.get() + lib = self.w.library.get() + ref = self.w.langueref.get() + ext = self.w.extending.get() + api = self.w.api.get() + return (docpath, kind, case, word, tut, lib, ref, ext, api) + + def checkbuttons(self): + self.w.searchbutton.enable(not not self.w.searchtext.get()) |