提交 cbc83acf 编写于 作者: D DCloud_LXH

feat: 改进读取 _sidebar 逻辑

上级 91ef2a5e
......@@ -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,
......
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(/<!--([\s\S]*?)-->/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(/<!--([\s\S]*?)-->/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
}
......@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册