From 95ace0e4eba1f5b2bc0f9ced8ec703e01aa73d0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9D=A8=E6=96=87?= Date: Sat, 27 Jul 2019 19:03:14 +0800 Subject: [PATCH] feat(v2): blog support date front matter (#1702) * feat(v2): blog support date front matter * feat(v2): blog support date front matter * feat(v2): blog support date front matter * feat(v2): blog support date front matter * Update CHANGELOG-2.x.md --- CHANGELOG-2.x.md | 1 + .../2018-12-14-Happy-First-Birthday-Slash.md | 5 ++ .../__fixtures__/website/blog/date-matter.md | 5 ++ .../__fixtures__/website/blog/no date.md | 1 + .../src/__tests__/index.test.js | 76 +++++++++++++++++++ .../src/index.js | 46 ++++++----- 6 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/2018-12-14-Happy-First-Birthday-Slash.md create mode 100644 packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/date-matter.md create mode 100644 packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/no date.md create mode 100644 packages/docusaurus-plugin-content-blog/src/__tests__/index.test.js diff --git a/CHANGELOG-2.x.md b/CHANGELOG-2.x.md index f53367bb2c..ca16aedfa1 100644 --- a/CHANGELOG-2.x.md +++ b/CHANGELOG-2.x.md @@ -2,6 +2,7 @@ ## Unreleased +- Add `date` frontMatter support for blog plugin - Add `truncateMarker` option to blog plugin, support string or regex. - Webpack `optimization.removeAvailableModules` is now disabled for performance gain. See https://github.com/webpack/webpack/releases/tag/v4.38.0 for more context. diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/2018-12-14-Happy-First-Birthday-Slash.md b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/2018-12-14-Happy-First-Birthday-Slash.md new file mode 100644 index 0000000000..a5151a223e --- /dev/null +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/2018-12-14-Happy-First-Birthday-Slash.md @@ -0,0 +1,5 @@ +--- +title: Happy 1st Birthday Slash! +--- + +pattern name \ No newline at end of file diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/date-matter.md b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/date-matter.md new file mode 100644 index 0000000000..52ffa7c01c --- /dev/null +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/date-matter.md @@ -0,0 +1,5 @@ +--- +date: 2019-01-01 +--- + +date inside front matter \ No newline at end of file diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/no date.md b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/no date.md new file mode 100644 index 0000000000..b579256ebf --- /dev/null +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/no date.md @@ -0,0 +1 @@ +no date \ No newline at end of file diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.js b/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.js new file mode 100644 index 0000000000..afeb123c14 --- /dev/null +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.js @@ -0,0 +1,76 @@ +/** + * 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. + */ + +import fs from 'fs-extra'; +import path from 'path'; +import pluginContentBlog from '../index'; + +describe('loadBlog', () => { + test('simple website', async () => { + const siteDir = path.join(__dirname, '__fixtures__', 'website'); + const siteConfig = { + title: 'Hello', + baseUrl: '/', + url: 'https://docusaurus.io', + }; + const pluginPath = 'blog'; + const plugin = pluginContentBlog( + { + siteDir, + siteConfig, + }, + { + path: 'blog', + }, + ); + const {blogPosts} = await plugin.loadContent(); + + expect( + blogPosts.find(v => v.metadata.title === 'date-matter').metadata, + ).toEqual({ + permalink: '/blog/2019/01/01/date-matter', + source: path.join('@site', pluginPath, 'date-matter.md'), + title: 'date-matter', + description: `date inside front matter`, + date: new Date('2019-01-01'), + tags: [], + }); + expect( + blogPosts.find(v => v.metadata.title === 'Happy 1st Birthday Slash!') + .metadata, + ).toEqual({ + permalink: '/blog/2018/12/14/Happy-First-Birthday-Slash', + source: path.join( + '@site', + pluginPath, + '2018-12-14-Happy-First-Birthday-Slash.md', + ), + title: 'Happy 1st Birthday Slash!', + description: `pattern name`, + date: new Date('2018-12-14'), + tags: [], + }); + + const noDateSource = path.join('@site', pluginPath, 'no date.md'); + const noDateSourceBirthTime = (await fs.stat( + noDateSource.replace('@site', siteDir), + )).birthtime; + expect( + blogPosts.find(v => v.metadata.title === 'no date').metadata, + ).toEqual({ + permalink: `/blog/${noDateSourceBirthTime + .toISOString() + .substr(0, '2019-01-01'.length) + .replace(/-/g, '/')}/no date`, + source: noDateSource, + title: 'no date', + description: `no date`, + date: noDateSourceBirthTime, + tags: [], + }); + }); +}); diff --git a/packages/docusaurus-plugin-content-blog/src/index.js b/packages/docusaurus-plugin-content-blog/src/index.js index 13433dbb09..ff7320a25e 100644 --- a/packages/docusaurus-plugin-content-blog/src/index.js +++ b/packages/docusaurus-plugin-content-blog/src/index.js @@ -11,13 +11,15 @@ const _ = require('lodash'); const path = require('path'); const {parse, normalizeUrl, docuHash} = require('@docusaurus/utils'); -// TODO: Use a better slugify function that doesn't rely on a specific file extension. -function fileToUrl(fileName) { - return fileName - .replace('-', '/') - .replace('-', '/') - .replace('-', '/') - .replace(/\.mdx?$/, ''); +// YYYY-MM-DD-{name}.mdx? +// prefer named capture, but old node version do not support +const FILENAME_PATTERN = /^(\d{4}-\d{1,2}-\d{1,2})-?(.*?).mdx?$/; + +function toUrl({date, link}) { + return `${date + .toISOString() + .substring(0, '2019-01-01'.length) + .replace(/-/g, '/')}/${link}`; } const DEFAULT_OPTIONS = { @@ -70,30 +72,40 @@ module.exports = function(context, opts) { const source = path.join(blogDir, relativeSource); const aliasedSource = `@site/${path.relative(siteDir, source)}`; const blogFileName = path.basename(relativeSource); - // Extract, YYYY, MM, DD from the file name. - const filePathDateArr = blogFileName.split('-'); - const date = new Date( - `${filePathDateArr[0]}-${filePathDateArr[1]}-${ - filePathDateArr[2] - }T06:00:00.000Z`, - ); const fileString = await fs.readFile(source, 'utf-8'); const {frontMatter, excerpt} = parse(fileString); + let date; + // extract date and title from filename + const match = blogFileName.match(FILENAME_PATTERN); + let linkName = blogFileName.replace(/\.mdx?$/, ''); + if (match) { + const [, dateString, name] = match; + date = new Date(dateString); + linkName = name; + } + // prefer usedefined date + if (frontMatter.date) { + date = new Date(frontMatter.date); + } + // use file create time for blog + date = date || (await fs.stat(source)).birthtime; + frontMatter.title = frontMatter.title || linkName; + blogPosts.push({ - id: frontMatter.id || blogFileName, + id: frontMatter.id || frontMatter.title, metadata: { permalink: normalizeUrl([ baseUrl, routeBasePath, - frontMatter.id || fileToUrl(blogFileName), + frontMatter.id || toUrl({date, link: linkName}), ]), source: aliasedSource, description: frontMatter.description || excerpt, date, tags: frontMatter.tags, - title: frontMatter.title || blogFileName, + title: frontMatter.title, }, }); }),