[Feature]
All checks were successful
Node.js CI / build-and-test (push) Successful in 25s

移除书签机制
更新了项目描述
增加对有章节作品阅读支持

[BugFix]
BetterHr 无法在 Markdown 显示的问题

[Base]
增加 Markdown 渲染锚点支持
This commit is contained in:
2025-05-18 13:33:39 +08:00
parent 9ef6da3efb
commit 4323acb4d6
13 changed files with 165 additions and 217 deletions

View File

@ -5,6 +5,8 @@ import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import vueDevTools from 'vite-plugin-vue-devtools'
import markdown from 'vite-plugin-md'
import markdownItAnchor from 'markdown-it-anchor'
import markdownItAttrs from 'markdown-it-attrs'
// https://vite.dev/config/
export default defineConfig({
@ -20,8 +22,57 @@ export default defineConfig({
vueJsx(),
vueDevTools(),
markdown({
markdownItSetup(md) {
md.renderer.rules.hr = () => "<Hr />"
markdownItSetup(mdit) {
mdit.use(markdownItAttrs)
mdit.use(markdownItAnchor, {
permalink: markdownItAnchor.permalink.ariaHidden({
placement: 'before',
symbol: '#',
level: [1, 2, 3, 4],
}),
slugify: s => s
.normalize("NFKD")
.replace(/[\u0300-\u036f]/g, "") // 去除重音符号
.replace(/[^\w\s-]/g, "") // 移除 emoji 和特殊符号
.trim()
.toLowerCase()
.replace(/\s+/g, "-")
})
mdit.renderer.rules.hr = () => {
console.log('Custom <hr> rendered 🚀');
return '<div><BetterHr /></div>'
}
const defaultOpen = mdit.renderer.rules.link_open || ((tokens, idx, options, env, self) => {
return self.renderToken(tokens, idx, options)
})
const defaultClose = mdit.renderer.rules.link_close || ((tokens, idx, options, env, self) => {
return self.renderToken(tokens, idx, options)
})
mdit.renderer.rules.link_open = (tokens, idx, options, env, self) => {
const token = tokens[idx]
const href = token.attrGet('href') || ''
const isExternal = /^https?:\/\//.test(href)
const isInternal = /^\/(?!\/)/.test(href)
if (isInternal) {
// 转换为 <router-link> 并设置 `to`
token.tag = 'router-link'
token.attrSet('to', href)
token.attrs = token.attrs?.filter(attr => attr[0] !== 'href') || []
} else if (isExternal) {
// 站外链接加上 target="_blank" rel="noopener noreferrer"
token.attrSet('target', '_blank')
token.attrSet('rel', 'noopener noreferrer')
}
return defaultOpen(tokens, idx, options, env, self)
}
mdit.renderer.rules.link_close = (tokens, idx, options, env, self) => {
const previous = tokens[idx - 1]
if (previous?.tag === 'router-link') {
tokens[idx].tag = 'router-link'
}
return defaultClose(tokens, idx, options, env, self)
}
}
})
],