diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2018-10-01 00:47:54 +0200 |
|---|---|---|
| committer | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2018-11-28 19:33:33 +0100 |
| commit | dd717deccb3a4698beac8edb0a75e2efb6f08ebb (patch) | |
| tree | d7e474fa30699d68c6e4b3db2b4191273f194e8b /src/librustdoc/html/static/main.js | |
| parent | b76ee83254ec0398da554f25c2168d917ba60f1c (diff) | |
| download | rust-dd717deccb3a4698beac8edb0a75e2efb6f08ebb.tar.gz rust-dd717deccb3a4698beac8edb0a75e2efb6f08ebb.zip | |
Add crate filtering
Diffstat (limited to 'src/librustdoc/html/static/main.js')
| -rw-r--r-- | src/librustdoc/html/static/main.js | 99 |
1 files changed, 83 insertions, 16 deletions
diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js index 4425712eed7..66e10b24440 100644 --- a/src/librustdoc/html/static/main.js +++ b/src/librustdoc/html/static/main.js @@ -254,12 +254,14 @@ // // So I guess you could say things are getting pretty interoperable. function getVirtualKey(ev) { - if ("key" in ev && typeof ev.key != "undefined") + if ("key" in ev && typeof ev.key != "undefined") { return ev.key; + } var c = ev.charCode || ev.keyCode; - if (c == 27) + if (c == 27) { return "Escape"; + } return String.fromCharCode(c); } @@ -467,12 +469,13 @@ /** * Executes the query and builds an index of results - * @param {[Object]} query [The user query] - * @param {[type]} searchWords [The list of search words to query - * against] - * @return {[type]} [A search index of results] + * @param {[Object]} query [The user query] + * @param {[type]} searchWords [The list of search words to query + * against] + * @param {[type]} filterCrates [Crate to search in if defined] + * @return {[type]} [A search index of results] */ - function execQuery(query, searchWords) { + function execQuery(query, searchWords, filterCrates) { function itemTypeFromName(typename) { for (var i = 0; i < itemTypes.length; ++i) { if (itemTypes[i] === typename) { @@ -848,6 +851,9 @@ { val = extractGenerics(val.substr(1, val.length - 2)); for (var i = 0; i < nSearchWords; ++i) { + if (filterCrates !== undefined && searchIndex[i].crate !== filterCrates) { + continue; + } var in_args = findArg(searchIndex[i], val, true); var returned = checkReturned(searchIndex[i], val, true); var ty = searchIndex[i]; @@ -902,6 +908,9 @@ var output = extractGenerics(parts[1]); for (var i = 0; i < nSearchWords; ++i) { + if (filterCrates !== undefined && searchIndex[i].crate !== filterCrates) { + continue; + } var type = searchIndex[i].type; var ty = searchIndex[i]; if (!type) { @@ -973,11 +982,11 @@ var contains = paths.slice(0, paths.length > 1 ? paths.length - 1 : 1); for (j = 0; j < nSearchWords; ++j) { - var lev_distance; var ty = searchIndex[j]; - if (!ty) { + if (!ty || (filterCrates !== undefined && ty.crate !== filterCrates)) { continue; } + var lev_distance; var lev_add = 0; if (paths.length > 1) { var lev = checkPath(contains, paths[paths.length - 1], ty); @@ -1353,7 +1362,7 @@ return '<div>' + text + ' <div class="count">(' + nbElems + ')</div></div>'; } - function showResults(results) { + function showResults(results, filterCrates) { if (results['others'].length === 1 && getCurrentValue('rustdoc-go-to-only-result') === "true") { var elem = document.createElement('a'); @@ -1371,8 +1380,13 @@ var ret_in_args = addTab(results['in_args'], query, false); var ret_returned = addTab(results['returned'], query, false); + var filter = ""; + if (filterCrates !== undefined) { + filter = " (in <b>" + filterCrates + "</b> crate)"; + } + var output = '<h1>Results for ' + escape(query.query) + - (query.type ? ' (type: ' + escape(query.type) + ')' : '') + '</h1>' + + (query.type ? ' (type: ' + escape(query.type) + ')' : '') + filter + '</h1>' + '<div id="titles">' + makeTabHeader(0, "In Names", ret_others[1]) + makeTabHeader(1, "In Parameters", ret_in_args[1]) + @@ -1401,7 +1415,7 @@ printTab(currentTab); } - function execSearch(query, searchWords) { + function execSearch(query, searchWords, filterCrates) { var queries = query.raw.split(","); var results = { 'in_args': [], @@ -1412,7 +1426,7 @@ for (var i = 0; i < queries.length; ++i) { var query = queries[i].trim(); if (query.length !== 0) { - var tmp = execQuery(getQuery(query), searchWords); + var tmp = execQuery(getQuery(query), searchWords, filterCrates); results['in_args'].push(tmp['in_args']); results['returned'].push(tmp['returned']); @@ -1474,7 +1488,16 @@ } } - function search(e) { + function getFilterCrates() { + var elem = document.getElementById("crate-search"); + + if (elem && elem.value !== "All crates" && rawSearchIndex.hasOwnProperty(elem.value)) { + return elem.value; + } + return undefined; + } + + function search(e, forced) { var params = getQueryStringParams(); var query = getQuery(search_input.value.trim()); @@ -1482,7 +1505,10 @@ e.preventDefault(); } - if (query.query.length === 0 || query.id === currentResults) { + if (query.query.length === 0) { + return; + } + if (forced !== true && query.id === currentResults) { if (query.query.length > 0) { putBackSearch(search_input); } @@ -1502,7 +1528,8 @@ } } - showResults(execSearch(query, index)); + var filterCrates = getFilterCrates(); + showResults(execSearch(query, index, filterCrates), filterCrates); } function buildIndex(rawSearchIndex) { @@ -1602,6 +1629,13 @@ }; search_input.onpaste = search_input.onchange; + var selectCrate = document.getElementById('crate-search'); + if (selectCrate) { + selectCrate.onchange = function() { + search(undefined, true); + }; + } + // Push and pop states are used to add search results to the browser // history. if (browserSupportsHistoryApi()) { @@ -2350,6 +2384,39 @@ if (window.location.hash && window.location.hash.length > 0) { expandSection(window.location.hash.replace(/^#/, '')); } + + function addSearchOptions(crates) { + var elem = document.getElementById('crate-search'); + + if (!elem) { + return; + } + var crates_text = []; + for (var crate in crates) { + if (crates.hasOwnProperty(crate)) { + crates_text.push(crate); + } + } + crates_text.sort(function(a, b) { + var lower_a = a.toLowerCase(); + var lower_b = b.toLowerCase(); + + if (lower_a < lower_b) { + return -1; + } else if (lower_a > lower_b) { + return 1; + } + return 0; + }); + for (var i = 0; i < crates_text.length; ++i) { + var option = document.createElement("option"); + option.value = crates_text[i]; + option.innerText = crates_text[i]; + elem.appendChild(option); + } + } + + window.addSearchOptions = addSearchOptions; }()); // Sets the focus on the search bar at the top of the page |
