summaryrefslogtreecommitdiffstats
path: root/lib/output
diff options
context:
space:
mode:
Diffstat (limited to 'lib/output')
-rw-r--r--lib/output/callHook.js15
-rw-r--r--lib/output/generateAssets.js23
-rw-r--r--lib/output/generateBook.js62
-rw-r--r--lib/output/generatePage.js9
-rw-r--r--lib/output/generatePages.js23
-rw-r--r--lib/output/generators/json.js26
-rw-r--r--lib/output/index.js11
-rw-r--r--lib/output/json/index.js6
-rw-r--r--lib/output/json/onPage.js20
-rw-r--r--lib/output/json/options.js8
-rw-r--r--lib/output/prepareAssets.js19
-rw-r--r--lib/output/preparePages.js18
-rw-r--r--lib/output/preparePlugins.js24
13 files changed, 191 insertions, 73 deletions
diff --git a/lib/output/callHook.js b/lib/output/callHook.js
new file mode 100644
index 0000000..0db1ff1
--- /dev/null
+++ b/lib/output/callHook.js
@@ -0,0 +1,15 @@
+
+/**
+ Call a "global" hook for an output
+
+ @param {String} name
+ @param {Output} output
+ @return {Promise<Output>}
+*/
+function callHook(name, output) {
+
+}
+
+
+
+module.exports = callHook;
diff --git a/lib/output/generateAssets.js b/lib/output/generateAssets.js
new file mode 100644
index 0000000..04ca05d
--- /dev/null
+++ b/lib/output/generateAssets.js
@@ -0,0 +1,23 @@
+var Promise = require('../utils/promise');
+
+/**
+ Output all assets using a generator
+
+ @param {Generator} generator
+ @param {Output} output
+ @return {Promise<Output>}
+*/
+function generateAssets(generator, output) {
+ var assets = output.getAssets();
+
+ // Is generator ignoring assets?
+ if (!generator.onAsset) {
+ return Promise(output);
+ }
+
+ return Promise.reduce(assets, function(out, assetFile) {
+ return generator.onAsset(out, assetFile);
+ }, output);
+}
+
+module.exports = generateAssets;
diff --git a/lib/output/generateBook.js b/lib/output/generateBook.js
index 3f04875..fb03418 100644
--- a/lib/output/generateBook.js
+++ b/lib/output/generateBook.js
@@ -1,42 +1,46 @@
-var Parse = require('../parse');
+var Output = require('../models/output');
+var Promise = require('../utils/promise');
-/**
- List all assets for a book
+var callHook = require('./callHook');
+var preparePlugins = require('./preparePlugins');
+var preparePages = require('./preparePages');
+var prepareAssets = require('./prepareAssets');
+var generateAssets = require('./generateAssets');
+var generatePages = require('./generatePages');
- @param {Book} book
- @param {Map<String:Page>} pages
- @param
-*/
-function listAssets(book, pages) {
- var fs = book.getContentFS();
-
- return fs.listAllFiles()
- .then(function(files) {
- return files.filterNot(function(file) {
- return (
- book.isContentFileIgnored(file) ||
- pages.has(file)
- );
- });
- });
-}
+/**
+ Generate a book using a generator.
+ The overall process is:
+ 1. List and load plugins for this book
+ 2. Call hook "config"
+ 3. Call hook "init"
+ 4. Initialize generator
+ 5. List all assets and pages
+ 6. Copy all assets to output
+ 7. Generate all pages
+ 8. Call hook "finish:before"
+ 9. Finish generation
+ 10. Call hook "finish"
-/**
- Generate a book using a generator
@param {Generator} generator
@param {Book} book
+ @param {Object} options
@return {Promise}
*/
-function generateBook(generator, book) {
- // List all parsable pages
- return Parse.parsePagesList(book)
- .then(function(pages) {
- return listAssets(book, pages);
- });
+function generateBook(generator, book, options) {
+ options = generator.Options(options);
+
+ return Promise(
+ Output.createForBook(book, options)
+ )
+ .then(preparePlugins)
+ .then(preparePages)
+ .then(prepareAssets)
+ .then(generateAssets.bind(null, generator))
+ .then(generatePages.bind(null, generator));
}
-
module.exports = generateBook;
diff --git a/lib/output/generatePage.js b/lib/output/generatePage.js
deleted file mode 100644
index 9afb50a..0000000
--- a/lib/output/generatePage.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/**
- Generate a page using a generator
-*/
-function generatePage(generator, book, page) {
-
-}
-
-
-module.exports = generatePage;
diff --git a/lib/output/generatePages.js b/lib/output/generatePages.js
new file mode 100644
index 0000000..406f242
--- /dev/null
+++ b/lib/output/generatePages.js
@@ -0,0 +1,23 @@
+var Promise = require('../utils/promise');
+
+/**
+ Output all pages using a generator
+
+ @param {Generator} generator
+ @param {Output} output
+ @return {Promise<Output>}
+*/
+function generatePages(generator, output) {
+ var pages = output.getPages();
+
+ // Is generator ignoring assets?
+ if (!generator.onPage) {
+ return Promise(output);
+ }
+
+ return Promise.reduce(pages, function(out, assetFile) {
+ return generator.onPage(out, assetFile);
+ }, output);
+}
+
+module.exports = generatePages;
diff --git a/lib/output/generators/json.js b/lib/output/generators/json.js
deleted file mode 100644
index e75ae7c..0000000
--- a/lib/output/generators/json.js
+++ /dev/null
@@ -1,26 +0,0 @@
-var Promise = require('../../utils/promise');
-
-var Modifier = require('../');
-
-
-function JSONGenerator(book) {
- this.book = book;
-}
-
-
-JSONGenerator.prototype.onPage = function(page) {
- return Modifier.HTMLTransformations(page, [
- Modifier.svgToImg(),
- Modifier.svgToPng()
- ])
- .then(function() {
-
-
- });
-};
-
-JSONGenerator.prototype.onAsset = function(file) {
-
-};
-
-module.exports = JSONGenerator; \ No newline at end of file
diff --git a/lib/output/index.js b/lib/output/index.js
index 67ca5ee..45bdf65 100644
--- a/lib/output/index.js
+++ b/lib/output/index.js
@@ -1,11 +1,4 @@
-
-
-function generate(book, output) {
-
-}
-
-
-
module.exports = {
- generate: generate
+ generate: require('./generateBook'),
+ JSONGenerator: require('./json')
};
diff --git a/lib/output/json/index.js b/lib/output/json/index.js
new file mode 100644
index 0000000..f721d22
--- /dev/null
+++ b/lib/output/json/index.js
@@ -0,0 +1,6 @@
+
+
+module.exports = {
+ Options: require('./options'),
+ onPage: require('./onPage')
+};
diff --git a/lib/output/json/onPage.js b/lib/output/json/onPage.js
new file mode 100644
index 0000000..3ef5c74
--- /dev/null
+++ b/lib/output/json/onPage.js
@@ -0,0 +1,20 @@
+var Modifier = require('../modifier');
+
+/**
+ Write a page as a json file
+
+ @param {Output} output
+ @param {Page} page
+*/
+function onPage(output, page) {
+ var options = output.
+
+ return Modifier.applyHTMLTransformations(page, [
+ Modifier.HTML.resolveLinks()
+ ])
+ .then(function(newPage) {
+
+ });
+}
+
+module.exports = onPage;
diff --git a/lib/output/json/options.js b/lib/output/json/options.js
new file mode 100644
index 0000000..79167b1
--- /dev/null
+++ b/lib/output/json/options.js
@@ -0,0 +1,8 @@
+var Immutable = require('immutable');
+
+var Options = Immutable.Record({
+ // Root folder for the output
+ root: String()
+});
+
+module.exports = Options;
diff --git a/lib/output/prepareAssets.js b/lib/output/prepareAssets.js
new file mode 100644
index 0000000..19aabef
--- /dev/null
+++ b/lib/output/prepareAssets.js
@@ -0,0 +1,19 @@
+var Parse = require('../parse');
+
+/**
+ List all assets in the book
+
+ @param {Output}
+ @return {Promise<Output>}
+*/
+function prepareAssets(output) {
+ var book = output.getBook();
+ var pages = output.getPages();
+
+ return Parse.listAssets(book, pages)
+ .then(function(assets) {
+ return output.set('assets', assets);
+ });
+}
+
+module.exports = prepareAssets;
diff --git a/lib/output/preparePages.js b/lib/output/preparePages.js
new file mode 100644
index 0000000..396edde
--- /dev/null
+++ b/lib/output/preparePages.js
@@ -0,0 +1,18 @@
+var Parse = require('../parse');
+
+/**
+ List and prepare all pages
+
+ @param {Output}
+ @return {Promise<Output>}
+*/
+function preparePages(output) {
+ var book = output.getBook();
+
+ return Parse.parsePagesList(book)
+ .then(function(pages) {
+ return output.set('pages', pages);
+ });
+}
+
+module.exports = preparePages;
diff --git a/lib/output/preparePlugins.js b/lib/output/preparePlugins.js
new file mode 100644
index 0000000..5768e68
--- /dev/null
+++ b/lib/output/preparePlugins.js
@@ -0,0 +1,24 @@
+var Plugins = require('../plugins');
+
+/**
+ Load and setup plugins
+
+ @param {Output}
+ @return {Promise<Output>}
+*/
+function preparePlugins(output) {
+ var book = output.getBook();
+
+ return Plugins.loadForBook(book)
+ .then(function(plugins) {
+ return Plugins.validateConfig(book, plugins)
+ .then(function(newBook) {
+ return output.merge({
+ book: newBook,
+ plugins: plugins
+ });
+ });
+ });
+}
+
+module.exports = preparePlugins;