feat: add "unlisted" front matter option for blog posts (#1396)

* Add `unlisted` header option for blog posts, fixes #1393.

Previously, the blog sidebar listed the most recent blog posts sorted by
their publish date. This commit adds the ability to hide a specific blog
post from the sidebar and the feed of all blog posts by adding the
`unlisted: true` header option.

```md
title: My Draft Post
unlisted: true # Hide from blog sidebar and main blog page feed.
---
```

* Rename "unlisted" into "draft".
This commit is contained in:
Ólafur Páll Geirsson 2019-06-15 18:24:15 +02:00 committed by Yangshun Tay
parent 60f9228d67
commit da3c91373e
4 changed files with 30 additions and 19 deletions

View file

@ -10,6 +10,8 @@ const BlogPost = require('./BlogPost.js');
const BlogSidebar = require('./BlogSidebar.js');
const Container = require('./Container.js');
const MetadataBlog = require('./MetadataBlog.js');
const MetadataPublicBlog = MetadataBlog.filter(item => !item.draft);
const Site = require('./Site.js');
const utils = require('./utils.js');
@ -40,8 +42,10 @@ class BlogPageLayout extends React.Component {
/>
<Container className="mainContainer postContainer blogContainer">
<div className="posts">
{MetadataBlog.slice(page * perPage, (page + 1) * perPage).map(
post => (
{MetadataPublicBlog.slice(
page * perPage,
(page + 1) * perPage,
).map(post => (
<BlogPost
post={post}
content={post.content}
@ -52,15 +56,14 @@ class BlogPageLayout extends React.Component {
}
config={this.props.config}
/>
),
)}
))}
<div className="docs-prevnext">
{page > 0 && (
<a className="docs-prev" href={this.getPageURL(page - 1)}>
Prev
</a>
)}
{MetadataBlog.length > (page + 1) * perPage && (
{MetadataPublicBlog.length > (page + 1) * perPage && (
<a className="docs-next" href={this.getPageURL(page + 1)}>
Next
</a>

View file

@ -10,6 +10,8 @@ const SideNav = require('./nav/SideNav.js');
const MetadataBlog = require('./MetadataBlog.js');
const MetadataPublicBlog = MetadataBlog.filter(item => !item.draft);
class BlogSidebar extends React.Component {
render() {
let blogSidebarCount = 5;
@ -17,7 +19,7 @@ class BlogSidebar extends React.Component {
let blogSidebarTitle = blogSidebarTitleConfig.default || 'Recent Posts';
if (this.props.config.blogSidebarCount) {
if (this.props.config.blogSidebarCount === 'ALL') {
blogSidebarCount = MetadataBlog.length;
blogSidebarCount = MetadataPublicBlog.length;
blogSidebarTitle = blogSidebarTitleConfig.all || 'All Blog Posts';
} else {
blogSidebarCount = this.props.config.blogSidebarCount;
@ -28,7 +30,7 @@ class BlogSidebar extends React.Component {
{
type: 'CATEGORY',
title: blogSidebarTitle,
children: MetadataBlog.slice(0, blogSidebarCount).map(item => ({
children: MetadataPublicBlog.slice(0, blogSidebarCount).map(item => ({
type: 'LINK',
item,
})),

View file

@ -0,0 +1,5 @@
---
title: Draft Example
draft: true
---
This blog post should not appear in the sidebar or the blog feed because it is a draft.

View file

@ -28,6 +28,7 @@ module.exports = function(type) {
readMetadata.generateMetadataBlog(siteConfig);
const MetadataBlog = require('../core/MetadataBlog.js');
const MetadataPublicBlog = MetadataBlog.filter(item => !item.draft);
const feed = new Feed({
title: `${siteConfig.title} Blog`,
@ -38,10 +39,10 @@ module.exports = function(type) {
link: blogRootURL,
image: siteImageURL,
copyright: siteConfig.copyright,
updated: new Date(MetadataBlog[0].date),
updated: new Date(MetadataPublicBlog[0].date),
});
MetadataBlog.forEach(post => {
MetadataPublicBlog.forEach(post => {
const url = `${blogRootURL}/${post.path}`;
const description = utils.blogPostHasTruncateMarker(post.content)
? renderMarkdown(utils.extractBlogPostBeforeTruncate(post.content))