mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
More compression: group objects by prefix.
This commit is contained in:
@@ -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()),
|
||||
)
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user