-
Notifications
You must be signed in to change notification settings - Fork 4
/
extension.js
105 lines (93 loc) · 3.14 KB
/
extension.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
'use strict';
var pjson = require('./package.json'),
Extension = require('openframe-extension'),
execSync = require('child_process').execSync,
debug = require('debug')('openframe-website');
/**
* Extensions should expose an instance of the Extension class.
*
* For info on building extensions, see [Openframe-Extension](https://github.com/OpenframeProject/Openframe-Extension).
*/
module.exports = new Extension({
format: {
// the name should be the same as the package name
'name': pjson.name,
// this is what might get displayed to users (not currently used)
'display_name': 'Website',
'download': false,
'start_command': function(args, tokens) {
// 1. clone template .xinitrc
var filePath = _cloneTemplate(this.xinitrcTplPath),
// 2. parse options from args into tokens
_tokens = _extendTokens(args, tokens);
// 3. replace tokens in .xinitrc
_replaceTokens(filePath, _tokens);
// 4. return xinit
return 'xinit ' + filePath;
},
'end_command': 'pkill -f X',
xinitrcTplPath: __dirname + '/scripts/.xinitrc.tpl'
},
});
/**
* extend the tokens with expected values from args
*
* @param {object} args Arguments provided to this extension
* @param {object} tokens Original tokens for this extension
*/
function _extendTokens(args, tokens) {
var _tokens = {},
_args = args,
expectedKeys = ['flags'];
// if args is not an object, we'll just use an empty one
if (typeof(args) !== 'object') {
_args = {};
}
// shallow-copy the original tokens object
for (let key in tokens) {
_tokens[key] = tokens[key];
}
// copy expected arguments from args to the new tokens object
// defaulting to an emptystring
for (let key of expectedKeys) {
// prepend keys with a dollar-sign for template-replacement
_tokens['$'+key] = _args[key] || '';
}
return _tokens;
}
/**
* Replace tokens in a file.
*
* @param {string} _str
* @param {object} tokens
* @return {string} The string with tokens replaced.
*/
function _replaceTokens(filePath, tokens) {
debug(_replaceTokens, filePath, tokens);
function replace(token, value) {
// tokens start with a $ which needs to be escaped, oops
var _token = '\\' + token,
// any '&' character needs to be escaped in the value,
// otherwise it is used as a backreference
_value = value.replace(/&/g, '\\&'),
// use commas as delims so that we don't need to escape value, which might be a URL
cmd = 'sed -i "s,' + _token + ',' + _value + ',g" ' + filePath;
execSync(cmd);
}
var key;
for (key in tokens) {
// TODO: better token replacement (global replacement?
replace(key, tokens[key]);
}
}
/**
* Clone xinitrc
*
* @return {string} The string with tokens replaced.
*/
function _cloneTemplate(filePath) {
var newFilePath = filePath.replace('.tpl', ''),
cmd = 'cp -f ' + filePath + ' ' + newFilePath;
execSync(cmd);
return newFilePath;
}