summaryrefslogtreecommitdiffstats
path: root/lib/generate/index.js
blob: 1606bd530f33e1c8214709cd8759b1cd098e3b7d (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 Q = require("q");
var _ = require("lodash");

var path = require("path");

var fs = require("./fs");
var parse = require("../parse");
var template = require("./template");

var generators = {
    "site": require("./generator_site"),
    "json": require("./generator_json")
};

var generate = function(options) {
    var generator = null;
    var files;

    options = _.defaults(options || {}, {
        // Folders to use
        input: null,
        output: null,

        // Output generator
        generator: "site",

        // Book title, keyword, description
        title: null,
        description: "Book generated using GitBook",

        // Origin github repository id
        github: null,
        githubHost: 'https://github.com/'
    });

    if (!options.github || !options.title || !options.input || !options.output) {
        return Q.reject(new Error("Need options: github, title, input, output"));
    }

    if (!generators[options.generator]) {
        return Q.reject(new Error("Invalid generator (availables are: "+_.keys(generators).join(", ")));
    }

    // Clean output folder
    return fs.remove(options.output)

    .then(function() {
        return fs.mkdirp(options.output);
    })

    // List all files in the repository
    .then(function() {
        return fs.list(options.input);
    })

    // Check repository is valid
    .then(function(_files) {
        files = _files;

        if (!_.contains(files, "SUMMARY.md") || !_.contains(files, "README.md")) {
            return Q.reject(new Error("Invalid gitbook repository, need SUMMARY.md and README.md"));
        }
    })

    // Get summary
    .then(function() {
        return fs.readFile(path.join(options.input, "SUMMARY.md"), "utf-8")
        .then(function(_summary) {
            options.summary = parse.summary(_summary);

            // Parse navigation
            options.navigation = parse.navigation(options.summary);
        });
    })

    // Create the generator
    .then(function() {
        generator = new generators[options.generator](options);
    })

    // Copy file and replace markdown file
    .then(function() {
        return Q.all(
            _.chain(files)
            .map(function(file) {
                if (!file) return;

                if (file[file.length -1] == "/") {
                    return Q(generator.transferFolder(file));
                } else if (path.extname(file) == ".md" && options.navigation[file] != null) {
                    return fs.readFile(path.join(options.input, file), "utf-8")
                    .then(function(content) {
                        return Q(generator.convertFile(content, file));
                    });
                } else {
                    return Q(generator.transferFile(file));
                }
            })
            .value()
        );
    })

    // Finish gneration
    .then(function() {
        return generator.finish();
    })

    .fail(function(err) {
        console.log(err);
        return Q.reject(err);
    })
};

module.exports = {
    generators: generators,
    folder: generate
};