From 6cbc58943e42b54067ffd4d314e5f657e115903a Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Wed, 2 Mar 2022 23:28:17 +0800 Subject: [PATCH] feat: allow blog authors email (#6783) --- .eslintrc.js | 1 + .../__fixtures__/authorsMapFiles/authors.json | 3 ++- .../__fixtures__/authorsMapFiles/authors.yml | 1 + .../__fixtures__/website/blog/authors.yml | 3 ++- .../authors.yml | 3 +-- .../__tests__/__snapshots__/feed.test.ts.snap | 2 ++ .../src/__tests__/index.test.ts | 1 + .../src/authors.ts | 1 + .../src/feed.ts | 4 +--- .../src/plugin-content-blog.d.ts | 1 + .../src/theme/BlogPostAuthor/index.tsx | 24 +++++++++++++------ .../_blog tests/2021-09-13-dup-title.md | 8 +++++++ website/blog/authors.yml | 5 ++++ website/docs/blog.mdx | 11 ++++++++- 14 files changed, 53 insertions(+), 15 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 408eda9737..5fd41c1f8a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -222,6 +222,7 @@ module.exports = { ], 'react/jsx-filename-extension': OFF, 'react/jsx-key': [ERROR, {checkFragmentShorthand: true}], + 'react/jsx-no-useless-fragment': [ERROR, {allowExpressions: true}], 'react/jsx-props-no-spreading': OFF, 'react/no-array-index-key': OFF, // We build a static site, and nearly all components don't change. 'react/no-unstable-nested-components': [WARNING, {allowAsProps: true}], diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/authorsMapFiles/authors.json b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/authorsMapFiles/authors.json index 1cca9c9f0a..3c50092336 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/authorsMapFiles/authors.json +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/authorsMapFiles/authors.json @@ -11,7 +11,8 @@ "title": "Docusaurus maintainer", "url": "https://sebastienlorber.com", "image_url": "https://github.com/slorber.png", - "twitter": "sebastienlorber" + "twitter": "sebastienlorber", + "email": "lorber.sebastien@gmail.com" }, "yangshun": { "name": "Yangshun Tay", diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/authorsMapFiles/authors.yml b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/authorsMapFiles/authors.yml index 5bce126cef..ac09421385 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/authorsMapFiles/authors.yml +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/authorsMapFiles/authors.yml @@ -12,6 +12,7 @@ slorber: url: https://sebastienlorber.com image_url: https://github.com/slorber.png twitter: sebastienlorber + email: lorber.sebastien@gmail.com yangshun: name: Yangshun Tay diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/authors.yml b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/authors.yml index cb6c296b21..a704e9e984 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/authors.yml +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/blog/authors.yml @@ -1,4 +1,5 @@ - slorber: name: Sébastien Lorber title: Docusaurus maintainer + email: lorber.sebastien@gmail.com + url: https://sebastienlorber.com diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/i18n/en/docusaurus-plugin-content-blog/authors.yml b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/i18n/en/docusaurus-plugin-content-blog/authors.yml index f42af6257f..f509f4ff45 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/i18n/en/docusaurus-plugin-content-blog/authors.yml +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__fixtures__/website/i18n/en/docusaurus-plugin-content-blog/authors.yml @@ -1,5 +1,4 @@ - - slorber: name: Sébastien Lorber (translated) title: Docusaurus maintainer (translated) + email: lorber.sebastien@gmail.com diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/feed.test.ts.snap b/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/feed.test.ts.snap index 228c9a76d1..67b84bc407 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/feed.test.ts.snap +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/feed.test.ts.snap @@ -77,6 +77,7 @@ Array [ Sébastien Lorber (translated) + lorber.sebastien@gmail.com ", @@ -238,6 +239,7 @@ Array [ Fri, 14 Dec 2018 00:00:00 GMT Happy birthday!

]]>
+ lorber.sebastien@gmail.com (Sébastien Lorber (translated)) ", diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts index 6831584bb1..b3fad925a6 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts @@ -177,6 +177,7 @@ describe('loadBlog', () => { name: 'Yangshun Tay (translated)', }, { + email: 'lorber.sebastien@gmail.com', key: 'slorber', name: 'Sébastien Lorber (translated)', title: 'Docusaurus maintainer (translated)', diff --git a/packages/docusaurus-plugin-content-blog/src/authors.ts b/packages/docusaurus-plugin-content-blog/src/authors.ts index e69ec0c849..566da9a46a 100644 --- a/packages/docusaurus-plugin-content-blog/src/authors.ts +++ b/packages/docusaurus-plugin-content-blog/src/authors.ts @@ -24,6 +24,7 @@ const AuthorsMapSchema = Joi.object().pattern( url: URISchema, imageURL: URISchema, title: Joi.string(), + email: Joi.string(), }) .rename('image_url', 'imageURL') .or('name', 'imageURL') diff --git a/packages/docusaurus-plugin-content-blog/src/feed.ts b/packages/docusaurus-plugin-content-blog/src/feed.ts index 1357135e60..eb5908977d 100644 --- a/packages/docusaurus-plugin-content-blog/src/feed.ts +++ b/packages/docusaurus-plugin-content-blog/src/feed.ts @@ -57,9 +57,7 @@ async function generateBlogFeed({ }); function toFeedAuthor(author: Author): FeedAuthor { - // TODO ask author emails? - // RSS feed requires email to render authors - return {name: author.name, link: author.url}; + return {name: author.name, link: author.url, email: author.email}; } await mapAsyncSequential(blogPosts, async (post) => { diff --git a/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts b/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts index 525c9f66fd..411f95ced3 100644 --- a/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts +++ b/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts @@ -21,6 +21,7 @@ declare module '@docusaurus/plugin-content-blog' { imageURL?: string; url?: string; title?: string; + email?: string; } export type BlogPostFrontMatter = { diff --git a/packages/docusaurus-theme-classic/src/theme/BlogPostAuthor/index.tsx b/packages/docusaurus-theme-classic/src/theme/BlogPostAuthor/index.tsx index fed9d4bcf3..f4d32b74ca 100644 --- a/packages/docusaurus-theme-classic/src/theme/BlogPostAuthor/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/BlogPostAuthor/index.tsx @@ -6,19 +6,29 @@ */ import React from 'react'; -import Link from '@docusaurus/Link'; +import Link, {type Props as LinkProps} from '@docusaurus/Link'; import type {Props} from '@theme/BlogPostAuthor'; import styles from './styles.module.css'; +function MaybeLink(props: LinkProps): JSX.Element { + if (props.href) { + return ; + } + return <>{props.children}; +} + export default function BlogPostAuthor({author}: Props): JSX.Element { - const {name, title, url, imageURL} = author; + const {name, title, url, imageURL, email} = author; + const link = url || (email && `mailto:${email}`) || undefined; return (
{imageURL && ( - - {name} - + + + {name} + + )} {name && ( @@ -28,9 +38,9 @@ export default function BlogPostAuthor({author}: Props): JSX.Element { itemScope itemType="https://schema.org/Person">
- +
{title && ( diff --git a/website/_dogfooding/_blog tests/2021-09-13-dup-title.md b/website/_dogfooding/_blog tests/2021-09-13-dup-title.md index 0f92f6a4b9..721fff0021 100644 --- a/website/_dogfooding/_blog tests/2021-09-13-dup-title.md +++ b/website/_dogfooding/_blog tests/2021-09-13-dup-title.md @@ -1,5 +1,13 @@ --- tags: [paginated-tag] +authors: + - name: Josh-Cena1 + - name: Josh-Cena2 + image_url: https://github.com/Josh-Cena.png + - name: Josh-Cena3 + url: https://github.com/Josh-Cena + - name: Josh-Cena4 + email: sidechen2003@gmail.com --- # Post with duplicate title diff --git a/website/blog/authors.yml b/website/blog/authors.yml index 42540c8100..b1beb5f8ec 100644 --- a/website/blog/authors.yml +++ b/website/blog/authors.yml @@ -3,6 +3,7 @@ JMarcey: title: Technical Lead & Developer Advocate at Facebook url: http://twitter.com/JoelMarcey image_url: https://github.com/JoelMarcey.png + email: jimarcey@gmail.com twitter: JoelMarcey slorber: @@ -11,6 +12,7 @@ slorber: url: https://sebastienlorber.com image_url: https://github.com/slorber.png twitter: sebastienlorber + email: lorber.sebastien@gmail.com yangshun: name: Yangshun Tay @@ -18,15 +20,18 @@ yangshun: url: https://github.com/yangshun image_url: https://github.com/yangshun.png twitter: yangshunz + email: tay.yang.shun@gmail.com lex111: name: Alexey Pyltsyn title: Open-source enthusiast url: https://github.com/lex111 image_url: https://github.com/lex111.png + email: lex@php.net Josh-Cena: name: Joshua Chen title: Working hard on Docusaurus url: https://joshcena.com/ image_url: https://github.com/josh-cena.png + email: sidachen2003@gmail.com diff --git a/website/docs/blog.mdx b/website/docs/blog.mdx index bdee3fcb35..3e0173879a 100644 --- a/website/docs/blog.mdx +++ b/website/docs/blog.mdx @@ -185,7 +185,7 @@ date: 2021-09-13T18:00 ## Blog post authors {#blog-post-authors} -Use the `authors` front matter field to declare blog post authors. +Use the `authors` front matter field to declare blog post authors. An author should have at least a `name` or an `image_url`. Docusaurus uses information like `url`, `email`, and `title`, but any other information is allowed. ### Inline authors {#inline-authors} @@ -202,6 +202,7 @@ authors: title: Co-creator of Docusaurus 1 url: https://github.com/JoelMarcey image_url: https://github.com/JoelMarcey.png + email: jimarcey@gmail.com --- ``` @@ -215,6 +216,7 @@ authors: title: Co-creator of Docusaurus 1 url: https://github.com/JoelMarcey image_url: https://github.com/JoelMarcey.png + email: jimarcey@gmail.com - name: Sébastien Lorber title: Docusaurus maintainer url: https://sebastienlorber.com @@ -259,6 +261,7 @@ jmarcey: title: Co-creator of Docusaurus 1 url: https://github.com/JoelMarcey image_url: https://github.com/JoelMarcey.png + email: jimarcey@gmail.com slorber: name: Sébastien Lorber @@ -353,6 +356,12 @@ website/i18n/[locale]/docusaurus-plugin-content-blog/authors.yml An author, either declared through front matter or through the authors map, needs to have a name or an avatar, or both. If all authors of a post don't have names, Docusaurus will display their avatars compactly. See [this test post](/tests/blog/2022/01/20/image-only-authors) for the effect. +:::caution Feed generation + +[RSS feeds](#feed) require the author's email to be set for the author to appear in the feed. + +::: + ## Reading time {#reading-time} Docusaurus generates a reading time estimation for each blog post based on word count. We provide an option to customize this.