diff --git a/src/client/app/composables/head.ts b/src/client/app/composables/head.ts index 1230760a..46c57b3f 100644 --- a/src/client/app/composables/head.ts +++ b/src/client/app/composables/head.ts @@ -28,6 +28,7 @@ export function useUpdateHead(route: Route, siteDataByRouteRef: Ref) { const pageData = route.data const siteData = siteDataByRouteRef.value const pageTitle = pageData && pageData.title + const pageDescription = pageData && pageData.description document.title = (pageTitle ? pageTitle + ` | ` : ``) + siteData.title updateHeadTags([ ['meta', { charset: 'utf-8' }], @@ -42,7 +43,7 @@ export function useUpdateHead(route: Route, siteDataByRouteRef: Ref) { 'meta', { name: 'description', - content: siteData.description + content: pageDescription || siteData.description } ], ...siteData.head, diff --git a/src/node/build/render.ts b/src/node/build/render.ts index a3887b01..6cf5414e 100644 --- a/src/node/build/render.ts +++ b/src/node/build/render.ts @@ -63,7 +63,9 @@ export async function renderPage( ${pageData.title ? pageData.title + ` | ` : ``}${siteData.title} - + ${preloadLinks} ${renderHead(siteData.head)} diff --git a/src/node/markdownToVue.ts b/src/node/markdownToVue.ts index 55a48f61..a774e417 100644 --- a/src/node/markdownToVue.ts +++ b/src/node/markdownToVue.ts @@ -42,7 +42,7 @@ export function createMarkdownToVueRenderFn( const pageData: PageData = { title: inferTitle(frontmatter, content), description: inferDescription(frontmatter), - frontmatter, + frontmatter: withHeadDescriptionRemoved(frontmatter), headers: data.headers, relativePath: file.replace(/\\/g, '/'), lastUpdated @@ -109,11 +109,11 @@ const inferTitle = (frontmatter: any, content: string) => { } const inferDescription = (frontmatter: Record) => { - if (!frontmatter.head) { - return '' + const { description, head } = frontmatter + if (description !== undefined) { + return description } - - return getHeadMetaContent(frontmatter.head, 'description') || '' + return (head && getHeadMetaContent(head, 'description')) || '' } const getHeadMetaContent = ( @@ -130,3 +130,25 @@ const getHeadMetaContent = ( return meta && meta[1].content } + +function isMetaDescription(headConfig: HeadConfig) { + return ( + headConfig[0] === 'meta' && + headConfig[1] && + headConfig[1].name === 'description' + ) +} + +function rejectHeadDescription(head: HeadConfig[]) { + return head.filter((h: HeadConfig) => !isMetaDescription(h)) +} + +function withHeadDescriptionRemoved(frontmatter: Record) { + if (frontmatter.head) { + return { + ...frontmatter, + head: rejectHeadDescription(frontmatter.head) + } + } + return frontmatter +}