rust-search-extension/README.md

121 lines
3.6 KiB
Markdown
Raw Normal View History

2018-11-27 10:55:52 +00:00
![](assets/rustacean.gif)
2018-10-31 11:40:46 +00:00
2018-11-27 03:34:35 +00:00
# Rust Search Extension
2018-11-29 15:56:40 +00:00
![Chrome Web Store](https://img.shields.io/chrome-web-store/v/ennpfpdlaclocpomkiablnmbppdnlhoh.svg)
2018-11-29 07:07:36 +00:00
![](https://img.shields.io/badge/stable-1.31.0-yellow.svg)
2018-11-27 03:34:35 +00:00
[![license-mit](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/Folyd/rust-search-extension/blob/master/LICENSE-MIT)
[![license-apache](https://img.shields.io/badge/license-Apache-yellow.svg)](https://github.com/Folyd/rust-search-extension/blob/master/LICENSE-APACHE)
2018-11-29 05:10:55 +00:00
🦀 A handy browser extension to search crates and docs in address bar (omnibox).
2018-11-27 03:34:35 +00:00
2018-11-29 15:56:40 +00:00
### Installation
- Chrome Web Store
https://chrome.google.com/webstore/detail/rust-search-extension/ennpfpdlaclocpomkiablnmbppdnlhoh
- Mannually
Git clone to your computer, open `chrome://extension` page, and enable developer mode, then click `load unpakced` button, select the `extension` directory.
2018-11-27 03:34:35 +00:00
### Features
- Search Primitive Types and Modules
- Search Structs, Traits and Enums
- Search Functions, Methods and Macros
- Search crates on https://crates.io
- Both Chrome and Firefox are supported
- [ ] Search local Rust docs (`rustup docs --std`)
2018-11-27 03:34:35 +00:00
### Usages
2018-11-27 10:55:52 +00:00
Input keyword **rs** in the address bar, press `Tab` or `Space` to activate the search bar. Then enter any word
you want to search, the extension will response the related search results instantly.
2018-11-27 03:34:35 +00:00
![demonstration.gif](assets/demonstration.gif)
### How the extension works
2018-11-27 10:55:52 +00:00
#### 1. Build *search index*
2018-11-27 03:34:35 +00:00
The raw *search index* was generated by **rustc-doc**. The most important function is `build_index()` which
located at [librustdoc/html/render.rs](https://github.com/rust-lang/rust/blob/master/src/librustdoc/html/render.rs).
2018-11-27 10:55:52 +00:00
The final *search index* is an object array like this:
2018-11-27 03:34:35 +00:00
```js
var searchIndex = [
{
crate: "std",
2018-11-27 10:55:52 +00:00
desc: "A hash map implemented with linear probing and Robin Hood bucket stealing.",
name: "HashMap",
2018-11-27 03:34:35 +00:00
parent: undefined,
2018-11-27 10:55:52 +00:00
path: "std::collections",
ty: 3,
2018-11-27 03:34:35 +00:00
type: null
},
{
crate: "std",
desc: "Applies function to the elements of iterator and returns the first non-none result.",
name: "find_map",
parent: {ty: 8, name: "Iterator"},
path: "std::iter",
ty: 11,
type: [["self"],["f"]]
2018-11-27 03:34:35 +00:00
}
...
];
2018-11-27 03:34:35 +00:00
```
2018-11-27 10:55:52 +00:00
#### 2. Build *search words array* based on *search index*
2018-11-27 03:34:35 +00:00
The *search words array* is the list of search words to query against which build from the raw *search index*.
It's just a plain name array of every Rust structs, traits, enums, functions, methods, macros, etc.
```js
var searchWords = [
"result",
"option",
"hashmap",
"hashset",
"clone",
"copy",
2018-11-27 10:55:52 +00:00
"display",
"debug"
2018-11-27 03:34:35 +00:00
...
];
2018-11-27 03:34:35 +00:00
```
2018-11-27 12:00:01 +00:00
#### 3. Search keyword in *search words array*
2018-11-27 03:34:35 +00:00
2018-11-27 12:00:01 +00:00
Using *Levenshtein distance* algorithm to search matched words, the max Levenshtein distance is 2.
```js
// Max levenshtein distance.
var MAX_LEV_DISTANCE = 2;
```
#### 4. Sort *search result*
Sort search result according to *Levenshtein distance*, lexicographical and others metrics.
2018-11-27 03:34:35 +00:00
2018-11-27 10:55:52 +00:00
#### 5. Transform *search result* to *suggestion result* to show in the address bar
2018-11-27 12:00:01 +00:00
Mapping the *search word* and *search index* to generate the *search result*, build Rust doc link for each result item.
```js
var suggestResults = [
{
content: "https://doc.rust-lang.org/std/ops/trait.Deref.html",
description: "std::ops::<match>Deref</match> - <dim>Used for immutable dereferencing operations, like `*v`.</dim>"
2018-11-27 12:00:01 +00:00
},
{
content: "https://doc.rust-lang.org/std/ops/trait.Deref.html#tymethod.deref",
description: "std::ops::Deref::<match>deref</match> - <dim>Dereferences the value.</dim>"
2018-11-27 12:00:01 +00:00
}
...
];
```