2020-02-24 06:18:03 +00:00
|
|
|
const c = new Compat();
|
2020-04-14 10:09:10 +00:00
|
|
|
const crateSearcher = new CrateSearch(mapping, crateIndex);
|
2020-02-03 08:18:23 +00:00
|
|
|
const attributeSearcher = new AttributeSearch();
|
2020-02-17 03:37:59 +00:00
|
|
|
const bookSearcher = new BookSearch(booksIndex);
|
2020-03-05 15:33:32 +00:00
|
|
|
const lintSearcher = new LintSearch(lintsIndex);
|
2020-03-07 09:13:18 +00:00
|
|
|
const stdSearcher = new StdSearch(searchIndex);
|
2020-03-08 02:59:37 +00:00
|
|
|
const crateDocSearchManager = new CrateDocSearchManager();
|
2020-02-28 04:53:52 +00:00
|
|
|
const commandManager = new CommandManager();
|
2020-02-10 03:58:12 +00:00
|
|
|
|
2020-04-08 14:37:25 +00:00
|
|
|
const defaultSuggestion = `Search std ${c.match("docs")}, external ${c.match("docs")} (@), ${c.match("crates")} (!), ${c.match("attributes")} (#), ${c.match("books")} (%), clippy ${c.match("lints")} (>), and ${c.match("error codes")}, etc in your address bar instantly!`;
|
2020-04-08 14:53:38 +00:00
|
|
|
const omnibox = new Omnibox(defaultSuggestion, c.isChrome ? 8 : 6);
|
2019-12-28 15:15:02 +00:00
|
|
|
|
2020-03-08 04:43:01 +00:00
|
|
|
let formatDoc = (index, doc) => {
|
2020-03-08 02:59:37 +00:00
|
|
|
let description = doc.displayPath + c.match(doc.name);
|
|
|
|
if (doc.desc) {
|
|
|
|
description += " - " + c.dim(c.escape(doc.desc));
|
|
|
|
}
|
|
|
|
return {content: doc.href, description};
|
|
|
|
};
|
|
|
|
|
2020-02-09 13:25:21 +00:00
|
|
|
omnibox.bootstrap({
|
|
|
|
onSearch: (query) => {
|
2020-03-07 09:13:18 +00:00
|
|
|
return stdSearcher.search(query);
|
2020-02-09 13:25:21 +00:00
|
|
|
},
|
2020-03-08 04:43:01 +00:00
|
|
|
onFormat: formatDoc,
|
2020-02-09 13:25:21 +00:00
|
|
|
onAppend: (query) => {
|
|
|
|
return [{
|
2020-03-08 14:19:04 +00:00
|
|
|
content: stdSearcher.getSearchUrl(query),
|
2020-03-08 02:59:37 +00:00
|
|
|
description: `Search Rust docs ${c.match(query)} on ${settings.isOfflineMode ? "offline mode" : stdSearcher.rootPath}`,
|
|
|
|
}];
|
2020-02-09 13:25:21 +00:00
|
|
|
},
|
2020-04-16 16:15:07 +00:00
|
|
|
beforeNavigate: (content) => {
|
|
|
|
if (content && content.trim().startsWith("@")) {
|
|
|
|
return `https://docs.rs/${content.replace("@", "")}`;
|
|
|
|
} else {
|
|
|
|
return content;
|
|
|
|
}
|
|
|
|
},
|
2020-04-17 10:50:43 +00:00
|
|
|
afterNavigated: (query, result) => {
|
2020-02-28 04:53:52 +00:00
|
|
|
HistoryCommand.record(query, result);
|
|
|
|
}
|
2020-02-09 13:25:21 +00:00
|
|
|
});
|
|
|
|
|
2020-03-08 02:59:37 +00:00
|
|
|
omnibox.addPrefixQueryEvent("@", {
|
|
|
|
onSearch: (query) => {
|
|
|
|
return crateDocSearchManager.search(query);
|
|
|
|
},
|
2020-03-08 04:43:01 +00:00
|
|
|
onFormat: (index, item) => {
|
2020-03-08 14:19:04 +00:00
|
|
|
if (item.hasOwnProperty("content")) {
|
|
|
|
// 1. Crate list header.
|
|
|
|
// 2. Crate result footer
|
|
|
|
return item;
|
|
|
|
} else if (item.hasOwnProperty("href")) {
|
2020-03-08 04:43:01 +00:00
|
|
|
return formatDoc(index, item);
|
|
|
|
} else {
|
2020-03-08 14:19:04 +00:00
|
|
|
// Crate name list.
|
2020-03-08 04:43:01 +00:00
|
|
|
let content = `@${item.name}`;
|
|
|
|
return {
|
|
|
|
content,
|
|
|
|
description: `${c.match(content)} - ${c.dim(item.doc)}`,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2020-03-08 02:59:37 +00:00
|
|
|
});
|
|
|
|
|
2020-02-09 13:25:21 +00:00
|
|
|
omnibox.addPrefixQueryEvent("!", {
|
|
|
|
defaultSearch: true,
|
|
|
|
searchPriority: 1,
|
|
|
|
onSearch: (query) => {
|
|
|
|
this.docMode = query.startsWith("!!");
|
|
|
|
return crateSearcher.search(query);
|
|
|
|
},
|
|
|
|
onFormat: (index, crate) => {
|
|
|
|
return {
|
2020-03-10 07:52:14 +00:00
|
|
|
content: this.docMode ? `https://docs.rs/${crate.id}` : `https://crates.io/crates/${crate.id}`,
|
2020-04-08 14:37:25 +00:00
|
|
|
description: `${this.docMode ? "Docs.rs" : "Crate.io"}: ${c.match(crate.id)} v${crate.version} - ${c.dim(c.escape(crate.description))}`,
|
2020-02-09 13:25:21 +00:00
|
|
|
};
|
|
|
|
},
|
2020-03-08 14:19:04 +00:00
|
|
|
onAppend: (query) => {
|
|
|
|
let keyword = query.replace(/[!\s]/g, "");
|
2020-02-09 13:25:21 +00:00
|
|
|
return [{
|
2020-03-08 14:19:04 +00:00
|
|
|
content: "https://crates.io/search?q=" + encodeURIComponent(keyword),
|
|
|
|
description: "Search Rust crates for " + c.match(keyword) + " on https://crates.io",
|
2020-02-26 10:13:21 +00:00
|
|
|
}, {
|
|
|
|
content: "remind",
|
|
|
|
description: `Remind: ${c.dim("We only indexed the top 20K crates. Sorry for the inconvenience if your desired crate not show.")}`,
|
2020-02-09 13:25:21 +00:00
|
|
|
}];
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
omnibox.addPrefixQueryEvent("#", {
|
|
|
|
defaultSearch: true,
|
|
|
|
searchPriority: 2,
|
2020-02-23 13:00:55 +00:00
|
|
|
deduplicate: true,
|
2020-02-09 13:25:21 +00:00
|
|
|
onSearch: (query) => {
|
|
|
|
return attributeSearcher.search(query);
|
|
|
|
},
|
|
|
|
onFormat: (index, attribute) => {
|
|
|
|
return {
|
2020-02-23 06:24:38 +00:00
|
|
|
content: attribute.href,
|
2020-02-24 06:18:03 +00:00
|
|
|
description: `Attribute: ${c.match("#[" + attribute.name + "]")} ${c.dim(attribute.description)}`,
|
2020-02-09 13:25:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
omnibox.addRegexQueryEvent(/e\d{2,4}$/i, {
|
|
|
|
onSearch: (query) => {
|
|
|
|
let baseIndex = parseInt(query.slice(1).padEnd(4, '0'));
|
|
|
|
let result = [];
|
|
|
|
for (let index = 0; index < 10; index++) {
|
|
|
|
let errorIndex = 'E' + String(baseIndex++).padStart(4, "0").toUpperCase();
|
|
|
|
result.push(errorIndex);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
},
|
|
|
|
onFormat: (index, errorCode) => {
|
|
|
|
return {
|
|
|
|
content: "https://doc.rust-lang.org/error-index.html#" + errorCode,
|
2020-02-24 06:18:03 +00:00
|
|
|
description: `Search Rust error index for ${c.match(errorCode)} on https://doc.rust-lang.org/error-index.html`,
|
2020-02-10 03:58:12 +00:00
|
|
|
};
|
2020-02-09 13:25:21 +00:00
|
|
|
}
|
|
|
|
});
|
2020-02-08 09:11:10 +00:00
|
|
|
|
2020-02-17 03:37:59 +00:00
|
|
|
omnibox.addPrefixQueryEvent("%", {
|
|
|
|
onSearch: (query) => {
|
|
|
|
return bookSearcher.search(query);
|
|
|
|
},
|
2020-02-22 08:45:45 +00:00
|
|
|
onFormat: (index, page) => {
|
|
|
|
let parentTitles = page.parentTitles || [];
|
2020-02-17 03:37:59 +00:00
|
|
|
return {
|
2020-02-22 08:45:45 +00:00
|
|
|
content: page.url,
|
2020-03-07 09:13:18 +00:00
|
|
|
description: `${[...parentTitles.map(t => c.escape(t)), c.match(c.escape(page.title))].join(" > ")} - ${c.dim(page.name)}`
|
2020-02-17 03:37:59 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2020-03-05 15:33:32 +00:00
|
|
|
const LINT_URL = "https://rust-lang.github.io/rust-clippy/master/";
|
|
|
|
omnibox.addPrefixQueryEvent(">", {
|
|
|
|
onSearch: (query) => {
|
|
|
|
return lintSearcher.search(query);
|
|
|
|
},
|
|
|
|
onFormat: (index, lint) => {
|
|
|
|
return {
|
|
|
|
content: `${LINT_URL}#${lint.name}`,
|
|
|
|
description: `Clippy lint: [${lint.level}] ${c.match(lint.name)} - ${c.dim(c.escape(lint.description))}`,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
omnibox.addPrefixQueryEvent(":", {
|
|
|
|
onSearch: (query) => {
|
|
|
|
return commandManager.execute(query);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2020-04-15 15:49:44 +00:00
|
|
|
omnibox.addNoCacheQueries("@", ":");
|
|
|
|
|
2020-04-14 10:09:10 +00:00
|
|
|
window.crateSearcher = crateSearcher;
|