[Python-checkins] r66578 - in doctools/trunk/sphinx: search.py static/searchtools.js

georg.brandl python-checkins at python.org
Wed Sep 24 11:31:46 CEST 2008


Author: georg.brandl
Date: Wed Sep 24 11:31:46 2008
New Revision: 66578

Log:
More compression: group objects by prefix.


Modified:
   doctools/trunk/sphinx/search.py
   doctools/trunk/sphinx/static/searchtools.js

Modified: doctools/trunk/sphinx/search.py
==============================================================================
--- doctools/trunk/sphinx/search.py	(original)
+++ doctools/trunk/sphinx/search.py	Wed Sep 24 11:31:46 2008
@@ -15,7 +15,7 @@
 from docutils.nodes import Text, NodeVisitor
 
 from sphinx.util.stemmer import PorterStemmer
-from sphinx.util import json
+from sphinx.util import json, rpartition
 
 
 word_re = re.compile(r'\w+(?u)')
@@ -107,7 +107,7 @@
         # stemmed word -> set(filenames)
         self._mapping = {}
         # desctypes -> index
-        self._desctypes = {'module': 0}
+        self._desctypes = {}
 
     def load(self, stream, format):
         """Reconstruct from frozen data."""
@@ -129,19 +129,24 @@
             format = self.formats[format]
         format.dump(self.freeze(), stream)
 
-    def get_keyword_map(self):
-        """Return a dict of all keywords."""
+    def get_modules(self, fn2index):
+        rv = {}
+        for name, (doc, _, _, _) in self.env.modules.iteritems():
+            rv[name] = fn2index[doc]
+        return rv
+
+    def get_descrefs(self, fn2index):
         rv = {}
         dt = self._desctypes
-        for kw, (ref, _, _, _) in self.env.modules.iteritems():
-            rv[kw] = (ref, 0)
-        for kw, (ref, ref_type) in self.env.descrefs.iteritems():
+        for fullname, (doc, desctype) in self.env.descrefs.iteritems():
+            prefix, name = rpartition(fullname, '.')
+            pdict = rv.setdefault(prefix, {})
             try:
-                i = dt[ref_type]
+                i = dt[desctype]
             except KeyError:
                 i = len(dt)
-                dt[ref_type] = i
-            rv[kw] = (ref, i)
+                dt[desctype] = i
+            pdict[name] = (fn2index[doc], i)
         return rv
 
     def freeze(self):
@@ -154,8 +159,8 @@
             titles=titles,
             terms=dict((k, [fn2index[fn] for fn in v])
                        for (k, v) in self._mapping.iteritems()),
-            keywords=dict((k, (fn2index[v[0]],) + v[1:]) for k, v in
-                          self.get_keyword_map().iteritems()),
+            descrefs=self.get_descrefs(fn2index),
+            modules=self.get_modules(fn2index),
             desctypes=dict((v, k) for (k, v) in self._desctypes.items()),
         )
 

Modified: doctools/trunk/sphinx/static/searchtools.js
==============================================================================
--- doctools/trunk/sphinx/static/searchtools.js	(original)
+++ doctools/trunk/sphinx/static/searchtools.js	Wed Sep 24 11:31:46 2008
@@ -294,7 +294,7 @@
     var excluded = [];
     var hlwords = [];
     var tmp = query.split(/\s+/);
-    var keyword = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
+    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
     for (var i = 0; i < tmp.length; i++) {
       // stem the word
       var word = stemmer.stemWord(tmp[i]).toLowerCase();
@@ -321,28 +321,38 @@
     var filenames = this._index.filenames;
     var titles = this._index.titles;
     var words = this._index.terms;
-    var keywords = this._index.keywords;
+    var descrefs = this._index.descrefs;
+    var modules = this._index.modules;
     var desctypes = this._index.desctypes;
     var fileMap = {};
     var files = null;
-    var keywordResults = [];
+    var objectResults = [];
     var regularResults = [];
     $('#search-progress').empty();
 
-    // lookup as keyword
-    if (keyword != null) {
-      for (var kw in keywords) {
-        if (kw.toLowerCase().indexOf(keyword, kw.lastIndexOf('.')) > -1) {
-          match = keywords[kw];
-          descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
-          anchor = '#' + (match[1] == 0 ? 'module-' + kw : kw);
-          keywordResults.push([filenames[match[0]], kw, anchor, descr]);
+    // lookup as object
+    if (object != null) {
+      for (var module in modules) {
+        if (module.indexOf(object) > -1) {
+          fn = modules[module];
+          descr = _('module, in ') + titles[fn];
+          objectResults.push([filenames[fn], module, '#module-'+module, descr]);
+        }
+      }
+      for (var prefix in descrefs) {
+        for (var name in descrefs[prefix]) {
+          if (name.toLowerCase().indexOf(object) > -1) {
+            match = descrefs[prefix][name];
+            fullname = prefix + '.' + name;
+            descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
+            objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
+          }
         }
       }
     }
 
-    // sort descending by keyword
-    keywordResults.sort(function(a, b) {
+    // sort results descending
+    objectResults.sort(function(a, b) {
       return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
     });
 
@@ -398,7 +408,7 @@
     });
 
     // combine both
-    var results = regularResults.concat(keywordResults);
+    var results = regularResults.concat(objectResults);
 
     // print the results
     var resultCount = results.length;


More information about the Python-checkins mailing list