/* eslint-env node, browser, jquery */
let keys = keys // eslint-disable-line no-use-before-define
if (!keys && typeof require === "function") {
keys = require("./conf.priv.js") // eslint-disable-line global-require
}
// ****** Helper Functions ****** //
function googleCxCallback(response) {
const res = JSON.parse(response.text).items
Omnibar.listResults(res, (s) => {
const li = $("
").html(`
${s.htmlTitle}
${s.htmlSnippet}
`)
li.data("url", s.link)
return li
})
}
function googleCxURL(alias) {
const key = `google_cx_${alias}`
return `https://www.googleapis.com/customsearch/v1?key=${keys.google_cs}&cx=${keys[key]}&q=`
}
function googleCxPublicURL(alias) {
const key = `google_cx_${alias}`
return `https://cse.google.com/cse/publicurl?cx=${keys[key]}&q=`
}
function escape(str) {
return String(str).replace(/[&<>"'`=/]/g, s => ({
"&": "&",
"<": "<",
">": ">",
"\"": """,
"'": "'",
"/": "/",
"`": "`",
"=": "=",
}[s]))
}
// This is a base64-encoded image used as a placeholder for
// the crunchbase Omnibar results if they don't have an image
const blank = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAAAAAByaaZbAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAACYktHRAD/h4/MvwAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAAd0SU1FB+EICxEMErRVWUQAAABOdEVYdFJhdyBwcm9maWxlIHR5cGUgZXhpZgAKZXhpZgogICAgICAyMAo0NTc4Njk2NjAwMDA0OTQ5MmEwMDA4MDAwMDAwMDAwMDAwMDAwMDAwCnwMkD0AAAGXSURBVEjH1ZRvc4IwDMb7/T8dbVr/sEPlPJQd3g22GzJdmxVOHaQa8N2WN7wwvyZ5Eh/hngzxTwDr0If/TAK67POxbqxnpgCIx9dkrkEvswYnAFiutFSgtQapS4ejwFYqbXQXBmC+QxawuI/MJb0LiCq0DICNHoZRKQdYLKQZEhATcQmwDYD5GR8DDtfqaYAMActvTiVMaUvqhZPVYhYAK2SBAwGMTHngnc4wVmFPW9L6k1PJxbSCkfvhqolKSQhsWSClizNyxwAWdzIADixQRXRmdWSHthsg+TknaztFMZgC3vh/nG/qo68TLAKrCSrUg1ulp3cH+BpItBp3DZf0lFXVOIDnBdwKkLO4D5Q3QMO6HJ+hUb1NKNWMGJn3jf4ejPKn99CXOtsuyab95obGL/rpdZ7oIJK87iPiumG01drbdggoCZuq/f0XaB8/FbG62Ta5cD97XJwuZUT7ONbZTIK5m94hBuQs8535MsL5xxPw6ZoNj0DiyzhhcyMf9BJ0Jk1uRRpNyb4y0UaM9UI7E8+kt/EHgR/R6042JzmiwgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNy0wOC0xMVQxNzoxMjoxOC0wNDowMLy29LgAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDgtMTFUMTc6MTI6MTgtMDQ6MDDN60wEAAAAAElFTkSuQmCC"
// ****** Completions ****** //
const completions = {}
// ****** Arch Linux ****** //
// Arch Linux official repos
completions.al = {
alias: "al",
name: "archlinux",
search: "https://www.archlinux.org/packages/?arch=x86_64&q=",
compl: googleCxURL("al"),
callback: googleCxCallback,
}
// Arch Linux AUR
completions.au = {
alias: "au",
name: "AUR",
search: "https://aur.archlinux.org/packages/?O=0&SeB=nd&outdated=&SB=v&SO=d&PP=100&do_Search=Go&K=",
compl: "https://aur.archlinux.org/rpc?type=suggest&arg=",
}
completions.au.callback = (response) => {
const res = JSON.parse(response.text)
Omnibar.listResults(res, s => Omnibar.createURLItem({
title: s,
url: `https://aur.archlinux.org/packages/${s}`,
}))
}
// Arch Linux Wiki
completions.aw = {
alias: "aw",
name: "archwiki",
search: "https://wiki.archlinux.org/index.php?go=go&search=",
compl: "https://wiki.archlinux.org/api.php?action=opensearch&format=json&formatversion=2&namespace=0&limit=10&suggest=true&search=",
}
completions.aw.callback = (response) => {
Omnibar.listWords(JSON.parse(response.text)[1])
}
// Arch Linux Forums
completions.af = {
alias: "af",
name: "archforums",
search: googleCxPublicURL("af"),
compl: googleCxURL("af"),
callback: googleCxCallback,
}
// ****** Technical Resources ****** //
// Chrome Webstore
completions.cs = {
alias: "cs",
name: "chromestore",
search: "https://chrome.google.com/webstore/search/",
compl: googleCxURL("cs"),
callback: googleCxCallback,
}
// OWASP Wiki
completions.ow = {
alias: "ow",
name: "owasp",
search: "https://www.owasp.org/index.php?go=go&search=",
compl: "https://www.owasp.org/api.php?action=opensearch&format=json&formatversion=2&namespace=0&limit=10&suggest=true&search=",
}
completions.ow.callback = (response) => {
Omnibar.listWords(JSON.parse(response.text)[1])
}
// StackOverflow
completions.so = {
alias: "so",
name: "stackoverflow",
search: "https://stackoverflow.com/search?q=",
compl: "https://api.stackexchange.com/2.2/search/advanced?pagesize=10&order=desc&sort=relevance&site=stackoverflow&q=",
}
completions.so.callback = (response) => {
const res = JSON.parse(response.text).items
Omnibar.listResults(res, s => Omnibar.createURLItem({
title: `[${s.score}] ${s.title}`,
url: s.link,
}))
}
// DockerHub repo search
completions.dh = {
alias: "dh",
name: "dockerhub",
search: "https://hub.docker.com/search/?page=1&q=",
compl: "https://hub.docker.com/v2/search/repositories/?page_size=20&query=",
}
completions.dh.callback = (response) => {
const res = JSON.parse(response.text)
Omnibar.listResults(res.results, (s) => {
let meta = ""
let repo = escape(s.repo_name)
meta += `[★${escape(s.star_count)}] `
meta += `[↓${escape(s.pull_count)}] `
if (repo.indexOf("/") === -1) {
repo = `_/${repo}`
}
const li = $("").html(`
${escape(s.repo_name)}
${meta}
${escape(s.short_description)}
`)
li.data("url", `https://hub.docker.com/r/${repo}`)
return li
})
}
// GitHub
completions.gh = {
alias: "gh",
name: "github",
search: "https://github.com/search?q=",
compl: "https://api.github.com/search/repositories?sort=stars&order=desc&q=",
}
completions.gh.callback = (response) => {
const res = JSON.parse(response.text).items
Omnibar.listResults(res, (s) => {
let prefix = ""
if (s.stargazers_count) {
prefix += `[★${s.stargazers_count}] `
}
return Omnibar.createURLItem({
title: prefix + s.full_name,
url: s.html_url,
})
})
}
// Domainr domain search
completions.do = {
alias: "do",
name: "domainr",
search: "https://domainr.com/?q=",
compl: `https://domainr.p.mashape.com/v2/search?mashape-key=${keys.domainr}&query=%s`,
}
completions.do.callback = (response) => {
const res = JSON.parse(response.text).results
const domains = []
res.forEach((r) => {
const d = {
id: escape(r.domain).replace(".", "-"),
domain: escape(r.domain),
}
domains.push(d)
})
const domainQuery = domains.map(d => d.domain).join(",")
runtime.command({
action: "request",
method: "get",
url: `https://domainr.p.mashape.com/v2/status?mashape-key=${keys.domainr}&domain=${domainQuery}`,
}, (sresponse) => {
const sres = JSON.parse(sresponse.text).status
sres.forEach((s) => {
const id = `#sk-domain-${escape(s.domain).replace(".", "-")}`
const available = s.summary === "inactive"
const color = available ? "#23b000" : "#ff4d00"
const symbol = available ? "✔ " : "✘ "
$(id).text(symbol + $(id).text()).css("color", color)
})
})
Omnibar.listResults(domains, (d) => {
const li = $("").html(`
`)
li.data("url", `https://domainr.com/${d.domain}`)
return li
})
}
// Vim Wiki
completions.vw = {
alias: "vw",
name: "vimwikia",
search: "https://vim.wikia.com/wiki/Special:Search?query=",
compl: "https://vim.wikia.com/api.php?action=opensearch&format=json&formatversion=2&namespace=0&limit=10&suggest=true&search=",
}
completions.vw.callback = (response) => {
Omnibar.listWords(JSON.parse(response.text)[1])
}
// ****** Shopping & Food ****** //
// Amazon
completions.az = {
alias: "az",
name: "amazon",
search: "https://smile.amazon.com/s/?field-keywords=",
compl: "https://completion.amazon.com/search/complete?method=completion&mkt=1&search-alias=aps&q=",
}
completions.az.callback = (response) => {
const res = JSON.parse(response.text)[1]
Omnibar.listWords(res)
}
// Craigslist
completions.cl = {
alias: "cl",
name: "craigslist",
search: "https://craigslist.org/search/sss?query=",
compl: "https://craigslist.org/suggest?v=12&type=search&cat=sss&area=1&term=",
}
completions.cl.callback = (response) => {
Omnibar.listWords(JSON.parse(response.text))
}
// Yelp
completions.yp = {
alias: "yp",
name: "yelp",
search: "https://www.yelp.com/search?find_desc=",
compl: "https://www.yelp.com/search_suggest/v2/prefetch?prefix=",
}
completions.yp.callback = (response) => {
const res = JSON.parse(response.text).response
const words = []
res.forEach((r) => {
r.suggestions.forEach((s) => {
const w = s.query
if (words.indexOf(w) === -1) {
words.push(w)
}
})
})
Omnibar.listWords(words)
}
// ****** General References, Calculators & Utilities ****** //
// Dictionary
completions.de = {
alias: "de",
name: "define",
search: "http://onelook.com/?w=",
compl: "https://api.datamuse.com/words?md=d&sp=%s*",
}
completions.de.callback = (response) => {
const res = JSON.parse(response.text)
const defs = []
res.forEach((r) => {
if (!r.defs || r.defs.length === 0) {
defs.push([r.word, "", ""])
return
}
r.defs.forEach((d) => {
const ds = d.split("\t")
const sp = `(${ds[0]})`
const def = ds[1]
defs.push([r.word, sp, def])
})
})
Omnibar.listResults(defs, (d) => {
const word = escape(d[0])
const pos = escape(d[1])
const def = escape(d[2])
const li = $("").html(`${word} ${pos} ${def}
`)
li.data("url", `http://onelook.com/?w=${encodeURIComponent(d[0])}`)
return li
})
}
// Thesaurus
completions.th = {
alias: "th",
name: "thesaurus",
search: "https://www.onelook.com/reverse-dictionary.shtml?s=",
compl: "https://api.datamuse.com/words?md=d&ml=%s",
}
completions.th.callback = (response) => {
const res = JSON.parse(response.text)
const defs = []
res.forEach((r) => {
if (!r.defs || r.defs.length === 0) {
defs.push([escape(r.word), "", ""])
return
}
r.defs.forEach((d) => {
const ds = d.split("\t")
const sp = `(${escape(ds[0])})`
const def = escape(ds[1])
defs.push([escape(r.word), sp, def])
})
})
Omnibar.listResults(defs, (d) => {
const li = $("").html(`${d[0]} ${d[1]} ${d[2]}
`)
li.data("url", `http://onelook.com/?w=${d[0]}`)
return li
})
}
// Wikipedia
completions.wp = {
alias: "wp",
name: "wikipedia",
search: "https://en.wikipedia.org/w/index.php?search=",
compl: "https://en.wikipedia.org/w/api.php?action=query&format=json&list=prefixsearch&utf8&pssearch=",
}
completions.wp.callback = (response) => {
const res = JSON.parse(response.text).query.prefixsearch
.map(r => r.title)
Omnibar.listWords(res)
}
// WolframAlpha
completions.wa = {
alias: "wa",
name: "wolframalpha",
search: "http://www.wolframalpha.com/input/?i=",
compl: `http://api.wolframalpha.com/v2/query?appid=${keys.wolframalpha}&format=plaintext&output=json&reinterpret=true&input=%s`,
}
completions.wa.callback = (response) => {
const res = JSON.parse(response.text).queryresult
if (res.error) {
Omnibar.listResults([""], () => {
const li = $("").html(`
Error (Code ${escape(res.error.code)})
${escape(res.error.msg)}
`)
return li
})
return
}
if (!res.success) {
if (res.tips) {
Omnibar.listResults([""], () => {
const li = $("").html(`
No Results
${escape(res.tips.text)}
`)
return li
})
}
if (res.didyoumeans) {
Omnibar.listResults(res.didyoumeans, (s) => {
const li = $("").html(`
Did you mean...?
${escape(s.val)}
`)
return li
})
}
return
}
const results = []
res.pods.forEach((p) => {
const result = {
title: escape(p.title),
values: [],
url: "http://www.wolframalpha.com/input/?i=",
}
if (p.numsubpods > 0) {
result.url += encodeURIComponent(p.subpods[0].plaintext)
p.subpods.forEach((sp) => {
if (!sp.plaintext) return
let v = ""
if (sp.title) {
v += `${escape(sp.title)}: `
}
v += escape(sp.plaintext)
result.values.push(`${v}
`)
})
}
if (result.values.length > 0) {
results.push(result)
}
})
Omnibar.listResults(results, (r) => {
const li = $("").html(`
${r.title}
${r.values.join("\n")}
`)
li.data("url", r.url)
return li
})
}
// ****** Business Utilities & References ****** //
// Crunchbase Organization Search
completions.co = {
alias: "co",
name: "crunchbase-orgs",
search: "https://www.crunchbase.com/app/search/?q=",
compl: `https://api.crunchbase.com/v/3/odm_organizations?user_key=${keys.crunchbase}&query=%s`,
}
completions.co.callback = (response) => {
const res = JSON.parse(response.text).data.items
const orgs = []
res.forEach((rr) => {
const r = rr.properties
const p = {
name: escape(r.name),
domain: escape(r.domain),
desc: escape(r.short_description),
role: escape(r.primary_role),
img: blank,
loc: "",
url: `https://www.crunchbase.com/${encodeURIComponent(r.web_path)}`,
}
p.loc += (r.city_name !== null) ? escape(r.city_name) : ""
p.loc += (r.region_name !== null && p.loc !== "") ? ", " : ""
p.loc += (r.region_name !== null) ? escape(r.region_name) : ""
p.loc += (r.country_code !== null && p.loc !== "") ? ", " : ""
p.loc += (r.country_code !== null) ? escape(r.country_code) : ""
p.loc += (p.loc === "") ? "Earth" : ""
if (r.profile_image_url !== null) {
const url = encodeURIComponent(r.profile_image_url)
const path = url.split("/")
const img = path[path.length - 1]
p.img = `http://public.crunchbase.com/t_api_images/v1402944794/c_pad,h_50,w_50/${img}`
}
orgs.push(p)
})
Omnibar.listResults(orgs, (p) => {
const li = $("").html(`
${p.name}
Type: ${p.role}, Domain: ${p.domain}
${p.desc}
${p.loc}
`)
li.data("url", p.url)
return li
})
}
// Crunchbase People Search
completions.cp = {
alias: "cp",
name: "crunchbase-people",
search: "https://www.crunchbase.com/app/search/?q=",
compl: `https://api.crunchbase.com/v/3/odm_people?user_key=${keys.crunchbase}&query=%s`,
}
completions.cp.callback = (response) => {
const res = JSON.parse(response.text).data.items
const people = []
res.forEach((rr) => {
const r = rr.properties
const p = {
name: `${escape(r.first_name)} ${escape(r.last_name)}`,
desc: "",
img: blank,
loc: "",
url: `https://www.crunchbase.com/${encodeURIComponent(r.web_path)}`,
}
p.desc += (r.title !== null) ? escape(r.title) : ""
p.desc += (r.organization_name !== null && p.desc !== "") ? ", " : ""
p.desc += (r.organization_name !== null) ? escape(r.organization_name) : ""
p.desc += (p.desc === "") ? "Human" : ""
p.loc += (r.city_name !== null) ? escape(r.city_name) : ""
p.loc += (r.region_name !== null && p.loc !== "") ? ", " : ""
p.loc += (r.region_name !== null) ? escape(r.region_name) : ""
p.loc += (r.country_code !== null && p.loc !== "") ? ", " : ""
p.loc += (r.country_code !== null) ? escape(r.country_code) : ""
p.loc += (p.loc === "") ? "Earth" : ""
if (r.profile_image_url !== null) {
const url = r.profile_image_url
const path = url.split("/")
const img = encodeURIComponent(path[path.length - 1])
p.img = `http://public.crunchbase.com/t_api_images/v1402944794/c_pad,h_50,w_50/${img}`
}
people.push(p)
})
Omnibar.listResults(people, (p) => {
const li = $("").html(`
${p.name}
${p.desc}
${p.loc}
`)
li.data("url", p.url)
return li
})
}
// ****** Search Engines ****** //
// DuckDuckGo
completions.dg = {
alias: "dg",
name: "duckduckgo",
search: "https://duckduckgo.com/?q=",
compl: "https://duckduckgo.com/ac/?q=",
}
completions.dg.callback = (response) => {
const res = JSON.parse(response.text).map(r => r.phrase)
Omnibar.listWords(res)
}
// Google
completions.go = {
alias: "go",
name: "google",
search: "https://www.google.com/search?q=",
compl: "https://www.google.com/complete/search?client=chrome-omni&gs_ri=chrome-ext&oit=1&cp=1&pgcl=7&q=",
}
completions.go.callback = (response) => {
Omnibar.listWords(JSON.parse(response.text)[1])
}
// Google - I'm Feeling Lucky
completions.gl = {
alias: "gl",
name: "google-lucky",
search: "https://www.google.com/search?btnI=1&q=",
compl: "https://www.google.com/complete/search?client=chrome-omni&gs_ri=chrome-ext&oit=1&cp=1&pgcl=7&q=",
}
completions.gl.callback = (response) => {
Omnibar.listWords(JSON.parse(response.text)[1])
}
// ****** Elixir ****** //
// Hex.pm
completions.hx = {
alias: "hx",
name: "hex",
search: "https://hex.pm/packages?sort=downloads&search=",
compl: "https://hex.pm/api/packages?sort=downloads&search=",
}
completions.hx.callback = (response) => {
const res = JSON.parse(response.text)
Omnibar.listResults(res, (s) => {
let dls = ""
let desc = ""
let liscs = ""
if (s.downloads && s.downloads.all) {
dls = `[↓${escape(s.downloads.all)}] `
}
if (s.meta) {
if (s.meta.description) {
desc = escape(s.meta.description)
}
if (s.meta.licenses) {
s.meta.licenses.forEach((l) => {
liscs += `[©${escape(l)}] `
})
}
}
const li = $("").html(`
${escape(s.repository)}/${escape(s.name)}
${dls}${liscs}
${desc}
`)
li.data("url", s.html_url)
return li
})
}
// hexdocs
// Same as hex but links to documentation pages
completions.hd = {
alias: "hd",
name: "hexdocs",
search: "https://hex.pm/packages?sort=downloads&search=",
compl: "https://hex.pm/api/packages?sort=downloads&search=",
}
completions.hd.callback = (response) => {
const res = JSON.parse(response.text)
Omnibar.listResults(res, (s) => {
let dls = ""
let desc = ""
let liscs = ""
if (s.downloads && s.downloads.all) {
dls = `[↓${escape(s.downloads.all)}]`
}
if (s.meta) {
if (s.meta.description) {
desc = escape(s.meta.description)
}
if (s.meta.licenses) {
s.meta.licenses.forEach((l) => {
liscs += `[©${escape(l)}] `
})
}
}
const li = $("").html(`
${escape(s.repository)}/${escape(s.name)}
${dls}${liscs}
${desc}
`)
li.data("url", `https://hexdocs.pm/${encodeURIComponent(s.name)}`)
return li
})
}
// Exdocs
// Similar to `hd` but searches inside docs using Google Custom Search
completions.ex = {
alias: "ex",
name: "exdocs",
search: "https://hex.pm/packages?sort=downloads&search=",
compl: googleCxURL("ex"),
}
completions.ex.callback = (response) => {
const res = JSON.parse(response.text).items
Omnibar.listResults(res, (s) => {
let hash = ""
const snippet = s.htmlSnippet
const openTag = ""
const closeTag = ""
const openArgs = "("
const closeArgs = ")"
let f1 = snippet.indexOf(openTag)
if (f1 === -1) {
return
}
const f2 = snippet.indexOf(closeTag)
if (f2 === -1) {
return
}
f1 += openTag.length
const f3 = f2 + closeTag.length
const fname = snippet.slice(f1, f2)
const snippetEnd = snippet.slice(f3)
const a1 = snippetEnd.indexOf(openArgs)
if (a1 !== 0) {
return
}
let a2 = snippetEnd.indexOf(closeArgs)
if (a2 === -1) {
return
}
a2 += closeArgs.length
const fargs = snippetEnd.slice(a1, a2)
const fary = fargs.replace(new RegExp(openArgs + closeArgs), "").split(",").length
hash = escape(`${fname}/${fary}`)
const moduleName = escape(s.title).split(" –")[0]
let subtitle = ""
if (hash) {
subtitle = `
${moduleName}.${hash}
`
}
const li = $("").html(`
${s.htmlTitle}
${subtitle}
${s.htmlSnippet}
`)
li.data("url", `${s.link}#${hash}`)
return li // eslint-disable-line consistent-return
})
}
// ****** Golang ****** //
// Godoc
completions.gd = {
alias: "gd",
name: "godoc",
search: "https://godoc.org/?q=",
compl: "https://api.godoc.org/search?q=",
}
completions.gd.callback = (response) => {
const res = JSON.parse(response.text).results
Omnibar.listResults(res, (s) => {
let prefix = ""
if (s.import_count) {
prefix += `[↓${s.import_count}] `
}
if (s.stars) {
prefix += `[★${s.stars}] `
}
return Omnibar.createURLItem({
title: prefix + s.path,
url: `https://godoc.org/${s.path}`,
})
})
}
// Gowalker
completions.gw = {
alias: "gw",
name: "gowalker",
search: "https://gowalker.org/search?auto_redirect=true&q=",
compl: "https://gowalker.org/search/json?q=",
}
completions.gw.callback = (response) => {
const res = JSON.parse(response.text).results
Omnibar.listResults(res, (s) => {
const title = escape(s.title)
const desc = escape(s.description)
const li = $("").html(`
`)
li.data("url", `https://golang.org/doc/${encodeURIComponent(s.url)}`)
return li
})
}
// Go-Search
completions.gs = {
alias: "gs",
name: "go-search",
search: "http://go-search.org/search?q=",
compl: "http://go-search.org/api?action=search&q=",
}
completions.gs.callback = (response) => {
const res = JSON.parse(response.text).hits
.map(r => r.package)
Omnibar.listWords(res)
}
// ****** Haskell ****** //
// Hackage
completions.ha = {
alias: "ha",
name: "hackage",
search: "https://hackage.haskell.org/packages/search?terms=",
compl: "https://hackage.haskell.org/packages/search.json?terms=",
}
completions.ha.callback = (response) => {
const res = JSON.parse(response.text)
Omnibar.listResults(res, s => Omnibar.createURLItem({
title: s.name,
url: `https://hackage.haskell.org/package/${s.name}`,
}))
}
// Hoogle
completions.ho = {
alias: "ho",
name: "hoogle",
search: `https://www.haskell.org/hoogle/?hoogle=${
encodeURIComponent("+platform +xmonad +xmonad-contrib ")}`, // This tells Hoogle to include these modules in the search - encodeURIComponent is only used for better readability
compl: `https://www.haskell.org/hoogle/?mode=json&hoogle=${
encodeURIComponent("+platform +xmonad +xmonad-contrib ")}`,
}
completions.ho.callback = (response) => {
const res = JSON.parse(response.text).results
Omnibar.listResults(res, s => Omnibar.createURLItem({
title: s.self,
url: s.location,
}))
}
// Haskell Wiki
completions.hw = {
alias: "hw",
name: "haskellwiki",
search: "https://wiki.haskell.org/index.php?go=go&search=",
compl: "https://wiki.haskell.org/api.php?action=opensearch&format=json&formatversion=2&namespace=0&limit=10&suggest=true&search=",
}
completions.hw.callback = (response) => {
Omnibar.listWords(JSON.parse(response.text)[1])
}
// Hayoo
completions.hy = {
alias: "hy",
name: "hayoo",
search: "http://hayoo.fh-wedel.de/?query=",
compl: "http://hayoo.fh-wedel.de/json?query=",
}
completions.hy.callback = (response) => {
const res = JSON.parse(response.text).result
Omnibar.listResults(res, s => Omnibar.createURLItem({
title: `[${s.resultType}] ${s.resultName}`,
url: s.resultUri,
}))
}
// ****** HTML, CSS, JavaScript, NodeJS, ... ****** //
// jQuery API documentation
completions.jq = {
alias: "jq",
name: "jquery",
search: googleCxPublicURL("jq"),
compl: googleCxURL("jq"),
callback: googleCxCallback,
}
// NodeJS standard library documentation
completions.no = {
alias: "no",
name: "node",
search: googleCxPublicURL("no"),
compl: googleCxURL("no"),
callback: googleCxCallback,
}
// Mozilla Developer Network (MDN)
completions.md = {
alias: "md",
name: "mdn",
search: "https://developer.mozilla.org/en-US/search?q=",
compl: "https://developer.mozilla.org/en-US/search.json?q=",
}
completions.md.callback = (response) => {
const res = JSON.parse(response.text)
Omnibar.listResults(res.documents, (s) => {
let excerpt = escape(s.excerpt)
if (excerpt.length > 240) {
excerpt = `${excerpt.slice(0, 240)}…`
}
res.query.split(" ").forEach((q) => {
excerpt = excerpt.replace(new RegExp(q, "gi"), "$&")
})
const title = escape(s.title)
const slug = escape(s.slug)
const li = $("").html(`
${title}
${slug}
${excerpt}
`)
li.data("url", s.url)
return li
})
}
// NPM registry search
completions.np = {
alias: "np",
name: "npm",
search: "https://www.npmjs.com/search?q=",
compl: "https://api.npms.io/v2/search/suggestions?size=20&q=",
}
completions.np.callback = (response) => {
const res = JSON.parse(response.text)
Omnibar.listResults(res, (s) => {
let flags = ""
let desc = ""
let stars = ""
let score = ""
if (s.package.description) {
desc = escape(s.package.description)
}
if (s.score) {
if (s.score.final) {
score = Math.round(Number(s.score.final) * 5)
stars = "★".repeat(score) + "☆".repeat(5 - score)
}
}
if (s.flags) {
Object.keys(s.flags).forEach((f) => {
flags += `[⚑ ${escape(f)}] `
})
}
const li = $("").html(`
${s.highlight}
${stars}
${flags}
${desc}
`)
li.data("url", s.package.links.npm)
return li
})
}
// ****** Social Media & Entertainment ****** //
// Hacker News (YCombinator)
completions.hn = {
alias: "hn",
name: "hackernews",
search: "https://hn.algolia.com/?query=",
compl: "https://hn.algolia.com/api/v1/search?tags=(story,comment)&query=",
}
completions.hn.callback = (response) => {
const res = JSON.parse(response.text).hits
Omnibar.listResults(res, (s) => {
let title = ""
let prefix = ""
if (s.points) {
prefix += `[↑${s.points}] `
}
if (s.num_comments) {
prefix += `[↲${s.num_comments}] `
}
switch (s._tags[0]) { // eslint-disable-line no-underscore-dangle
case "story":
[title] = s.title
break
case "comment":
title = s.comment_text
break
default:
title = s.objectID
}
return Omnibar.createURLItem({
title: prefix + title,
url: `https://news.ycombinator.com/item?id=${s.objectID}`,
})
})
}
// Reddit
completions.re = {
alias: "re",
name: "reddit",
search: "https://www.reddit.com/search?sort=relevance&t=all&q=",
compl: "https://api.reddit.com/search?syntax=plain&sort=relevance&limit=20&q=",
}
completions.re.callback = (response) => {
const res = JSON.parse(response.text).data.children
Omnibar.listResults(res, (s) => {
const d = s.data
return Omnibar.createURLItem({
title: `[${d.score}] ${d.title}`,
url: `https://reddit.com${d.permalink}`,
})
})
}
// YouTube
completions.yt = {
alias: "yt",
name: "youtube",
search: "https://www.youtube.com/search?q=",
compl: `https://www.googleapis.com/youtube/v3/search?maxResults=20&part=snippet&type=video,channel&key=${keys.google_yt}&safeSearch=none&q=`,
}
completions.yt.callback = (response) => {
const res = JSON.parse(response.text).items
Omnibar.listResults(res, (s) => {
switch (s.id.kind) {
case "youtube#channel":
return Omnibar.createURLItem({
title: `${s.snippet.channelTitle}: ${s.snippet.description}`,
url: `https://youtube.com/channel/${s.id.channelId}`,
})
case "youtube#video":
return Omnibar.createURLItem({
title: ` ▶ ${s.snippet.title}`,
url: `https://youtu.be/${s.id.videoId}`,
})
default:
return ""
}
})
}
if (typeof module !== "undefined" && typeof module.exports !== "undefined") {
module.exports = completions
}