Skip to content
Merged

. #247

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 31 additions & 37 deletions lib/db/SiteDataApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ const EmptyData = pageId => {
* ✅ 兼容 prefix / slug / suffix 任意组合
* ⚠️ 只能在 getStaticProps / getServerSideProps 使用
*/
/**
* 生产级稳定版本
* 严格精确匹配,不做模糊匹配
*/
export async function resolvePostProps({
prefix,
slug,
Expand All @@ -167,59 +171,51 @@ export async function resolvePostProps({
from,
}) {
/**
* 1️⃣ 统一路径片段
* 1️⃣ 统一路径
*/
const segments = []
if (prefix) segments.push(prefix)
if (slug) segments.push(slug)
if (Array.isArray(suffix)) segments.push(...suffix)

const fullSlug = segments.join('/')
const source = from || `slug-props-${fullSlug}`

/**
* 2️⃣ 构造所有可能命中的 slug
*/
const lastSegment = segments[segments.length - 1]

const slugCandidates = new Set([
fullSlug,
lastSegment,
slug,
prefix,
])

// 去掉 falsy
for (const s of Array.from(slugCandidates)) {
if (!s) slugCandidates.delete(s)
}
const source = from || `slug-props-${fullSlug}`

/**
* 3️⃣ 拉取全局数据
* 2️⃣ 拉全局数据
*/
const props = await fetchGlobalAllData({ from: source, locale })

let post = null

/**
* 4️⃣ 列表内匹配
* 3️⃣ 一级匹配:完整 slug 精确匹配(核心)
*/
post = props?.allPages?.find(p => {
if (!p || p?.type?.includes('Menu')) return false
if (fullSlug) {
post = props?.allPages?.find(p => {
if (!p || p?.type?.includes('Menu')) return false
return p.slug === fullSlug
})
}

return (
slugCandidates.has(p.slug) ||
slugCandidates.has(p.slug?.split('/').pop()) ||
slugCandidates.has(p.id) ||
slugCandidates.has(idToUuid(p.id)) ||
slugCandidates.has(idToUuid(fullSlug))
)
})
/**
* 4️⃣ 二级匹配:完整 UUID 精确匹配
*/
if (!post && fullSlug) {
post = props?.allPages?.find(p => {
return p?.id === fullSlug
})
}

/**
* 5️⃣ 非列表文章兜底(pageId)
* 5️⃣ 三级匹配:如果最后一段是 UUID,直接拉 Notion
*/
if (!post && typeof lastSegment === 'string' && lastSegment.length >= 32) {
if (
!post &&
typeof lastSegment === 'string' &&
/^[a-f0-9-]{32,36}$/i.test(lastSegment)
) {
try {
post = await fetchPageFromNotion(lastSegment)
} catch (e) {
Expand All @@ -228,17 +224,14 @@ export async function resolvePostProps({
}

/**
* 6️⃣ blockMap 兜底
* 6️⃣ 如果拿到了 post,但没有 blockMap,则拉 block
*/
if (post && post.id && !post?.blockMap) {
if (post?.id && !post?.blockMap) {
try {

const rawBlockMap = await fetchNotionPageBlocks(post.id, source)

// Notion修改了数据格式再次做统一兼容
post.blockMap = adapterNotionBlockMap(rawBlockMap)

// 格式化内容,部分的样式字段格式在此处理
post.blockMap = {
...post.blockMap,
block: formatNotionBlock(post.blockMap.block)
Expand Down Expand Up @@ -268,6 +261,7 @@ export async function resolvePostProps({
return props
}


/**
* 将Notion数据转站点数据
* 这里统一对数据格式化
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "notion-next",
"version": "4.9.3",
"version": "4.9.3.1",
"homepage": "https://github.com/tangly1024/NotionNext.git",
"license": "MIT",
"engines": {
Expand Down
Loading