mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-16 23:55:20 +00:00
8ed9f645fc
Add command to build
169 lines
3.2 KiB
JavaScript
169 lines
3.2 KiB
JavaScript
var Q = require("q");
|
|
var _ = require("lodash");
|
|
var path = require("path");
|
|
|
|
var fs = require("./utils/fs");
|
|
var Configuration = require("./configuration");
|
|
var parser = require("./parser");
|
|
|
|
var Book = function(root, options) {
|
|
// Root folder of the book
|
|
this.root = root;
|
|
|
|
// Configuration
|
|
this.config = new Configuration(this, options);
|
|
Object.defineProperty(this, "options", {
|
|
get: function () {
|
|
return this.config.options;
|
|
}
|
|
});
|
|
|
|
// Summary
|
|
this.summary = {};
|
|
|
|
// Glossary
|
|
this.glossary = [];
|
|
|
|
// Langs
|
|
this.langs = [];
|
|
};
|
|
|
|
// Initialize and parse the book: config, summary, glossary
|
|
Book.prototype.init = function() {
|
|
var that = this;
|
|
var multilingal = false;
|
|
|
|
return this.config.load()
|
|
|
|
.then(function() {
|
|
return that.parseLangs()
|
|
.then(function() {
|
|
multilingal = that.langs.length > 0;
|
|
|
|
// Sub-books that inherit from the current book configuration
|
|
that.books = _.map(that.langs, function(lang) {
|
|
return new Book(
|
|
path.join(that.root, lang.path),
|
|
_.extend({}, that.options, {
|
|
'lang': lang.lang
|
|
})
|
|
)
|
|
});
|
|
});
|
|
})
|
|
|
|
.then(function() {
|
|
if (multilingal) return;
|
|
return that.parseSummary();
|
|
})
|
|
.then(function() {
|
|
if (multilingal) return;
|
|
return that.parseGlossary();
|
|
})
|
|
.thenResolve(this);
|
|
};
|
|
|
|
// Generate the output
|
|
Book.prototype.generate = function() {
|
|
var that = this;
|
|
|
|
return this.init()
|
|
.then(function() {
|
|
|
|
});
|
|
};
|
|
|
|
// Parse langs
|
|
Book.prototype.parseLangs = function() {
|
|
var that = this;
|
|
|
|
return that.findFile("LANGS")
|
|
.then(function(langs) {
|
|
if (!langs) return [];
|
|
|
|
return that.readFile(langs.path)
|
|
.then(function(content) {
|
|
return langs.parser.langs(content);
|
|
});
|
|
})
|
|
.then(function(langs) {
|
|
that.langs = langs;
|
|
});
|
|
};
|
|
|
|
// Parse summary
|
|
Book.prototype.parseSummary = function() {
|
|
var that = this;
|
|
|
|
return that.findFile("SUMMARY")
|
|
.then(function(summary) {
|
|
if (!summary) throw "No SUMMARY file";
|
|
|
|
return that.readFile(summary.path)
|
|
.then(function(content) {
|
|
return summary.parser.summary(content);
|
|
});
|
|
})
|
|
.then(function(summary) {
|
|
that.summary = summary;
|
|
});
|
|
};
|
|
|
|
// Parse glossary
|
|
Book.prototype.parseGlossary = function() {
|
|
var that = this;
|
|
|
|
return that.findFile("GLOSSARY")
|
|
.then(function(glossary) {
|
|
if (!glossary) return {};
|
|
|
|
return that.readFile(glossary.path)
|
|
.then(function(content) {
|
|
return glossary.parser.glossary(content);
|
|
});
|
|
})
|
|
.then(function(glossary) {
|
|
that.glossary = glossaryy;
|
|
});
|
|
};
|
|
|
|
// Find file that can be parsed with a specific filename
|
|
Book.prototype.findFile = function(filename) {
|
|
var that = this;
|
|
|
|
return _.reduce(parser.extensions, function(prev, ext) {
|
|
return prev.then(function(output) {
|
|
// Stop if already find a parser
|
|
if (output) return output;
|
|
|
|
var filepath = filename+ext;
|
|
|
|
return that.fileExists(filepath)
|
|
.then(function(exists) {
|
|
if (!exists) return null;
|
|
return {
|
|
parser: parser.get(ext).parser,
|
|
path: filepath
|
|
};
|
|
})
|
|
});
|
|
}, Q(null));
|
|
};
|
|
|
|
// Check if a file exists in the book
|
|
Book.prototype.fileExists = function(filename) {
|
|
return fs.exists(
|
|
path.join(this.root, filename)
|
|
);
|
|
};
|
|
|
|
// Read a file
|
|
Book.prototype.readFile = function(filename) {
|
|
return fs.readFile(
|
|
path.join(this.root, filename),
|
|
{ encoding: "utf8" }
|
|
);
|
|
};
|
|
|
|
module.exports= Book;
|