rkeys
Version:
A platform for creating tablet/HTML5 virtual-keyboard apps to send keystrokes to remote X11
176 lines (175 loc) • 5.19 kB
JavaScript
// Generated by LiveScript 1.3.0
(function(){
var Fs, Path, _, Yaml, Sh, U, Args, cache, transformCommand, me, join$ = [].join, slice$ = [].slice, replace$ = ''.replace, split$ = ''.split;
Fs = require('fs');
Path = require('path');
_ = require('lodash');
Yaml = require('js-yaml');
Sh = require('shelljs/global');
U = require('util');
Args = require('../args');
cache = {
fpaths: []
};
transformCommand = curry$(function(fn, cmd){
if (_.isArray(cmd)) {
return _.map(cmd, fn);
} else {
return fn(cmd);
}
});
module.exports = me = {
applyAliases: transformCommand(applyAliases),
getCommand: function(id){
return cache.commands[id];
},
getSidechains: function(){
return cache.sidechains;
}
};
loadAll();
function applyAliases(it){
return _.reduce(cache.aliases, function(s, v, k){
return s.replace(k, v);
}, it);
}
function buildCache(cfgs){
var as, cs, ss, i$, len$, cfg, id, c, val, isSidechain, chain, cid, cmd;
cache.aliases = as = {};
cache.commands = cs = {};
cache.sidechains = ss = {};
for (i$ = 0, len$ = cfgs.length; i$ < len$; ++i$) {
cfg = cfgs[i$];
for (id in cfg) {
c = cfg[id];
if (/^alias /.test(c)) {
as[id] = c.slice(6);
delete cfg[id];
}
}
}
for (i$ = 0, len$ = cfgs.length; i$ < len$; ++i$) {
cfg = cfgs[i$];
for (id in cfg) {
val = cfg[id];
if (isSidechain = /^\/.*\/$/.test(id)) {
chain = [];
if (!_.isObject(val)) {
throw new Error("Invalid sidechain: expecting a series of key value pairs at " + id + ": " + val);
}
for (cid in val) {
cmd = val[cid];
if (!/^\/.*\/$/.test(cid)) {
throw new Error("Invalid sidechain key: " + cid + " should be a regular expression surrounded\nby / in " + val);
}
_.remove(chain, fn$);
chain.push({
id: cid,
cmd: me.applyAliases(cmd),
rx: getRxById(cid)
});
}
ss[id] = {
chain: chain,
rx: getRxById(id)
};
} else {
cs[id] = me.applyAliases(val);
}
}
}
log2(U.inspect(cache, {
depth: null
}));
function getRxById(id){
return new RegExp(join$.call(slice$.call(id, 1, -2 + 1 || 9e9), ''));
}
return getRxById;
function fn$(it){
return it.id === cid;
}
}
function loadAll(){
var i$, ref$, len$, p, dirs, d, results$ = [];
for (i$ = 0, len$ = (ref$ = cache.fpaths).length; i$ < len$; ++i$) {
p = ref$[i$];
Fs.unwatchFile(p);
}
dirs = [__dirname].concat(Args.dirs);
cache.fpaths = _.flatten((function(){
var i$, ref$, len$, results$ = [];
for (i$ = 0, len$ = (ref$ = dirs).length; i$ < len$; ++i$) {
d = ref$[i$];
results$.push(ls([d + "/*.yaml", d + "/*.yml"]));
}
return results$;
}()));
buildCache((function(){
var i$, ref$, len$, results$ = [];
for (i$ = 0, len$ = (ref$ = cache.fpaths).length; i$ < len$; ++i$) {
p = ref$[i$];
results$.push(loadFile(p));
}
return results$;
}()));
for (i$ = 0, len$ = (ref$ = cache.fpaths).length; i$ < len$; ++i$) {
p = ref$[i$];
results$.push(Fs.watchFile(p, loadAll));
}
return results$;
}
function loadFile(path){
var cfg, dir, k, v, i$, ref$, paths, len$, pInc, p, ps, j$, len1$;
log("load commands from " + path);
if (!test('-e', path)) {
return log("MISSING " + path);
}
cfg = Yaml.safeLoad(Fs.readFileSync(path));
dir = Path.dirname(path);
for (k in cfg) {
v = cfg[k];
if (k === 'include') {
log("include " + v);
delete cfg.include;
for (i$ = 0, len$ = (ref$ = paths = (replace$.call(v, ',', '')).split(' ')).length; i$ < len$; ++i$) {
pInc = ref$[i$];
p = Path.resolve(dir, pInc);
ps = test('-d', p)
? ls([p + "/*.yaml", p + "/*.yml"])
: [p];
for (j$ = 0, len1$ = ps.length; j$ < len1$; ++j$) {
p = ps[j$];
cfg = _.extend(cfg, loadFile(p));
}
}
}
}
return _.mapValues(cfg, transformCommand(function(it){
var i$, ref$, arr, len$, i, s;
if (_.isObject(it)) {
return it;
}
for (i$ = 0, len$ = (ref$ = arr = split$.call(it, ' ')).length; i$ < len$; ++i$) {
i = i$;
s = ref$[i$];
if (/^\.{1,2}\//.test(s)) {
arr[i] = Path.resolve(dir, s);
}
}
return join$.call(arr, ' ');
}));
}
function curry$(f, bound){
var context,
_curry = function(args) {
return f.length > 1 ? function(){
var params = args ? args.concat() : [];
context = bound ? context || this : this;
return params.push.apply(params, arguments) <
f.length && arguments.length ?
_curry.call(context, params) : f.apply(context, params);
} : f;
};
return _curry();
}
}).call(this);