diff --git a/packages/gitbook-core/.babelrc b/packages/gitbook-core/.babelrc
new file mode 100644
index 000000000..5f27bdab6
--- /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 16de7c653..6e6c2e77e 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 3414a37a9..000000000
--- 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
- }
-});
-
-module.exports = Application;
diff --git a/packages/gitbook-core/src/components/InjectedComponent.js b/packages/gitbook-core/src/components/InjectedComponent.js
index f8e5b04ef..39b48b2ef 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 dcd7580d0..4a2f21f9b 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 000000000..365a037dd
--- /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 = (
+
+
+
+ );
+ 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 000000000..f4d625303
--- /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 cbf1516fb..5ee288b19 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 d4e5f8d41..5f27bdab6 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 27eda4958..29fa9cebe 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 3b40536c9..41c4b1bb8 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 000000000..dc674abef
--- /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 (
+
+
+ {head.title.toComponent()}
+ {head.meta.toComponent()}
+ {head.link.toComponent()}
+
+
+
+
+
+ );
+}
+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 =