Add base utils for generation

This commit is contained in:
Samy Pessé
2016-04-22 22:21:34 +02:00
parent 4f86a9978b
commit fb0ea4610d
21 changed files with 341 additions and 91 deletions
+33
View File
@@ -0,0 +1,33 @@
jest.autoMockOff();
describe('Glossary', function() {
var File = require('../file');
var Glossary = require('../glossary');
var GlossaryEntry = require('../glossaryEntry');
describe('createFromEntries', function() {
var glossary = Glossary.createFromEntries(File(), [
{
name: 'Hello World',
description: 'Awesome!'
},
{
name: 'JavaScript',
description: 'This is a cool language'
}
]);
it('must add all entries', function() {
var entries = glossary.getEntries();
expect(entries.size).toBe(2);
});
it('must add entries as GlossaryEntries', function() {
var entries = glossary.getEntries();
var entry = entries.get('hello-world');
expect(entry instanceof GlossaryEntry).toBeTruthy();
});
});
});
+17
View File
@@ -0,0 +1,17 @@
jest.autoMockOff();
describe('GlossaryEntry', function() {
var GlossaryEntry = require('../glossaryEntry');
describe('getID', function() {
it('must return a normalized ID', function() {
var entry = new GlossaryEntry({
name: 'Hello World'
});
expect(entry.getID()).toBe('hello-world');
});
});
});
-13
View File
@@ -1,13 +0,0 @@
var Immutable = require('immutable');
var Generator = Immutable.Record({
name: String()
});
Generator.create = function(def) {
return new Generator(def);
};
module.exports = Generator;
+2 -4
View File
@@ -1,4 +1,5 @@
var Immutable = require('immutable');
var slug = require('github-slugid');
/*
A definition represents an entry in the glossary
@@ -35,10 +36,7 @@ GlossaryEntry.prototype.getID = function() {
@return {String}
*/
GlossaryEntry.nameToID = function nameToID(name) {
return name.toLowerCase()
.replace(/[\/\\\?\%\*\:\;\|\"\'\\<\\>\#\$\(\)\!\.\@]/g, '')
.replace(/ /g, '_')
.trim();
return slug(name);
};
+47
View File
@@ -0,0 +1,47 @@
var Immutable = require('immutable');
var Book = require('./book');
var Output = Immutable.Record({
book: Book(),
plugins: Immutable.OrderedMap(),
pages: Immutable.OrderedMap(),
assets: Immutable.List(),
options: Immutable.Map()
});
Output.prototype.getBook = function() {
return this.get('book');
};
Output.prototype.getPlugins = function() {
return this.get('plugins');
};
Output.prototype.getPages = function() {
return this.get('pages');
};
Output.prototype.getOptions = function() {
return this.get('options');
};
Output.prototype.getAssets = function() {
return this.get('assets');
};
/**
Create an Output instance from a book and a set of options
@param {Book} book
@param {Object} options
@return {Output}
*/
Output.createForBook = function(book, options) {
return new Output({
book: book,
options: options
});
};
module.exports = Output;
+15
View File
@@ -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;
+23
View File
@@ -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;
+33 -29
View File
@@ -1,42 +1,46 @@
var Parse = require('../parse');
var Output = require('../models/output');
var Promise = require('../utils/promise');
var callHook = require('./callHook');
var preparePlugins = require('./preparePlugins');
var preparePages = require('./preparePages');
var prepareAssets = require('./prepareAssets');
var generateAssets = require('./generateAssets');
var generatePages = require('./generatePages');
/**
List all assets for a book
Generate a book using a generator.
@param {Book} book
@param {Map<String:Page>} pages
@param
*/
function listAssets(book, pages) {
var fs = book.getContentFS();
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"
return fs.listAllFiles()
.then(function(files) {
return files.filterNot(function(file) {
return (
book.isContentFileIgnored(file) ||
pages.has(file)
);
});
});
}
/**
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;
-9
View File
@@ -1,9 +0,0 @@
/**
Generate a page using a generator
*/
function generatePage(generator, book, page) {
}
module.exports = generatePage;
+23
View File
@@ -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;
-26
View File
@@ -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;
+2 -9
View File
@@ -1,11 +1,4 @@
function generate(book, output) {
}
module.exports = {
generate: generate
generate: require('./generateBook'),
JSONGenerator: require('./json')
};
+6
View File
@@ -0,0 +1,6 @@
module.exports = {
Options: require('./options'),
onPage: require('./onPage')
};
+20
View File
@@ -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;
+8
View File
@@ -0,0 +1,8 @@
var Immutable = require('immutable');
var Options = Immutable.Record({
// Root folder for the output
root: String()
});
module.exports = Options;
+19
View File
@@ -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;
+18
View File
@@ -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;
+24
View File
@@ -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;
+2 -1
View File
@@ -6,5 +6,6 @@ module.exports = {
parseReadme: require('./parseReadme'),
parseConfig: require('./parseConfig'),
parsePagesList: require('./parsePagesList'),
parseIgnore: require('./parseIgnore')
parseIgnore: require('./parseIgnore'),
listAssets: require('./listAssets')
};
+24
View File
@@ -0,0 +1,24 @@
/**
List all assets in a book
Assets are file not ignored and not a page
@param {Book} book
@param {List<String>} 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)
);
});
});
}
module.exports = listAssets;
+25
View File
@@ -0,0 +1,25 @@
var path = require('path');
var gitbook = require('./lib');
var NodeFS = require('./lib/fs/node');
var BASE_PATH = path.join(__dirname); //, 'docs');
// Create a filesystem to read the book
var fs = NodeFS(BASE_PATH);
// Create a book instance
var book = gitbook.Book.createForFS(fs);
// Parse the book
gitbook.Parse.parseBook(book)
.then(function(_book) {
return gitbook.Parse.parsePagesList(_book);
})
.then(function(pages) {
//console.log('parsed', pages);
}, function(err) {
console.log('error:', err.stack);
});