summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md7
-rw-r--r--lib/book.js60
-rw-r--r--lib/generator.js28
-rw-r--r--lib/generators/json.js32
-rw-r--r--test/generation.js10
5 files changed, 106 insertions, 31 deletions
diff --git a/README.md b/README.md
index 6318e91..88672b5 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,10 @@ GitBook
=======
:warning: This branch contains some test for a version 2.0.
+
+ChangeLog with 1.0.0:
+
+- Hooks `summary` and `glossary` (after and before) have been removed
+- Exercises and Quizzes are no longer parsed in the markdown parser
+- You can now also use the `.markdown` extension for markdown files
+
diff --git a/lib/book.js b/lib/book.js
index 435e05c..3ad302a 100644
--- a/lib/book.js
+++ b/lib/book.js
@@ -126,11 +126,46 @@ Book.prototype.generate = function(generator) {
var Generator = generators[generator];
if (!Generator) throw "Generator '"+generator+"' doesn't exist";
generator = new Generator(that);
+
+ return generator.load();
})
.then(function() {
- if (that.isMultilingual()) return that.generateMultiLingual(generator);
- });
+ if (that.isMultilingual()) {
+ return that.generateMultiLingual(generator);
+ } else {
+ // Copy file and replace markdown file
+ return Q.all(
+ _.chain(that.files)
+ .map(function(file) {
+ if (!file) return;
+
+ if (file[file.length -1] == "/") {
+ return Q(generator.transferFolder(file));
+ } else if (_.contains(parsers.extensions, path.extname(file)) && 1) {
+ return that.parsePage(file)
+ .then(function(content) {
+ return Q(generator.writeParsedFile(content, file));
+ });
+ } else {
+ return Q(generator.transferFile(file));
+ }
+ })
+ .value()
+ );
+ }
+ })
+
+ // Finish generation
+ .then(function() {
+ return generator.callHook("finish:before");
+ })
+ .then(function() {
+ return generator.finish();
+ })
+ .then(function() {
+ return generator.callHook("finish");
+ });
};
// Generate the output for a multilingual book
@@ -213,6 +248,9 @@ Book.prototype.parseSummary = function() {
.spread(function(summary, readme) {
if (!summary) throw "No SUMMARY file";
+ // Remove the summary from the list of files to parse
+ that.files = _.without(that.files, summary.path);
+
return that.template.renderFile(summary.path)
.then(function(content) {
return summary.parser.summary(content, readme.path);
@@ -231,6 +269,9 @@ Book.prototype.parseGlossary = function() {
.then(function(glossary) {
if (!glossary) return {};
+ // Remove the glossary from the list of files to parse
+ that.files = _.without(that.files, glossary.path);
+
return that.template.renderFile(glossary.path)
.then(function(content) {
return glossary.parser.glossary(content);
@@ -241,6 +282,21 @@ Book.prototype.parseGlossary = function() {
});
};
+// Parse a page
+Book.prototype.parsePage = function(filename) {
+ var that = this;
+
+ var extension = path.extname(filename);
+ var filetype = parsers.get(extension);
+
+ if (!filetype) return Q.reject(new Error("Can't parse file: "+filename));
+
+ return that.template.renderFile(filename)
+ .then(function(content) {
+ return filetype.parser.page(content);
+ });
+};
+
// Find file that can be parsed with a specific filename
Book.prototype.findFile = function(filename) {
var that = this;
diff --git a/lib/generator.js b/lib/generator.js
index 32ce3b5..fa6b8b0 100644
--- a/lib/generator.js
+++ b/lib/generator.js
@@ -3,32 +3,40 @@ var path = require("path");
var Q = require("q");
var fs = require("./utils/fs");
-var BaseGenerator = function(book, options) {
- this.options = options;
+var BaseGenerator = function(book) {
+ this.book = book;
+
+ Object.defineProperty(this, "options", {
+ get: function () {
+ return this.book.options;
+ }
+ });
// Base for assets in plugins
this.pluginAssetsBase = "book";
};
BaseGenerator.prototype.callHook = function(name, data) {
- return this.plugins.hook(name, data);
+ //return this.plugins.hook(name, data);
+ return Q();
};
-// Sets up generator
+// Prepare the genertor
BaseGenerator.prototype.load = function() {
- return this.loadPlugins();
+ return this.preparePlugins();
};
BaseGenerator.prototype.preparePlugins = function() {
var that = this;
-
};
-BaseGenerator.prototype.convertFile = function(content, input) {
+// Write a parsed file to the output
+BaseGenerator.prototype.writeParsedFile = function(page, input) {
return Q.reject(new Error("Could not convert "+input));
};
+// Copy file to the output (non parsable)
BaseGenerator.prototype.transferFile = function(input) {
return fs.copy(
path.join(this.options.input, input),
@@ -36,12 +44,14 @@ BaseGenerator.prototype.transferFile = function(input) {
);
};
+// Copy a folder to the output
BaseGenerator.prototype.transferFolder = function(input) {
return fs.mkdirp(
- path.join(this.options.output, input)
+ path.join(this.book.options.output, input)
);
};
+// Copy the cover picture
BaseGenerator.prototype.copyCover = function() {
var that = this;
@@ -63,10 +73,12 @@ BaseGenerator.prototype.copyCover = function() {
});
};
+// Generate the langs index
BaseGenerator.prototype.langsIndex = function(langs) {
return Q.reject(new Error("Langs index is not supported in this generator"));
};
+// At teh end of the generation
BaseGenerator.prototype.finish = function() {
return Q.reject(new Error("Could not finish generation"));
};
diff --git a/lib/generators/json.js b/lib/generators/json.js
index 661e587..3023b42 100644
--- a/lib/generators/json.js
+++ b/lib/generators/json.js
@@ -17,33 +17,25 @@ Generator.prototype.transferFile = function(input) { };
Generator.prototype.finish = function() { };
// Convert an input file
-Generator.prototype.convertFile = function(content, input) {
+Generator.prototype.writeParsedFile = function(page, input) {
var that = this;
var json = {
- progress: parse.progress(this.options.navigation, input)
+ progress: [],
+ sections: page.sections
};
- return Q()
- .then(function() {
- return parse.page(content, {
- dir: path.dirname(input) || '/'
- });
- })
- .then(function(parsed) {
- json.lexed = parsed.lexed;
- json.sections = parsed.sections;
- })
- .then(function() {
- return fs.writeFile(
- path.join(that.options.output, input.replace(".md", ".json")),
- JSON.stringify(json, null, 4)
- );
- });
+ var output = path.basename(input, path.extname(input))+".json";
+ output = path.join(that.options.output, output);
+
+ return fs.writeFile(
+ output,
+ JSON.stringify(json, null, 4)
+ );
};
// Generate languages index
// Contains the first languages readme and langs infos
-Generator.prototype.langsIndex = function(langs) {
+/*Generator.prototype.langsIndex = function(langs) {
var that = this;
if (langs.list.length == 0) return Q.reject("Need at least one language");
@@ -68,6 +60,6 @@ Generator.prototype.langsIndex = function(langs) {
JSON.stringify(json, null, 4)
);
});
-};
+};*/
module.exports = Generator;
diff --git a/test/generation.js b/test/generation.js
index 2083ca0..4176c8a 100644
--- a/test/generation.js
+++ b/test/generation.js
@@ -2,8 +2,16 @@ var path = require('path');
var _ = require('lodash');
var assert = require('assert');
+var fs = require('../lib/utils/fs');
+
describe('Book generation', function () {
it('should correctly generate a book with json', function(done) {
- qdone(book1.generate("json"), done);
+ var OUTPUT_PATH = book1.options.output;
+
+ qdone(
+ book1.generate("json")
+ .fin(function() {
+ return fs.remove(OUTPUT_PATH);
+ }), done);
});
});