def render(self, req, mimetype, content, filename=None, rev=None): # -n to ignore php.ini so we're using default colors cmdline = '%s -sn' % self.path self.env.log.debug("PHP command line: %s" % cmdline) content = content_to_unicode(self.env, content, mimetype) content = content.encode('utf-8') np = NaivePopen(cmdline, content, capturestderr=1) if (os.name != 'nt' and np.errorlevel) or np.err: msg = u'L\'exécution de la commande (%s) a echoué : %s, %s.' \ % (cmdline, np.errorlevel, np.err) raise Exception(msg) odata = ''.join(np.out.splitlines()[1:-1]) if odata.startswith('X-Powered-By:') or \ odata.startswith('Content-type:'): raise TracError( u'Apparemment, vous utilisez la version CGI de PHP. ' u'Trac a besoin de la version CLI pour réaliser la ' u'coloration syntaxique.') epilogues = ["</span>", "</font>"] for e in epilogues: if odata.endswith(e): odata = odata[:-len(e)] break html = PhpDeuglifier().format(odata.decode('utf-8')) for line in html.split('<br />'): # PHP generates _way_ too many non-breaking spaces... # We don't need them anyway, so replace them by normal spaces yield line.replace(' ', ' ')
def display(data, mimetype, filename, rev, env): try: lang = types[mimetype] except KeyError: raise Exception, "Enscript doesn't support %s" % mimetype env.log.debug("type: %s enscript-suffix: %s" % (mimetype, lang)) enscript = env.get_config('mimeviewer', 'enscript_path', 'enscript') enscript += ' --color -h -q --language=html -p - -E' if lang: enscript += lang np = NaivePopen(enscript, data, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % (enscript, np.errorlevel, np.err) raise Exception, err odata = np.out # Strip header and footer i = odata.find('</H1>') beg = i > 0 and i + 7 i = odata.rfind('</PRE>') end = i > 0 and i + 6 or len(odata) odata = Deuglifier().format(odata[beg:end]) return '<div class="code-block">' + odata + '</div>'
def render(self, context, mimetype, content, filename=None, rev=None): # -n to ignore php.ini so we're using default colors cmdline = '%s -sn' % self.path self.log.debug("PHP command line: %s" % cmdline) content = content_to_unicode(self.env, content, mimetype) content = content.encode('utf-8') np = NaivePopen(cmdline, content, capturestderr=1) if (os.name != 'nt' and np.errorlevel) or np.err: msg = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel, np.err) raise Exception(msg) odata = ''.join(np.out.splitlines()[1:-1]) if odata.startswith('X-Powered-By:') or \ odata.startswith('Content-type:'): raise TracError( _('You appear to be using the PHP CGI ' 'binary. Trac requires the CLI version ' 'for syntax highlighting.')) epilogues = ["</span>", "</font>"] for e in epilogues: if odata.endswith(e): odata = odata[:-len(e)] break html = PhpDeuglifier().format(odata.decode('utf-8')) # PHP generates _way_ too many non-breaking spaces... # We don't need them anyway, so replace them by normal spaces return [ Markup(line.replace(' ', ' ')) for line in html.split('<br />') ]
def test_severity_change_ok(self): """ Tests the 'severity add' command in trac-admin. This particular test passes valid arguments and checks for success. """ test_name = sys._getframe().f_code.co_name cmd = 'severity change critical end-of-the-world' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err cmd = 'severity list' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def test_version_remove_ok(self): """ Tests the 'version remove' command in trac-admin. This particular test passes a valid argument and checks for success. """ test_name = sys._getframe().f_code.co_name cmd = 'version remove 1.0' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err cmd = 'version list' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def test_milestone_add_ok(self): """ Tests the 'milestone add' command in trac-admin. This particular test passes valid arguments and checks for success. """ test_name = sys._getframe().f_code.co_name new_years = time.strftime('%b %d, %Y', (2004, 1, 1, 0, 0, 0, 3, 1, -1)) cmd = 'milestone add new_milestone "%s"' % new_years trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err cmd = 'milestone list' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def test_permission_remove_multiple_actions_ok(self): """ Tests the 'permission remove' command in trac-admin. This particular test passes valid arguments to remove multiple permission and checks for success. """ test_name = sys._getframe().f_code.co_name cmd = 'permission remove anonymous WIKI_CREATE WIKI_MODIFY' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err cmd = 'permission list' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def test_version_remove_error_bad_version(self): """ Tests the 'version remove' command in trac-admin. This particular test tries to remove a version that does not exist. """ test_name = sys._getframe().f_code.co_name cmd = 'version remove bad_version' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def test_severity_change_error_bad_new_name(self): """ Tests the 'severity change' command in trac-admin. This particular test tries to change a severity to a name that already exists. """ test_name = sys._getframe().f_code.co_name cmd = 'severity change critical major' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def test_severity_add_error_already_exists(self): """ Tests the 'severity add' command in trac-admin. This particular test passes a severity name that already exists and checks for an error message. """ test_name = sys._getframe().f_code.co_name cmd = 'severity add blocker' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name], test_results
def test_component_chown_error_bad_component(self): """ Tests the 'component chown' command in trac-admin. This particular test tries to change the owner of a component that does not exist. """ test_name = sys._getframe().f_code.co_name cmd = 'component chown bad_component changed_owner' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def test_milestone_list_ok(self): """ Tests the 'milestone list' command in trac-admin. Since this command has no command arguments, it is hard to call it incorrectly. As a result, there is only this one test. """ test_name = sys._getframe().f_code.co_name cmd = 'milestone list' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def test_version_time_error_bad_version(self): """ Tests the 'version time' command in trac-admin. This particular test tries to change the time on a version that does not exist. """ test_name = sys._getframe().f_code.co_name new_years = time.strftime('%b %d, %Y', (2004, 1, 1, 0, 0, 0, 3, 1, -1)) cmd = 'version time bad_version "%s"' % new_years trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def test_version_add_error_already_exists(self): """ Tests the 'version add' command in trac-admin. This particular test passes a version name that already exists and checks for an error message. """ test_name = sys._getframe().f_code.co_name new_years = time.strftime('%b %d, %Y', (2004, 1, 1, 0, 0, 0, 3, 1, -1)) cmd = 'version add 1.0 "%s"' % new_years trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == self.expected_results[test_name]
def render(self, req, mimetype, content, filename=None, rev=None): #cmdline = '/usr/bin/groff -Tutf8 -a -mandoc ' cmdline = self.config.get('mimeviewer', 'groff_path') if len(cmdline) == 0: cmdline = '/usr/bin/groff' self.env.log.debug("groff got command line: %s" % cmdline) cmdline += ' -Thtml -P -r -P -l -mandoc ' self.env.log.debug("groff command line: %s" % cmdline) content = content_to_unicode(self.env, content, mimetype) cont = content.encode('utf-8') np = NaivePopen(cmdline, cont, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel, np.err) raise Exception, err return np.out
def render(self, req, mimetype, content, filename=None, rev=None): cmdline = self.config.get('mimeviewer', 'enscript_path') cmdline += ' --color -h -q --language=html -p - -E' + types[mimetype] self.env.log.debug("Enscript command line: %s" % cmdline) np = NaivePopen(cmdline, content, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel, np.err) raise Exception, err odata = np.out # Strip header and footer i = odata.find('<PRE>') beg = i > 0 and i + 6 i = odata.rfind('</PRE>') end = i > 0 and i or len(odata) odata = EnscriptDeuglifier().format(odata[beg:end]) return odata.splitlines()
def render(self, req, mimetype, content, filename=None, rev=None): cmdline = self.path mimetype = mimetype.split(';', 1)[0] # strip off charset mode = self._types[mimetype][0] cmdline += ' --color -h -q --language=html -p - -E%s' % mode self.env.log.debug("Enscript command line: %s" % cmdline) np = NaivePopen(cmdline, content.encode('utf-8'), capturestderr=1) if np.errorlevel or np.err: err = u"L'exécution de la commande (%s) a echoué: %s, %s." % \ (cmdline, np.errorlevel, np.err) raise Exception, err odata = np.out # Strip header and footer i = odata.find('<PRE>') beg = i > 0 and i + 6 i = odata.rfind('</PRE>') end = i > 0 and i or len(odata) odata = EnscriptDeuglifier().format(odata[beg:end].decode('utf-8')) return odata.splitlines()
def render(self, req, mimetype, content, filename=None, rev=None): cmdline = self.config.get('mimeviewer', 'php_path') # -n to ignore php.ini so we're using default colors cmdline += ' -sn' self.env.log.debug("PHP command line: %s" % cmdline) np = NaivePopen(cmdline, content, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel, np.err) raise Exception, err odata = ''.join(np.out.splitlines()[1:-1]) if odata.startswith('X-Powered-By'): raise TracError, 'You appear to be using the PHP CGI binary. ' \ 'Trac requires the CLI version for syntax ' \ 'highlighting.' html = PhpDeuglifier().format(odata) for line in html.split('<br />'): # PHP generates _way_ too many non-breaking spaces... # We don't need them anyway, so replace them by normal spaces yield line.replace(' ', ' ')
def test_about(self): """ Tests the 'about' command in trac-admin. Since the 'about' command has no command arguments, it is hard to call it incorrectly. As a result, there is only this one test. """ expected_results = """ Trac Admin Console %s ================================================================= %s %s """ % (trac.__version__, trac.__license_long__, trac.__credits__) cmd = 'about' trac_admin = 'trac-admin %s %s' % (self.env.path, cmd) np = NaivePopen(trac_admin, None, capturestderr=1) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % \ (trac_admin, np.errorlevel, np.err) raise Exception, err test_results = np.out assert test_results == expected_results
def render(self, context, mimetype, content, filename=None, rev=None): cmdline = self.path mimetype = mimetype.split(';', 1)[0] # strip off charset mode = self._types[mimetype][0] cmdline += ' --color -h -q --language=html -p - -E%s' % mode self.log.debug("Enscript command line: %s" % cmdline) np = NaivePopen(cmdline, content.encode('utf-8'), capturestderr=1) if np.errorlevel or np.err: self.env.disable_component(self) err = "Running enscript failed with (%s, %s), disabling " \ "EnscriptRenderer (command: '%s')" \ % (np.errorlevel, np.err.strip(), cmdline) raise Exception(err) odata = np.out # Strip header and footer i = odata.find('<PRE>') beg = i > 0 and i + 6 i = odata.rfind('</PRE>') end = i if i > 0 else len(odata) odata = EnscriptDeuglifier().format(odata[beg:end].decode('utf-8')) return [Markup(line) for line in odata.splitlines()]
def get_search_results(self, req, terms, filters): if not 'attachmenthyperest' in filters: return #estcmd.exeのパス estcmd_path = self.env.config.get('searchhyperestraier', 'estcmd_path', 'estcmd') #estcmd.exeの引数 estcmd_arg = self.env.config.get('searchhyperestraier', 'estcmd_arg', 'search -vx -sf -ic Shift_JIS') estcmd_encode = self.env.config.get('searchhyperestraier', 'estcmd_encode', 'mbcs') #インデックスのパス att_index_path = self.env.config.get('searchhyperestraier', 'att_index_path', '') #コマンド実行時のエンコード(Pythonでの形式) #estcmd_argと一致(?)させる必要有り。 #検索結果のパスの頭で削る文字列 #self.log.debug('attpath:%s' % os.path.normpath(self.env.path)) att_replace_left = os.path.join(os.path.normpath(self.env.path), 'attachments') #self.log.debug('attleft:%s' % att_replace_left) #cmdline = "%s %s %s %s" % (estcmd_path,estcmd_arg,att_index_path,unicode(query,'utf-8').encode('CP932')) qline = ' '.join(terms) cmdline = "%s %s %s %s" % (estcmd_path, estcmd_arg, att_index_path, qline) self.log.debug('SearchHyperEstraier:%s' % cmdline) cmdline = unicode(cmdline).encode(estcmd_encode) np = NaivePopen(cmdline) #self.log.debug('Result:%s' % unicode(np.out,'utf-8').encode('mbcs')) #self.log.debug('Result:%s' % np.out) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel, np.err) raise Exception, err if np.out == '': #添付ファイルフォルダに何も入ってない return dom = parseString(np.out) root = dom.documentElement #estresult_node = root.getElementsByTagName("document")[0] element_array = root.getElementsByTagName("document") for element in element_array: #self.log.debug('Result:%s' % 'hoge') url = "" title = "" date = 0 detail = "" author = "不明" #detailを生成 elem_array = element.getElementsByTagName("snippet") detail = self._get_innerText("", elem_array) #その他の属性を生成 attrelem_array = element.getElementsByTagName("attribute") for attrelem in attrelem_array: attr_name = attrelem.getAttribute("name") attr_value = unicode(attrelem.getAttribute( "value")) #添付ファイルはパスがquoteされたものになっている #URLとタイトルを生成 if attr_name == "_lreal": attr_value = attr_value[len(att_replace_left):].replace( "\\", "/") url = self.env.href.attachment("") #attachmentまでのurl取得 url = url + attr_value[1:] #[1:]は先頭の"/"を除くため #そのままunquoteすると文字化けするから title = urllib.unquote(attr_value).encode( 'raw_unicode_escape').decode('utf-8') title = "attachment" + title title = title.replace("/", ":") #更新日時を生成 elif attr_name == "@mdate": date = time.strptime(attr_value, "%Y-%m-%dT%H:%M:%SZ") self.log.debug('date:%s' % attr_value) date = to_datetime( datetime.datetime(date[0], date[1], date[2], date[3], date[4], date[5], 0, utc)) # for Trac0.11 yield (url, title, date, to_unicode(author, 'utf-8'), to_unicode(detail, 'utf-8')) return
def get_search_results(self, req, terms, filters): if not 'changesethyperest' in filters: return #estcmd.exeのパス estcmd_path = self.env.config.get('searchhyperestraier', 'estcmd_path', 'estcmd') #estcmd.exeの引数 estcmd_arg = self.env.config.get('searchhyperestraier', 'estcmd_arg', 'search -vx -sf -ic Shift_JIS') estcmd_encode = self.env.config.get('searchhyperestraier', 'estcmd_encode', 'mbcs') #for multi repos for option in self.config['searchhyperestraier']: #リポジトリのパス if not option.endswith('.cs_index_path'): continue mrepstr = option[:-len( '.cs_index_path')] #'.cs_index_path'の前の文字列がreponame if RepositoryManager(self.env).get_repository( mrepstr) is None: #mrepstrのrepositoryがない continue repoinfo = RepositoryManager(self.env).get_all_repositories().get( mrepstr, {}) #self.log.debug('type:%s' % repoinfo.get('type')) if repoinfo.get( 'type') != 'direct-svnfs': #'direct-svnfs'のリポジトリでない continue #インデックスのパス cs_index_path = self.env.config.get('searchhyperestraier', mrepstr + '.cs_index_path', '') if cs_index_path == '': #mrepstr+'.cs_index_path'がない continue if mrepstr != '': #defaultでない mrepstr = '/' + mrepstr #cmdline = "%s %s %s %s" % (estcmd_path,estcmd_arg,cs_index_path,unicode(query,'utf-8').encode('CP932')) qline = ' '.join(terms) cmdline = "%s %s %s %s" % (estcmd_path, estcmd_arg, cs_index_path, qline) self.log.debug('SearchChangesetHyperEstraier:%s' % cmdline) cmdline = unicode(cmdline).encode(estcmd_encode) np = NaivePopen(cmdline) #self.log.debug('Result:%s' % unicode(np.out,'utf-8').encode('mbcs')) #self.log.debug('Result:%s' % np.out) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel, np.err) raise Exception, err if np.out == '': #何も入ってない continue dom = parseString(np.out) root = dom.documentElement #estresult_node = root.getElementsByTagName("document")[0] element_array = root.getElementsByTagName("document") for element in element_array: #self.log.debug('Result:%s' % 'hoge') url = "" title = "" date = 0 detail = "" author = "不明" #detailを生成 elem_array = element.getElementsByTagName("snippet") detail = self._get_innerText("", elem_array) #その他の属性を生成 attrelem_array = element.getElementsByTagName("attribute") for attrelem in attrelem_array: attr_name = attrelem.getAttribute("name") attr_value = unicode(attrelem.getAttribute("value")) #URLとタイトルを生成 if attr_name == "_lreal": attr_value = attr_value.replace(".txt", "") end = len(attr_value) for m in range(1, end): if not attr_value[(end - m):].isdigit(): break attr_value = attr_value[ (end - m + 1):] + mrepstr #数字の文字列 + mrepstr url = self.env.href('/changeset/' + attr_value) title = "changeset:" + attr_value #更新日時を生成 elif attr_name == "@mdate": date = time.strptime(attr_value, "%Y-%m-%dT%H:%M:%SZ") self.log.debug('date:%s' % attr_value) date = to_datetime( datetime.datetime(date[0], date[1], date[2], date[3], date[4], date[5], 0, utc)) # for Trac0.11 yield (url, title, date, to_unicode(author, 'utf-8'), to_unicode(detail, 'utf-8')) return
def get_search_results(self, req, terms, filters): if not 'repositoryhyperest' in filters: return #estcmd.exeのパス estcmd_path = self.env.config.get('searchhyperestraier', 'estcmd_path', 'estcmd') #estcmd.exeの引数 estcmd_arg = self.env.config.get('searchhyperestraier', 'estcmd_arg', 'search -vx -sf -ic Shift_JIS') estcmd_encode = self.env.config.get('searchhyperestraier', 'estcmd_encode', 'mbcs') #Tracのブラウザへのリンクを作るか否か。 #enabled:Tracのブラウザへのリンクを作る #上記以外:replace_left,url_leftで指定したURLへのリンクを作る browse_trac = self.env.config.get('searchhyperestraier', 'browse_trac', 'enabled') #for multi repos for option in self.config['searchhyperestraier']: #リポジトリのパス if not option.endswith('.index_path'): continue mrepstr = option[:-len( '.index_path')] #'.index_path'の前の文字列がreponame if RepositoryManager(self.env).get_repository( mrepstr) is None: #mrepstrのrepositoryがない continue #インデックスのパス index_path = self.env.config.get('searchhyperestraier', mrepstr + '.index_path', '') if index_path == '': #mrepstr+'.index_path'がない continue #検索結果のパスの頭で削る文字列 replace_left = self.env.config.get('searchhyperestraier', mrepstr + '.replace_left', '') if replace_left == '': #mrepstr+'.replace_left'がない continue #URLを生成する際に頭につける文字列 #browse_trac=enabledの場合は/がリポジトリのルートになるように url_left = self.env.config.get('searchhyperestraier', mrepstr + '.url_left', '') if url_left == '': #mrepstr+'.url_left'がない continue if mrepstr != '': #defaultでない url_left = '/' + mrepstr + url_left #cmdline = "%s %s %s %s" % (estcmd_path,estcmd_arg,index_path,unicode(query,'utf-8').encode('CP932')) qline = ' '.join(terms) cmdline = "%s %s %s %s" % (estcmd_path, estcmd_arg, index_path, qline) self.log.debug('SearchHyperEstraier:%s' % cmdline) cmdline = unicode(cmdline).encode(estcmd_encode) np = NaivePopen(cmdline) #self.log.debug('Result:%s' % unicode(np.out,'utf-8').encode('mbcs')) #self.log.debug('Result:%s' % np.out) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel, np.err) raise Exception, err if np.out == '': #何も入ってない continue dom = parseString(np.out) root = dom.documentElement #estresult_node = root.getElementsByTagName("document")[0] element_array = root.getElementsByTagName("document") for element in element_array: #self.log.debug('Result:%s' % 'hoge') url = "" title = "" date = 0 detail = "" author = "不明" #detailを生成 elem_array = element.getElementsByTagName("snippet") detail = self._get_innerText("", elem_array) #その他の属性を生成 attrelem_array = element.getElementsByTagName("attribute") for attrelem in attrelem_array: attr_name = attrelem.getAttribute("name") attr_value = unicode(attrelem.getAttribute("value")) #URLとタイトルを生成 #if attr_name == "_lreal": #"_lreal"ではファイル名に' 'などが入っている場合対応できない # attr_value=attr_value[len(replace_left):].replace("\\","/") # if browse_trac == "enabled": # url = self.env.href.browser(url_left + attr_value) # title = "source:"+ url_left + attr_value # else: # url = url_left + attr_value # title = url_left + attr_value if attr_name == "_lpath": #s-jisをquoteしたもの("file:///C|/TracLight/…"の形式) attr_value = urllib.unquote(attr_value).encode( 'raw_unicode_escape').decode('CP932') attr_value = attr_value[(len('file:///') + len(replace_left)):] if browse_trac == "enabled": url = self.env.href.browser(url_left + attr_value) title = "source:" + urllib.unquote(url).encode( 'raw_unicode_escape').decode('utf-8') else: url = url_left + attr_value title = urllib.unquote(url).encode( 'raw_unicode_escape').decode('utf-8') #更新日時を生成 elif attr_name == "@mdate": date = time.strptime(attr_value, "%Y-%m-%dT%H:%M:%SZ") self.log.debug('date:%s' % attr_value) date = to_datetime( datetime.datetime(date[0], date[1], date[2], date[3], date[4], date[5], 0, utc)) # for Trac0.11 yield (url, title, date, to_unicode(author, 'utf-8'), to_unicode(detail, 'utf-8')) return
def get_search_results(self, req, terms, filters): if not 'documenthyperest' in filters: return #estcmd.exeのパス estcmd_path = self.env.config.get('searchhyperestraier', 'estcmd_path', 'estcmd') #estcmd.exeの引数 estcmd_arg = self.env.config.get('searchhyperestraier', 'estcmd_arg', 'search -vx -sf -ic Shift_JIS') estcmd_encode = self.env.config.get('searchhyperestraier', 'estcmd_encode', 'mbcs') #インデックスのパス doc_index_path = self.env.config.get('searchhyperestraier', 'doc_index_path', '') #コマンド実行時のエンコード(Pythonでの形式) #estcmd_argと一致(?)させる必要有り。 #検索結果のパスの頭で削る文字列 doc_replace_left = self.env.config.get('searchhyperestraier', 'doc_replace_left', '') #tracやsvnと同じならびにくるドキュメントのフォルダ名 doc_url_left = self.env.config.get('searchhyperestraier', 'doc_url_left', 'doc') #cmdline = "%s %s %s %s" % (estcmd_path,estcmd_arg,doc_index_path,unicode(query,'utf-8').encode('CP932')) qline = ' '.join(terms) cmdline = "%s %s %s %s" % (estcmd_path, estcmd_arg, doc_index_path, qline) self.log.debug('SearchHyperEstraier:%s' % cmdline) cmdline = unicode(cmdline).encode(estcmd_encode) np = NaivePopen(cmdline) #self.log.debug('Result:%s' % unicode(np.out,'utf-8').encode('mbcs')) #self.log.debug('Result:%s' % np.out) if np.errorlevel or np.err: err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel, np.err) raise Exception, err if np.out == '': #ドキュメントフォルダに何も入ってない return dom = parseString(np.out) root = dom.documentElement #estresult_node = root.getElementsByTagName("document")[0] element_array = root.getElementsByTagName("document") for element in element_array: #self.log.debug('Result:%s' % 'hoge') url = "" title = "" date = 0 detail = "" author = "不明" #detailを生成 elem_array = element.getElementsByTagName("snippet") detail = self._get_innerText("", elem_array) #その他の属性を生成 attrelem_array = element.getElementsByTagName("attribute") for attrelem in attrelem_array: attr_name = attrelem.getAttribute("name") attr_value = unicode(attrelem.getAttribute("value")) #URLとタイトルを生成 #if attr_name == "_lreal": #"_lreal"ではファイル名に' 'などが入っている場合対応できない # attr_value=attr_value[len(doc_replace_left):].replace("\\","/") # title = doc_url_left + attr_value # url = urllib.quote(title.encode('utf-8')) # title = '/' + title if attr_name == "_lpath": #s-jisをquoteしたもの("file:///C|/TracLight/…"の形式) attr_value = urllib.unquote(attr_value).encode( 'raw_unicode_escape').decode('CP932') attr_value = attr_value[(len('file:///') + len(doc_replace_left)):] #url = doc_url_left + attr_value #title = '/' + urllib.unquote(url) title = '/' + doc_url_left + attr_value url = urllib.quote( (doc_url_left + attr_value).encode('utf-8')) #更新日時を生成 elif attr_name == "@mdate": date = time.strptime(attr_value, "%Y-%m-%dT%H:%M:%SZ") self.log.debug('date:%s' % attr_value) date = to_datetime( datetime.datetime(date[0], date[1], date[2], date[3], date[4], date[5], 0, utc)) # for Trac0.11 yield (url, title, date, to_unicode(author, 'utf-8'), to_unicode(detail, 'utf-8')) return