.m-dox-search ul#search-results li a > div {
white-space: nowrap;
overflow: hidden;
+}
+.m-dox-search ul#search-results li a > div:not(.m-dox-search-alias) {
direction: rtl;
}
.m-dox-search ul#search-results li a .m-label {
.m-dox-search ul#search-results li a > div {
white-space: nowrap;
overflow: hidden;
+}
+.m-dox-search ul#search-results li a > div:not(.m-dox-search-alias) {
direction: rtl;
}
.m-dox-search ul#search-results li a .m-label {
.m-dox-search ul#search-results li a > div {
white-space: nowrap;
overflow: hidden;
+}
+.m-dox-search ul#search-results li a > div:not(.m-dox-search-alias) {
/* This is here in order to cut the text off at the left side. Besides this
there's special patching needed for punctuation characters, see search.js
for details. */
.m-dox-search ul#search-results li a > div {
white-space: nowrap;
overflow: hidden;
+}
+.m-dox-search ul#search-results li a > div:not(.m-dox-search-alias) {
direction: rtl;
}
.m-dox-search ul#search-results li a .m-label {
.m-dox-search ul#search-results li a > div {
white-space: nowrap;
overflow: hidden;
+}
+.m-dox-search ul#search-results li a > div:not(.m-dox-search-alias) {
direction: rtl;
}
.m-dox-search ul#search-results li a .m-label {
that's just wrong, fix! */
if(aliasedIndex != null && maxUrlPrefix == 0xffffff) {
let alias = this.gatherResult(aliasedIndex, 0 /* ignored */, 0xffffff); /* should be enough haha */
- name += ': ' + alias.name;
url = alias.url;
flags = alias.flags;
- /* Result suffix length: add the whole aliased name + the `: ` */
- resultSuffixLength += 2 + alias.name.length;
+ /* Keeping in UTF-8, as we need that for proper slicing (and concatenating) */
+ return {name: name,
+ alias: alias.name,
+ url: alias.url,
+ flags: alias.flags,
+ suffixLength: suffixLength + resultSuffixLength};
+ }
/* Otherwise extract URL from here */
- } else {
- let max = Math.min(j + maxUrlPrefix - url.length, nextResultOffset);
- for(; j != max; ++j) {
- url += String.fromCharCode(this.map.getUint8(j));
- }
+ let max = Math.min(j + maxUrlPrefix - url.length, nextResultOffset);
+ for(; j != max; ++j) {
+ url += String.fromCharCode(this.map.getUint8(j));
}
/* Keeping in UTF-8, as we need that for proper slicing (and concatenating) */
suffixLength: suffixLength + resultSuffixLength};
},
+ escape: function(name) {
+ return name.replace(/[\"&<>]/g, function (a) {
+ return { '"': '"', '&': '&', '<': '<', '>': '>' }[a];
+ });
+ },
escapeForRtl: function(name) {
/* Besides the obvious escaping of HTML entities we also need
to escape punctuation, because due to the RTL hack to cut
characters, parentheses we need to *soak* in it. But only
the right ones. And that for some reason needs to be also for &.
Huh. https://en.wikipedia.org/wiki/Right-to-left_mark */
- return name.replace(/[\"&<>]/g, function (a) {
- return { '"': '"', '&': '&', '<': '<', '>': '>' }[a];
- }).replace(/[:=]/g, '‎$&').replace(/(\)|>|&|\/)/g, '‎$&‎');
+ return this.escape(name).replace(/[:=]/g, '‎$&').replace(/(\)|>|&|\/)/g, '‎$&‎');
},
renderResults: /* istanbul ignore next */ function(value, results) {
break;
}
- list += this.fromUtf8('<li' + (i ? '' : ' id="search-current"') + '><a href="' + results[i].url + '" onmouseover="selectResult(event)"><div class="m-label m-flat ' + color + '">' + type + '</div>' + (results[i].flags & 2 ? '<div class="m-label m-danger">deprecated</div>' : '') + (results[i].flags & 4 ? '<div class="m-label m-danger">deleted</div>' : '') + '<div><span class="m-text m-dim">' + this.escapeForRtl(results[i].name.substr(0, results[i].name.length - value.length - results[i].suffixLength)) + '</span><span class="m-dox-search-typed">' + this.escapeForRtl(results[i].name.substr(results[i].name.length - value.length - results[i].suffixLength, value.length)) + '</span>' + this.escapeForRtl(results[i].name.substr(results[i].name.length - results[i].suffixLength)) + '</div></a></li>');
+ /* Labels + */
+ list += '<li' + (i ? '' : ' id="search-current"') + '><a href="' + results[i].url + '" onmouseover="selectResult(event)"><div class="m-label m-flat ' + color + '">' + type + '</div>' + (results[i].flags & 2 ? '<div class="m-label m-danger">deprecated</div>' : '') + (results[i].flags & 4 ? '<div class="m-label m-danger">deleted</div>' : '');
+
+ /* Render the alias (cut off from the right) */
+ if(results[i].alias) {
+ list += '<div class="m-dox-search-alias"><span class="m-text m-dim">' + this.escape(results[i].name.substr(0, results[i].name.length - value.length - results[i].suffixLength)) + '</span><span class="m-dox-search-typed">' + this.escape(results[i].name.substr(results[i].name.length - value.length - results[i].suffixLength, value.length)) + '</span>' + this.escapeForRtl(results[i].name.substr(results[i].name.length - results[i].suffixLength)) + '<span class="m-text m-dim">: ' + this.escape(results[i].alias) + '</span>';
+
+ /* Render the normal thing (cut off from the left, have to
+ escape for RTL) */
+ } else {
+ list += '<div><span class="m-text m-dim">' + this.escapeForRtl(results[i].name.substr(0, results[i].name.length - value.length - results[i].suffixLength)) + '</span><span class="m-dox-search-typed">' + this.escapeForRtl(results[i].name.substr(results[i].name.length - value.length - results[i].suffixLength, value.length)) + '</span>' + this.escapeForRtl(results[i].name.substr(results[i].name.length - results[i].suffixLength));
+ }
+
+ /* The closing */
+ list += '</div></a></li>';
}
- document.getElementById('search-results').innerHTML = list;
+ document.getElementById('search-results').innerHTML = this.fromUtf8(list);
document.getElementById('search-current').scrollIntoView(true);
} else {
-O+!-v2LOx#003|S000310RR921ONaj009U904M+f4gdgd009&L0BHdL0{{R4AOHX<00ATb04M+fDgXd(00A%n0BHaLHUI!^00BGz06GBy0suk)fI0vHNB{tG00B?{0B-;RRsaBW00CS80Am0FVgLYT0RRO600C|Q04V?gasU7*00DRa0B!&QegFVz00D#m0BryPiU0sQ0RaR6kN|)>00EW&0A&CHo&W%600E=`0B!&QssI3C00SBT0BvXh0Cund0CE5Uwg3P+0RaF2!~lRg00GJX0B8UK(f|N-0{{U40{{g800G_r04V?g<^TXF00Ha(0B!&R*Z=@w@&Ev70RRU8009C40A&CH1_1zU009gE0A~OJ5&-~i0RRX900ABW04V?h7y$rbA^`v>00Afg0CWHWG64W%00OE20AV-*0A&FH1^@s7NC5z400B$^0A~OJQUL&A00CG50B`^SUI74N00CqH0CfNa_y7QHXaE3qJ^=u7Y5@RqC;$KuKL7w}R{#JidjJ4wkpKWFvj6~X$p8Sr<p2Nx@Bjb_{r~^~O<{Cs0B&JzWpi+0V`WWYbZ9PUbZu+^01^l~I&EogC~0nVEFfuabSVHMZE0=*0025VR%K&!Z*l-*Y+-YAO<{CsUol@XR%K&!Z*neZbZu+`02l^3I&EogC@COgZ*FsR03&T_ZU6uPIyzEeZf9ixV{Bn_b4_7%XkRg3F;Zb}XJsyEbZu+|02c;2I&EogC@COgZ*FsR03&T_Zct%oWgx=4AX9Z>aA9X<0CRO>aA9X<E@*UZYy<#OWn*+<Zf9&|1ONvB00KHXQe|UwC@BB{
\ No newline at end of file
+O+!-v2LONp003kG000310RR921ONaj009U904M+f4gdgd009&L0BHdL0{{R4AOHX<00ATb04M+fDgXd(00A%n0BHaLHUI!^00BGz06GBy0suk)fI0vHNB{tG00B?{0B-;RRsaBW00CS80Am0FVgLYT0RRO600C|Q04V?gasU7*00DRa0B!&QegFVz00D#m0BryPiU0sQ0RaR6kN|)>00EW&0A&CHo&W%600E=`0B!&QssI3C00SBT0BvXh0Cund0CE5Uwg3P+0RaF2!~lRg00GJX0B8UK(f|N-0{{U40{{g800G_r04V?g<^TXF00Ha(0B!&R*Z=@w@&Ev70RRU8009C40A&CH1_1zU009gE0A~OJ5&-~i0RadA7y$rb00ABW0CWHWCIJ9r00OE20AVZv0A&FH1^@s7JOKb@00BS&0A~OJMgag}00B$^0B`^SQUL&B00CG50CfNa_y7QHXaE3qG64W`UI74eC;$KuKL7w}R{#JidjJ4wkpKWFvj6~X$p8Sr<p2Nx@Bjb_{r~^~O<{Cs0B&JzWpi+0V`WWYbZ9PUbZu+^01^l~I&EogC~0nVEFfuabSVHMZE0=*0025VR%K&!Z*l-*Y+-YAO<{CsUol@XR%K&!Z*neZbZu+`02l^3I&EogC@COgZ*FsR03&T_ZU6uPIyzEeZf9ixV{Bn_b4_7%XkRg3F;Zb}XJsyEbZu+|02c;2I&EogC@COgZ*FsR03&T_Zct%oWgx=4AX9Z>aA9X<0CRO>aA9X<E@*UZYy<#OWn*+<Zf9&|1ONvB00KHXQe|UwC@BB{
\ No newline at end of file
trie.insert("subpage", map.add("Page » Subpage", "subpage.html", flags=ResultFlag.PAGE))
trie.insert("rectangle", map.add("Rectangle", "", alias=range_index))
-trie.insert("rect()", map.add("Rectangle::Rect()", "", suffix_length=2, alias=range_index))
+trie.insert("rect", map.add("Rectangle::Rect()", "", suffix_length=2, alias=range_index))
with open(basedir/'searchdata.bin', 'wb') as f:
f.write(serialize_search_data(trie, map, 7))
/* 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, 650);
+ assert.equal(binary.byteLength, 638);
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, 650);
+ assert.equal(Search.dataSize, 638);
assert.equal(Search.symbolCount, 7);
assert.equal(Search.maxResults, 100);
/* Alias */
assert.deepEqual(Search.search('r'), [
- { name: 'Math::Range',
+ { name: 'Rectangle::Rect()',
+ alias: 'Math::Range',
url: 'classMath_1_1Range.html',
flags: 40,
- suffixLength: 4 },
- { name: 'Rectangle::Rect(): Math::Range',
+ suffixLength: 5 },
+ { name: 'Math::Range',
url: 'classMath_1_1Range.html',
flags: 40,
- suffixLength: 20 },
- { name: 'Rectangle: Math::Range',
+ suffixLength: 4 },
+ { name: 'Rectangle',
+ alias: 'Math::Range',
url: 'classMath_1_1Range.html',
flags: 40,
- suffixLength: 21 }]);
+ suffixLength: 8 }]);
}
/* 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, 650);
+ assert.equal(Search.dataSize, 638);
assert.equal(Search.symbolCount, 7);
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, 652); /* some padding on the end, that's okay */
+ assert.equal(Search.dataSize, 640); /* some padding on the end, that's okay */
assert.equal(Search.symbolCount, 7);
assert.equal(Search.maxResults, 100);
assert.deepEqual(Search.search('min'), [