More compression: group objects by prefix.

This commit is contained in:
Georg Brandl
2008-09-24 09:31:46 +00:00
parent 7a2d4f0f27
commit 0cc9cc5eaa
2 changed files with 41 additions and 26 deletions

View File

@@ -15,7 +15,7 @@ from cStringIO import StringIO
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 @@ class IndexBuilder(object):
# 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 @@ class IndexBuilder(object):
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 @@ class IndexBuilder(object):
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()),
)

View File

@@ -294,7 +294,7 @@ var Search = {
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 Search = {
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 @@ var Search = {
});
// combine both
var results = regularResults.concat(keywordResults);
var results = regularResults.concat(objectResults);
// print the results
var resultCount = results.length;