Files
gitbook/lib/generate/index.js
T
2014-03-31 19:25:14 -07:00

159 lines
3.6 KiB
JavaScript

var Q = require("q");
var _ = require("lodash");
var path = require("path");
var Ignore = require("fstream-ignore");
var fs = require("./fs");
var parse = require("../parse");
var template = require("./template");
function getFiles(path) {
var d = Q.defer();
// Our list of files
var files = [];
var ig = Ignore({
path: path,
ignoreFiles: ['.ignore', '.gitignore']
});
// Add extra rules to ignore common folders
ig.addIgnoreRules([
'.git/'
], '__custom_stuff');
// Push each file to our list
ig.on('child', function (c) {
files.push(
c.path.substr(c.root.path.length + 1) + (c.props.Directory === true ? '/' : '')
);
});
ig.on('end', function() {
d.resolve(files);
});
ig.on('error', d.reject);
return d.promise;
}
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 getFiles(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() {
console.log(files, summary);
return Q.all(
_.chain(files)
.map(function(file) {
if (!file) return;
// Folder
if (file[file.length -1] == "/") {
return fs.mkdirp(
path.join(output, file)
);
}
// Markdown file
else if (path.extname(file) == ".md") {
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
};