summaryrefslogtreecommitdiffstats
path: root/lib/generate/index.js
blob: 7cc7b6bf419d3954c220d4e8b3d923ab95e2431c (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
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(root, output, options) {
    var generator = null;
    var files, summary, navigation, tpl;

    options = _.defaults(options || {}, {
        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) {
        return Q.reject(new Error("Need options.github and options.title"));
    }

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

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

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

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

    // 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(root, "SUMMARY.md"), "utf-8")
        .then(function(_summary) {
            summary = parse.summary(_summary);

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

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

    // 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 generator.transferFolder(file);
                } else if (path.extname(file) == ".md" && navigation[file] != null) {
                    return generator.convertFile(file);
                } else {
                    return generator.transferFile(file);
                }
            })
            .value()
        );
    })

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

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