summaryrefslogtreecommitdiffstats
path: root/lib/generate/init.js
blob: 705e6e75811bf6b3ef8bc7c043a3f82496892b71 (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
var Q = require('q');
var _ = require('lodash');

var path = require('path');

var fs = require('./fs');
var parse = require('../parse');


// Extract paths out of a summary
function paths(summary) {
    return _.reduce(summary.chapters, function(accu, chapter) {
        return accu.concat(
            _.filter([chapter.path].concat(_.pluck(chapter.articles, 'path')))
        );
    }, []);
}

// Get the parent folders out of a group of files
function folders(files) {
    return _.chain(files)
    .map(function(file) {
        return path.dirname(file);
    })
    .uniq()
    .value();
}

function initDir(dir) {
    return fs.readFile(path.join(dir, 'SUMMARY.md'), 'utf8')
    .then(function(src) {
        // Parse summary
        return parse.summary(src);
    })
    .then(function(summary) {
        // Extract paths from summary
        return paths(summary);
    })
    .then(function(paths) {
        // Convert to absolute paths
        return _.map(paths, function(file) {
            return path.resolve(file);
        });
    })
    .then(function(files) {
        // Create folders
        return Q.all(_.map(folders(files), function(folder) {
            return fs.mkdirp(folder);
        }))
        .then(_.constant(files));
    })
    .then(function(files) {
        // Create files that don't exist
        return Q.all(_.map(files, function(file) {
            return fs.exists(file)
            .then(function(exists) {
                if(exists) return;
                return fs.writeFile(file, '');
            });
        }));
    })
    .fail(function(err) {
        console.error(err.stack);
    });
}


// Exports
module.exports = initDir;