Initial commit
This commit is contained in:
commit
42a6af06d4
|
@ -0,0 +1,64 @@
|
|||
*.priv.js
|
||||
|
||||
### Node ###
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Build directory
|
||||
build/
|
||||
|
||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Typescript v1 declaration files
|
||||
typings/
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
|
@ -0,0 +1,82 @@
|
|||
### Maddy's SurfingKeys Configuration
|
||||
|
||||
This is my personal configuration for the wonderful [SurfingKeys](https://github.com/brookhong/Surfingkeys) Chrome Extension.
|
||||
|
||||
|
||||
It currently includes Search Engine auto-completions for 31 sites,
|
||||
along with some convenience functions and key remappings.
|
||||
|
||||
| Alias | Name | Domain |
|
||||
| ---- | ------ | ----- |
|
||||
| `al` | `archlinux` | `www.archlinux.org` |
|
||||
| `au` | `AUR` | `aur.archlinux.org` |
|
||||
| `aw` | `archwiki` | `wiki.archlinux.org` |
|
||||
| `az` | `amazon` | `smile.amazon.com` |
|
||||
| `cl` | `craigslist` | `craigslist.org` |
|
||||
| `co` | `crunchbase-orgs` | `www.crunchbase.com` |
|
||||
| `cp` | `crunchbase-people` | `www.crunchbase.com` |
|
||||
| `cs` | `chromestore` | `chrome.google.com` |
|
||||
| `de` | `define` | `onelook.com` |
|
||||
| `dg` | `duckduckgo` | `duckduckgo.com` |
|
||||
| `dh` | `dockerhub` | `hub.docker.com` |
|
||||
| `do` | `domainr` | `domainr.com` |
|
||||
| `ex` | `hexdocs` | `hex.pm` |
|
||||
| `gd` | `godoc` | `godoc.org` |
|
||||
| `gh` | `github` | `github.com` |
|
||||
| `go` | `google` | `www.google.com` |
|
||||
| `gs` | `go-search` | `go-search.org` |
|
||||
| `ha` | `hackage` | `hackage.haskell.org` |
|
||||
| `hd` | `hexdocs` | `hex.pm` |
|
||||
| `hn` | `hackernews` | `hn.algolia.com` |
|
||||
| `ho` | `hoogle` | `www.haskell.org` |
|
||||
| `hw` | `haskellwiki` | `wiki.haskell.org` |
|
||||
| `hx` | `hex` | `hex.pm` |
|
||||
| `hy` | `hayoo` | `hayoo.fh-wedel.de` |
|
||||
| `md` | `mdn` | `developer.mozilla.org` |
|
||||
| `np` | `npm` | `www.npmjs.com` |
|
||||
| `re` | `reddit` | `www.reddit.com` |
|
||||
| `so` | `stackoverflow` | `stackoverflow.com` |
|
||||
| `wp` | `wikipedia` | `en.wikipedia.org` |
|
||||
| `yp` | `yelp` | `www.yelp.com` |
|
||||
| `yt` | `youtube` | `www.youtube.com` |
|
||||
|
||||
#### Installation
|
||||
|
||||
You'll need `git`, `node`, and `gulp`.
|
||||
|
||||
First, clone the repo:
|
||||
|
||||
```shell
|
||||
$ git clone http://github.com/b0o/surfingkeys-conf
|
||||
$ cd surfingkeys-conf
|
||||
```
|
||||
|
||||
Next, follow the instructions inside [conf.priv.example.js](conf.priv.example.js).
|
||||
If you don't want to add any API keys, just copy the file as instructed but leave it as-is:
|
||||
|
||||
```shell
|
||||
$ cp ./conf.priv.example.js ./conf.priv.js
|
||||
```
|
||||
|
||||
Next, run `npm install`:
|
||||
|
||||
```shell
|
||||
$ npm install
|
||||
```
|
||||
|
||||
Run `gulp install`.
|
||||
This will build the final configuration file and place it in `~/.surfingkeys`.
|
||||
If you already have a file in that location, make sure you back it up first!
|
||||
|
||||
```shell
|
||||
$ gulp install
|
||||
```
|
||||
|
||||
In order to reference a local file, you need to check __Allow access to file URLs__ in [chrome://extensions/](chrome://extensions/) for the SurfingKeys extension.
|
||||
|
||||
Finally, you'll need to open the SurfingKeys [configuration page](chrome-extension://mffcegbjcdejldmihkogmcnkgbbhioid/pages/options.html) and set the __Load settings from__ option to __"file:///home/YOUR_USERNAME_HERE/.surfingkeys"__. (This is for Unix-like Operating Systems. For Windows, you'll need to figure out the proper path)
|
||||
|
||||
If you make a change to __conf.js__ in the future, simply run `gulp install` again.
|
||||
|
||||
### License
|
||||
©2017 Maddison Hellstrom - MIT License
|
|
@ -0,0 +1,903 @@
|
|||
// Unmap undesired defaults
|
||||
var unmaps = [ "sb" , "sw", "ob"
|
||||
, "ow" , "cp", ";cp"
|
||||
, ";ap", "spa", "spb"
|
||||
, "spd", "sps", "spc"
|
||||
, "spi", "sfr", "zQ"
|
||||
, "zz" , "zR", "ab"
|
||||
, "Q" , "q", "ag"
|
||||
, "af"
|
||||
];
|
||||
|
||||
unmaps.forEach(function(u) {
|
||||
unmap(u);
|
||||
});
|
||||
|
||||
var rmSearchAliases =
|
||||
{ "s" : [ "g", "d", "b"
|
||||
, "w", "s", "h" ]
|
||||
};
|
||||
|
||||
Object.keys(rmSearchAliases).forEach(function(k) {
|
||||
rmSearchAliases[k].forEach(function(v) {
|
||||
removeSearchAliasX(v, k);
|
||||
});
|
||||
});
|
||||
|
||||
// Settings
|
||||
settings.hintAlign = "left";
|
||||
settings.omnibarSuggestionTimeout = 500
|
||||
// settings.hintGroups = false
|
||||
|
||||
// Maps
|
||||
// Left-hand aliases
|
||||
// Movement
|
||||
map('w', 'k');
|
||||
map('s', 'j');
|
||||
|
||||
// Right-hand aliases
|
||||
// Tab Navigation
|
||||
map('J', 'E');
|
||||
map('K', 'R');
|
||||
|
||||
// History
|
||||
map('H', 'S');
|
||||
map('L', 'D');
|
||||
|
||||
// Mapkeys
|
||||
mapkey('=w', "Lookup whois information for domain", whois, {
|
||||
repeatIgnore: true
|
||||
});
|
||||
|
||||
mapkey('=d', "Lookup dns information for domain", dns, {
|
||||
repeatIgnore: true
|
||||
});
|
||||
|
||||
mapkey('=D', "Lookup all information for domain", dnsVerbose, {
|
||||
repeatIgnore: true
|
||||
});
|
||||
|
||||
mapkey(';se', '#11Edit Settings', 'tabOpenLink("/pages/options.html")');
|
||||
|
||||
mapkey('\\fs', "Run fakespot for the current page (Amazon, Yelp)", fakeSpot, {
|
||||
repeatIgnore: true,
|
||||
domain: /(amazon\.com|yelp\.com)/i
|
||||
});
|
||||
|
||||
mapkey('\\F', "Toggle fullscreen (YouTube)", ytFullscreen, {
|
||||
repeatIgnore: true,
|
||||
domain: /(youtube\.com)/i
|
||||
});
|
||||
|
||||
mapkey('\\F', "Toggle fullscreen (Vimeo)", vimeoFullscreen, {
|
||||
repeatIgnore: true,
|
||||
domain: /(vimeo\.com)/i
|
||||
});
|
||||
|
||||
mapkey('\\s', "Toggle Star (GitHub)", ghToggleStar, {
|
||||
repeatIgnore: true,
|
||||
domain: /(github\.com)/i
|
||||
});
|
||||
|
||||
mapkey('\\s', "Toggle Star (GitLab)", glToggleStar, {
|
||||
repeatIgnore: true,
|
||||
domain: /(gitlab\.com)/i
|
||||
});
|
||||
|
||||
mapkey('\\c', "Collapse comment (Reddit)", function() {
|
||||
Hints.create('a.expand', Hints.dispatchMouseClick)
|
||||
}, {
|
||||
domain: /(reddit\.com)/i
|
||||
});
|
||||
|
||||
mapkey('\\c', "Collapse comment (HN)", function() {
|
||||
Hints.create('a.togg', Hints.dispatchMouseClick)
|
||||
}, {
|
||||
domain: /(news\.ycombinator\.com)/i
|
||||
});
|
||||
|
||||
mapkey('\\v', "Cast vote (Reddit)", function() {
|
||||
Hints.create('div.arrow', Hints.dispatchMouseClick)
|
||||
}, {
|
||||
domain: /(reddit\.com)/i
|
||||
});
|
||||
|
||||
mapkey('\\v', "Cast vote (HN)", function() {
|
||||
Hints.create('div.votearrow', Hints.dispatchMouseClick)
|
||||
}, {
|
||||
domain: /(news\.ycombinator\.com)/i
|
||||
});
|
||||
|
||||
mapkey('gi', 'Edit current URL with vim editor', vimEditURL);
|
||||
|
||||
// Search & completion
|
||||
// Search leader
|
||||
let sl = 'a';
|
||||
|
||||
// This is a base64-encoded image used as a placeholder for
|
||||
// the crunchbase Omnibar results if they don't have an image
|
||||
let 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";
|
||||
|
||||
// Search engines
|
||||
var search = [
|
||||
{ alias: 'al'
|
||||
, name: 'archlinux'
|
||||
, search: 'https://www.archlinux.org/packages/?arch=x86_64&q='
|
||||
, compl: ''
|
||||
, callback: function() {}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text);
|
||||
Omnibar.listResults(res, function(s) {
|
||||
return Omnibar.createURLItem({
|
||||
title: s,
|
||||
url: "https://aur.archlinux.org/packages/" + s
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
Omnibar.listWords(JSON.parse(response.text)[1]);
|
||||
}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)[1];
|
||||
Omnibar.listWords(res);
|
||||
}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
Omnibar.listWords(JSON.parse(response.text));
|
||||
}
|
||||
},
|
||||
{ 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`
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["data"]["items"];
|
||||
var orgs = [];
|
||||
res.map(function(rr){
|
||||
var r = rr.properties;
|
||||
var p = {
|
||||
name: r["name"],
|
||||
domain: r["domain"],
|
||||
desc: r["short_description"],
|
||||
role: r["primary_role"],
|
||||
img: blank,
|
||||
loc: "",
|
||||
url: "https://www.crunchbase.com/" + r["web_path"]
|
||||
};
|
||||
|
||||
p.loc += (r["city_name"] !== null) ? r["city_name"] : "";
|
||||
p.loc += (r["region_name"] !== null && p.loc !== "") ? ", " : "";
|
||||
p.loc += (r["region_name"] !== null) ? r["region_name"] : "";
|
||||
p.loc += (r["country_code"] !== null && p.loc !== "") ? ", " : "";
|
||||
p.loc += (r["country_code"] !== null) ? r["country_code"] : "";
|
||||
p.loc += (p.loc === "") ? "Earth" : "";
|
||||
|
||||
if (r["profile_image_url"] !== null) {
|
||||
var url = r["profile_image_url"]
|
||||
, path = url.split('/')
|
||||
, 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, function(p) {
|
||||
var li = $('<li/>').html(`
|
||||
<div style="width:100%;height:6em;display:block;">
|
||||
<div style="float:left;">
|
||||
<img style="width:4em;height:4em;max-width:4em;max-height:4em;overflow:hidden;" src="${p.img}" alt="${p.name}">
|
||||
</div>
|
||||
<div style="float:left;height:100%;margin-left:10px;">
|
||||
<div class="title"><strong>${p.name}</strong></div>
|
||||
<div class="title">Type: <em>${p.role}</em>, Domain: <em>${p.domain}</em></div>
|
||||
<div class="title">${p.desc}</div>
|
||||
<div class="title"><em>${p.loc}</em></div>
|
||||
</div>
|
||||
</div>
|
||||
`)
|
||||
li.data('url', p.url);
|
||||
return li;
|
||||
});
|
||||
}
|
||||
},
|
||||
{ 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`
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["data"]["items"];
|
||||
var people = [];
|
||||
res.map(function(rr){
|
||||
var r = rr.properties;
|
||||
var p = {
|
||||
name: r["first_name"] + " " + r["last_name"],
|
||||
desc: "",
|
||||
img: blank,
|
||||
loc: "",
|
||||
url: "https://www.crunchbase.com/" + r["web_path"]
|
||||
};
|
||||
|
||||
p.desc += (r["title"] !== null) ? r["title"] : "";
|
||||
p.desc += (r["organization_name"] !== null && p.desc !== "") ? ", " : "";
|
||||
p.desc += (r["organization_name"] !== null) ? r["organization_name"] : "";
|
||||
p.desc += (p.desc === "") ? "Human" : "";
|
||||
|
||||
p.loc += (r["city_name"] !== null) ? r["city_name"] : "";
|
||||
p.loc += (r["region_name"] !== null && p.loc !== "") ? ", " : "";
|
||||
p.loc += (r["region_name"] !== null) ? r["region_name"] : "";
|
||||
p.loc += (r["country_code"] !== null && p.loc !== "") ? ", " : "";
|
||||
p.loc += (r["country_code"] !== null) ? r["country_code"] : "";
|
||||
p.loc += (p.loc === "") ? "Earth" : "";
|
||||
|
||||
if (r["profile_image_url"] !== null) {
|
||||
var url = r["profile_image_url"]
|
||||
, path = url.split('/')
|
||||
, img = 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, function(p) {
|
||||
var li = $('<li/>').html(`
|
||||
<div style="width:100%;height:6em;display:block;">
|
||||
<div style="float:left;">
|
||||
<img style="width:4em;height:4em;max-width:4em;max-height:4em;overflow:hidden;" src="${p.img}" alt="${p.name}">
|
||||
</div>
|
||||
<div style="float:left;height:100%;margin-left:10px;">
|
||||
<div class="title"><strong>${p.name}</strong></div>
|
||||
<div class="title">${p.desc}</div>
|
||||
<div class="title"><em>${p.loc}</em></div>
|
||||
</div>
|
||||
</div>
|
||||
`)
|
||||
li.data('url', p.url);
|
||||
return li;
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'cs'
|
||||
, name: 'chromestore'
|
||||
, search: 'https://chrome.google.com/webstore/search/'
|
||||
, compl: ''
|
||||
, callback: function() {}
|
||||
},
|
||||
{ alias: 'de'
|
||||
, name: 'define'
|
||||
, search: 'http://onelook.com/?w='
|
||||
, compl: 'https://api.datamuse.com/words?md=d&sp=%s*'
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text);
|
||||
var defs = [];
|
||||
res.map(function(r){
|
||||
if (!r.defs || r.defs.length === 0) {
|
||||
defs.push([r.word, "", ""]);
|
||||
return
|
||||
}
|
||||
r.defs.map(function(d) {
|
||||
d = d.split("\t")
|
||||
|
||||
var sp = "(" + d[0] + ")",
|
||||
def = d[1];
|
||||
|
||||
defs.push([r.word, sp, def]);
|
||||
});
|
||||
});
|
||||
Omnibar.listResults(defs, function(d) {
|
||||
var li = $('<li/>').html(`<div class="title"><strong>${d[0]}</strong> <em>${d[1]}</em> ${d[2]}</div>`)
|
||||
li.data('url', "http://onelook.com/?w=" + d[0]);
|
||||
return li;
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'dg'
|
||||
, name: 'duckduckgo'
|
||||
, search: 'https://duckduckgo.com/?q='
|
||||
, compl: 'https://duckduckgo.com/ac/?q='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text).map(function(r){
|
||||
return r.phrase;
|
||||
});
|
||||
Omnibar.listWords(res);
|
||||
}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text);
|
||||
Omnibar.listResults(res["results"], function(s) {
|
||||
var meta = ""
|
||||
, repo = s["repo_name"];
|
||||
meta += "[★" + s["star_count"] + "] ";
|
||||
meta += "[↓" + s["pull_count"] + "] ";
|
||||
if (repo.indexOf("/") === -1) {
|
||||
repo = "_/" + repo
|
||||
}
|
||||
var li = $('<li/>').html(`
|
||||
<div>
|
||||
<div class="title"><strong>${s["repo_name"]}</strong></div>
|
||||
<div>${meta}</div>
|
||||
<div>${s["short_description"]}</div>
|
||||
</div>
|
||||
`)
|
||||
li.data('url', "https://hub.docker.com/r/" + repo);
|
||||
return li;
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'do'
|
||||
, name: 'domainr'
|
||||
, search: 'https://domainr.com/?q='
|
||||
, compl: `https://api.domainr.com/v2/search?client_id=${keys.domainr}&query=%s`
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["results"];
|
||||
var domains = [];
|
||||
res.map(function(r){
|
||||
var d = {
|
||||
id: r["domain"].replace('.', '-'),
|
||||
domain: r["domain"]
|
||||
};
|
||||
domains.push(d);
|
||||
});
|
||||
|
||||
var domainQuery = domains.map(function(d) { return d.domain }).join(',')
|
||||
|
||||
runtime.command({
|
||||
action: 'request',
|
||||
method: 'get',
|
||||
url: `https://api.domainr.com/v2/status?client_id=${keys.domainr}&domain=${domainQuery}`
|
||||
}, function(sresponse) {
|
||||
var sres = JSON.parse(sresponse.text)["status"];
|
||||
sres.map(function(s) {
|
||||
var id = "#sk-domain-" + s["domain"].replace('.', '-')
|
||||
, available = s["summary"] === "inactive"
|
||||
, color = available ? "#23b000" : "#ff4d00"
|
||||
, symbol = available ? "✔ " : "✘ ";
|
||||
$(id).text(symbol + $(id).text()).css("color", color)
|
||||
})
|
||||
});
|
||||
|
||||
Omnibar.listResults(domains, function(d) {
|
||||
var li = $('<li/>').html(`
|
||||
<div id="sk-domain-${d.id}">
|
||||
<div class="title"><strong>${d.domain}</strong></div>
|
||||
</div>
|
||||
`)
|
||||
li.data('url', `https://domainr.com/${d.domain}`);
|
||||
return li;
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'ex' // Similar to `hd` but searches inside docs using Google Custom Search
|
||||
, name: 'exdocs'
|
||||
, search: 'https://hex.pm/packages?sort=downloads&search='
|
||||
, compl: `https://www.googleapis.com/customsearch/v1?key=${keys.google_ex}&cx=${keys.google_ex_cx}&q=`
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["items"];
|
||||
Omnibar.listResults(res, function(s) {
|
||||
var snippet = s["htmlSnippet"];
|
||||
var hash = "";
|
||||
|
||||
// Hacky way to extract the desired function's
|
||||
// signature to use as an anchor because
|
||||
// Google Custom Search doesn't link to the appropriate
|
||||
// section of the documentation page
|
||||
// A regex would probably work better.
|
||||
(function() {
|
||||
var openTag = "<b>"
|
||||
, closeTag = "</b>"
|
||||
, openArgs = "("
|
||||
, closeArgs = ")";
|
||||
|
||||
var f1 = snippet.indexOf(openTag);
|
||||
if (f1 === -1) {
|
||||
return;
|
||||
}
|
||||
var f2 = snippet.indexOf(closeTag);
|
||||
if (f2 === -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
f1 += openTag.length;
|
||||
f3 = f2 + closeTag.length;
|
||||
fname = snippet.slice(f1, f2);
|
||||
snippetEnd = snippet.slice(f3);
|
||||
|
||||
var a1 = snippetEnd.indexOf(openArgs);
|
||||
if (a1 !== 0) {
|
||||
return;
|
||||
}
|
||||
var a2 = snippetEnd.indexOf(closeArgs);
|
||||
if (a2 === -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
a2 += closeArgs.length;
|
||||
var fargs = snippetEnd.slice(a1, a2)
|
||||
var fary = fargs.replace(new RegExp(openArgs + closeArgs), '').split(',').length;
|
||||
hash = fname + '/' + fary;
|
||||
})();
|
||||
|
||||
var moduleName = s["title"].split(' –')[0];
|
||||
|
||||
var subtitle = ""
|
||||
if (hash) {
|
||||
var subtitle = `
|
||||
<div style="font-size:1.1em; line-height:1.25em">
|
||||
<em>${moduleName}</em>.<strong>${hash}</strong>
|
||||
</div>`
|
||||
}
|
||||
var li = $('<li/>').html(`
|
||||
<div>
|
||||
<div class="title"><strong>${s["htmlTitle"]}</strong></div>
|
||||
${subtitle}
|
||||
<div>${s["htmlSnippet"]}</div>
|
||||
</div>
|
||||
`)
|
||||
li.data('url', s["link"] + "#" + hash);
|
||||
return li;
|
||||
})
|
||||
}
|
||||
},
|
||||
{ alias: 'gd'
|
||||
, name: 'godoc'
|
||||
, search: 'https://godoc.org/?q='
|
||||
, compl: 'https://api.godoc.org/search?q='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["results"];
|
||||
Omnibar.listResults(res, function(s) {
|
||||
var 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"]
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'gh'
|
||||
, name: 'github'
|
||||
, search: 'https://github.com/search?q='
|
||||
, compl: 'https://api.github.com/search/repositories?sort=stars&order=desc&q='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["items"];
|
||||
Omnibar.listResults(res, function(s) {
|
||||
var prefix = "";
|
||||
if (s["stargazers_count"]) {
|
||||
prefix += "[★" + s["stargazers_count"] + "] "
|
||||
}
|
||||
return Omnibar.createURLItem({
|
||||
title: prefix + s["full_name"],
|
||||
url: s["html_url"]
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
Omnibar.listWords(JSON.parse(response.text)[1]);
|
||||
}
|
||||
},
|
||||
{ alias: 'gs'
|
||||
, name: 'go-search'
|
||||
, search: 'http://go-search.org/search?q='
|
||||
, compl: 'http://go-search.org/api?action=search&q='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["hits"]
|
||||
.map(function(r){
|
||||
return r.package;
|
||||
});
|
||||
Omnibar.listWords(res);
|
||||
}
|
||||
},
|
||||
{ alias: 'ha'
|
||||
, name: 'hackage'
|
||||
, search: 'https://hackage.haskell.org/packages/search?terms='
|
||||
, compl: 'https://hackage.haskell.org/packages/search.json?terms='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text);
|
||||
Omnibar.listResults(res, function(s) {
|
||||
return Omnibar.createURLItem({
|
||||
title: s.name,
|
||||
url: 'https://hackage.haskell.org/package/' + s.name
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'hd' // Same as hex but links to documentation pages
|
||||
, name: 'hexdocs'
|
||||
, search: 'https://hex.pm/packages?sort=downloads&search='
|
||||
, compl: 'https://hex.pm/api/packages?sort=downloads&search='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text);
|
||||
Omnibar.listResults(res, function(s) {
|
||||
var dls = ""
|
||||
, desc = ""
|
||||
, liscs = "";
|
||||
if (s["downloads"] && s["downloads"]["all"]) {
|
||||
dls = "[↓" + s["downloads"]["all"] + "] ";
|
||||
}
|
||||
if(s["meta"]) {
|
||||
if (s["meta"]["description"]) {
|
||||
desc = s["meta"]["description"];
|
||||
}
|
||||
if (s["meta"]["licenses"]) {
|
||||
s["meta"]["licenses"].forEach(function(l) {
|
||||
liscs += "[©" + l + "] ";
|
||||
})
|
||||
}
|
||||
}
|
||||
var li = $('<li/>').html(`
|
||||
<div>
|
||||
<div class="title">${s["repository"]}/<strong>${s["name"]}</strong></div>
|
||||
<div>${dls}${liscs}</div>
|
||||
<div>${desc}</div>
|
||||
</div>
|
||||
`)
|
||||
li.data('url', "https://hexdocs.pm/" + s["name"]);
|
||||
return li;
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'hn'
|
||||
, name: 'hackernews'
|
||||
, search: 'https://hn.algolia.com/?query='
|
||||
, compl: 'https://hn.algolia.com/api/v1/search?tags=(story,comment)&query='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["hits"];
|
||||
Omnibar.listResults(res, function(s) {
|
||||
var title = "";
|
||||
var prefix = "";
|
||||
if (s["points"]) {
|
||||
prefix += "[↑" + s["points"] + "] ";
|
||||
}
|
||||
if (s["num_comments"]) {
|
||||
prefix += "[↲" + s["num_comments"] + "] ";
|
||||
}
|
||||
switch(s._tags[0]) {
|
||||
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"]
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{ 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 ")
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["results"];
|
||||
Omnibar.listResults(res, function(s) {
|
||||
return Omnibar.createURLItem({
|
||||
title: s.self,
|
||||
url: s.location
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
Omnibar.listWords(JSON.parse(response.text)[1]);
|
||||
}
|
||||
},
|
||||
{ alias: 'hx'
|
||||
, name: 'hex'
|
||||
, search: 'https://hex.pm/packages?sort=downloads&search='
|
||||
, compl: 'https://hex.pm/api/packages?sort=downloads&search='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text);
|
||||
Omnibar.listResults(res, function(s) {
|
||||
var dls = ""
|
||||
, desc = ""
|
||||
, liscs = "";
|
||||
if (s["downloads"] && s["downloads"]["all"]) {
|
||||
dls = "[↓" + s["downloads"]["all"] + "] ";
|
||||
}
|
||||
if(s["meta"]) {
|
||||
if (s["meta"]["description"]) {
|
||||
desc = s["meta"]["description"];
|
||||
}
|
||||
if (s["meta"]["licenses"]) {
|
||||
s["meta"]["licenses"].forEach(function(l) {
|
||||
liscs += "[©" + l + "] ";
|
||||
})
|
||||
}
|
||||
}
|
||||
var li = $('<li/>').html(`
|
||||
<div>
|
||||
<div class="title">${s["repository"]}/<strong>${s["name"]}</strong></div>
|
||||
<div>${dls}${liscs}</div>
|
||||
<div>${desc}</div>
|
||||
</div>
|
||||
`)
|
||||
li.data('url', s["html_url"]);
|
||||
return li;
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'hy'
|
||||
, name: 'hayoo'
|
||||
, search: 'http://hayoo.fh-wedel.de/?query='
|
||||
, compl: 'http://hayoo.fh-wedel.de/json?query='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["result"];
|
||||
Omnibar.listResults(res, function(s) {
|
||||
return Omnibar.createURLItem({
|
||||
title: "[" + s.resultType + "] " + s.resultName,
|
||||
url: s.resultUri
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'md'
|
||||
, name: 'mdn'
|
||||
, search: 'https://developer.mozilla.org/en-US/search?q='
|
||||
, compl: 'https://developer.mozilla.org/en-US/search.json?q='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text);
|
||||
Omnibar.listResults(res["documents"], function(s) {
|
||||
var excerpt = s["excerpt"]
|
||||
if(excerpt.length > 240) {
|
||||
excerpt = excerpt.slice(0, 240) + '…';
|
||||
}
|
||||
res["query"].split(" ").forEach(function(q) {
|
||||
excerpt = excerpt.replace(new RegExp(q, 'gi'), "<strong>$&</strong>");
|
||||
});
|
||||
var li = $('<li/>').html(`
|
||||
<div>
|
||||
<div class="title"><strong>${s["title"]}</strong></div>
|
||||
<div style="font-size:0.8em"><em>${s["slug"]}</em></div>
|
||||
<div>${excerpt}</div>
|
||||
</div>
|
||||
`);
|
||||
li.data('url', s["url"]);
|
||||
return li;
|
||||
});
|
||||
}
|
||||
},
|
||||
{ alias: 'np'
|
||||
, name: 'npm'
|
||||
, search: 'https://www.npmjs.com/search?q='
|
||||
, compl: 'https://api.npms.io/v2/search/suggestions?size=20&q='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text);
|
||||
Omnibar.listResults(res, function(s) {
|
||||
var flags = ""
|
||||
, desc = ""
|
||||
, stars = "";
|
||||
if (s["package"]["description"]) {
|
||||
desc = s["package"]["description"];
|
||||
}
|
||||
if(s["score"]) {
|
||||
if (s["score"]["final"]) {
|
||||
score = Math.round(s["score"]["final"] * 5);
|
||||
stars = "★".repeat(score) + "☆".repeat(5-score);
|
||||
}
|
||||
}
|
||||
if (s["flags"]) {
|
||||
Object.keys(s["flags"]).forEach(function(f) {
|
||||
flags += "[<span style='color:#ff4d00'>⚑</span> " + f + "] ";
|
||||
})
|
||||
}
|
||||
var li = $('<li/>').html(`
|
||||
<div>
|
||||
<style>
|
||||
.title>em {
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
<div class="title">${s["highlight"]}</div>
|
||||
<div>
|
||||
<span style="font-size:2em;line-height:0.5em">${stars}</span>
|
||||
<span>${flags}</span>
|
||||
</div>
|
||||
<div>${desc}</div>
|
||||
</div>
|
||||
`)
|
||||
li.data('url', s["package"]["links"]["npm"]);
|
||||
return li;
|
||||
});
|
||||
}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["data"]["children"];
|
||||
Omnibar.listResults(res, function(s) {
|
||||
var d = s["data"];
|
||||
return Omnibar.createURLItem({
|
||||
title: "[" + d["score"] + "] " + d["title"],
|
||||
url: "https://reddit.com" + d["permalink"]
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["items"];
|
||||
Omnibar.listResults(res, function(s) {
|
||||
return Omnibar.createURLItem({
|
||||
title: "[" + s["score"] + "] " + s["title"],
|
||||
url: s["link"]
|
||||
});
|
||||
});
|
||||
}
|
||||
},
|
||||
{ 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='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["query"]["prefixsearch"]
|
||||
.map(function(r){
|
||||
return r.title;
|
||||
});
|
||||
Omnibar.listWords(res);
|
||||
}
|
||||
},
|
||||
{ alias: 'yp'
|
||||
, name: 'yelp'
|
||||
, search: 'https://www.yelp.com/search?find_desc='
|
||||
, compl: 'https://www.yelp.com/search_suggest/v2/prefetch?prefix='
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["response"];
|
||||
var words = [];
|
||||
res.map(function(r){
|
||||
r["suggestions"].map(function(s) {
|
||||
var w = s["query"];
|
||||
if (words.indexOf(w) === -1) {
|
||||
words.push(w);
|
||||
}
|
||||
});
|
||||
});
|
||||
Omnibar.listWords(words);
|
||||
}
|
||||
},
|
||||
{ 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=`
|
||||
, callback: function(response) {
|
||||
var res = JSON.parse(response.text)["items"];
|
||||
Omnibar.listResults(res, function(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"]
|
||||
});
|
||||
break;
|
||||
case "youtube#video":
|
||||
return Omnibar.createURLItem({
|
||||
title: " ▶ " + s["snippet"]["title"],
|
||||
url: "https://youtu.be/" + s["id"]["videoId"]
|
||||
});
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
];
|
||||
|
||||
for(var i = 0; i < search.length; i++) {
|
||||
var s = search[i], // Search object
|
||||
la = sl + s.alias; // Search leader + alias
|
||||
|
||||
addSearchAliasX(s.alias, s.name, s.search, sl, s.compl, s.callback);
|
||||
mapkey(la, '#8Search ' + s.name, 'Front.openOmnibar({type: "SearchEngine", extra: "' + s.alias + '"})');
|
||||
}
|
||||
|
||||
// Functions
|
||||
function fakeSpot() {
|
||||
var url = "http://fakespot.com/analyze?url=" + window.location.href;
|
||||
window.open(url, '_blank').focus();
|
||||
}
|
||||
|
||||
function ytFullscreen() {
|
||||
$('.ytp-fullscreen-button.ytp-button').click();
|
||||
}
|
||||
|
||||
function vimeoFullscreen() {
|
||||
$('.fullscreen-icon').click();
|
||||
}
|
||||
|
||||
function ghToggleStar() {
|
||||
var repo = window.location.pathname.slice(1).split("/").slice(0,2).join("/");
|
||||
var cur = $('div.starring-container > form').filter(function() {
|
||||
return $(this).css("display") === "block";
|
||||
});
|
||||
|
||||
var action = "starred";
|
||||
var star = "★";
|
||||
if (cur.attr("class") === "starred") {
|
||||
action = "un" + action
|
||||
star = "☆"
|
||||
}
|
||||
|
||||
cur.find("button").click();
|
||||
Front.showBanner(star + " Repository " + repo + " " + action);
|
||||
}
|
||||
|
||||
function glToggleStar() {
|
||||
var repo = window.location.pathname.slice(1).split("/").slice(0,2).join("/");
|
||||
var action = $('.btn.star-btn > span').click().text().toLowerCase() + "red";
|
||||
var star = "☆";
|
||||
if (action === "starred") {
|
||||
star = "★";
|
||||
}
|
||||
Front.showBanner(star + " Repository " + repo + " " + action);
|
||||
}
|
||||
|
||||
function vimEditURL() {
|
||||
Front.showEditor(window.location.href, function(data) {
|
||||
window.location.href = data;
|
||||
}, 'url');
|
||||
}
|
||||
|
||||
function whois() {
|
||||
var url = "http://centralops.net/co/DomainDossier.aspx?dom_whois=true&addr=" + window.location.hostname;
|
||||
window.open(url, '_blank').focus();
|
||||
}
|
||||
|
||||
function dns() {
|
||||
var url = "http://centralops.net/co/DomainDossier.aspx?dom_dns=true&addr=" + window.location.hostname;
|
||||
window.open(url, '_blank').focus();
|
||||
}
|
||||
|
||||
function dnsVerbose() {
|
||||
var url = "http://centralops.net/co/DomainDossier.aspx?dom_whois=true&dom_dns=true&traceroute=true&net_whois=true&svc_scan=true&addr=" + window.location.hostname;
|
||||
window.open(url, '_blank').focus();
|
||||
}
|
||||
|
||||
// vim: set ft=javascript expandtab:
|
|
@ -0,0 +1,29 @@
|
|||
// This is a reference for how conf.priv.js should look.
|
||||
//
|
||||
// Copy this file to a new file named "conf.priv.js" and update
|
||||
// the API keys as needed.
|
||||
//
|
||||
// You can also place any additional variables here and they will
|
||||
// be included before the rest of your configuration script.
|
||||
// Running `gulp build` will generate the final configuration by concatenating
|
||||
// this file with your main configuration file.
|
||||
//
|
||||
// WARNING: Don't `git commit` your actual "conf.priv.js" file if you
|
||||
// add real API keys to it! Malicious parties frequently scan GitHub for
|
||||
// these keys and use them for bad stuff. The "conf.priv.js" file is already
|
||||
// ignored by .gitignore, but just be safe.
|
||||
|
||||
// These are private API keys which are required for certain search completions.
|
||||
// You can obtain them all for free at the supplied links.
|
||||
//
|
||||
// Note:
|
||||
// The Domainr API is configured for High-Volume usage, not Mashape.
|
||||
// You will need to modify the code in conf.js to work with the Mashape API if desired.
|
||||
// Open an issue if you can't figure this out and I'll help out.
|
||||
var keys =
|
||||
{ crunchbase: "foo" // https://about.crunchbase.com/crunchbase-basic-access/
|
||||
, domainr: "bar" // https://domainr.build/docs/overview#section-try-it-for-free
|
||||
, google_ex: "qux" // https://developers.google.com/custom-search/json-api/v1/overview?hl=en_US
|
||||
, google_ex_cx: "ham" // This is the Search Engine ID (cx) from your Google Custom Search
|
||||
, google_yt: "spam" // https://developers.google.com/youtube/v3/docs/
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
var gulp = require('gulp');
|
||||
var concat = require('gulp-concat');
|
||||
var del = require('del');
|
||||
var os = require('os');
|
||||
|
||||
|
||||
var paths = {
|
||||
scripts: ['conf.priv.js', 'conf.js']
|
||||
};
|
||||
|
||||
gulp.task('clean', function() {
|
||||
return del(['build']);
|
||||
});
|
||||
|
||||
gulp.task('build', ['clean'], function() {
|
||||
return gulp.src(paths.scripts)
|
||||
.pipe(concat('.surfingkeys'))
|
||||
.pipe(gulp.dest('build'));
|
||||
});
|
||||
|
||||
gulp.task('install', ['build'], function() {
|
||||
return gulp.src('build/.surfingkeys')
|
||||
.pipe(gulp.dest(os.homedir()));
|
||||
})
|
||||
|
||||
gulp.task('watch', function() {
|
||||
gulp.watch(paths.scripts, ['build']);
|
||||
});
|
||||
|
||||
gulp.task('default', ['build']);
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"name": "surfingkeys-conf",
|
||||
"version": "1.0.0",
|
||||
"description": "A custom SurfingKeys configuration which adds some nice features.",
|
||||
"main": "conf.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "github.com/b0o/surfingkeys-conf"
|
||||
},
|
||||
"keywords": [
|
||||
"surfingkeys",
|
||||
"chrome-extension",
|
||||
"configuration"
|
||||
],
|
||||
"author": "Maddison Hellstrom",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"del": "^3.0.0",
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-concat": "^2.6.1"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue