summaryrefslogtreecommitdiffstats
path: root/lib/output/folder.js
blob: 9964ecd91bf7990464b56377554c3192493b2228 (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
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)
*/

module.exports = function folderOutput(Base) {
    Base = Base || Output;

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

    // 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);
            });
    };

    return FolderOutput;
};