[Python-checkins] r66584 - in doctools/trunk/sphinx: search.py static/searchtools.js util/json.py
georg.brandl
python-checkins at python.org
Wed Sep 24 13:51:03 CEST 2008
Author: georg.brandl
Date: Wed Sep 24 13:51:02 2008
New Revision: 66584
Log:
A fix in the JS dumper and further compression by omitting redundant braces.
Modified:
doctools/trunk/sphinx/search.py
doctools/trunk/sphinx/static/searchtools.js
doctools/trunk/sphinx/util/json.py
Modified: doctools/trunk/sphinx/search.py
==============================================================================
--- doctools/trunk/sphinx/search.py (original)
+++ doctools/trunk/sphinx/search.py Wed Sep 24 13:51:02 2008
@@ -32,6 +32,7 @@
was will with
""".split())
+
class _JavaScriptIndex(object):
"""
The search index as javascript file that calls a function
@@ -44,8 +45,7 @@
SUFFIX = ')'
def dumps(self, data):
- return self.PREFIX + json.dumps(data, separators=(',', ':')) \
- + self.SUFFIX
+ return self.PREFIX + json.dumps(data) + self.SUFFIX
def loads(self, s):
data = s[len(self.PREFIX):-len(self.SUFFIX)]
@@ -119,8 +119,12 @@
raise ValueError('old format')
index2fn = frozen['filenames']
self._titles = dict(zip(index2fn, frozen['titles']))
- self._mapping = dict((k, set(index2fn[i] for i in v))
- for (k, v) in frozen['terms'].iteritems())
+ self._mapping = {}
+ for k, v in frozen['terms'].iteritems():
+ if isinstance(v, int):
+ self._mapping[k] = set([index2fn[v]])
+ else:
+ self._mapping[k] = set(index2fn[i] for i in v)
# no need to load keywords/desctypes
def dump(self, stream, format):
@@ -149,6 +153,16 @@
pdict[name] = (fn2index[doc], i)
return rv
+ def get_terms(self, fn2index):
+ rv = {}
+ for k, v in self._mapping.iteritems():
+ if len(v) == 1:
+ fn, = v
+ rv[k] = fn2index[fn]
+ else:
+ rv[k] = [fn2index[fn] for fn in v]
+ return rv
+
def freeze(self):
"""Create a usable data structure for serializing."""
filenames = self._titles.keys()
@@ -157,8 +171,7 @@
return dict(
filenames=filenames,
titles=titles,
- terms=dict((k, [fn2index[fn] for fn in v])
- for (k, v) in self._mapping.iteritems()),
+ terms=self.get_terms(fn2index),
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 13:51:02 2008
@@ -287,12 +287,12 @@
},
query : function(query) {
- // stem the searchwords and add them to the
+ // stem the searchterms and add them to the
// correct list
var stemmer = new PorterStemmer();
- var searchwords = [];
+ var searchterms = [];
var excluded = [];
- var hlwords = [];
+ var hlterms = [];
var tmp = query.split(/\s+/);
var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
for (var i = 0; i < tmp.length; i++) {
@@ -304,23 +304,23 @@
word = word.substr(1);
}
else {
- var toAppend = searchwords;
- hlwords.push(tmp[i].toLowerCase());
+ var toAppend = searchterms;
+ hlterms.push(tmp[i].toLowerCase());
}
// only add if not already in the list
if (!$.contains(toAppend, word))
toAppend.push(word);
};
- var highlightstring = '?highlight=' + $.urlencode(hlwords.join(" "));
+ var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
console.debug('SEARCH: searching for:');
- console.info('required: ', searchwords);
+ console.info('required: ', searchterms);
console.info('excluded: ', excluded);
// prepare search
var filenames = this._index.filenames;
var titles = this._index.titles;
- var words = this._index.terms;
+ var terms = this._index.terms;
var descrefs = this._index.descrefs;
var modules = this._index.modules;
var desctypes = this._index.desctypes;
@@ -343,7 +343,7 @@
for (var name in descrefs[prefix]) {
if (name.toLowerCase().indexOf(object) > -1) {
match = descrefs[prefix][name];
- fullname = prefix + '.' + name;
+ fullname = (prefix ? prefix + '.' : '') + name;
descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
}
@@ -357,12 +357,15 @@
});
- // perform the search on the required words
- for (var i = 0; i < searchwords.length; i++) {
- var word = searchwords[i];
+ // perform the search on the required terms
+ for (var i = 0; i < searchterms.length; i++) {
+ var word = searchterms[i];
// no match but word was a required one
- if ((files = words[word]) == null)
+ if ((files = terms[word]) == null)
break;
+ if (files.length == undefined) {
+ files = [files];
+ }
// create the mapping
for (var j = 0; j < files.length; j++) {
var file = files[j];
@@ -373,18 +376,19 @@
}
}
- // now check if the files don't contain excluded words
+ // now check if the files don't contain excluded terms
for (var file in fileMap) {
var valid = true;
// check if all requirements are matched
- if (fileMap[file].length != searchwords.length)
+ if (fileMap[file].length != searchterms.length)
continue;
- // ensure that none of the excluded words is in the
+ // ensure that none of the excluded terms is in the
// search result.
for (var i = 0; i < excluded.length; i++) {
- if ($.contains(words[excluded[i]] || [], file)) {
+ if (terms[excluded[i]] == file ||
+ $.contains(terms[excluded[i]] || [], file)) {
valid = false;
break;
}
@@ -398,7 +402,7 @@
// delete unused variables in order to not waste
// memory until list is retrieved completely
- delete filenames, titles, words;
+ delete filenames, titles, terms;
// now sort the regular results descending by title
regularResults.sort(function(a, b) {
@@ -429,7 +433,7 @@
});
} else {
$.get('_sources/' + item[0] + '.txt', function(data) {
- listItem.append($.makeSearchSummary(data, searchwords, hlwords));
+ listItem.append($.makeSearchSummary(data, searchterms, hlterms));
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
Modified: doctools/trunk/sphinx/util/json.py
==============================================================================
--- doctools/trunk/sphinx/util/json.py (original)
+++ doctools/trunk/sphinx/util/json.py Wed Sep 24 13:51:02 2008
@@ -20,6 +20,7 @@
_str_re = re.compile(r'"(\\\\|\\"|[^"])*"')
_int_re = re.compile(r'\d+')
_name_re = re.compile(r'[a-zA-Z]\w*')
+_nameonly_re = re.compile(r'[a-zA-Z]\w*$')
# escape \, ", control characters and everything outside ASCII
ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
@@ -78,7 +79,7 @@
if key:
if not isinstance(obj, basestring):
obj = str(obj)
- if _name_re.match(obj) and obj not in reswords:
+ if _nameonly_re.match(obj) and obj not in reswords:
return obj # return it as a bare word
else:
return encode_string(obj)
More information about the Python-checkins
mailing list