diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2017-11-19 13:41:56 +0100 |
|---|---|---|
| committer | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2017-11-20 21:54:27 +0100 |
| commit | c00eaa99690c69457da19dff4920c393d71dbf4e (patch) | |
| tree | e2d310092d2653e0873b20df20052868760a60c5 /src | |
| parent | ad6324f6f7ecc05c3597278a0fa83822269c097a (diff) | |
| download | rust-c00eaa99690c69457da19dff4920c393d71dbf4e.tar.gz rust-c00eaa99690c69457da19dff4920c393d71dbf4e.zip | |
Strongly improve search path
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustdoc/html/static/main.js | 47 |
1 files changed, 37 insertions, 10 deletions
diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js index 2f83585d708..27f035da7e6 100644 --- a/src/librustdoc/html/static/main.js +++ b/src/librustdoc/html/static/main.js @@ -376,7 +376,7 @@ for (var z = 0; z < split.length; ++z) { if (split[z] === "") { - split.slice(z, 1); + split.splice(z, 1); z -= 1; } } @@ -526,20 +526,47 @@ return literalSearch === true ? false : lev_distance; } - function checkPath(startsWith, ty) { - var lev_total = 0; + function checkPath(startsWith, lastElem, ty) { + var ret_lev = MAX_LEV_DISTANCE + 1; var path = ty.path.split("::"); + + if (ty.parent && ty.parent.name) { + path.push(ty.parent.name.toLowerCase()); + } + if (startsWith.length > path.length) { return MAX_LEV_DISTANCE + 1; } - for (var i = path.length - 1; i < startsWith.length; ++i) { - var lev = levenshtein(startsWith[i], path[i]); - if (lev > MAX_LEV_DISTANCE) { - return MAX_LEV_DISTANCE + 1; + for (var i = 0; i < path.length; ++i) { + if (i + startsWith.length > path.length) { + break; + } + var lev_total = 0; + var aborted = false; + for (var x = 0; x < startsWith.length; ++x) { + var lev = levenshtein(path[i + x], startsWith[x]); + if (lev > MAX_LEV_DISTANCE) { + aborted = true; + break; + } + lev_total += lev; + } + if (aborted === false) { + var extra = MAX_LEV_DISTANCE + 1; + if (i + startsWith.length < path.length) { + extra = levenshtein(path[i + startsWith.length], lastElem); + } + if (extra > MAX_LEV_DISTANCE) { + extra = levenshtein(ty.name, lastElem); + } + if (extra < MAX_LEV_DISTANCE + 1) { + lev_total += extra; + ret_lev = Math.min(ret_lev, + Math.round(lev_total / (startsWith.length + 1))); + } } - lev_total += lev; } - return Math.round(lev_total / startsWith.length); + return ret_lev; } function typePassesFilter(filter, type) { @@ -701,7 +728,7 @@ } var lev_add = 0; if (paths.length > 1) { - var lev = checkPath(startsWith, ty); + var lev = checkPath(startsWith, paths[paths.length - 1], ty); if (lev > MAX_LEV_DISTANCE) { continue; } else if (lev > 0) { |
