diff options
Diffstat (limited to 'packages/gitbook')
-rw-r--r-- | packages/gitbook/src/browser/loadPlugins.js | 10 | ||||
-rw-r--r-- | packages/gitbook/src/browser/render.js | 30 | ||||
-rw-r--r-- | packages/gitbook/src/json/encodeState.js | 7 | ||||
-rw-r--r-- | packages/gitbook/src/models/ignore.js | 65 | ||||
-rw-r--r-- | packages/gitbook/src/output/__tests__/generateMock.js | 2 | ||||
-rw-r--r-- | packages/gitbook/src/output/ebook/getPDFTemplate.js | 39 | ||||
-rw-r--r-- | packages/gitbook/src/output/ebook/onFinish.js | 50 | ||||
-rw-r--r-- | packages/gitbook/src/output/ebook/onPage.js | 11 | ||||
-rw-r--r-- | packages/gitbook/src/output/ebook/options.js | 11 | ||||
-rw-r--r-- | packages/gitbook/src/output/generateBook.js | 6 | ||||
-rw-r--r-- | packages/gitbook/src/output/generatePage.js | 10 | ||||
-rw-r--r-- | packages/gitbook/src/output/website/onPage.js | 2 |
12 files changed, 120 insertions, 123 deletions
diff --git a/packages/gitbook/src/browser/loadPlugins.js b/packages/gitbook/src/browser/loadPlugins.js index 0f26aae..bd8a195 100644 --- a/packages/gitbook/src/browser/loadPlugins.js +++ b/packages/gitbook/src/browser/loadPlugins.js @@ -1,18 +1,20 @@ const path = require('path'); /** - * Load all browser plugins + * Load all browser plugins. + * * @param {OrderedMap<Plugin>} plugins + * @param {String} type ('browser', 'ebook') * @return {Array} */ -function loadPlugins(plugins) { +function loadPlugins(plugins, type) { return plugins .valueSeq() - .filter(plugin => plugin.getPackage().has('browser')) + .filter(plugin => plugin.getPackage().has(type)) .map(plugin => { const browserFile = path.resolve( plugin.getPath(), - plugin.getPackage().get('browser') + plugin.getPackage().get(type) ); return require(browserFile); diff --git a/packages/gitbook/src/browser/render.js b/packages/gitbook/src/browser/render.js index 616b157..d5062c6 100644 --- a/packages/gitbook/src/browser/render.js +++ b/packages/gitbook/src/browser/render.js @@ -4,9 +4,7 @@ const GitBook = require('gitbook-core'); const loadPlugins = require('./loadPlugins'); -const BOOTSTRAP_CODE = '(function() { require("gitbook-core").bootstrap() })()'; - -function HTML({head, innerHTML, payload, scripts}) { +function HTML({head, innerHTML, payload, scripts, bootstrap}) { const attrs = head.htmlAttributes.toComponent(); return ( @@ -23,7 +21,7 @@ function HTML({head, innerHTML, payload, scripts}) { return <script key={script} src={script} />; })} <script type="application/payload+json" dangerouslySetInnerHTML={{__html: payload}} /> - <script type="application/javascript" dangerouslySetInnerHTML={{__html: BOOTSTRAP_CODE}} /> + <script type="application/javascript" dangerouslySetInnerHTML={{__html: bootstrap}} /> {head.script.toComponent()} </body> </html> @@ -33,27 +31,40 @@ HTML.propTypes = { head: React.PropTypes.object, innerHTML: React.PropTypes.string, payload: React.PropTypes.string, + bootstrap: React.PropTypes.string, scripts: React.PropTypes.arrayOf(React.PropTypes.string) }; /** - * Render a page + * Get bootstrap code for a role + * @param {String} role + * @return {String} + */ +function getBootstrapCode(role) { + return `(function() { require("gitbook-core").bootstrap({ role: "${role}" }) })()`; +} + +/** + * Render a view using plugins. + * * @param {OrderedMap<String:Plugin>} plugin * @param {Object} initialState + * @param {String} type ("ebook" or "browser") + * @param {String} role * @return {String} html */ -function render(plugins, initialState) { +function render(plugins, initialState, type, role) { // Load the plugins - const browserPlugins = loadPlugins(plugins); + const browserPlugins = loadPlugins(plugins, type); const payload = JSON.stringify(initialState); const context = GitBook.createContext(browserPlugins, initialState); const scripts = plugins.toList() - .filter(plugin => plugin.getPackage().has('browser')) + .filter(plugin => plugin.getPackage().has(type)) .map(plugin => 'gitbook/plugins/' + plugin.getName() + '.js') .toArray(); - const el = GitBook.renderWithContext(context); + const el = GitBook.renderWithContext(context, { role }); // We're done with the context context.deactivate(); @@ -69,6 +80,7 @@ function render(plugins, initialState) { head={head} innerHTML={innerHTML} payload={payload} + bootstrap={getBootstrapCode(role)} scripts={['gitbook/core.js'].concat(scripts)} />; diff --git a/packages/gitbook/src/json/encodeState.js b/packages/gitbook/src/json/encodeState.js index d264835..50e7880 100644 --- a/packages/gitbook/src/json/encodeState.js +++ b/packages/gitbook/src/json/encodeState.js @@ -11,13 +11,12 @@ const encodeFile = require('./encodeFile'); * This JSON representation is used as initial state for the redux store. * * @param {Output} output - * @param {Page} page + * @param {Page} page? * @return {JSON} */ function encodeStateToJSON(output, page) { const book = output.getBook(); const urls = output.getURLIndex(); - const file = page.getFile(); return { output: { @@ -34,8 +33,8 @@ function encodeStateToJSON(output, page) { config: book.getConfig().getValues().toJS(), languages: book.isMultilingual() ? encodeLanguages(book.getLanguages()) : undefined, - page: encodePage(page, book.getSummary(), urls), - file: encodeFile(file, urls) + page: page ? encodePage(page, book.getSummary(), urls) : undefined, + file: page ? encodeFile(page.getFile(), urls) : undefined }; } diff --git a/packages/gitbook/src/models/ignore.js b/packages/gitbook/src/models/ignore.js index 99ade9a..547f6b4 100644 --- a/packages/gitbook/src/models/ignore.js +++ b/packages/gitbook/src/models/ignore.js @@ -1,42 +1,43 @@ -const Immutable = require('immutable'); +const { Record } = require('immutable'); const IgnoreMutable = require('ignore'); /* Immutable version of node-ignore */ -const Ignore = Immutable.Record({ - ignore: new IgnoreMutable() -}, 'Ignore'); - -Ignore.prototype.getIgnore = function() { - return this.get('ignore'); -}; -/** - Test if a file is ignored by these rules - - @param {String} filePath - @return {Boolean} -*/ -Ignore.prototype.isFileIgnored = function(filename) { - const ignore = this.getIgnore(); - return ignore.filter([filename]).length == 0; +const DEFAULTS = { + ignore: new IgnoreMutable() }; -/** - Add rules - - @param {String} - @return {Ignore} -*/ -Ignore.prototype.add = function(rule) { - const ignore = this.getIgnore(); - const newIgnore = new IgnoreMutable(); - - newIgnore.add(ignore); - newIgnore.add(rule); - - return this.set('ignore', newIgnore); -}; +class Ignore extends Record(DEFAULTS) { + getIgnore() { + return this.get('ignore'); + } + + /** + * Test if a file is ignored by these rules. + * @param {String} filePath + * @return {Boolean} isIgnored + */ + isFileIgnored(filename) { + const ignore = this.getIgnore(); + return ignore.filter([filename]).length == 0; + } + + /** + * Add rules. + * @param {String} + * @return {Ignore} + */ + add(rule) { + const ignore = this.getIgnore(); + const newIgnore = new IgnoreMutable(); + + newIgnore.add(ignore); + newIgnore.add(rule); + + return this.set('ignore', newIgnore); + } +} module.exports = Ignore; diff --git a/packages/gitbook/src/output/__tests__/generateMock.js b/packages/gitbook/src/output/__tests__/generateMock.js index a0be244..6ae1de2 100644 --- a/packages/gitbook/src/output/__tests__/generateMock.js +++ b/packages/gitbook/src/output/__tests__/generateMock.js @@ -29,7 +29,7 @@ function generateMock(Generator, files) { book = book.setLogLevel('disabled'); return parseBook(book) - .then(function(resultBook) { + .then((resultBook) => { return generateBook(Generator, resultBook, { root: dir.name }); diff --git a/packages/gitbook/src/output/ebook/getPDFTemplate.js b/packages/gitbook/src/output/ebook/getPDFTemplate.js index c0faed3..53c7a82 100644 --- a/packages/gitbook/src/output/ebook/getPDFTemplate.js +++ b/packages/gitbook/src/output/ebook/getPDFTemplate.js @@ -1,40 +1,35 @@ const juice = require('juice'); -const WebsiteGenerator = require('../website'); const JSONUtils = require('../../json'); -const Templating = require('../../templating'); +const render = require('../../browser/render'); const Promise = require('../../utils/promise'); - /** - Generate PDF header/footer templates - - @param {Output} output - @param {String} type - @return {String} -*/ + * Generate PDF header/footer templates + * + * @param {Output} output + * @param {String} type ("footer" or "header") + * @return {String} html + */ function getPDFTemplate(output, type) { - const filePath = 'pdf_' + type + '.html'; const outputRoot = output.getRoot(); - const engine = WebsiteGenerator.createTemplateEngine(output, filePath); + const plugins = output.getPlugins(); - // Generate context - const context = JSONUtils.encodeOutput(output); - context.page = { + // Generate initial state + const initialState = JSONUtils.encodeState(output); + initialState.page = { num: '_PAGENUM_', title: '_SECTION_' }; // Render the theme - return Templating.renderFile(engine, 'ebook/' + filePath, context) + const html = render(plugins, initialState, 'ebook', `pdf:${type}`); - // Inline css and assets - .then(function(tplOut) { - return Promise.nfcall(juice.juiceResources, tplOut.getContent(), { - webResources: { - relativeTo: outputRoot - } - }); + // Inline CSS + return Promise.nfcall(juice.juiceResources, html, { + webResources: { + relativeTo: outputRoot + } }); } diff --git a/packages/gitbook/src/output/ebook/onFinish.js b/packages/gitbook/src/output/ebook/onFinish.js index adff798..7db757f 100644 --- a/packages/gitbook/src/output/ebook/onFinish.js +++ b/packages/gitbook/src/output/ebook/onFinish.js @@ -1,45 +1,39 @@ const path = require('path'); -const WebsiteGenerator = require('../website'); const JSONUtils = require('../../json'); -const Templating = require('../../templating'); const Promise = require('../../utils/promise'); const error = require('../../utils/error'); const command = require('../../utils/command'); const writeFile = require('../helper/writeFile'); +const render = require('../../browser/render'); const getConvertOptions = require('./getConvertOptions'); const SUMMARY_FILE = 'SUMMARY.html'; /** - Write the SUMMARY.html - - @param {Output} - @return {Output} -*/ + * Write the SUMMARY.html + * + * @param {Output} output + * @return {Output} output + */ function writeSummary(output) { - const options = output.getOptions(); - const prefix = options.get('prefix'); + const plugins = output.getPlugins(); - const filePath = SUMMARY_FILE; - const engine = WebsiteGenerator.createTemplateEngine(output, filePath); - const context = JSONUtils.encodeOutput(output); + // Generate initial state + const initialState = JSONUtils.encodeState(output); - // Render the theme - return Templating.renderFile(engine, prefix + '/summary.html', context) + // Render using React + const html = render(plugins, initialState, 'ebook', 'ebook:summary'); - // Write it to the disk - .then(function(tplOut) { - return writeFile(output, filePath, tplOut.getContent()); - }); + return writeFile(output, SUMMARY_FILE, html); } /** - Generate the ebook file as "index.pdf" - - @param {Output} - @return {Output} -*/ + * Generate the ebook file as "index.pdf" + * + * @param {Output} output + * @return {Output} output + */ function runEbookConvert(output) { const logger = output.getLogger(); const options = output.getOptions(); @@ -78,11 +72,11 @@ function runEbookConvert(output) { } /** - Finish the generation, generates the SUMMARY.html - - @param {Output} - @return {Output} -*/ + * Finish the generation, generates the SUMMARY.html + * + * @param {Output} output + * @return {Output} output + */ function onFinish(output) { return writeSummary(output) .then(runEbookConvert); diff --git a/packages/gitbook/src/output/ebook/onPage.js b/packages/gitbook/src/output/ebook/onPage.js index 520d296..a7c2137 100644 --- a/packages/gitbook/src/output/ebook/onPage.js +++ b/packages/gitbook/src/output/ebook/onPage.js @@ -2,11 +2,12 @@ const WebsiteGenerator = require('../website'); const Modifiers = require('../modifiers'); /** - Write a page for ebook output - - @param {Output} output - @param {Output} -*/ + * Write a page for ebook output. It renders it just as the website generator + * except that it inline assets. + * + * @param {Output} output + * @param {Output} output + */ function onPage(output, page) { const options = output.getOptions(); diff --git a/packages/gitbook/src/output/ebook/options.js b/packages/gitbook/src/output/ebook/options.js index 4156fac..d192fd2 100644 --- a/packages/gitbook/src/output/ebook/options.js +++ b/packages/gitbook/src/output/ebook/options.js @@ -2,16 +2,13 @@ const Immutable = require('immutable'); const Options = Immutable.Record({ // Root folder for the output - root: String(), - + root: String(), // Prefix for generation - prefix: String('ebook'), - + prefix: String('ebook'), // Format to generate using ebook-convert - format: String(), - + format: String(), // Force use of absolute urls ("index.html" instead of "/") - directoryIndex: Boolean(false) + directoryIndex: Boolean(false) }); module.exports = Options; diff --git a/packages/gitbook/src/output/generateBook.js b/packages/gitbook/src/output/generateBook.js index e27d3ce..0e2c230 100644 --- a/packages/gitbook/src/output/generateBook.js +++ b/packages/gitbook/src/output/generateBook.js @@ -58,7 +58,7 @@ function processOutput(generator, startOutput) { ) ) - .then(function(output) { + .then((output) => { if (!generator.onInit) { return output; } @@ -69,7 +69,7 @@ function processOutput(generator, startOutput) { .then(generateAssets.bind(null, generator)) .then(generatePages.bind(null, generator)) - .tap(function(output) { + .tap((output) => { const book = output.getBook(); if (!book.isMultilingual()) { @@ -111,7 +111,7 @@ function processOutput(generator, startOutput) { ) ) - .then(function(output) { + .then((output) => { if (!generator.onFinish) { return output; } diff --git a/packages/gitbook/src/output/generatePage.js b/packages/gitbook/src/output/generatePage.js index 36a5780..7375f1d 100644 --- a/packages/gitbook/src/output/generatePage.js +++ b/packages/gitbook/src/output/generatePage.js @@ -49,15 +49,11 @@ function generatePage(output, page) { return Templating.render(engine, absoluteFilePath, content, context); }) - .then((content) => { - return parser.parsePage(content) - .then(function(result) { - return output.setContent(result.content); - }); - }) + // Parse with markdown/asciidoc parser + .then((content) => parser.parsePage(content)) // Return new page - .then((content) => { + .then(({content}) => { return resultPage.set('content', content); }) diff --git a/packages/gitbook/src/output/website/onPage.js b/packages/gitbook/src/output/website/onPage.js index 7dd35f3..90eec63 100644 --- a/packages/gitbook/src/output/website/onPage.js +++ b/packages/gitbook/src/output/website/onPage.js @@ -24,7 +24,7 @@ function onPage(output, page) { const initialState = JSONUtils.encodeState(output, resultPage); // Render the theme - const html = render(plugins, initialState); + const html = render(plugins, initialState, 'browser', 'website:body'); // Write it to the disk return writeFile(output, filePath, html); |