/* Returns the values in UTF-8, but input is in whatever shitty 16bit
encoding JS has */
search: function(searchString) {
- /* Normalize the search string first, convert to UTF-8 */
- searchString = this.toUtf8(searchString.toLowerCase().trim());
+ /* Normalize the search string first, convert to UTF-8 and trim spaces
+ from the left. From the right they're trimmed only if nothing is
+ found, see below. */
+ searchString = this.toUtf8(searchString.toLowerCase().replace(/^\s+/,''));
/* TODO: maybe i could make use of InputEvent.data and others here */
break;
}
- /* Character not found, exit */
- if(!found) break;
+ /* Character not found */
+ if(!found) {
+ /* If we found everything except spaces at the end, pretend the
+ spaces aren't there. On the other hand, we *do* want to
+ try searching with the spaces first -- it can narrow down
+ the result list for page names or show subpages (which are
+ after a lookahead barrier that's a space). */
+ if(!searchString.substr(foundPrefix).trim().length)
+ searchString = searchString.substr(0, foundPrefix);
+
+ break;
+ }
}
/* Save the whole found prefix for next time */
trie.insert("math::range::min()", index, lookahead_barriers=[4, 11])
trie.insert("range::min()", index, lookahead_barriers=[5])
trie.insert("min()", index)
-trie.insert("subpage", map.add("Page » Subpage", "subpage.html", flags=ResultFlag.from_type(ResultFlag.NONE, EntryType.PAGE)))
+trie.insert("page", map.add("Page", "page.html", flags=ResultFlag.from_type(ResultFlag.NONE, EntryType.PAGE)))
+index = map.add("Page » Subpage", "subpage.html", flags=ResultFlag.from_type(ResultFlag.NONE, EntryType.PAGE))
+trie.insert("page » subpage", index, lookahead_barriers=[4])
+trie.insert("subpage", index)
trie.insert("rectangle", map.add("Rectangle", "", alias=range_index))
trie.insert("rect", map.add("Rectangle::Rect()", "", suffix_length=2, alias=range_index))
/* Verify that base85-decoded file is equivalent to the binary */
{
let binary = fs.readFileSync(path.join(__dirname, "js-test-data/searchdata.bin"));
- assert.equal(binary.byteLength, 674);
+ assert.equal(binary.byteLength, 745);
let b85 = fs.readFileSync(path.join(__dirname, "js-test-data/searchdata.b85"), {encoding: 'utf-8'});
assert.deepEqual(new DataView(binary.buffer.slice(binary.byteOffset, binary.byteOffset + binary.byteLength)), new DataView(Search.base85decode(b85), 0, binary.byteLength));
}
{
let buffer = fs.readFileSync(path.join(__dirname, "js-test-data/searchdata.bin"));
assert.ok(Search.init(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength)));
- assert.equal(Search.dataSize, 674);
+ assert.equal(Search.dataSize, 745);
assert.equal(Search.symbolCount, "7 symbols (0.7 kB)");
assert.equal(Search.maxResults, 100);
suffixLength: 3 }], 'tor'];
assert.deepEqual(Search.search('vec'), resultsForVec);
- /* Uppercase things and spaces */
- assert.deepEqual(Search.search(' Vec '), resultsForVec);
-
/* Not found */
assert.deepEqual(Search.search('pizza'), [[], '']);
assert.deepEqual(Search.search('su'), [[
{ name: Search.toUtf8('Page » Subpage'),
url: 'subpage.html',
- flags: 0,
+ flags: 8, /* has prefix */
cssClass: 'm-success',
typeName: 'page',
suffixLength: 5 }], 'bpage']);
suffixLength: 8 }], '']);
}
+/* Search with spaces */
+{
+ let buffer = fs.readFileSync(path.join(__dirname, "js-test-data/searchdata.bin"));
+ assert.ok(Search.init(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength)));
+ assert.equal(Search.dataSize, 745);
+ assert.equal(Search.symbolCount, "7 symbols (0.7 kB)");
+ assert.equal(Search.maxResults, 100);
+
+ /* No spaces */
+ assert.deepEqual(Search.search('pa'), [[
+ { name: Search.toUtf8('Page'),
+ url: 'page.html',
+ flags: 0,
+ cssClass: 'm-success',
+ typeName: 'page',
+ suffixLength: 2 }], 'ge']);
+
+ /* Spaces from the left are always trimmed */
+ assert.deepEqual(Search.search(' \t pa'), [[
+ { name: Search.toUtf8('Page'),
+ url: 'page.html',
+ flags: 0,
+ cssClass: 'm-success',
+ typeName: 'page',
+ suffixLength: 2 }], 'ge']);
+
+ /* Spaces from the right are trimmed if nothing is found */
+ assert.deepEqual(Search.search('pa \n '), [[
+ { name: Search.toUtf8('Page'),
+ url: 'page.html',
+ flags: 0,
+ cssClass: 'm-success',
+ typeName: 'page',
+ suffixLength: 2 }], 'ge']);
+
+ /* But not if they have results */
+ assert.deepEqual(Search.search('page'), [[
+ { name: Search.toUtf8('Page'),
+ url: 'page.html',
+ flags: 0,
+ cssClass: 'm-success',
+ typeName: 'page',
+ suffixLength: 0 }], '']);
+ assert.deepEqual(Search.search('page '), [[
+ { name: Search.toUtf8('Page » Subpage'),
+ url: 'subpage.html',
+ flags: 8, /* has prefix */
+ cssClass: 'm-success',
+ typeName: 'page',
+ suffixLength: 10 }], Search.toUtf8('» subpage')]);
+}
+
/* Search, limiting the results to 3 */
{
let buffer = fs.readFileSync(path.join(__dirname, "js-test-data/searchdata.bin"));
assert.ok(Search.init(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength), 3));
- assert.equal(Search.dataSize, 674);
+ assert.equal(Search.dataSize, 745);
assert.equal(Search.symbolCount, "7 symbols (0.7 kB)");
assert.equal(Search.maxResults, 3);
assert.deepEqual(Search.search('m'), [[
{
let b85 = fs.readFileSync(path.join(__dirname, "js-test-data/searchdata.b85"), {encoding: 'utf-8'});
assert.ok(Search.load(b85));
- assert.equal(Search.dataSize, 676); /* some padding on the end, that's okay */
+ assert.equal(Search.dataSize, 748); /* some padding on the end, that's okay */
assert.equal(Search.symbolCount, "7 symbols (0.7 kB)");
assert.equal(Search.maxResults, 100);
assert.deepEqual(Search.search('min'), [[