Skip to content

Commit

Permalink
Merge branch 'tangly1024:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
expoli authored Dec 15, 2022
2 parents a5f30e6 + bca9f17 commit c7e9fbd
Show file tree
Hide file tree
Showing 20 changed files with 131 additions and 70 deletions.
2 changes: 1 addition & 1 deletion .env.local
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# 环境变量 @see https://www.nextjs.cn/docs/basic-features/environment-variables
NEXT_PUBLIC_VERSION=3.6.5
NEXT_PUBLIC_VERSION=3.6.6
5 changes: 2 additions & 3 deletions lib/notion/getNotionData.js
Original file line number Diff line number Diff line change
Expand Up @@ -212,17 +212,16 @@ async function getPageRecordMapByNotionAPI({ pageId, from }) {
collectionData.push(properties)
}
}
// 读取映射 配置
let postCount = 0

// 获取page作为自定义菜单
const customNav = getCustomNav({ allPages: collectionData.filter(post => post.type === 'Page' && post.status === 'Published') })

// 文章计数
let postCount = 0
const allPages = collectionData.filter(post => {
if (post.type === 'Post' && post.status === 'Published') {
postCount++
}

return post &&
post.type &&
(post.type === 'Post' || post.type === 'Page') &&
Expand Down
2 changes: 2 additions & 0 deletions lib/notion/getPageProperties.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { NotionAPI } from 'notion-client'
import BLOG from '@/blog.config'
import formatDate from '../formatDate'
import { defaultMapImageUrl } from 'react-notion-x'
import md5 from 'js-md5'

export default async function getPageProperties(id, block, schema, authToken, tagOptions, siteInfo) {
const rawProperties = Object.entries(block?.[id]?.value?.properties || [])
Expand Down Expand Up @@ -89,6 +90,7 @@ export default async function getPageProperties(id, block, schema, authToken, ta
properties.pageIcon = getImageUrl(block[id].value?.format?.page_icon, block[id].value) ?? ''
properties.page_cover = getImageUrl(block[id].value?.format?.page_cover, block[id].value) ?? siteInfo?.pageCover
properties.content = value.content ?? []
properties.password = properties.password ? md5(properties.slug + properties.password) : ''
properties.tagItems = properties?.tags?.map(tag => {
return { name: tag, color: tagOptions?.find(t => t.value === tag)?.color || 'gray' }
}) || []
Expand Down
90 changes: 90 additions & 0 deletions lib/notion/getPageTableOfContents.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import { getTextContent } from 'notion-utils'

const indentLevels = {
header: 0,
sub_header: 1,
sub_sub_header: 2
}

/**
* @see https://github.com/NotionX/react-notion-x/blob/master/packages/notion-utils/src/get-page-table-of-contents.ts
* Gets the metadata for a table of contents block by parsing the page's
* H1, H2, and H3 elements.
*/
export const getPageTableOfContents = (page, recordMap) => {
const contents = (page.content ?? [])
const toc = getBlockHeader(contents, recordMap)
const indentLevelStack = [
{
actual: -1,
effective: -1
}
]

// Adjust indent levels to always change smoothly.
// This is a little tricky, but the key is that when increasing indent levels,
// they should never jump more than one at a time.
for (const tocItem of toc) {
const { indentLevel } = tocItem
const actual = indentLevel

do {
const prevIndent = indentLevelStack[indentLevelStack.length - 1]
const { actual: prevActual, effective: prevEffective } = prevIndent

if (actual > prevActual) {
tocItem.indentLevel = prevEffective + 1
indentLevelStack.push({
actual,
effective: tocItem.indentLevel
})
} else if (actual === prevActual) {
tocItem.indentLevel = prevEffective
break
} else {
indentLevelStack.pop()
}

// eslint-disable-next-line no-constant-condition
} while (true)
}

return toc
}

/**
* 重写获取目录方法
*/
function getBlockHeader(contents, recordMap, toc) {
if (!toc) {
toc = []
}
if (!contents) {
return toc
}

for (const blockId of contents) {
const block = recordMap.block[blockId]?.value
if (!block) {
continue
}
const { type } = block
if (type.indexOf('header') >= 0) {
const existed = toc.find(e => e.id === blockId)
if (!existed) {
toc.push({
id: blockId,
type,
text: getTextContent(block.properties?.title),
indentLevel: indentLevels[type]
})
}
}

if (block.content?.length > 0) {
getBlockHeader(block.content, recordMap, toc)
}
}

return toc
}
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "notion-next",
"version": "3.6.5",
"version": "3.6.6",
"homepage": "https://github.com/tangly1024/NotionNext.git",
"license": "MIT",
"repository": {
Expand Down Expand Up @@ -30,6 +30,7 @@
"eslint-plugin-react-hooks": "^4.6.0",
"feed": "^4.2.2",
"gitalk": "^1.7.2",
"js-md5": "^0.7.3",
"localStorage": "^1.0.4",
"lodash.throttle": "^4.1.1",
"mark.js": "^8.11.1",
Expand Down
13 changes: 11 additions & 2 deletions pages/[...slug].js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import { idToUuid } from 'notion-utils'
import Router from 'next/router'
import { isBrowser } from '@/lib/utils'
import { getNotion } from '@/lib/notion/getNotion'
import md5 from 'js-md5'
import { getPageTableOfContents } from '@/lib/notion/getPageTableOfContents'

/**
* 根据notion的slug访问页面
Expand All @@ -28,6 +30,11 @@ const Slug = props => {
if (post?.password && post?.password !== '') {
setLock(true)
} else {
if (!lock && post?.blockMap?.block) {
post.content = Object.keys(post.blockMap.block)
post.toc = getPageTableOfContents(post, post.blockMap)
}

setLock(false)
}
}, [post])
Expand All @@ -51,10 +58,12 @@ const Slug = props => {
* 验证文章密码
* @param {*} result
*/
const validPassword = result => {
if (result) {
const validPassword = passInput => {
if (passInput && md5(post.slug + passInput) === post.password) {
setLock(false)
return true
}
return false
}

props = { ...props, lock, setLock, validPassword }
Expand Down
4 changes: 2 additions & 2 deletions styles/notion.css
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@

.notion-h {
position: relative;
display: block;
/* display: block; */
font-weight: 600;
line-height: 1.3;
padding: 3px 2px;
Expand Down Expand Up @@ -427,7 +427,7 @@
margin-top: 2px;
} */
.notion-h2 {
font-size: 1.5em;
font-size: 1.4em;
margin-top: 1.1em;
}
.notion-h3 {
Expand Down
8 changes: 1 addition & 7 deletions themes/example/LayoutSlug.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { getPageTableOfContents } from 'notion-utils'
import LayoutBase from './LayoutBase'
import { ArticleLock } from './components/ArticleLock'
import NotionPage from '@/components/NotionPage'
Expand All @@ -12,15 +11,10 @@ export const LayoutSlug = props => {
return <LayoutBase {...props} />
}

if (!lock && post?.blockMap?.block) {
post.content = Object.keys(post.blockMap.block)
post.toc = getPageTableOfContents(post, post.blockMap)
}

return (
<LayoutBase {...props}>

{lock && <ArticleLock password={post.password} validPassword={validPassword} />}
{lock && <ArticleLock validPassword={validPassword} />}

{!lock && <div id="notion-article" className="px-2">

Expand Down
6 changes: 2 additions & 4 deletions themes/example/components/ArticleLock.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@ import { useGlobal } from '@/lib/global'
* @returns
*/
export const ArticleLock = props => {
const { password, validPassword } = props
const { validPassword } = props
const { locale } = useGlobal()

const submitPassword = () => {
const p = document.getElementById('password')
if (p && p.value && p.value === password) {
validPassword(true)
} else {
if (!validPassword(p?.value)) {
const tips = document.getElementById('tips')
if (tips) {
tips.innerHTML = ''
Expand Down
10 changes: 2 additions & 8 deletions themes/fukasawa/LayoutSlug.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
import { getPageTableOfContents } from 'notion-utils'
import ArticleDetail from './components/ArticleDetail'
import LayoutBase from './LayoutBase'
import { ArticleLock } from './components/ArticleLock'

export const LayoutSlug = (props) => {
const { post, lock, validPassword } = props
if (!lock && post?.blockMap?.block) {
post.content = Object.keys(post.blockMap.block)
post.toc = getPageTableOfContents(post, post.blockMap)
}

const { lock, validPassword } = props
return (
<LayoutBase {...props} >
{!lock && <ArticleDetail {...props} />}
{lock && <ArticleLock password={post.password} validPassword={validPassword} />}
{lock && <ArticleLock validPassword={validPassword} />}
</LayoutBase>
)
}
6 changes: 2 additions & 4 deletions themes/fukasawa/components/ArticleLock.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@ import { useGlobal } from '@/lib/global'
* @returns
*/
export const ArticleLock = props => {
const { password, validPassword } = props
const { validPassword } = props
const { locale } = useGlobal()

const submitPassword = () => {
const p = document.getElementById('password')
if (p && p.value && p.value === password) {
validPassword(true)
} else {
if (!validPassword(p?.value)) {
const tips = document.getElementById('tips')
if (tips) {
tips.innerHTML = ''
Expand Down
10 changes: 2 additions & 8 deletions themes/hexo/LayoutSlug.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { getPageTableOfContents } from 'notion-utils'
import { useRef } from 'react'
import { ArticleLock } from './components/ArticleLock'
import HeaderArticle from './components/HeaderArticle'
Expand All @@ -15,6 +14,7 @@ import { isBrowser } from '@/lib/utils'

export const LayoutSlug = props => {
const { post, lock, validPassword } = props
const drawerRight = useRef(null)

if (!post) {
return <LayoutBase
Expand All @@ -25,12 +25,6 @@ export const LayoutSlug = props => {
></LayoutBase>
}

if (!lock && post?.blockMap?.block) {
post.content = Object.keys(post.blockMap.block)
post.toc = getPageTableOfContents(post, post.blockMap)
}

const drawerRight = useRef(null)
const targetRef = isBrowser() ? document.getElementById('container') : null

const floatSlot = <>
Expand All @@ -53,7 +47,7 @@ export const LayoutSlug = props => {
floatSlot={floatSlot}
>
<div className="w-full lg:shadow-sm lg:hover:shadow lg:border lg:rounded-xl lg:px-2 lg:py-4 bg-white dark:bg-hexo-black-gray dark:border-black">
{lock && <ArticleLock password={post.password} validPassword={validPassword} />}
{lock && <ArticleLock validPassword={validPassword} />}

{!lock && <div id="container" className="overflow-x-auto flex-grow mx-auto md:w-full md:px-5 ">

Expand Down
6 changes: 2 additions & 4 deletions themes/hexo/components/ArticleLock.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,11 @@ import { useGlobal } from '@/lib/global'
* @returns
*/
export const ArticleLock = props => {
const { password, validPassword } = props
const { validPassword } = props
const { locale } = useGlobal()
const submitPassword = () => {
const p = document.getElementById('password')
if (p && p.value && p.value === password) {
validPassword(true)
} else {
if (!validPassword(p?.value)) {
const tips = document.getElementById('tips')
if (tips) {
tips.innerHTML = ''
Expand Down
3 changes: 2 additions & 1 deletion themes/hexo/components/HeaderArticle.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ import formatDate from '@/lib/formatDate'
import BLOG from '@/blog.config'

export default function HeaderArticle({ post, siteInfo }) {
const { locale } = useGlobal()

if (!post) {
return <></>
}
const headerImage = post?.page_cover ? `url("${post.page_cover}")` : `url("${siteInfo?.pageCover}")`

const { locale } = useGlobal()
const date = formatDate(
post?.date?.start_date || post?.createdTime,
locale.LOCALE
Expand Down
2 changes: 1 addition & 1 deletion themes/medium/LayoutCategory.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import BLOG from '@/blog.config'

export const LayoutCategory = props => {
const { category } = props
const slotTop = <div className='flex items-center font-sans p-8'><div className='text-xl'><i className='mr-2 fas fa-th' />分类:</div>{category}</div>
const slotTop = <div className='flex items-center font-sans py-8'><div className='text-xl'><i className='mr-2 fas fa-th' />分类:</div>{category}</div>

return <LayoutBase {...props} slotTop={slotTop}>
{BLOG.POST_LIST_STYLE === 'page' ? <BlogPostListPage {...props} /> : <BlogPostListScroll {...props} />}
Expand Down
9 changes: 1 addition & 8 deletions themes/medium/LayoutSlug.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { getPageTableOfContents } from 'notion-utils'

import LayoutBase from './LayoutBase'
import { useGlobal } from '@/lib/global'
import React from 'react'
Expand All @@ -16,11 +14,6 @@ export const LayoutSlug = props => {
/>
}

if (!lock && post?.blockMap?.block) {
post.content = Object.keys(post.blockMap.block)
post.toc = getPageTableOfContents(post, post.blockMap)
}

const slotRight = post?.toc && post?.toc?.length > 3 && (
<div key={locale.COMMON.TABLE_OF_CONTENTS} >
<Catalog toc={post.toc} />
Expand All @@ -29,7 +22,7 @@ export const LayoutSlug = props => {

return (
<LayoutBase showInfoCard={true} slotRight={slotRight} {...props} >
{!lock ? <ArticleDetail {...props} /> : <ArticleLock password={post.password} validPassword={validPassword} />}
{!lock ? <ArticleDetail {...props} /> : <ArticleLock validPassword={validPassword} />}
</LayoutBase>
)
}
2 changes: 1 addition & 1 deletion themes/medium/LayoutTag.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import BlogPostListPage from './components/BlogPostListPage'

export const LayoutTag = (props) => {
const { tag } = props
const slotTop = <div className='flex items-center font-sans p-8'><div className='text-xl'><i className='mr-2 fas fa-tag'/>标签:</div>{tag}</div>
const slotTop = <div className='flex items-center font-sans py-8'><div className='text-xl'><i className='mr-2 fas fa-tag'/>标签:</div>{tag}</div>

return <LayoutBase {...props} slotTop={slotTop}>
{BLOG.POST_LIST_STYLE === 'page' ? <BlogPostListPage {...props} /> : <BlogPostListScroll {...props} />}
Expand Down
Loading

1 comment on commit c7e9fbd

@vercel
Copy link

@vercel vercel bot commented on c7e9fbd Dec 15, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.