summaryrefslogtreecommitdiffstats
path: root/lib/output.js
blob: b787edc78cdc89c9aa1d8f41f5386d1d77e16339 (plain)
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;