Changeset 871
- Timestamp:
- 06/15/06 10:45:10 (2 years ago)
- Files:
-
- doxygenplugin/0.9/doxygentrac/doxygentrac.py (modified) (13 diffs)
- doxygenplugin/0.9/doxygentrac/htdocs (added)
- doxygenplugin/0.9/doxygentrac/htdocs/css (added)
- doxygenplugin/0.9/doxygentrac/htdocs/css/doxygen.css (added)
- doxygenplugin/0.9/setup.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
doxygenplugin/0.9/doxygentrac/doxygentrac.py
r361 r871 10 10 import posixpath 11 11 import re 12 import mimetypes 12 13 13 14 from trac.core import * 14 15 from trac.web import IRequestHandler 15 from trac.web.chrome import INavigationContributor, ITemplateProvider 16 from trac.perm import IPermissionRequestor 17 from trac.web.chrome import INavigationContributor, ITemplateProvider, add_stylesheet 16 18 from trac.Search import ISearchSource 17 19 from trac.util import Markup … … 22 24 elif x['rank'] > y['rank']: 23 25 return -1 24 25 26 return 1 26 27 27 28 class DoxygenPlugin(Component): 28 implements(INavigationContributor, IRequestHandler, ITemplateProvider, ISearchSource) 29 implements(IPermissionRequestor, INavigationContributor, IRequestHandler, 30 ITemplateProvider, ISearchSource) 31 32 # IPermissionRequestor methods 33 34 def get_permission_actions(self): 35 return ['DOXYGEN_VIEW'] 29 36 30 37 # INavigationContributor methods … … 33 40 return 'doxygen' 34 41 def get_navigation_items(self, req): 35 yield ('mainnav', 'doxygen', Markup('<a href="%s">Doxygen</a>', self.env.href.doxygen())) 42 if req.perm.has_permission('DOXYGEN_VIEW'): 43 # Get config variables 44 title = self.env.config.get('doxygen', 'title', 'Doxygen') 45 index = self.env.config.get('doxygen', 'index', 'main.html') 46 47 # Return mainnav buttons 48 yield 'mainnav', 'doxygen', Markup('<a href="%s">%s</a>' % \ 49 (self.env.href.doxygen(index), title)) 36 50 37 51 # IRequestHandler methods 38 52 39 53 def match_request(self, req): 40 if req.path_info == '/doxygen': 41 req.args['path'] = ''.join([self.config.get('doxygen', 'path'), '/main.html']) 54 # Get config variables 55 base_path = self.config.get('doxygen', 'path', '/var/lib/trac/doxygen') 56 ext = self.config.get('doxygen', 'ext', 'htm html png') 57 ext = '|'.join(ext.split(' ')) 58 59 # Match searching request 60 if re.match('^/doxygen/search.php$', req.path_info): 42 61 return True 43 elif re.match(r'''^/.*[.]html$''', req.path_info): 44 self.log.debug("path = %s" % (req.path_info)) 45 path = ''.join([self.config.get('doxygen', 'path'), req.path_info]) 62 63 # Match request if requested file exists 64 elif re.match(r'''^/doxygen/.*[.](%s)$''' % (ext), req.path_info): 65 file = re.sub('^/doxygen', '', req.path_info) 66 path = base_path + file 46 67 req.args['path'] = path 68 req.args['type'] = mimetypes.guess_type(path)[0] 47 69 return os.path.exists(path) 48 49 return False70 else: 71 return False 50 72 51 73 def process_request(self, req): 52 req.hdf['doxygen.path'] = req.args['path'] 53 return 'doxygen.cs', 'text/html' 74 # Get request arguments 75 path = req.args.get('path') 76 type = req.args.get('type') 77 78 # Retrun apropriate content to type or search request 79 if req.args.has_key('query'): 80 req.redirect('%s?q=%s&doxygen=on' % (self.env.href.search(), 81 req.args.get('query'))) 82 return None, None 83 elif type == 'text/html': 84 #add_stylesheet(req, 'doxygen/css/doxygen.css') 85 req.hdf['doxygen.path'] = path 86 return 'doxygen.cs', type 87 else: 88 req.send_file(path, type) 89 return None, None 54 90 55 91 # ITemplateProvider methods 92 93 def get_htdocs_dirs(self): 94 from pkg_resources import resource_filename 95 return [('doxygen', resource_filename(__name__, 'htdocs'))] 56 96 57 97 def get_templates_dirs(self): … … 60 100 61 101 # ISearchProvider methods 62 102 63 103 def get_search_filters(self, req): 64 yield('doxygen', 'Doxygen') 104 if req.perm.has_permission('DOXYGEN_VIEW'): 105 # Get config variables 106 title = self.env.config.get('doxygen', 'title', 'Doxygen') 107 108 yield('doxygen', title) 65 109 66 110 def get_search_results(self, req, query, filters): … … 71 115 else: 72 116 keywords = query.split(' ') 73 117 74 118 path = self.config.get('doxygen', 'path') 75 path = ''.join([path, '/search.idx'])76 77 if os.path.exists(path): 119 path = os.path.join(path, 'search.idx') 120 121 if os.path.exists(path): 78 122 fd = open(path) 79 123 80 124 results = [] 81 125 for keyword in keywords: 82 126 results += self._search(fd, keyword) 83 84 results.sort(compare_rank) 85 86 # use the creation time for the search.idx file for all results 127 128 results.sort(compare_rank) 129 130 # use the creation time for the search.idx file for all results 87 131 creation = os.path.getctime(path) 88 132 89 133 for result in results: 90 yield result['url'], result['name'], creation, 'doxygen', None91 134 yield 'doxygen/' + result['url'], result['name'], creation, 'doxygen', None 135 92 136 # internal methods 93 137 94 138 def _search(self, fd, word): 95 139 results = [] … … 98 142 fd.seek(index * 4 + 4, 0) 99 143 index = self._readInt(fd) 100 144 101 145 if index: 102 146 fd.seek(index) … … 109 153 matches.append({'word' : word, 'match' : w, 'index' : statIdx, 'full' : len(low) == len(w)}) 110 154 w = self._readString(fd) 111 155 112 156 count = 0 113 157 totalHi = 0 … … 122 166 fd.seek(match['index']) 123 167 numDocs = self._readInt(fd) 124 168 125 169 for i in range(numDocs): 126 170 idx = self._readInt(fd) … … 132 176 else: 133 177 totalFreqLo += freq * multiplier 134 178 135 179 for i in range(numDocs): 136 180 fd.seek(results[count]['idx']) … … 140 184 results[count]['url'] = url 141 185 count += 1 142 186 143 187 totalFreq = (totalHi + 1) * totalFreqLo + totalFreqHi 144 188 for i in range(count): … … 149 193 else: 150 194 results[i]['rank'] = float((freq * multi)) / float(totalFreq) 151 195 152 196 return results 153 197 … … 155 199 if len(word) < 2: 156 200 return -1 157 201 158 202 hi = ord(word[0].lower()) 159 203 if hi == 0: 160 204 return -1 161 205 162 206 lo = ord(word[1].lower()) 163 207 if lo == 0: 164 208 return -1 165 209 166 210 return hi * 256 + lo 167 211 168 212 def _readInt(self, fd): 169 213 b1 = fd.read(1) … … 171 215 b3 = fd.read(1) 172 216 b4 = fd.read(1) 173 217 174 218 return (ord(b1) << 24) | (ord(b2) << 16) | (ord(b3) << 8) | ord(b4) 175 176 219 177 220 def _readString(self, fd): 178 221 byte = fd.read(1) 179 222 if byte == '\0': 180 return ""223 return '' 181 224 result = byte 182 225 while byte != '\0': 183 226 byte = fd.read(1) 184 227 result = ''.join([result, byte]) 185 228 186 229 return result 187 doxygenplugin/0.9/setup.py
r231 r871 7 7 description='Doxygen plugin for Trac', 8 8 keywords='trac doxygen', 9 version='0. 1',9 version='0.2', 10 10 url='http://trac-hacks.swapoff.org/wiki/DoxygenPlugin', 11 11 license = """Copyright (C) 2005 Jason Parks <jparks@jparks.net> … … 37 37 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 38 38 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.""", 39 author='Jason Parks ',39 author='Jason Parks, Radek BartoÅ', 40 40 author_email='jparks@jparks.net', 41 41 long_description=""" … … 43 43 zip_safe=True, 44 44 packages=['doxygentrac'], 45 package_data={'doxygentrac': ['templates/*.cs' ]},45 package_data={'doxygentrac': ['templates/*.cs', 'htdocs/css/*.css']}, 46 46 entry_points={'trac.plugins': 'doxygentrac = doxygentrac.doxygentrac'})
