markdown写的文章,没有生成目录结构功能,自己手动写个,DOM节点如下:
本文章只是针对H2,H3的标签的事例(h1~h6只能有个2个标签即可)
- 获取节点
let childrens = document.getElementsByClassName("v-show-content")[0].children,
treeArray = [];
- 过滤H2 H3的标签
for (let i = 0; i < childrens.length - 1; i++) {
console.info("childrens[i]-打印看下面图片", childrens[i]);
let nodeName = childrens[i].nodeName;
if (nodeName == "H2" || nodeName == "H3") {
treeArray.push({
id: childrens[i].childNodes[0].getAttribute("id"),
name: childrens[i].innerText,
tag: childrens[i].nodeName
});
}
}
- 改变数据 h2 和 h3
就是前后2个比较,小标签是大标签子集
// 获取标题级别
function getLevel(str = "") {
const result = str.slice(-1);
return Number(result);
}
function format(list) {
const result = [];
let prevItem;
list.forEach(item => {
if (!prevItem) {
result.push(item);
prevItem = item;
return;
}
const level = getLevel(item.tag);
const prevLevel = getLevel(prevItem.tag);
// 比较级别大小
const isSmall = level > prevLevel; // 注意大小判断 2 > 3
if (isSmall) {
prevItem.list = prevItem.list || [];
prevItem.list.push(item);
} else {
result.push(item);
prevItem = item;
}
});
return result;
}
const newTreeArray = format(treeArray);
我的博客文章详情有例子: http://www.zhooson.cn/article