-
Notifications
You must be signed in to change notification settings - Fork 4
/
cli.js
107 lines (91 loc) · 2.81 KB
/
cli.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
106
107
const fs = require('fs'),
vow = require('vow'),
Autoclasscss = require('./autoclasscss').Autoclasscss,
argv = require('optimist')
.alias('o', 'options')
.describe('o', 'JSON file with options')
.alias('s', 'save')
.describe('s', 'File to save result')
.argv;
/**
* Конструктор
* @param {string} html Путь до HTML-файл
* @param {string} [options] Путь до файла опций
* @param {string} [save] Путь до файла для сохранения результата
* @constructor
*/
function Cli(html, options, save) {
this.html = html;
this.options = options;
this.save = save;
}
Cli.prototype = {
/**
* Запустить выполнение
*/
run: function() {
var that = this;
vow.all([this.getHtml(), this.getOptions()]).then(function(result) {
var html = result[0],
options = result[1],
css = new Autoclasscss(html, options).get();
that._result(css);
});
},
/**
* Вывести результат
* @param {string} css Результирующий CSS
* @private
*/
_result: function(css) {
this.save ? this.saveCss(css) : console.log(css);
},
/**
* Сохранить CSS
* @param {string} css Результирующий CSS
*/
saveCss: function(css) {
var that = this;
fs.writeFile(this.save, css, function(err) {
if(err) throw err;
console.log('Saved to ' + that.save);
});
},
/**
* Получить содержимое целевого HTML-файла
* @returns {Promise}
*/
getHtml: function() {
return this._readFilePromise(this.html);
},
/**
* Получить объект опций
* @returns {Promise}
*/
getOptions: function() {
if(!this.options) return;
return this._readFilePromise(this.options, function(options) {
return JSON.parse(options);
});
},
/**
* Прочитать содержимое файла
* @param {string} file Путь до файла
* @param {Function} [modify] Преобразователь полученных данных
* @returns {Promise}
* @private
*/
_readFilePromise: function(file, modify) {
var promise = vow.promise(),
that = this;
fs.readFile(file, { 'encoding': 'utf-8' }, function(err, data) {
if(err) return promise.reject(err);
var modifiedData = modify ? modify.call(that, data) : data;
promise.fulfill(modifiedData);
});
return promise;
}
};
module.exports.run = function() {
return new Cli(argv._[0], argv.options, argv.save).run();
};