summaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/gitbook-core/.babelrc3
-rw-r--r--packages/gitbook-core/package.json9
-rw-r--r--packages/gitbook-core/src/components/Application.js10
-rw-r--r--packages/gitbook-core/src/components/InjectedComponent.js6
-rw-r--r--packages/gitbook-core/src/index.js2
-rw-r--r--packages/gitbook-core/src/renderComponent.js25
-rw-r--r--packages/gitbook-plugin-theme-default/index.js3
-rw-r--r--packages/gitbook-plugin-theme-default/package.json1
-rw-r--r--packages/gitbook/.babelrc2
-rw-r--r--packages/gitbook/package.json7
-rw-r--r--packages/gitbook/src/output/website/onPage.js19
-rw-r--r--packages/gitbook/src/output/website/render.js44
-rw-r--r--packages/gitbook/testing/setup.js33
13 files changed, 121 insertions, 43 deletions
diff --git a/packages/gitbook-core/.babelrc b/packages/gitbook-core/.babelrc
new file mode 100644
index 0000000..5f27bda
--- /dev/null
+++ b/packages/gitbook-core/.babelrc
@@ -0,0 +1,3 @@
+{
+ "presets": ["es2015", "react", "stage-2"]
+}
diff --git a/packages/gitbook-core/package.json b/packages/gitbook-core/package.json
index 16de7c6..6e6c2e7 100644
--- a/packages/gitbook-core/package.json
+++ b/packages/gitbook-core/package.json
@@ -7,8 +7,15 @@
"immutable": "^3.8.1",
"react": "^15.3.1",
"react-dom": "^15.3.1",
+ "react-helmet": "^3.1.0",
"react-redux": "^4.4.5",
- "redux": "^3.5.2"
+ "redux": "^3.5.2",
+ "redux-thunk": "^2.1.0"
+ },
+ "devDependencies": {
+ "babel-preset-es2015": "^6.14.0",
+ "babel-preset-react": "^6.11.1",
+ "babel-preset-stage-2": "^6.13.0"
},
"repository": {
"type": "git",
diff --git a/packages/gitbook-core/src/components/Application.js b/packages/gitbook-core/src/components/Application.js
deleted file mode 100644
index 3414a37..0000000
--- a/packages/gitbook-core/src/components/Application.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const React = require('react');
-const { InjectedComponent } = require('./components/InjectedComponent');
-
-const Application = React.createClass({
- render() {
- return <InjectedComponent matching={{ role: 'Body' }} />
- }
-});
-
-module.exports = Application;
diff --git a/packages/gitbook-core/src/components/InjectedComponent.js b/packages/gitbook-core/src/components/InjectedComponent.js
index f8e5b04..39b48b2 100644
--- a/packages/gitbook-core/src/components/InjectedComponent.js
+++ b/packages/gitbook-core/src/components/InjectedComponent.js
@@ -1,5 +1,5 @@
const React = require('react');
-const connect = require('./connect');
+const ReactRedux = require('react-redux');
const UnsafeComponent = require('./UnsafeComponent');
const { findMatchingComponents } = require('../actions/components');
@@ -65,11 +65,11 @@ function mapStateToProps(state, props) {
}
module.exports = {
- InjectedComponent: connect(InjectedComponentSet, (state, props) => {
+ InjectedComponent: ReactRedux.connect(InjectedComponentSet, (state, props) => {
const result = mapStateToProps(state, props);
result.components = result.components.slice(0, 1);
result.withContainer = false;
return result;
}),
- InjectedComponentSet: connect(InjectedComponentSet, mapStateToProps)
+ InjectedComponentSet: ReactRedux.connect(InjectedComponentSet, mapStateToProps)
};
diff --git a/packages/gitbook-core/src/index.js b/packages/gitbook-core/src/index.js
index dcd7580..4a2f21f 100644
--- a/packages/gitbook-core/src/index.js
+++ b/packages/gitbook-core/src/index.js
@@ -5,6 +5,7 @@ const connect = require('./connect');
const createPlugin = require('./createPlugin');
const createReducer = require('./createReducer');
const createStore = require('./createStore');
+const renderComponent = require('./renderComponent');
module.exports = {
ACTIONS,
@@ -12,6 +13,7 @@ module.exports = {
createPlugin,
createReducer,
createStore,
+ renderComponent,
registerComponent,
InjectedComponent,
InjectedComponentSet
diff --git a/packages/gitbook-core/src/renderComponent.js b/packages/gitbook-core/src/renderComponent.js
new file mode 100644
index 0000000..365a037
--- /dev/null
+++ b/packages/gitbook-core/src/renderComponent.js
@@ -0,0 +1,25 @@
+const React = require('react');
+const Helmet = require('react-helmet');
+const ReactRedux = require('react-redux');
+const { InjectedComponent } = require('./components/InjectedComponent');
+
+/**
+ * Render a registered component from a store.
+ * This method is intended for server-side use in "gitbook".
+ *
+ * @param {ReduxStore} store
+ * @param {Descriptor} matching
+ * @return {Object} { el, meta }
+ */
+function renderComponent(store, matching) {
+ const el = (
+ <ReactRedux.Provider store={store}>
+ <InjectedComponent matching={matching} />
+ </ReactRedux.Provider>
+ );
+ const head = Helmet.rewind();
+
+ return { el, head };
+}
+
+module.exports = renderComponent;
diff --git a/packages/gitbook-plugin-theme-default/index.js b/packages/gitbook-plugin-theme-default/index.js
new file mode 100644
index 0000000..f4d6253
--- /dev/null
+++ b/packages/gitbook-plugin-theme-default/index.js
@@ -0,0 +1,3 @@
+module.exports = {
+
+};
diff --git a/packages/gitbook-plugin-theme-default/package.json b/packages/gitbook-plugin-theme-default/package.json
index cbf1516..5ee288b 100644
--- a/packages/gitbook-plugin-theme-default/package.json
+++ b/packages/gitbook-plugin-theme-default/package.json
@@ -2,6 +2,7 @@
"name": "gitbook-plugin-theme-default",
"description": "Default theme for GitBook",
"main": "./index.js",
+ "browser": "./src/index.js",
"version": "1.0.5",
"engines": {
"gitbook": ">=3.0.0"
diff --git a/packages/gitbook/.babelrc b/packages/gitbook/.babelrc
index d4e5f8d..5f27bda 100644
--- a/packages/gitbook/.babelrc
+++ b/packages/gitbook/.babelrc
@@ -1,3 +1,3 @@
{
- "presets": ["es2015", "react"]
+ "presets": ["es2015", "react", "stage-2"]
}
diff --git a/packages/gitbook/package.json b/packages/gitbook/package.json
index 27eda49..29fa9ce 100644
--- a/packages/gitbook/package.json
+++ b/packages/gitbook/package.json
@@ -67,7 +67,7 @@
"urijs": "1.18.0"
},
"scripts": {
- "test": "./node_modules/.bin/mocha ./testing/setup.js \"./lib/**/*/__tests__/*.js\" --bail --reporter=list --timeout=10000",
+ "test": "./node_modules/.bin/mocha ./testing/setup.js \"./src/**/*/__tests__/*.js\" --bail --reporter=list --timeout=10000 --compilers js:babel-register",
"dist": "rm -rf lib/ && babel --presets es2015 -d lib/ src/",
"prepublish": "npm run dist"
},
@@ -101,6 +101,9 @@
"devDependencies": {
"babel-cli": "^6.14.0",
"babel-preset-es2015": "^6.14.0",
- "babel-preset-react": "^6.11.1"
+ "babel-preset-react": "^6.11.1",
+ "babel-preset-stage-2": "^6.13.0",
+ "babel-register": "^6.14.0",
+ "mocha": "^3.0.2"
}
}
diff --git a/packages/gitbook/src/output/website/onPage.js b/packages/gitbook/src/output/website/onPage.js
index 3b40536..41c4b1b 100644
--- a/packages/gitbook/src/output/website/onPage.js
+++ b/packages/gitbook/src/output/website/onPage.js
@@ -7,9 +7,10 @@ const JSONUtils = require('../../json');
const LocationUtils = require('../../utils/location');
const Modifiers = require('../modifiers');
const writeFile = require('../helper/writeFile');
+const fileToOutput = require('../helper/fileToOutput');
const getModifiers = require('../getModifiers');
const createTemplateEngine = require('./createTemplateEngine');
-const fileToOutput = require('../helper/fileToOutput');
+const render = require('./render');
/**
* Write a page as a json file
@@ -40,12 +41,12 @@ function onPage(output, page) {
return Modifiers.modifyHTML(page, getModifiers(output, page))
.then(function(resultPage) {
// Generate the context
- const context = JSONUtils.encodeOutputWithPage(output, resultPage);
- context.plugins = {
+ const initialState = JSONUtils.encodeOutputWithPage(output, resultPage);
+ initialState.plugins = {
resources: Plugins.listResources(plugins, resources).toJS()
};
- context.template = {
+ /*context.template = {
getJSContext() {
return {
page: omit(context.page, 'content'),
@@ -58,18 +59,16 @@ function onPage(output, page) {
}
};
}
- };
+ };*/
// We should probabbly move it to "template" or a "site" namespace
- context.basePath = basePath;
+ // context.basePath = basePath;
// Render the theme
- return Templating.renderFile(engine, prefix + '/page.html', context)
+ const html = render(initialState);
// Write it to the disk
- .then(function(tplOut) {
- return writeFile(output, filePath, tplOut.getContent());
- });
+ return writeFile(output, filePath, html);
});
}
diff --git a/packages/gitbook/src/output/website/render.js b/packages/gitbook/src/output/website/render.js
new file mode 100644
index 0000000..dc674ab
--- /dev/null
+++ b/packages/gitbook/src/output/website/render.js
@@ -0,0 +1,44 @@
+const React = require('react');
+const ReactDOMServer = require('react-dom/server');
+const GitBook = require('gitbook-core');
+
+function HTML({head, innerHTML}) {
+ const attrs = head.htmlAttributes.toComponent();
+
+ return (
+ <html {...attrs}>
+ <head>
+ {head.title.toComponent()}
+ {head.meta.toComponent()}
+ {head.link.toComponent()}
+ </head>
+ <body>
+ <div id="content" dangerouslySetInnerHTML={{__html: innerHTML}} />
+ </body>
+ </html>
+ );
+}
+HTML.propTypes = {
+ head: React.PropTypes.object,
+ innerHTML: React.PropTypes.string
+};
+
+/**
+ * Render a page
+ * @param {Object} initialState
+ * @return {String} html
+ */
+function render(initialState) {
+ const plugins = [];
+ const store = GitBook.createStore(plugins, initialState);
+ const { el, head } = GitBook.renderComponent(store, {
+ role: 'Body'
+ });
+
+ const innerHTML = ReactDOMServer.renderToString(el);
+ const htmlEl = <HTML head={head} innerHTML={innerHTML} />;
+
+ return ReactDOMServer.renderToStaticMarkup(htmlEl);
+}
+
+module.exports = render;
diff --git a/packages/gitbook/testing/setup.js b/packages/gitbook/testing/setup.js
index 1105002..ee1485e 100644
--- a/packages/gitbook/testing/setup.js
+++ b/packages/gitbook/testing/setup.js
@@ -1,17 +1,18 @@
-var is = require('is');
-var path = require('path');
-var fs = require('fs');
-var expect = require('expect');
-var cheerio = require('cheerio');
+const is = require('is');
+const path = require('path');
+const fs = require('fs');
+const expect = require('expect');
+const cheerio = require('cheerio');
expect.extend({
+
/**
* Check that a file is created in a directory:
* expect('myFolder').toHaveFile('hello.md');
*/
- toHaveFile: function(fileName) {
- var filePath = path.join(this.actual, fileName);
- var exists = fs.existsSync(filePath);
+ toHaveFile(fileName) {
+ const filePath = path.join(this.actual, fileName);
+ const exists = fs.existsSync(filePath);
expect.assert(
exists,
@@ -21,9 +22,9 @@ expect.extend({
);
return this;
},
- toNotHaveFile: function(fileName) {
- var filePath = path.join(this.actual, fileName);
- var exists = fs.existsSync(filePath);
+ toNotHaveFile(fileName) {
+ const filePath = path.join(this.actual, fileName);
+ const exists = fs.existsSync(filePath);
expect.assert(
!exists,
@@ -37,7 +38,7 @@ expect.extend({
/**
* Check that a value is defined (not null nor undefined)
*/
- toBeDefined: function() {
+ toBeDefined() {
expect.assert(
!(is.undefined(this.actual) || is.null(this.actual)),
'expected to be defined'
@@ -48,7 +49,7 @@ expect.extend({
/**
* Check that a value is defined (not null nor undefined)
*/
- toNotBeDefined: function() {
+ toNotBeDefined() {
expect.assert(
(is.undefined(this.actual) || is.null(this.actual)),
'expected %s to be not defined',
@@ -61,9 +62,9 @@ expect.extend({
* Check that a dom element exists in HTML
* @param {String} selector
*/
- toHaveDOMElement: function(selector) {
- var $ = cheerio.load(this.actual);
- var $el = $(selector);
+ toHaveDOMElement(selector) {
+ const $ = cheerio.load(this.actual);
+ const $el = $(selector);
expect.assert($el.length > 0, 'expected HTML to contains %s', selector);
}