From 645edd7eaddf060707ee064ced931b0437848ed4 Mon Sep 17 00:00:00 2001 From: anime Date: Tue, 8 Jul 2025 22:59:08 +0800 Subject: [PATCH 1/3] feat: enhance mailto/tel link handling and streamline imports - Introduced isMailOrTelLink utility function to validate mailto/tel links. - Updated getPageProperties to properly handle mailto/tel links with target=_self, preventing unintended conversion to internal links by avoiding the addition of slashes. Closes #3485 --- lib/notion/getPageProperties.js | 12 ++++++------ lib/utils/index.js | 9 +++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/notion/getPageProperties.js b/lib/notion/getPageProperties.js index 571c1b8c..963607d1 100644 --- a/lib/notion/getPageProperties.js +++ b/lib/notion/getPageProperties.js @@ -4,11 +4,7 @@ import formatDate from '../utils/formatDate' // import { createHash } from 'crypto' import md5 from 'js-md5' import { siteConfig } from '../config' -import { - checkStartWithHttp, - convertUrlStartWithOneSlash, - getLastSegmentFromUrl -} from '../utils' +import { checkStartWithHttp, convertUrlStartWithOneSlash, getLastSegmentFromUrl, isMailOrTelLink } from '../utils' import { extractLangPrefix } from '../utils/pageId' import { mapImgUrl } from './mapImage' import notionAPI from '@/lib/notion/getNotionAPI' @@ -85,8 +81,9 @@ export default async function getPageProperties( const fieldNames = BLOG.NOTION_PROPERTY_NAME if (fieldNames) { Object.keys(fieldNames).forEach(key => { - if (fieldNames[key] && properties[fieldNames[key]]) + if (fieldNames[key] && properties[fieldNames[key]]) { properties[key] = properties[fieldNames[key]] + } }) } @@ -193,6 +190,9 @@ export function adjustPageProperties(properties, NOTION_CONFIG) { if (checkStartWithHttp(properties?.href)) { properties.href = properties?.slug properties.target = '_blank' + } else if (isMailOrTelLink(properties?.href)) { + properties.href = properties?.slug + properties.target = '_self' } else { properties.target = '_self' // 伪静态路径右侧拼接.html diff --git a/lib/utils/index.js b/lib/utils/index.js index e12f2f85..fe49c942 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -104,6 +104,15 @@ export function checkStartWithHttp(str) { } } +/** + * 检查是否是邮件或电话链接 + * @param href + * @returns {boolean} + */ +export function isMailOrTelLink(href) { + return /^(mailto:|tel:)/i.test(href) +} + // 检查一个字符串是否UUID https://ihateregex.io/expr/uuid/ export function checkStrIsUuid(str) { if (!str) { From b16512ac9aff156760a11c40a9e4f0f616d367cd Mon Sep 17 00:00:00 2001 From: anime Date: Tue, 8 Jul 2025 23:04:41 +0800 Subject: [PATCH 2/3] refactor: rename checkStartWithHttp to isHttpLink - Update function name and implementation in utils/index.js - Replace all occurrences in getPageProperties.js, post.js, and BlogPostCard.js - Improve function documentation and use regex for better URL matching --- lib/notion/getPageProperties.js | 6 +++--- lib/utils/index.js | 19 ++++++++----------- lib/utils/post.js | 8 ++++---- themes/nav/components/BlogPostCard.js | 4 ++-- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/lib/notion/getPageProperties.js b/lib/notion/getPageProperties.js index 963607d1..29bb5472 100644 --- a/lib/notion/getPageProperties.js +++ b/lib/notion/getPageProperties.js @@ -4,7 +4,7 @@ import formatDate from '../utils/formatDate' // import { createHash } from 'crypto' import md5 from 'js-md5' import { siteConfig } from '../config' -import { checkStartWithHttp, convertUrlStartWithOneSlash, getLastSegmentFromUrl, isMailOrTelLink } from '../utils' +import { convertUrlStartWithOneSlash, getLastSegmentFromUrl, isHttpLink, isMailOrTelLink } from '../utils' import { extractLangPrefix } from '../utils/pageId' import { mapImgUrl } from './mapImage' import notionAPI from '@/lib/notion/getNotionAPI' @@ -187,7 +187,7 @@ export function adjustPageProperties(properties, NOTION_CONFIG) { } // http or https 开头的视为外链 - if (checkStartWithHttp(properties?.href)) { + if (isHttpLink(properties?.href)) { properties.href = properties?.slug properties.target = '_blank' } else if (isMailOrTelLink(properties?.href)) { @@ -238,7 +238,7 @@ export function adjustPageProperties(properties, NOTION_CONFIG) { */ function generateCustomizeSlug(postProperties, NOTION_CONFIG) { // 外链不处理 - if (checkStartWithHttp(postProperties.slug)) { + if (isHttpLink(postProperties.slug)) { return postProperties.slug } let fullPrefix = '' diff --git a/lib/utils/index.js b/lib/utils/index.js index fe49c942..bfef0f46 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -89,19 +89,16 @@ export function isUrl(str) { return false } - return str?.indexOf('/') === 0 || checkStartWithHttp(str) + return str?.indexOf('/') === 0 || isHttpLink(str) } -// 检查是否外链 -export function checkStartWithHttp(str) { - // 检查字符串是否包含http - if (str?.indexOf('http:') === 0 || str?.indexOf('https:') === 0) { - // 如果包含,找到http的位置 - return true - } else { - // 不包含 - return false - } +/** + * 判断是否是 http(s) 开头的链接(外部网页) + * @param str + * @returns {boolean} + */ +export function isHttpLink(str) { + return typeof str === 'string' && /^https?:\/\//i.test(str) } /** diff --git a/lib/utils/post.js b/lib/utils/post.js index a3ee0f91..5cb769f2 100644 --- a/lib/utils/post.js +++ b/lib/utils/post.js @@ -1,7 +1,7 @@ /** * 文章相关工具 */ -import { checkStartWithHttp } from '.' +import { isHttpLink } from '.' import { getPostBlocks } from '@/lib/db/getSiteData' import { getPageTableOfContents } from '@/lib/notion/getPageTableOfContents' import { siteConfig } from '@/lib/config' @@ -59,7 +59,7 @@ export function checkSlugHasNoSlash(row) { } return ( (slug.match(/\//g) || []).length === 0 && - !checkStartWithHttp(slug) && + !isHttpLink(slug) && row.type.indexOf('Menu') < 0 ) } @@ -76,7 +76,7 @@ export function checkSlugHasOneSlash(row) { } return ( (slug.match(/\//g) || []).length === 1 && - !checkStartWithHttp(slug) && + !isHttpLink(slug) && row.type.indexOf('Menu') < 0 ) } @@ -94,7 +94,7 @@ export function checkSlugHasMorThanTwoSlash(row) { return ( (slug.match(/\//g) || []).length >= 2 && row.type.indexOf('Menu') < 0 && - !checkStartWithHttp(slug) + !isHttpLink(slug) ) } diff --git a/themes/nav/components/BlogPostCard.js b/themes/nav/components/BlogPostCard.js index 0f92a30a..cdff4d55 100755 --- a/themes/nav/components/BlogPostCard.js +++ b/themes/nav/components/BlogPostCard.js @@ -1,5 +1,5 @@ import { siteConfig } from '@/lib/config' -import { checkStartWithHttp } from '@/lib/utils' +import { isHttpLink } from '@/lib/utils' import Link from 'next/link' import { useRouter } from 'next/router' import NotionIcon from './NotionIcon' @@ -23,7 +23,7 @@ const BlogPostCard = ({ post, className }) => { return (
Date: Tue, 8 Jul 2025 23:06:07 +0800 Subject: [PATCH 3/3] refactor(utils): rename and improve isUrl to isUrlLikePath - Rename isUrl function to isUrlLikePath for better clarity - Simplify function logic and add type checking - Update all references to use the new function name - Improve function documentation and parameter typing --- lib/config.js | 4 ++-- lib/utils/index.js | 15 ++++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/config.js b/lib/config.js index 54b043a7..81ff88e3 100644 --- a/lib/config.js +++ b/lib/config.js @@ -2,7 +2,7 @@ import BLOG from '@/blog.config' import { useGlobal } from './global' -import { deepClone, isUrl } from './utils' +import { deepClone, isUrlLikePath } from './utils' /** * 读取配置顺序 @@ -146,7 +146,7 @@ export const convertVal = val => { } // 检测是否为 URL - if (isUrl(val)) { + if (isUrlLikePath(val)) { return val } diff --git a/lib/utils/index.js b/lib/utils/index.js index bfef0f46..b0e0c77e 100644 --- a/lib/utils/index.js +++ b/lib/utils/index.js @@ -80,16 +80,13 @@ export function convertUrlStartWithOneSlash(str) { } /** - * 是否是一个相对或绝对路径的ur类 - * @param {*} str - * @returns + * 判断是否是一个“URL 样式”的路径(内部或外部) + * 内部如 /about,外部如 http://xxx.com + * @param str + * @returns {boolean} */ -export function isUrl(str) { - if (!str) { - return false - } - - return str?.indexOf('/') === 0 || isHttpLink(str) +export function isUrlLikePath(str) { + return typeof str === 'string' && (str.startsWith('/') || isHttpLink(str)) } /**