diff --git a/README.md b/README.md index 335f8b43..095529e2 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ yarn run start # 本地启动NextJS服务 - **框架**: [Next.js](https://nextjs.org) - **样式**: [Tailwind CSS](https://www.tailwindcss.cn/) 和 `@tailwindcss/jit` compiler - **渲染**: [React-notion-x](https://github.com/NotionX/react-notion-x) -- **评论**: [Giscus](https://giscus.app/zh-CN), [Gitalk](https://gitalk.github.io), [Cusdis](https://gitalk.github.io), [Utterances](https://utteranc.es) +- **评论**: [Giscus](https://giscus.app/zh-CN), [Gitalk](https://gitalk.github.io), [Cusdis](https://cusdis.com), [Utterances](https://utteranc.es) - **图标**:[fontawesome v5.15](https://fontawesome.com/v5.15/icons?d=gallery) ## 更新日志 diff --git a/blog.config.js b/blog.config.js index bf271a5e..e0fd64c7 100644 --- a/blog.config.js +++ b/blog.config.js @@ -31,6 +31,9 @@ const BLOG = { BACKGROUND_DARK: '#000000', // use hex value, don't forget '#' SUB_PATH: '', // leave this empty unless you want to deploy in a folder + POST_URL_PREFIX: process.env.NEXT_PUBLIC_POST_URL_PREFIX || 'article', // POST类型文章的默认路径前缀,例如默认POST类型的路径是 /article/[slug] + // 如果此项配置为 '' 空, 则文章将没有前缀路径,使用场景: 希望 文章前缀路径为 /post 的情况 支持多级 + POST_LIST_STYLE: 'page', // ['page','scroll] 文章列表样式:页码分页、单页滚动加载 POST_LIST_PREVIEW: process.env.NEXT_PUBLIC_POST_PREVIEW || 'false', // 是否在列表加载文章预览 POST_PREVIEW_LINES: 12, // 预览博客行数 @@ -128,20 +131,22 @@ const BLOG = { ADSENSE_GOOGLE_ID: process.env.NEXT_PUBLIC_ADSENSE_GOOGLE_ID || '', // 谷歌广告ID e.g ca-pub-xxxxxxxxxxxxxxxx - // 无关紧要的配置 // 自定义配置notion数据库字段名 NOTION_PROPERTY_NAME: { - password: 'password', - type: 'type', - title: 'title', - status: 'status', - summary: 'summary', - slug: 'slug', - category: 'category', - date: 'date', - tags: 'tags', - icon: 'icon' + password: process.env.NEXT_PUBLIC_NOTION_PROPERTY_PASSWORD || 'password', + type: process.env.NEXT_PUBLIC_NOTION_PROPERTY_TYPE || 'type', + title: process.env.NEXT_PUBLIC_NOTION_PROPERTY_TITLE || 'title', + status: process.env.NEXT_PUBLIC_NOTION_PROPERTY_STATUS || 'status', + summary: process.env.NEXT_PUBLIC_NOTION_PROPERTY_SUMMARY || 'summary', + slug: process.env.NEXT_PUBLIC_NOTION_PROPERTY_SLUG || 'slug', + category: process.env.NEXT_PUBLIC_NOTION_PROPERTY_CATEGORY || 'category', + date: process.env.NEXT_PUBLIC_NOTION_PROPERTY_DATE || 'date', + tags: process.env.NEXT_PUBLIC_NOTION_PROPERTY_TAGS || 'tags', + icon: process.env.NEXT_PUBLIC_NOTION_PROPERTY_ICON || 'icon' }, + + ENABLE_CACHE: false, // 开启缓存 会将Notion数据缓存在内存中,稍微提升访问速度,但要更新内容需要多次刷新页面 + AVATAR: '/avatar.png', // 作者头像,被notion中的ICON覆盖。如果没有ICON则取public目录下的avatar.png TITLE: process.env.NEXT_PUBLIC_TITLE || 'NotionNext BLOG', // 站点标题 ,被notion中的页面标题覆盖 DESCRIPTION: diff --git a/components/CommonHead.js b/components/CommonHead.js index d8aea1fc..de4c7d25 100644 --- a/components/CommonHead.js +++ b/components/CommonHead.js @@ -44,7 +44,7 @@ const CommonHead = ({ meta, children }) => { {JSON.parse(BLOG.ANALYTICS_BUSUANZI_ENABLE) && } - {meta?.type === 'article' && ( + {meta?.type === 'Post' && ( <> { // return 'https://www.notion.so/' + id.replace(/-/g, '') - return '/article/' + id.replace(/-/g, '') + return '/' + id.replace(/-/g, '') } function getMediumZoomMargin() { diff --git a/lib/cache/cache_manager.js b/lib/cache/cache_manager.js index 6554b014..8796d3f4 100644 --- a/lib/cache/cache_manager.js +++ b/lib/cache/cache_manager.js @@ -1,7 +1,7 @@ import MemoryCache from './memory_cache' import FileCache from './local_file_cache' import MongoCache from './mongo_db_cache' -const enableCache = true +import BLOG from '@/blog.config' let api if (process.env.MONGO_DB_URL && process.env.MONGO_DB_NAME) { @@ -17,26 +17,27 @@ if (process.env.MONGO_DB_URL && process.env.MONGO_DB_NAME) { * @param {*} key * @returns */ -export async function getDataFromCache(key) { - if (!enableCache) { +export async function getDataFromCache(key, force) { + if (BLOG.ENABLE_CACHE || force) { + const dataFromCache = await api.getCache(key) + if (JSON.stringify(dataFromCache) === '[]') { + return null + } + return api.getCache(key) + } else { return null } - const dataFromCache = await api.getCache(key) - if (JSON.stringify(dataFromCache) === '[]') { - return null - } - return api.getCache(key) } export async function setDataToCache(key, data) { - if (!enableCache || !data) { + if (!data) { return } await api.setCache(key, data) } export async function delCacheData(key) { - if (!enableCache) { + if (!BLOG.ENABLE_CACHE) { return } await api.delCache(key) diff --git a/lib/notion/getAllPageIds.js b/lib/notion/getAllPageIds.js index 1fbca908..e8f6dd8f 100644 --- a/lib/notion/getAllPageIds.js +++ b/lib/notion/getAllPageIds.js @@ -11,10 +11,10 @@ export default function getAllPageIds (collectionQuery, collectionId, collection view?.collection_group_results?.blockIds?.forEach(id => pageSet.add(id)) // table视图 }) pageIds = [...pageSet] - console.log('PageIds: 从collectionQuery获取', collectionQuery) + // console.log('PageIds: 从collectionQuery获取', collectionQuery, pageIds.length) } else if (viewIds && viewIds.length > 0) { const ids = collectionView[viewIds[0]].value.page_sort - console.log('PageIds: 从viewId获取', viewIds) + // console.log('PageIds: 从viewId获取', viewIds) for (const id of ids) { pageIds.push(id) } diff --git a/lib/notion/getAllTags.js b/lib/notion/getAllTags.js index 33e82f51..098f62fb 100644 --- a/lib/notion/getAllTags.js +++ b/lib/notion/getAllTags.js @@ -7,7 +7,9 @@ import { isIterable } from '../utils' * @param tagOptions tags的下拉选项 * @returns {Promise<{}|*[]>} */ -export function getAllTags({ allPosts, sliceCount = 0, tagOptions }) { +export function getAllTags({ allPages, sliceCount = 0, tagOptions }) { + const allPosts = allPages.filter(page => page.type === 'Post') + if (!allPosts || !tagOptions) { return [] } diff --git a/lib/notion/getNotionData.js b/lib/notion/getNotionData.js index bf54561c..21a43c37 100644 --- a/lib/notion/getNotionData.js +++ b/lib/notion/getNotionData.js @@ -21,8 +21,7 @@ import getPageProperties from './getPageProperties' */ export async function getGlobalNotionData({ pageId = BLOG.NOTION_PAGE_ID, - from, - pageType = ['Post'] + from }) { // 获取Notion数据 const notionPageData = deepClone(await getNotionPageData({ pageId, from })) @@ -42,7 +41,9 @@ export async function getGlobalNotionData({ * @param {*}} param0 * @returns */ -function getLatestPosts({ allPosts, from, latestPostCount }) { +function getLatestPosts({ allPages, from, latestPostCount }) { + const allPosts = allPages.filter(page => page.type === 'Post') + const latestPosts = Object.create(allPosts).sort((a, b) => { const dateA = new Date(a?.lastEditedTime || a?.createdTime || a?.date?.start_date) const dateB = new Date(b?.lastEditedTime || b?.createdTime || b?.date?.start_date) @@ -82,7 +83,7 @@ function getCustomNav({ allPages }) { const customNav = [] if (allPages && allPages.length > 0) { allPages.forEach(p => { - if (p?.status?.[0] === 'Published') { + if (p?.status === 'Published' && p?.type === 'Page') { if (p?.slug?.indexOf('http') === 0) { customNav.push({ icon: p.icon || null, name: p.title, to: p.slug, show: true }) } else { @@ -101,7 +102,7 @@ function getCustomNav({ allPages }) { */ function getTagOptions(schema) { if (!schema) return {} - const tagSchema = Object.values(schema).find(e => e.name === 'tags') + const tagSchema = Object.values(schema).find(e => e.name === BLOG.NOTION_PROPERTY_NAME.tags) return tagSchema?.options || [] } @@ -112,7 +113,7 @@ function getTagOptions(schema) { */ function getCategoryOptions(schema) { if (!schema) return {} - const categorySchema = Object.values(schema).find(e => e.name === 'category') + const categorySchema = Object.values(schema).find(e => e.name === BLOG.NOTION_PROPERTY_NAME.category) return categorySchema?.options || [] } @@ -121,7 +122,8 @@ function getCategoryOptions(schema) { * @param allPosts * @returns {Promise<{}|*[]>} */ -function getAllCategories({ allPosts, categoryOptions, sliceCount = 0 }) { +function getAllCategories({ allPages, categoryOptions, sliceCount = 0 }) { + const allPosts = allPages.filter(page => page.type === 'Post') if (!allPosts || !categoryOptions) { return [] } @@ -220,7 +222,7 @@ async function getPageRecordMapByNotionAPI({ pageId, from }) { // Check Type Page-Database和Inline-Database if ( rawMetadata?.type !== 'collection_view_page' && - rawMetadata?.type !== 'collection_view' + rawMetadata?.type !== 'collection_view' ) { console.warn(`pageId "${pageId}" is not a database`) return null @@ -251,17 +253,24 @@ async function getPageRecordMapByNotionAPI({ pageId, from }) { collectionData.push(properties) } } + // 读取映射 配置 + let postCount = 0 const allPages = collectionData.filter(post => { - return post.title && ['Page'].indexOf(post?.type?.[0]) > -1 && (post?.status?.[0] === 'Published' || post?.status?.[0] === 'Invisible') - }) - const allPosts = collectionData.filter(post => { - return post.title && ['Post'].indexOf(post?.type?.[0]) > -1 && post?.status?.[0] === 'Published' - }) + if (post.type === 'Post' && (post.status === 'Published' || post.status === 'Invisible')) { + postCount++ + } + + return post && + post.type && + (post.type === 'Post' || post.type === 'Page') && + (post.status === 'Published' || post.status === 'Invisible') + } + ) // Sort by date if (BLOG.POSTS_SORT_BY === 'date') { - allPosts.sort((a, b) => { + allPages.sort((a, b) => { const dateA = new Date(a?.date?.start_date || a.createdTime) const dateB = new Date(b?.date?.start_date || b.createdTime) return dateB - dateA @@ -269,15 +278,13 @@ async function getPageRecordMapByNotionAPI({ pageId, from }) { } const customNav = getCustomNav({ allPages }) - const postCount = allPosts?.length || 0 - const categories = getAllCategories({ allPosts, categoryOptions, sliceCount: BLOG.PREVIEW_CATEGORY_COUNT }) - const tags = getAllTags({ allPosts, tagOptions, sliceCount: BLOG.PREVIEW_TAG_COUNT }) - const latestPosts = getLatestPosts({ allPosts, from, latestPostCount: 5 }) + const categories = getAllCategories({ allPages, categoryOptions, sliceCount: BLOG.PREVIEW_CATEGORY_COUNT }) + const tags = getAllTags({ allPages, tagOptions, sliceCount: BLOG.PREVIEW_TAG_COUNT }) + const latestPosts = getLatestPosts({ allPages, from, latestPostCount: 5 }) return { siteInfo, allPages, - allPosts, collection, collectionQuery, collectionId, diff --git a/lib/notion/getPageProperties.js b/lib/notion/getPageProperties.js index 33324928..4061632c 100644 --- a/lib/notion/getPageProperties.js +++ b/lib/notion/getPageProperties.js @@ -58,6 +58,7 @@ async function getPageProperties(id, block, schema, authToken, tagOptions, siteI } } } + // 设置自定义字段 const fieldNames = BLOG.NOTION_PROPERTY_NAME if (fieldNames) { @@ -65,7 +66,16 @@ async function getPageProperties(id, block, schema, authToken, tagOptions, siteI if (fieldNames[key] && properties[fieldNames[key]]) properties[key] = properties[fieldNames[key]] }) } - properties.slug = properties.slug ?? properties.id + + properties.type = properties.type[0] + properties.status = properties.status[0] + + if (properties.type === 'Post') { + properties.slug = BLOG.POST_URL_PREFIX + '/' + (properties.slug ?? properties.id) + } else { + properties.slug = (properties.slug ?? properties.id) + } + properties.createdTime = formatDate(new Date(value.created_time).toString(), BLOG.LANG) properties.lastEditedTime = formatDate(new Date(value?.last_edited_time).toString(), BLOG.LANG) properties.fullWidth = value.format?.page_full_width ?? false diff --git a/lib/notion/getPostBlocks.js b/lib/notion/getPostBlocks.js index dfd3988e..f5712b8c 100644 --- a/lib/notion/getPostBlocks.js +++ b/lib/notion/getPostBlocks.js @@ -35,7 +35,7 @@ async function getPageWithRetry(id, from, retryAttempts = 3) { const authToken = BLOG.NOTION_ACCESS_TOKEN || null const api = new NotionAPI({ authToken, userTimeZone: 'Asia/ShangHai' }) const pageData = await api.getPage(id) - console.info('[响应成功]:', `from:${from}`, `id:${id}`) + console.info('[响应成功]:', `from:${from}`) return pageData } catch (e) { console.warn('[响应异常]:', e) diff --git a/lib/rss.js b/lib/rss.js index 9c394c2c..9019f061 100644 --- a/lib/rss.js +++ b/lib/rss.js @@ -38,7 +38,7 @@ export async function generateRss(posts) { feed.addItem({ title: post.title, guid: `${post.id}`, - link: `${BLOG.LINK}/article/${post.slug}`, + link: `${BLOG.LINK}/${post.slug}`, description: post.summary, content: await createFeedContent(post), date: new Date(post?.date?.start_date || post?.createdTime) diff --git a/pages/article/[slug].js b/pages/[...slug].js similarity index 90% rename from pages/article/[slug].js rename to pages/[...slug].js index a0f2bb55..39246577 100644 --- a/pages/article/[slug].js +++ b/pages/[...slug].js @@ -62,8 +62,8 @@ const Slug = props => { const meta = { title: `${post?.title} | ${siteInfo?.title}`, description: post?.summary, - type: 'article', - slug: 'article/' + post?.slug, + type: post.type, + slug: post?.slug, image: post?.page_cover, category: post?.category?.[0], tags: post?.tags @@ -95,17 +95,20 @@ export async function getStaticPaths() { } export async function getStaticProps({ params: { slug } }) { - const from = `slug-props-${slug}` + // slug 是个数组 + const fullSlug = slug.join('/') + const from = `slug-props-${fullSlug}` const props = await getGlobalNotionData({ from, pageType: ['Post'] }) - const allPosts = props.allPosts - props.post = props.allPosts.find((p) => { - return p.slug === slug || p.id === idToUuid(slug) + props.post = props.allPages.find((p) => { + return p.slug === fullSlug || p.id === idToUuid(fullSlug) }) if (!props.post) { + console.warn('无效地址', fullSlug) return { props, revalidate: 1 } } props.post.blockMap = await getPostBlocks(props.post.id, 'slug') + const allPosts = props.allPages.filter(page => page.type === 'Post') const index = allPosts.indexOf(props.post) props.prev = allPosts.slice(index - 1, index)[0] ?? allPosts.slice(-1)[0] props.next = allPosts.slice(index + 1, index + 2)[0] ?? allPosts[0] @@ -114,6 +117,7 @@ export async function getStaticProps({ params: { slug } }) { allPosts, BLOG.POST_RECOMMEND_COUNT ) + delete props.allPages return { props, revalidate: 1 diff --git a/pages/[slug].js b/pages/[slug].js deleted file mode 100644 index 64b949e9..00000000 --- a/pages/[slug].js +++ /dev/null @@ -1,115 +0,0 @@ -import BLOG from '@/blog.config' -import { getPostBlocks } from '@/lib/notion' -import { getGlobalNotionData } from '@/lib/notion/getNotionData' -import { useGlobal } from '@/lib/global' -import * as ThemeMap from '@/themes' -import React from 'react' -import { useRouter } from 'next/router' -import { isBrowser } from '@/lib/utils' - -/** - * 根据notion的slug访问页面,针对类型为Page的页面 - * @param {*} props - * @returns - */ -const Slug = props => { - const { theme, changeLoadingState } = useGlobal() - const ThemeComponents = ThemeMap[theme] - const { post } = props - - if (!post) { - changeLoadingState(true) - const router = useRouter() - setTimeout(() => { - if (isBrowser()) { - const article = document.getElementById('container') - if (!article) { - router.push('/404').then(() => { - console.warn('找不到页面', router.asPath) - }) - } - } - }, 5000) - const meta = { title: `${props?.siteInfo?.title || BLOG.TITLE} | loading` } - return - } - - changeLoadingState(false) - - // 文章锁🔐 - const [lock, setLock] = React.useState(post.password && post.password !== '') - React.useEffect(() => { - if (post.password && post.password !== '') { - setLock(true) - } else { - setLock(false) - } - }, [post]) - - /** - * 验证文章密码 - * @param {*} result - */ - const validPassword = result => { - if (result) { - setLock(false) - } - } - - const { siteInfo } = props - const meta = { - title: `${post?.title} | ${siteInfo?.title}`, - description: post?.summary, - type: 'article', - slug: 'article/' + post?.slug, - image: post?.page_cover, - category: post?.category?.[0], - tags: post?.tags - } - - props = { ...props, meta, lock, setLock, validPassword } - - return -} - -export async function getStaticPaths() { - if (!BLOG.isProd) { - return { - paths: [], - fallback: true - } - } - - const from = 'slug-paths' - const { allPages } = await getGlobalNotionData({ from, pageType: ['Page'] }) - - return { - paths: allPages.map(row => ({ params: { slug: row.slug } })), - fallback: true - } -} - -export async function getStaticProps({ params: { slug } }) { - const from = `slug-props-${slug}` - const props = await getGlobalNotionData({ from, pageType: ['Page'] }) - const { allPages } = props - const page = allPages?.find(p => p.slug === slug) - if (!page) { - return { props: {}, revalidate: 1 } - } - - try { - page.blockMap = await getPostBlocks(page.id, 'slug') - } catch (error) { - console.error('获取文章详情失败', error) - } - - props.post = page - - return { - props, - revalidate: 1 - } -} - -export default Slug diff --git a/pages/archive/index.js b/pages/archive/index.js index fda51dc5..098da940 100644 --- a/pages/archive/index.js +++ b/pages/archive/index.js @@ -20,7 +20,10 @@ const ArchiveIndex = props => { export async function getStaticProps() { const props = await getGlobalNotionData({ from: 'archive-index' }) - props.posts = props.allPosts + const { allPages } = props + const allPosts = allPages.filter(page => page.type === 'Post') + // 处理分页 + props.posts = allPosts return { props, revalidate: 1 diff --git a/pages/category/[category].js b/pages/category/[category].js index ac44bb05..6c07adcf 100644 --- a/pages/category/[category].js +++ b/pages/category/[category].js @@ -26,7 +26,9 @@ export default function Category(props) { export async function getStaticProps({ params: { category } }) { const from = 'category-props' let props = await getGlobalNotionData({ from }) - const posts = props.allPosts.filter( + const { allPages } = props + const allPosts = allPages.filter(page => page.type === 'Post') + const posts = allPosts.filter( post => post && post.category && post.category.includes(category) ) props = { ...props, posts, category } diff --git a/pages/index.js b/pages/index.js index bc519e2c..3c49f983 100644 --- a/pages/index.js +++ b/pages/index.js @@ -11,8 +11,9 @@ const Index = props => { export async function getStaticProps() { const from = 'index' - const props = await getGlobalNotionData({ from, pageType: ['Post'] }) - const { allPosts, siteInfo } = props + const props = await getGlobalNotionData({ from }) + const { allPages, siteInfo } = props + const allPosts = allPages.filter(page => page.type === 'Post') const meta = { title: `${siteInfo?.title} | ${siteInfo?.description}`, description: siteInfo?.description, diff --git a/pages/page/[page].js b/pages/page/[page].js index f86b0902..a7b49e82 100644 --- a/pages/page/[page].js +++ b/pages/page/[page].js @@ -38,8 +38,10 @@ export async function getStaticProps({ params: { page } }) { const from = `page-${page}` const props = await getGlobalNotionData({ from }) props.page = page + const { allPages } = props + const allPosts = allPages.filter(page => page.type === 'Post') // 处理分页 - props.posts = props.allPosts.slice( + props.posts = allPosts.slice( BLOG.POSTS_PER_PAGE * (page - 1), BLOG.POSTS_PER_PAGE * page ) diff --git a/pages/search/[keyword].js b/pages/search/[keyword].js index 03fb8109..dc992481 100644 --- a/pages/search/[keyword].js +++ b/pages/search/[keyword].js @@ -35,7 +35,9 @@ export async function getStaticProps({ params: { keyword } }) { from: 'search-props', pageType: ['Post'] }) - props.posts = await filterByMemCache(props.allPosts, keyword) + const { allPages } = props + const allPosts = allPages.filter(page => page.type === 'Post') + props.posts = await filterByMemCache(allPosts, keyword) props.keyword = keyword return { props, @@ -107,7 +109,7 @@ async function filterByMemCache(allPosts, keyword) { } for (const post of allPosts) { const cacheKey = 'page_block_' + post.id - const page = await getDataFromCache(cacheKey) + const page = await getDataFromCache(cacheKey, true) const tagContent = post.tags && Array.isArray(post.tags) ? post.tags.join(' ') : '' const categoryContent = post.category && Array.isArray(post.category) ? post.category.join(' ') : '' const articleInfo = post.title + post.summary + tagContent + categoryContent @@ -121,7 +123,7 @@ async function filterByMemCache(allPosts, keyword) { indexContent = appendText(indexContent, properties, 'caption') }) } - console.log('全文搜索缓存', cacheKey, page != null) + // console.log('全文搜索缓存', cacheKey, page != null) post.results = [] let hitCount = 0 for (const i in indexContent) { diff --git a/pages/search/index.js b/pages/search/index.js index 30e97c95..7cee6392 100644 --- a/pages/search/index.js +++ b/pages/search/index.js @@ -52,7 +52,9 @@ export async function getStaticProps() { from: 'search-props', pageType: ['Post'] }) - props.posts = props.allPosts + const { allPages } = props + const allPosts = allPages.filter(page => page.type === 'Post') + props.posts = allPosts return { props, revalidate: 1 diff --git a/pages/tag/[tag].js b/pages/tag/[tag].js index 121dc973..37606158 100644 --- a/pages/tag/[tag].js +++ b/pages/tag/[tag].js @@ -28,7 +28,8 @@ export async function getStaticProps({ params: { tag } }) { includePage: false, tagsCount: 0 }) - const { allPosts } = props + const { allPages } = props + const allPosts = allPages.filter(page => page.type === 'Post') props.posts = allPosts.filter( post => post && post.tags && post.tags.includes(tag) ) diff --git a/styles/notion.css b/styles/notion.css index 6907ff61..f6a28c5b 100644 --- a/styles/notion.css +++ b/styles/notion.css @@ -388,13 +388,11 @@ .notion-h { position: relative; - display: inline-block; - + display: block; font-weight: 600; line-height: 1.3; padding: 3px 2px; margin-bottom: 1px; - max-width: 100%; white-space: pre-wrap; word-break: break-word; @@ -655,6 +653,10 @@ svg.notion-page-icon { margin-bottom: 0; } +.notion-list-numbered > .notion-list-numbered { + list-style-type: lower-alpha; +} + .notion-list-disc li { padding-left: 0.1em; } diff --git a/themes/example/LayoutArchive.js b/themes/example/LayoutArchive.js index a8bc68ee..b85860e0 100644 --- a/themes/example/LayoutArchive.js +++ b/themes/example/LayoutArchive.js @@ -43,7 +43,7 @@ export const LayoutArchive = props => { {' '}   diff --git a/themes/example/LayoutCategory.js b/themes/example/LayoutCategory.js index ef344ea2..a9c99d90 100644 --- a/themes/example/LayoutCategory.js +++ b/themes/example/LayoutCategory.js @@ -30,7 +30,7 @@ export const LayoutCategory = props => { {postsToShow.map(p => (

- + {p.title}

diff --git a/themes/example/LayoutSearch.js b/themes/example/LayoutSearch.js index 29a07f99..7c5dbafb 100644 --- a/themes/example/LayoutSearch.js +++ b/themes/example/LayoutSearch.js @@ -62,7 +62,7 @@ export const LayoutSearch = props => { {postsToShow.map(p => (

- + {p.title}

diff --git a/themes/example/LayoutTag.js b/themes/example/LayoutTag.js index e9809123..f60653e3 100644 --- a/themes/example/LayoutTag.js +++ b/themes/example/LayoutTag.js @@ -28,7 +28,7 @@ export const LayoutTag = props => { {postsToShow.map(p => (

- + {p.title}

diff --git a/themes/example/components/BlogList.js b/themes/example/components/BlogList.js index ec2e7a88..1a45d6f7 100644 --- a/themes/example/components/BlogList.js +++ b/themes/example/components/BlogList.js @@ -23,7 +23,7 @@ export const BlogList = (props) => { {posts.map(p => (

- + {p.title}

diff --git a/themes/example/components/Footer.js b/themes/example/components/Footer.js index 83a55193..08b9d561 100644 --- a/themes/example/components/Footer.js +++ b/themes/example/components/Footer.js @@ -4,13 +4,18 @@ import DarkModeButton from '@/components/DarkModeButton' export const Footer = (props) => { const d = new Date() const currentYear = d.getFullYear() - const startYear = BLOG.SINCE && BLOG.SINCE !== currentYear && BLOG.SINCE + '-' + const copyrightDate = (function() { + if (Number.isInteger(BLOG.SINCE) && BLOG.SINCE < currentYear) { + return BLOG.SINCE + '-' + currentYear + } + return currentYear + })() return