def HitTest(self, path, ret_list): """_performSearchStepから呼ばれ、与えられたpathのファイルが検索にヒットするならリスト追加する""" if misc.isDocumentExt(path.split(".")[-1]): fullpath = os.path.join(self.rootDirectory, path) content = misc.ExtractText(fullpath).split("\n") fileobj = None # 複数ヒットでファイルオブジェクトを生成し続けないようにキャッシュする ln = 1 hitobjects = [] for elem in content: m = re.search(self.keyword, elem) if m: preview_start = max(0, m.start() - 10) preview = elem[preview_start:preview_start + 25] if not fileobj: fileobj = self._MakeObject(browsableObjects.File, fullpath) obj = browsableObjects.GrepItem() obj.Initialize(ln, preview, fileobj) hitobjects.append(obj) # end ヒット ln += 1 # end 行数ごとに検索 for elem in hitobjects: hits = len(hitobjects) elem.SetHitCount(hits) # end 最終的なヒットカウントを設定 self.results.extend(hitobjects) ret_list.extend(hitobjects) return len(hitobjects) # end 対応している拡張子 return 0
def ReadFooter(self): ext = self.GetFocusedElement().fullpath.split(".")[-1].lower() if not misc.isDocumentExt(ext): globalVars.app.say(_("ドキュメントファイルではありません。"), interrupt=True) return #end 非対応 ln = globalVars.app.config.getint("preview", "footer_line_count", 10, 1, 100) s = misc.ExtractText(self.GetFocusedElement().fullpath).split("\n") if len(s) > 10: s = s[-10:] prefix = _("末尾%(ln)d行") % {'ln': ln} globalVars.app.say("%s %s" % (prefix, "\n".join(s)), interrupt=True)
def Preview(self): ext = self.GetFocusedElement().fullpath.split(".")[-1].lower() if ext in constants.SUPPORTED_AUDIO_FORMATS: self.StopSound() ret = globalVars.app.PlaySound(self.GetFocusedElement().fullpath, custom_location=True, volume=globalVars.app.config.getint( "preview", "audio_volume", 100, 1, 300)) if ret == -1: dialog(_("エラー"), _("再生に失敗しました。ファイルにアクセスができないか、ファイルが壊れている可能性があります。")) return errorCodes.FILE_NOT_FOUND self.stopSoundHandle = ret elif misc.isDocumentExt(ext): globalVars.app.say(misc.ExtractText( self.GetFocusedElement().fullpath), interrupt=True) else: globalVars.app.say(_("プレビューに対応していないファイル形式です。"), interrupt=True)
def _performSearchStep(self, taskState): """検索を1ステップ実行する。100県のヒットが出るまで検索するか、リストが終わるまで検索し、終わったら関数から抜ける。途中で EOL に当たったら、検索終了としてTrueを返し、そうでないときにFalseを帰す。また、表示関数に渡しやすいように、今回のステップでヒットした要素のリストも返す。スレッドからtaskStateを受け取っていて、キャンセルされたら hits を-1にセットして抜ける。""" ret_list = [] i = self.searched_index eol = False total_hits = 0 while (True): if taskState.canceled: return False, -1 #途中でキャンセル path = self.searches[i] if path == "eol": #EOLで検索終了 eol = True self.finished = True globalVars.app.PlaySound("complete.ogg") globalVars.app.say( _("検索終了、%(item)d件ヒットしました。") % {'item': len(self)}) break #end EOL ext = path.split(".")[-1].lower() if misc.isDocumentExt(ext): fullpath = os.path.join(self.rootDirectory, path) content = misc.ExtractText(fullpath).split("\n") fileobj = None #複数ヒットでファイルオブジェクトを生成し続けないようにキャッシュする ln = 1 hitobjects = [] for elem in content: m = re.search(self.keyword, elem) if m: preview_start = m.start() - 10 if preview_start < 0: preview_start = 0 preview = elem[preview_start:preview_start + 20] if not fileobj: stat = os.stat(fullpath) mod = datetime.datetime.fromtimestamp( stat.st_mtime) creation = datetime.datetime.fromtimestamp( stat.st_ctime) ret, shfileinfo = shell.SHGetFileInfo( fullpath, 0, shellcon.SHGFI_ICON | shellcon.SHGFI_TYPENAME) fileobj = browsableObjects.File() fileobj.Initialize( os.path.dirname(fullpath), os.path.basename(fullpath), fullpath, stat.st_size, mod, win32file.GetFileAttributes(fullpath), shfileinfo[4], creation, win32api.GetShortPathName(fullpath)) #end make fileobj obj = browsableObjects.GrepItem() obj.Initialize(ln, preview, fileobj) hitobjects.append(obj) #end ヒット ln += 1 #end 行数ごとに検索 if len(hitobjects) > 0: #このファイルの中でヒットがあった total_hits += len(hitobjects) for elem in hitobjects: hits = len(hitobjects) elem.SetHitCount(hits) #end 最終的なヒットカウントを設定 self.results.extend(hitobjects) ret_list.extend(hitobjects) #end このファイルでヒットがあった #end 対応している拡張子 if total_hits >= 100: self.searched_index = i + 1 #次の位置をキャッシュ break #end 100県検索 i += 1 if i >= len(self.searches): #検索は終わってないが、ファイルリスト取得が追いついてない self.searched_index = len(self.searches) break #end リストが追いついてない #end 検索ループ return eol, ret_list