mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-16 15:45:13 +00:00
Add base utils for generation
This commit is contained in:
@@ -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();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
/**
|
||||
Generate a page using a generator
|
||||
*/
|
||||
function generatePage(generator, book, page) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
module.exports = generatePage;
|
||||
@@ -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;
|
||||
@@ -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
@@ -1,11 +1,4 @@
|
||||
|
||||
|
||||
function generate(book, output) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
module.exports = {
|
||||
generate: generate
|
||||
generate: require('./generateBook'),
|
||||
JSONGenerator: require('./json')
|
||||
};
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
|
||||
module.exports = {
|
||||
Options: require('./options'),
|
||||
onPage: require('./onPage')
|
||||
};
|
||||
@@ -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;
|
||||
@@ -0,0 +1,8 @@
|
||||
var Immutable = require('immutable');
|
||||
|
||||
var Options = Immutable.Record({
|
||||
// Root folder for the output
|
||||
root: String()
|
||||
});
|
||||
|
||||
module.exports = Options;
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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
@@ -6,5 +6,6 @@ module.exports = {
|
||||
parseReadme: require('./parseReadme'),
|
||||
parseConfig: require('./parseConfig'),
|
||||
parsePagesList: require('./parsePagesList'),
|
||||
parseIgnore: require('./parseIgnore')
|
||||
parseIgnore: require('./parseIgnore'),
|
||||
listAssets: require('./listAssets')
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user