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}