接上一篇HTML逆向生成Markdown -- Part 1javascript
在前文的結尾,咱們已經將HTML文本處理爲一個個虛擬DOM節點(JSON對象)了。java
爲了方便以後的處理,新增長了兩個表示結束標籤的節點,以方便構建DOM樹。數組
const result = [
{
tag: 'h2',
type: 42, // 不要在乎`type`屬性,這是自定義的,42表明`h2`元素對應數字
position: 1
},
{
tag: 'textNode',
type: 1,
position: 3,
content: '逆向解析HTMl'
},
{
tag: 'h2',
type: 42,
position: 2
},
{
tag: 'p',
type: 6,
position: 1
},
{
tag: 'a',
type: 2,
position: 1,
attr: {
href: 'https://www.baidu.com'
}
},
{
tag: 'textNode',
type: 1,
position: 3,
content: 'Markdown'
},
{
tag: 'a',
type: 2,
position: 2
},
{
tag: 'p',
type: 6,
position: 2
},
]
複製代碼
咱們已經用position
屬性標識了開始/結尾標籤和文本節點,咱們知道在開始和結束標籤之間的節點都屬於該節點的子節點。 以此類推,就表示出一顆DOM樹了。 以上文的節點數組爲輸入咱們來嘗試構建一個虛擬DOM樹。post
[
{
tag: 'h2',
type: 42
}
]
複製代碼
[
{
tag: 'h2',
type: 42,
child: [
{
tag: 'textNode',
type: 1,
content: '逆向解析HTMl'
}
]
}
]
複製代碼
[
{
tag: 'h2',
type: 42,
child: [
{
tag: 'textNode',
type: 1,
content: '逆向解析HTMl'
}
]
}
]
複製代碼
[
{
tag: 'h2',
type: 42,
child: [
{
tag: 'textNode',
type: 1,
content: '逆向解析HTMl'
}
]
},
{
tag: 'p',
type: 6
}
]
複製代碼
[
{
tag: 'h2',
type: 42,
child: [
{
tag: 'textNode',
type: 1,
content: '逆向解析HTMl'
}
]
},
{
tag: 'p',
type: 6,
child: [
{
tag: 'a',
type: 2,
attr: {
href: 'https://www.baidu.com'
}
}
]
}
]
複製代碼
[
{
tag: 'h2',
type: 42,
child: [
{
tag: 'textNode',
type: 1,
content: '逆向解析HTMl'
}
]
},
{
tag: 'p',
type: 6,
child: [
{
tag: 'a',
type: 2,
attr: {
href: 'https://www.baidu.com'
},
child: [
{
tag: 'textNode',
type: 1,
position: 3,
content: 'Markdown'
}
]
}
]
}
]
複製代碼
最終,咱們獲得的是這樣一個DOM樹結構:spa
const result = [
{
tag: 'h2',
type: 42,
child: [
{
tag: 'textNode',
type: 1,
content: '逆向解析HTMl'
}
]
},
{
tag: 'p',
type: 6,
child: [
{
tag: 'a',
type: 2,
attr: {
href: 'https://www.baidu.com'
},
child: [
{
tag: 'textNode',
type: 1,
position: 3,
content: 'Markdown'
}
]
}
]
}
]
複製代碼
到這一步,咱們已經將HTML文本轉化成了虛擬DOM樹。最後也是最關鍵的一步,就是分析DOM樹,根據MD規則生成MD文本了。 能夠說以前的三個步驟都是爲了最後一步服務的。code