diff --git a/.env.local b/.env.local
index 91f032e9..efe56bd8 100644
--- a/.env.local
+++ b/.env.local
@@ -1,2 +1,2 @@
# 环境变量 @see https://www.nextjs.cn/docs/basic-features/environment-variables
-NEXT_PUBLIC_VERSION=3.3.9
\ No newline at end of file
+NEXT_PUBLIC_VERSION=3.4.0
\ No newline at end of file
diff --git a/components/NotionPage.js b/components/NotionPage.js
index 61b7fc56..ead0d0ba 100644
--- a/components/NotionPage.js
+++ b/components/NotionPage.js
@@ -3,6 +3,8 @@ import dynamic from 'next/dynamic'
import mediumZoom from 'medium-zoom'
import React from 'react'
import { isBrowser } from '@/lib/utils'
+import Image from 'next/image'
+import Link from 'next/link'
const Code = dynamic(() =>
import('react-notion-x/build/third-party/code').then((m) => m.Code), { ssr: false }
@@ -59,12 +61,20 @@ const NotionPage = ({ post }) => {
const cards = document.getElementsByClassName('notion-collection-card')
for (const e of cards) {
e.removeAttribute('href')
+ const links = e.querySelectorAll('.notion-link')
+ if (links && links.length > 0) {
+ for (const l of links) {
+ l.onclick = function() {
+ window.open('http://' + l.innerText)
+ }
+ }
+ }
}
}
}, 800)
addWatch4Dom()
- }, [])
+ })
return
{
Collection,
Equation,
Modal,
- Pdf
+ Pdf,
+ nextImage: Image,
+ nextLink: Link
}} />
}
@@ -101,7 +113,12 @@ function addWatch4Dom(element) {
switch (type) {
case 'childList':
if (mutation.target.className === 'notion-code-copy') {
- fixCopy(mutation)
+ fixCopy(mutation.target)
+ } else if (mutation.target.className?.indexOf('language-') > -1) {
+ const copyCode = mutation.target.parentElement?.firstElementChild
+ if (copyCode) {
+ fixCopy(copyCode)
+ }
}
// console.log('A child node has been added or removed.')
break
@@ -128,12 +145,11 @@ function addWatch4Dom(element) {
}
/**
- * 复制代码后,会重复 @see https://github.com/tangly1024/NotionNext/issues/165
- * @param {*} e
- */
-function fixCopy(e) {
- const codeE = e.target.parentElement.lastElementChild
- // console.log('2', codeE)
+ * 复制代码后,会重复 @see https://github.com/tangly1024/NotionNext/issues/165
+ * @param {*} e
+ */
+function fixCopy(codeCopy) {
+ const codeE = codeCopy.parentElement.lastElementChild
const codeEnd = codeE.lastChild
if (codeEnd.nodeName === '#text' && codeE.childNodes.length > 1) {
codeEnd.nodeValue = null
diff --git a/lib/cache/cache_manager.js b/lib/cache/cache_manager.js
index 4a667df4..2943b233 100644
--- a/lib/cache/cache_manager.js
+++ b/lib/cache/cache_manager.js
@@ -1,9 +1,12 @@
import MemoryCache from './memory_cache'
import FileCache from './local_file_cache'
+import MongoCache from './mongo_db_cache'
const enableCache = true
let api
-if (process.env.ENABLE_FILE_CACHE) {
+if (process.env.MONGO_DB_URL && process.env.MONGO_DB_NAME) {
+ api = MongoCache
+} else if (process.env.ENABLE_FILE_CACHE) {
api = FileCache
} else {
api = MemoryCache
@@ -22,7 +25,7 @@ export async function getDataFromCache(key) {
if (JSON.stringify(dataFromCache) === '[]') {
return null
}
- return dataFromCache
+ return MongoCache.getCache(key)
}
export async function setDataToCache(key, data) {
diff --git a/lib/cache/mongo_db_cache.js b/lib/cache/mongo_db_cache.js
new file mode 100644
index 00000000..b3996470
--- /dev/null
+++ b/lib/cache/mongo_db_cache.js
@@ -0,0 +1,49 @@
+const MongoClient = require('mongodb').MongoClient
+
+const DB_URL = process.env.MONGO_DB_URL // e.g. mongodb+srv://mongo_user:[password]@xxx.mongodb.net//?retryWrites=true&w=majority
+const DB_NAME = process.env.MONGO_DB_NAME // e.g. tangly1024
+const DB_COLLECTION = 'posts'
+
+export async function getCache (key) {
+ const client = await MongoClient.connect(DB_URL).catch(err => { console.error(err) })
+ const dbo = client.db(DB_NAME)
+ const query = { block_id: key }
+ const res = await dbo.collection('posts').findOne(query).catch(err => { console.error(err) })
+ await client.close()
+ return res
+}
+
+/**
+ * 并发请求写文件异常; Vercel生产环境不支持写文件。
+ * @param key
+ * @param data
+ * @returns {Promise}
+ */
+export async function setCache (key, data) {
+ const client = await MongoClient.connect(DB_URL).catch(err => { console.error(err) })
+ const dbo = client.db(DB_NAME)
+ data.block_id = key
+ const query = { block_id: key }
+ const jsonObj = JSON.parse(JSON.stringify(data))
+
+ const updRes = await dbo.collection(DB_COLLECTION).updateOne(query, { $set: jsonObj }).catch(err => { console.error(err) })
+ console.log('更新结果', key, updRes)
+ if (updRes.matchedCount === 0) {
+ const insertRes = await dbo.collection(DB_COLLECTION).insertOne(jsonObj).catch(err => { console.error(err) })
+ console.log('插入结果', key, insertRes)
+ }
+ await client.close()
+ return data
+}
+
+export async function delCache (key, data) {
+ const client = await MongoClient.connect(DB_URL).catch(err => { console.error(err) })
+ const dbo = client.db(DB_NAME)
+ const query = { block_id: key }
+ const res = await dbo.collection('posts').deleteOne(query).catch(err => { console.error(err) })
+ console.log('删除结果', key, res)
+ await client.close()
+ return null
+}
+
+export default { getCache, setCache, delCache }
diff --git a/package.json b/package.json
index ab5eb052..64d4fa89 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "notion-next",
- "version": "3.3.9",
+ "version": "3.4.0",
"homepage": "https://github.com/tangly1024/NotionNext.git",
"license": "MIT",
"repository": {
@@ -32,6 +32,7 @@
"localStorage": "^1.0.4",
"lodash.throttle": "^4.1.1",
"memory-cache": "^0.2.0",
+ "mongodb": "^4.6.0",
"next": "^12.0.5",
"notion-client": "6.12.9",
"notion-utils": "6.10.0",
diff --git a/styles/globals.css b/styles/globals.css
index 8d4459e1..af6c3ac6 100644
--- a/styles/globals.css
+++ b/styles/globals.css
@@ -137,6 +137,7 @@ nav {
.medium-zoom-overlay{
background: none !important;
+ /* background: rgba(0, 0, 0, 0.01) none repeat scroll 0% 0% !important; */
}
.shadow-text{
@@ -156,7 +157,7 @@ nav {
}
.medium-zoom-image--opened{
- width: auto !important;
+ /* width: auto !important; */
}
[data-waline] p {
diff --git a/styles/notion.css b/styles/notion.css
index 76807da7..a43bfcc1 100644
--- a/styles/notion.css
+++ b/styles/notion.css
@@ -537,7 +537,7 @@
color: inherit;
word-break: break-word;
text-decoration: inherit;
- border-bottom: 0.05em solid;
+ border-bottom: .05em solid !important;
border-color: var(--fg-color-2);
opacity: 0.7;
transition: border-color 100ms ease-in, opacity 100ms ease-in;
@@ -673,7 +673,8 @@ svg.notion-page-icon {
.notion-asset-wrapper img {
width: 100%;
- height: 100%;
+ /* height: 100%; */
+ height: auto !important;
max-height: 100%;
}
@@ -1352,8 +1353,13 @@ svg.notion-page-icon {
margin-right: 6px;
}
+.notion-collection-card{
+ cursor: default !important;
+}
+
.notion-collection-card-property .notion-link {
border-bottom: 0 none;
+ cursor: pointer
}
.notion-collection-card-property .notion-page-title {
diff --git a/themes/hexo/components/BlogPostCard.js b/themes/hexo/components/BlogPostCard.js
index 22dbe428..95bfcfbf 100644
--- a/themes/hexo/components/BlogPostCard.js
+++ b/themes/hexo/components/BlogPostCard.js
@@ -33,7 +33,7 @@ const BlogPostCard = ({ post, showSummary }) => {
>
- {post.date?.start_date}
+ {post.date?.start_date || post.lastEditedTime}