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