mirror of
https://github.com/facebook/docusaurus.git
synced 2025-04-29 18:27:56 +02:00
* Add Prettier formatting to source files and example files, and check that Prettier formatting is maintained on PRs * Remove trailing-comma as we are using Node 6 on Circle * Use latest Node 6 LTS version in Circle * Remove unused test
134 lines
3.2 KiB
JavaScript
134 lines
3.2 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 MarkdownBlock = require('./MarkdownBlock.js');
|
|
const React = require('react');
|
|
|
|
// inner blog component for the article itself, without sidebar/header/footer
|
|
class BlogPost extends React.Component {
|
|
renderContent() {
|
|
let content = this.props.content;
|
|
let hasSplit = false;
|
|
if (content.split('<!--truncate-->').length > 1) {
|
|
hasSplit = (
|
|
<div className="read-more">
|
|
<a
|
|
className="button"
|
|
href={this.props.config.baseUrl + 'blog/' + this.props.post.path}>
|
|
Read More
|
|
</a>
|
|
</div>
|
|
);
|
|
}
|
|
if (this.props.truncate) {
|
|
content = content.split('<!--truncate-->')[0];
|
|
return (
|
|
<article className="post-content">
|
|
<MarkdownBlock>{content}</MarkdownBlock>
|
|
{hasSplit}
|
|
</article>
|
|
);
|
|
}
|
|
return <MarkdownBlock>{content}</MarkdownBlock>;
|
|
}
|
|
|
|
renderAuthorPhoto() {
|
|
const post = this.props.post;
|
|
const className =
|
|
'authorPhoto' +
|
|
(post.author && post.authorTitle ? ' authorPhoto-big' : '');
|
|
if (post.authorFBID) {
|
|
return (
|
|
<div className={className}>
|
|
<a href={post.authorURL} target="_blank">
|
|
<img
|
|
src={
|
|
'https://graph.facebook.com/' +
|
|
post.authorFBID +
|
|
'/picture/?height=200&width=200'
|
|
}
|
|
/>
|
|
</a>
|
|
</div>
|
|
);
|
|
} else if (post.authorImage) {
|
|
return (
|
|
<div className={className}>
|
|
<a href={post.authorURL} target="_blank">
|
|
<img src={post.authorImage} />
|
|
</a>
|
|
</div>
|
|
);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
renderTitle() {
|
|
const post = this.props.post;
|
|
return (
|
|
<h1>
|
|
<a href={this.props.config.baseUrl + 'blog/' + post.path}>
|
|
{post.title}
|
|
</a>
|
|
</h1>
|
|
);
|
|
}
|
|
|
|
renderPostHeader() {
|
|
const post = this.props.post;
|
|
const match = post.path.match(/([0-9]+)\/([0-9]+)\/([0-9]+)/);
|
|
// Because JavaScript sucks at date handling :(
|
|
const year = match[1];
|
|
const month = [
|
|
'January',
|
|
'February',
|
|
'March',
|
|
'April',
|
|
'May',
|
|
'June',
|
|
'July',
|
|
'August',
|
|
'September',
|
|
'October',
|
|
'November',
|
|
'December',
|
|
][parseInt(match[2], 10) - 1];
|
|
const day = parseInt(match[3], 10);
|
|
|
|
return (
|
|
<header className="postHeader">
|
|
{this.renderTitle()}
|
|
<p className="post-meta">
|
|
{month} {day}, {year}
|
|
</p>
|
|
<div className="authorBlock">
|
|
{post.author ? (
|
|
<p className="post-authorName">
|
|
<a href={post.authorURL} target="_blank">
|
|
{post.author}
|
|
</a>
|
|
{post.authorTitle}
|
|
</p>
|
|
) : null}
|
|
{this.renderAuthorPhoto()}
|
|
</div>
|
|
</header>
|
|
);
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<div className="post">
|
|
{this.renderPostHeader()}
|
|
{this.renderContent()}
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
module.exports = BlogPost;
|