mirror of
https://github.com/ThePhD/sol2.git
synced 2024-03-22 13:10:44 +08:00
Fixed (hopefully) broken links in search results when performing a local search.
This commit is contained in:
parent
4b58b4ace3
commit
b1b121d8d0
|
@ -1,5 +1,7 @@
|
||||||
{%- extends "haiku/layout.html" %}
|
{%- extends "haiku/layout.html" %}
|
||||||
|
|
||||||
|
{% set script_files = script_files + ["_static/search-fix.js"] %}
|
||||||
|
|
||||||
{% block haikuheader %}
|
{% block haikuheader %}
|
||||||
<div class="header-left">
|
<div class="header-left">
|
||||||
{{ super() }}
|
{{ super() }}
|
||||||
|
@ -11,4 +13,4 @@
|
||||||
<input type="submit" value="search">
|
<input type="submit" value="search">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
150
docs/source/_themes/sol2/static/search-fix.js_t
Normal file
150
docs/source/_themes/sol2/static/search-fix.js_t
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
Search.query = function(query) {
|
||||||
|
var i;
|
||||||
|
var stopwords = {{ search_language_stop_words }};
|
||||||
|
|
||||||
|
// stem the searchterms and add them to the correct list
|
||||||
|
var stemmer = new Stemmer();
|
||||||
|
var searchterms = [];
|
||||||
|
var excluded = [];
|
||||||
|
var hlterms = [];
|
||||||
|
var tmp = query.split(/\s+/);
|
||||||
|
var objectterms = [];
|
||||||
|
for (i = 0; i < tmp.length; i++) {
|
||||||
|
if (tmp[i] !== "") {
|
||||||
|
objectterms.push(tmp[i].toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i].match(/^\d+$/) ||
|
||||||
|
tmp[i] === "") {
|
||||||
|
// skip this "word"
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// stem the word
|
||||||
|
var word = stemmer.stemWord(tmp[i].toLowerCase());
|
||||||
|
var toAppend;
|
||||||
|
// select the correct list
|
||||||
|
if (word[0] == '-') {
|
||||||
|
toAppend = excluded;
|
||||||
|
word = word.substr(1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
toAppend = searchterms;
|
||||||
|
hlterms.push(tmp[i].toLowerCase());
|
||||||
|
}
|
||||||
|
// only add if not already in the list
|
||||||
|
if (!$u.contains(toAppend, word))
|
||||||
|
toAppend.push(word);
|
||||||
|
}
|
||||||
|
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
|
||||||
|
|
||||||
|
// prepare search
|
||||||
|
var terms = this._index.terms;
|
||||||
|
var titleterms = this._index.titleterms;
|
||||||
|
|
||||||
|
// array of [filename, title, anchor, descr, score]
|
||||||
|
var results = [];
|
||||||
|
$('#search-progress').empty();
|
||||||
|
|
||||||
|
// lookup as object
|
||||||
|
for (i = 0; i < objectterms.length; i++) {
|
||||||
|
var others = [].concat(objectterms.slice(0, i),
|
||||||
|
objectterms.slice(i+1, objectterms.length));
|
||||||
|
results = results.concat(this.performObjectSearch(objectterms[i], others));
|
||||||
|
}
|
||||||
|
|
||||||
|
// lookup as search terms in fulltext
|
||||||
|
results = results.concat(this.performTermsSearch(searchterms, excluded, terms, Scorer.term))
|
||||||
|
.concat(this.performTermsSearch(searchterms, excluded, titleterms, Scorer.title));
|
||||||
|
|
||||||
|
// let the scorer override scores with a custom scoring function
|
||||||
|
if (Scorer.score) {
|
||||||
|
for (i = 0; i < results.length; i++)
|
||||||
|
results[i][4] = Scorer.score(results[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// now sort the results by score (in opposite order of appearance, since the
|
||||||
|
// display function below uses pop() to retrieve items) and then
|
||||||
|
// alphabetically
|
||||||
|
results.sort(function(a, b) {
|
||||||
|
var left = a[4];
|
||||||
|
var right = b[4];
|
||||||
|
if (left > right) {
|
||||||
|
return 1;
|
||||||
|
} else if (left < right) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
// same score: sort alphabetically
|
||||||
|
left = a[1].toLowerCase();
|
||||||
|
right = b[1].toLowerCase();
|
||||||
|
return (left > right) ? -1 : ((left < right) ? 1 : 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// for debugging
|
||||||
|
//Search.lastresults = results.slice(); // a copy
|
||||||
|
//console.info('search results:', Search.lastresults);
|
||||||
|
|
||||||
|
// print the results
|
||||||
|
var resultCount = results.length;
|
||||||
|
function displayNextItem() {
|
||||||
|
// results left, load the summary and display it
|
||||||
|
if (results.length) {
|
||||||
|
var item = results.pop();
|
||||||
|
var listItem = $('<li style="display:none"></li>');
|
||||||
|
if (DOCUMENTATION_OPTIONS.FILE_SUFFIX === '') {
|
||||||
|
// dirhtml builder
|
||||||
|
var dirname = item[0].replace(/\.rst$/, '') + '/';
|
||||||
|
if (dirname.match(/\/index\/$/)) {
|
||||||
|
dirname = dirname.substring(0, dirname.length-6);
|
||||||
|
} else if (dirname == 'index/') {
|
||||||
|
dirname = '';
|
||||||
|
}
|
||||||
|
listItem.append($('<a/>').attr('href',
|
||||||
|
DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
|
||||||
|
highlightstring + item[2]).html(item[1]));
|
||||||
|
} else {
|
||||||
|
// normal html builders
|
||||||
|
listItem.append($('<a/>').attr('href',
|
||||||
|
item[0].replace(/\.rst$/, '') + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
|
||||||
|
highlightstring + item[2]).html(item[1]));
|
||||||
|
}
|
||||||
|
if (item[3]) {
|
||||||
|
listItem.append($('<span> (' + item[3] + ')</span>'));
|
||||||
|
Search.output.append(listItem);
|
||||||
|
listItem.slideDown(5, function() {
|
||||||
|
displayNextItem();
|
||||||
|
});
|
||||||
|
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
|
||||||
|
$.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[0] + '.txt',
|
||||||
|
dataType: "text",
|
||||||
|
complete: function(jqxhr, textstatus) {
|
||||||
|
var data = jqxhr.responseText;
|
||||||
|
if (data !== '' && data !== undefined) {
|
||||||
|
listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
|
||||||
|
}
|
||||||
|
Search.output.append(listItem);
|
||||||
|
listItem.slideDown(5, function() {
|
||||||
|
displayNextItem();
|
||||||
|
});
|
||||||
|
}});
|
||||||
|
} else {
|
||||||
|
// no source available, just display title
|
||||||
|
Search.output.append(listItem);
|
||||||
|
listItem.slideDown(5, function() {
|
||||||
|
displayNextItem();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// search finished, update title and status message
|
||||||
|
else {
|
||||||
|
Search.stopPulse();
|
||||||
|
Search.title.text(_('Search Results'));
|
||||||
|
if (!resultCount)
|
||||||
|
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
|
||||||
|
else
|
||||||
|
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
|
||||||
|
Search.status.fadeIn(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
displayNextItem();
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user