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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
var _ = require('lodash');
var Ignore = require('ignore');
var path = require('path');
var Promise = require('./utils/promise');
var pathUtil = require('./utils/path');
var error = require('./utils/error');
var fs = require('./utils/fs');
var generators = require('./generators');
var PluginsManager = require('./plugins');
function Output(book, type) {
if (!generators[type]) throw error.GeneratorNotFoundError({ generator: type });
this.book = book;
this.log = this.book.log;
this.type = type;
this.plugins = new PluginsManager(book);
this.generator = new generators[type](this, type);
// Files to ignore in output
this.ignore = Ignore();
this.ignore.addPattern(_.compact([
'.gitignore',
'.ignore',
'.bookignore',
// The configuration file should not be copied in the output
this.book.config.filename
]));
}
// Return path to the root folder
Output.prototype.root = function(filename) {
return path.resolve(process.cwd(), this.book.config.get('output'));
};
// Resolve a file in the output directory
Output.prototype.resolve = function(filename) {
return pathUtil.resolveInRoot.apply(null, [this.root()].concat(_.toArray(arguments)));
};
// Write a file/buffer to the output folder
Output.prototype.writeFile = function(filename, buf) {
var that = this;
return Promise()
.then(function() {
filename = that.resolve(filename);
var folder = path.dirname(filename);
// Ensure fodler exists
return fs.mkdirp(folder);
})
// Write the file
.then(function() {
return fs.writeFile(filename, buf);
});
};
// Copy a file to the output
Output.prototype.copyFile = function(from, to) {
var that = this;
return Promise()
.then(function() {
to = that.resolve(to);
return fs.copy(from, to);
});
};
// Start the generation, for a parsed book
Output.prototype.generate = function() {
var that = this;
var isMultilingual = this.book.isMultilingual();
return Promise()
// Load all plugins
.then(function() {
that.log.info.ln('Loading and preparing plugins');
var plugins = _.pluck(that.book.config.get('plugins'), 'name');
return that.plugins.load(plugins);
})
// Create the output folder
.then(function() {
return fs.mkdirp(that.root());
})
// Initialize the generation
.then(function() {
return that.generator.prepare();
})
// Process all files
.then(function() {
return that.book.fs.listAllFiles(that.book.root);
})
.then(function(files) {
return Promise.serie(files, function(filename) {
// Ignore file present in a language book
if (isMultilingual && that.book.isInLanguageBook(filename)) return;
// Process file as page or asset
if (that.book.hasPage(filename)) {
return that.generator.writePage(that.book.getPage(filename));
} else {
return that.generator.writeAsset(filename);
}
});
})
// Finish the generation
.then(function() {
return that.generator.finish();
});
};
module.exports = Output;
|