docusaurus/lib/core/DocsLayout.js
2018-06-07 07:41:28 -07:00

115 lines
3.8 KiB
JavaScript

/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const React = require('react');
const Container = require('./Container.js');
const Doc = require('./Doc.js');
const DocsSidebar = require('./DocsSidebar.js');
const OnPageNav = require('./nav/OnPageNav.js');
const Site = require('./Site.js');
const translation = require('../server/translation.js');
const path = require('path');
// component used to generate whole webpage for docs, including sidebar/header/footer
class DocsLayout extends React.Component {
getRelativeURL = (from, to) => {
const extension = this.props.config.cleanUrl ? '' : '.html';
return (
path
.relative(from, to)
.replace('\\', '/')
.replace(/^\.\.\//, '') + extension
);
};
render() {
const metadata = this.props.metadata;
const content = this.props.children;
const i18n = translation[this.props.metadata.language];
let DocComponent = Doc;
if (this.props.Doc) {
DocComponent = this.props.Doc;
}
const title = i18n
? translation[this.props.metadata.language]['localized-strings'][
this.props.metadata.localized_id
] || this.props.metadata.title
: this.props.metadata.title;
return (
<Site
config={this.props.config}
className="sideNavVisible doc"
title={title}
description={content.trim().split('\n')[0]}
language={metadata.language}
version={metadata.version}
metadata={metadata}>
<div className="docMainWrapper wrapper">
<DocsSidebar metadata={metadata} />
<Container className="mainContainer">
<DocComponent
metadata={metadata}
content={content}
config={this.props.config}
source={metadata.source}
hideTitle={this.props.metadata.hide_title}
title={title}
version={metadata.version}
language={metadata.language}
/>
<div className="docs-prevnext">
{metadata.previous_id && (
<a
className="docs-prev button"
href={this.getRelativeURL(
metadata.localized_id,
metadata.previous_id
)}>
{' '}
{i18n
? translation[this.props.metadata.language][
'localized-strings'
][metadata.previous_id] ||
translation[this.props.metadata.language][
'localized-strings'
]['previous'] ||
'Previous'
: metadata.previous_title || 'Previous'}
</a>
)}
{metadata.next_id && (
<a
className="docs-next button"
href={this.getRelativeURL(
metadata.localized_id,
metadata.next_id
)}>
{i18n
? translation[this.props.metadata.language][
'localized-strings'
][metadata.next_id] ||
translation[this.props.metadata.language][
'localized-strings'
]['next'] ||
'Next'
: metadata.next_title || 'Next'}{' '}
</a>
)}
</div>
</Container>
{this.props.config.onPageNav == 'separate' && (
<nav className="onPageNav">
<OnPageNav rawContent={this.props.children} />
</nav>
)}
</div>
</Site>
);
}
}
module.exports = DocsLayout;