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

var path = require("path");

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

var generate = function(root, output, options) {
    var files, summary, navigation, tpl;

    options = _.defaults(options || {}, {
        // Book title
        title: null,

        // Origin github repository id
        github: null
    });

    if (!options.github || !options.title) return Q.reject(new Error("Need options.github and optiosn.title"));


    // 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 template
    .then(function() {
        tpl = template({
            root: root,
            output: output,
            locals: {
                githubAuthor: options.github.split("/")[0],
                githubId: options.github,
                title: options.title,
                summary: summary,
                allNavigation: navigation
            }
        });
    })

    // Copy file and replace markdown file
    .then(function() {
        return Q.all(
            _.chain(files)
            .map(function(file) {
                if (!file) return;
                var _html = file.replace(".md", ".html");

                // Folder
                if (file[file.length -1] == "/") {
                    return fs.mkdirp(
                        path.join(output, file)
                    );
                }

                // Markdown file (only from the summary)
                else if (path.extname(file) == ".md" && navigation[_html] != null) {
                    return tpl(file, file.replace(".md", ".html"));
                }

                // Copy file
                else {
                    return fs.copy(
                        path.join(root, file),
                        path.join(output, file)
                    );
                }
            })
            .value()
        );
    })

    // Symlink index.html to README.html
    .then(function() {
        return fs.symlink(
            path.join(output, 'README.html'),
            path.join(output, 'index.html')
        );
    })

    // Copy assets
    .then(function() {
        return fs.copy(
            path.join(__dirname, "../../assets/static"),
            path.join(output, "gitbook")
        );
    });
};

module.exports = {
    folder: generate
};