summaryrefslogtreecommitdiffstats
path: root/lib/output/folder.js
blob: 90a33511b8cc660337667e63952ef25f973145f1 (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
var _ = require('lodash');
var util = require('util');
var path = require('path');

var Output = require('./base');
var fs = require('../utils/fs');
var pathUtil = require('../utils/path');
var Promise = require('../utils/promise');

/*
This output requires the native fs module to output
book as a directory (mapping assets and pages)
*/

function FolderOutput() {
    Output.apply(this, arguments);
}
util.inherits(FolderOutput, Output);

// Copy an asset file (non-parsable), ex: images, etc
FolderOutput.prototype.onAsset = function(filename) {
    return this.copyFile(
        this.book.resolve(filename),
        filename
    );
};

// Prepare the generation by creating the output folder
FolderOutput.prototype.prepare = function() {
    return fs.mkdirp(this.root());
};


// ----- Utility methods -----

// Return path to the root folder
FolderOutput.prototype.root = function() {
    return path.resolve(process.cwd(), this.book.config.get('output'));
};

// Resolve a file in the output directory
FolderOutput.prototype.resolve = function(filename) {
    return pathUtil.resolveInRoot.apply(null, [this.root()].concat(_.toArray(arguments)));
};

// Resolve a file path from a page (in the output folder)
FolderOutput.prototype.resolveForPage = function(page, filename) {
    var abs = page.resolveLocal(filename);
    return this.resolve(abs);
};


// Copy a file to the output
FolderOutput.prototype.copyFile = function(from, to) {
    var that = this;

    return Promise()
    .then(function() {
        to = that.resolve(to);

        return fs.copy(from, to);
    });
};

// Write a file/buffer to the output folder
FolderOutput.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);
    });
};

// Return true if a file exists in the output folder
FolderOutput.prototype.hasFile = function(filename) {
    var that = this;

    return Promise()
    .then(function() {
        return fs.exists(that.resolve(filename));
    });
};


// Create a new unique file
// Returns its filename
FolderOutput.prototype.createNewFile = function(base, filename) {
    var that = this;

    if (!filename) {
        filename = path.basename(filename);
        base = path.dirname(base);
    }

    return fs.uniqueFilename(this.resolve(base), filename)
        .then(function(out) {
            out = path.join(base, out);

            return fs.ensure(that.resolve(out))
                .thenResolve(out);
        });
};


module.exports = FolderOutput;