feat: add tocs feature & fix page element generation issue (#9).

This commit is contained in:
jaywcjlove
2022-10-28 22:07:12 +08:00
parent 6d0801a9da
commit dd8a3cb26d
9 changed files with 197 additions and 29 deletions

View File

@ -1,5 +1,71 @@
import path from 'path';
import { panelAddNumber } from './panelAddNumber.mjs';
import { getChilds, getHeader } from './childs.mjs';
import { ICONS_PATH, getSVGNode } from './getSVGNode.mjs';
export const titleNum = (tagName = '') => Number(tagName.replace(/^h/, ''));
export function getTocsTitleNode(arr = [], result = []) {
arr.forEach(({ tagName, type, properties, children }) => {
if (/^h[23456]/.test(tagName)) {
const num = titleNum(tagName)
const props = { 'aria-hidden': "true", class: `leve${num} tocs-link`, href: '#' + (properties.id || '') }
result.push({ tagName: 'a', type, properties: props, children: (children || []).filter(m => m.type === 'text') })
} else if (children?.length > 0) {
result = result.concat(getTocsTitleNode(children))
}
});
return result
}
export function addTocsInWarp(tocsData = [], menuData, isDone = false) {
const childs = tocsData.map((item) => {
if (item.properties?.class?.includes('h1wrap-body')) {
isDone = true;
}
if (!isDone && item.children) {
item.children = addTocsInWarp([...item.children], menuData, isDone)
}
return item
});
if (isDone) {
childs.splice(1, 0, menuData);
}
return childs
}
export const getTocsTitleNodeWarpper = (children = []) => {
const iconPath = path.resolve(ICONS_PATH, `menu.svg`);
const svgNode = getSVGNode(iconPath);
return {
type: 'element',
tagName: 'div',
properties: {
class: 'menu-tocs',
},
children: [
{
type: 'element',
tagName: 'div',
properties: {
class: 'menu-btn',
},
children: [
// { type: 'text', value: 'menu' }
...svgNode
]
},
{
type: 'element',
tagName: 'div',
properties: {
class: 'menu-modal',
},
children: children
}
]
}
}
/** Markdown 文档转成树形结构 */
export function getTocsTree(arr = [], result = []) {
@ -14,9 +80,7 @@ export function getTocsTree(arr = [], result = []) {
if (level === -1) {
level = toc.number;
}
const titleNum = Number(toc.tagName?.replace(/^h/, ''));
if (toc.number === level && titleNum === level) {
if (toc.number === level && titleNum(toc.tagName) === level) {
const header = getHeader(data.slice(n), level);
const wrapCls = ['wrap'];
const headerCls = ['wrap-header', `h${level}wrap`];