From cbc83acf540b2e9ad97850e678baad9a36207ad9 Mon Sep 17 00:00:00 2001 From: DCloud_LXH <283700113@qq.com> Date: Thu, 11 Apr 2024 19:01:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=B9=E8=BF=9B=E8=AF=BB=E5=8F=96=20?= =?UTF-8?q?=5Fsidebar=20=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.js | 4 +- docs/.vuepress/markdown/createSidebar.js | 139 +++++++++++++---------- docs/.vuepress/utils/index.js | 24 +--- 3 files changed, 79 insertions(+), 88 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 10d01c9..0059422 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -4,7 +4,7 @@ const highlight = require('@vuepress/markdown/lib/highlight') const translatePlugin = require('./markdown/translate') const headerPlugin = require('./markdown/header') const createSidebar = require('./markdown/createSidebar') -const { simplifySlugText, tabs } = require('./utils') +const { simplifySlugText } = require('./utils') const copyOptions = require('./config/copy'); const base = '/uniCloud/' @@ -39,7 +39,7 @@ const config = { themeConfig: { titleLogo: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/unicloudlogo.png', logo: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/logo.png', - sidebar: createSidebar(tabs), + sidebar: createSidebar(), sidebarDepth: 0, nextLinks: false, prevLinks: false, diff --git a/docs/.vuepress/markdown/createSidebar.js b/docs/.vuepress/markdown/createSidebar.js index 10c5654..a5d3db9 100644 --- a/docs/.vuepress/markdown/createSidebar.js +++ b/docs/.vuepress/markdown/createSidebar.js @@ -1,83 +1,96 @@ const fs = require('fs') const path = require('path') -const MarkdownIt = require('markdown-it'); +const MarkdownIt = require('markdown-it') +const glob = require('glob') const createMarkdownArray = require('./createMarkdownArray') const { isExternal } = require('../utils') -const createSiteMap = require('./createSiteMap'); +const createSiteMap = require('./createSiteMap') const links = [] function parseBar(tab, file, options) { - const textName = options.text || 'text' - const linkName = options.link || 'link' - const contents = [] + const textName = options.text || 'text' + const linkName = options.link || 'link' + const contents = [] - new MarkdownIt() - .parse(fs.readFileSync(file, { encoding: 'utf-8' }).replace(//g, "")) - .forEach(token => { - if (token.type === 'inline') { - let text - let link - let config = {} - token.children.forEach(child => { - switch (child.type) { - case 'text': - text = text || child.content - break; - case 'link_open': - link = link || new Map(child.attrs).get('href') - break; - case 'code_inline': - try { - config = JSON.parse(child.content) - } catch (error) { } - break; + new MarkdownIt().parse(fs.readFileSync(file, { encoding: 'utf-8' }).replace(//g, '')).forEach(token => { + if (token.type === 'inline') { + let text + let link + let config = {} + token.children.forEach(child => { + switch (child.type) { + case 'text': + text = text || child.content + break + case 'link_open': + link = link || new Map(child.attrs).get('href') + break + case 'code_inline': + try { + config = JSON.parse(child.content) + } catch (error) {} + break - default: - break; - } - }) + default: + break + } + }) - if (link && !isExternal(link)) { - if (!link.startsWith('/')) { - const linkFirstItem = link.split('/')[0] - if (tab.indexOf(linkFirstItem) === -1) { - link = path.join(tab, link).replace(/\\/g, '/') - } - } + if (link && !isExternal(link)) { + if (!link.startsWith('/')) { + const linkFirstItem = link.split('/')[0] + if (tab.indexOf(linkFirstItem) === -1) { + link = path.join(tab, link).replace(/\\/g, '/') + } + } - link = path.join('/', link.replace(/\.md\b/, '') - .replace(/\bREADME\b/, '') - .replace(/\/index/, '/') - .replace(/\?id=/, '#')) - .replace(/\\/g, '/') + link = path + .join( + '/', + link + .replace(/\.md\b/, '') + .replace(/\bREADME\b/, '') + .replace(/\/index/, '/') + .replace(/\?id=/, '#') + ) + .replace(/\\/g, '/') - links.push(link) - } + links.push(link) + } - contents.push({ - level: token.level, - [textName]: text, - [linkName]: link, - ...config - }) - } - }) + contents.push({ + level: token.level, + [textName]: text, + [linkName]: link, + ...config, + }) + } + }) - return createMarkdownArray(contents, options.children) + return createMarkdownArray(contents, options.children) } -module.exports = function (tabs = []) { - const sidebar = {} +module.exports = function () { + const sidebar = {} - tabs.forEach(tab => { - sidebar[tab] = parseBar(tab, path.join(__dirname, '../../', tab, '_sidebar.md'), { - text: 'title', - link: 'path' - }) - }) + // 需要反向,vuepress 在匹配路由的时候,会按照数组的顺序匹配,所以需要将最长的路径放在最前面,否则 / 路径会第一个被匹配,导致右侧栏不跟随路由变化 + const tabs = glob + .GlobSync(path.resolve(__dirname, '../../**/_sidebar.md')) + .found.map(file => { + const tab = file.match(/\/docs([\s\S]+)_sidebar.md/)[1] + return tab + }) + .reverse() - createSiteMap(links, () => links.length = 0) + ;(process.env.DOCS_LITE ? [] : tabs).forEach(tab => { + sidebar[tab] = parseBar(tab, path.join(__dirname, '../../', tab, '_sidebar.md'), { + text: 'title', + link: 'path', + }) + }) - return tabs.length ? sidebar : false -} \ No newline at end of file + createSiteMap(links, () => (links.length = 0)) + + return tabs.length ? sidebar : false +} diff --git a/docs/.vuepress/utils/index.js b/docs/.vuepress/utils/index.js index 5e71b07..3c604ee 100644 --- a/docs/.vuepress/utils/index.js +++ b/docs/.vuepress/utils/index.js @@ -14,29 +14,7 @@ function simplifySlugText(text) { return text; } -function getFormattedDate() { - const now = new Date(); - - const year = now.getFullYear(); - const month = (now.getMonth() + 1).toString().padStart(2, '0'); - const day = now.getDate().toString().padStart(2, '0'); - const hours = now.getHours().toString().padStart(2, '0'); - const minutes = now.getMinutes().toString().padStart(2, '0'); - const seconds = now.getSeconds().toString().padStart(2, '0'); - - const formattedDate = `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`; - - return formattedDate; -} - -// 顺序有要求,会影响 for 循环匹配侧边栏 -const tabs = [ - '/' -] - module.exports = { isExternal, - simplifySlugText, - getFormattedDate, - tabs: process.env.DOCS_LITE ? [] : tabs + simplifySlugText } \ No newline at end of file -- GitLab