chiark / gitweb /
doxygen: render the aliases in search better.
authorVladimír Vondruš <mosra@centrum.cz>
Sun, 11 Feb 2018 17:03:09 +0000 (18:03 +0100)
committerVladimír Vondruš <mosra@centrum.cz>
Sun, 11 Feb 2018 17:09:19 +0000 (18:09 +0100)
In particular it's more important what's the alias than what's the name
it points to.

css/m-dark+doxygen.compiled.css
css/m-dark.doxygen.compiled.css
css/m-doxygen.css
css/m-light+doxygen.compiled.css
css/m-light.doxygen.compiled.css
doxygen/search.js
doxygen/test/js-test-data/searchdata.b85
doxygen/test/js-test-data/searchdata.bin
doxygen/test/populate-js-test-data.py
doxygen/test/test-search.js

index 736bb49a402c6150bff24a465d83b813d1b08925..9d8436ed22d4c915edfc875b2f6d2843f6a4dadd 100644 (file)
@@ -2070,6 +2070,8 @@ a.m-dox-search-icon:focus svg, a.m-dox-search-icon:hover svg, a.m-dox-search-ico
 .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 {
index 23b7a8e285638571518d32e22d17353d23ca0f74..bed1377929c68a7a0b68eefa222d32482ae3dc89 100644 (file)
@@ -256,6 +256,8 @@ a.m-dox-search-icon:focus svg, a.m-dox-search-icon:hover svg, a.m-dox-search-ico
 .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 {
index 30f6a1fb5f96f6451903821554d59d185ffd5433..c2300901c567775cfbfbb587660d64d4bc83b174 100644 (file)
@@ -271,6 +271,8 @@ a.m-dox-search-icon:focus svg, a.m-dox-search-icon:hover svg, a.m-dox-search-ico
 .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. */
index e16d3f1f685b2c35205979f15571ec86a3b4d9a3..36626c4367dbb974f7bd4d33f52ef0327d00cbfd 100644 (file)
@@ -2006,6 +2006,8 @@ a.m-dox-search-icon:focus svg, a.m-dox-search-icon:hover svg, a.m-dox-search-ico
 .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 {
index 6672701bc22aaa3f5682121307bb8a9b48f1a171..5b060ecdd3ae7b88ec82a126b55ff08c1433c129 100644 (file)
@@ -256,6 +256,8 @@ a.m-dox-search-icon:focus svg, a.m-dox-search-icon:hover svg, a.m-dox-search-ico
 .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 {
index ac58ef2c6ccd8e4d1bbad205c26f622933e3afa2..f3eeeaa9f30cbb1fbaadcb5cc40f7cc7e826719b 100644 (file)
@@ -314,19 +314,21 @@ var Search = {
            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) */
@@ -336,6 +338,11 @@ var Search = {
                 suffixLength: suffixLength + resultSuffixLength};
     },
 
+    escape: function(name) {
+        return name.replace(/[\"&<>]/g, function (a) {
+            return { '"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;' }[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
@@ -344,9 +351,7 @@ var Search = {
            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 { '"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;' }[a];
-        }).replace(/[:=]/g, '&lrm;$&').replace(/(\)|&gt;|&amp;|\/)/g, '&lrm;$&&lrm;');
+        return this.escape(name).replace(/[:=]/g, '&lrm;$&').replace(/(\)|&gt;|&amp;|\/)/g, '&lrm;$&&lrm;');
     },
 
     renderResults: /* istanbul ignore next */ function(value, results) {
@@ -430,9 +435,23 @@ var Search = {
                         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 {
index ab4e029f896119ea02907c5c42130df8b2238ce9..fb582afad5aa01bd867a3cb246aa4f6369ba3130 100644 (file)
@@ -1 +1 @@
-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
index 5b2f09fc0245a94d81d488a64084909ea55e1504..d9a2f9a69ae1f82948448014b2166dd8223f94f8 100644 (file)
Binary files a/doxygen/test/js-test-data/searchdata.bin and b/doxygen/test/js-test-data/searchdata.bin differ
index a7d873c0c785b86f80bb7c5750c6a944f3a620c0..5f2bc55539b53e076b4857fefeeee58759d08d36 100755 (executable)
@@ -67,7 +67,7 @@ trie.insert("min()", index)
 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))
index 3c873af8773eca41b07faa0f81e81cf493338a7c..e85daa2573b47a70fcedaef5982ec3723f1cccbb 100644 (file)
@@ -70,7 +70,7 @@ const { StringDecoder } = require('string_decoder');
 /* 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));
 }
@@ -105,7 +105,7 @@ const { StringDecoder } = require('string_decoder');
 {
     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);
 
@@ -170,25 +170,27 @@ const { StringDecoder } = require('string_decoder');
 
     /* 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'), [
@@ -210,7 +212,7 @@ const { StringDecoder } = require('string_decoder');
 {
     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'), [