/
index.js
126 lines (86 loc) · 1.93 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
const HTMLParser = require('node-html-parser');
const {marked} = require('marked');
class MdToArray {
constructor(md) {
this._md = md;
this._html;
}
get markdown () {
return this._md;
}
get html () {
if (this._html) {
return this._html;
}
this._html = marked(this.markdown);
return this._html;
}
parse (options={}) {
options.lowerCaseTagName = true;
let tree = [];
const flatten = (nodes, parent) => {
if ((nodes.childNodes && nodes.childNodes.length)) {
return flatten(nodes.childNodes, nodes.tagName);
}
if (nodes && nodes.length) {
tree.push([]);
nodes.forEach( (node) => {
if (node && node.rawText !== '\n') {
let item = this.parseNode(node, parent);
tree[tree.length-1].push(item);
}
});
}
};
const root = HTMLParser.parse(this.html, options);
for (let item of root.childNodes) {
flatten(item);
}
return tree;
}
parseNode (node, parent) {
let res = {};
// this helps with h1-h6
if (!node.tagName && parent && parent.length && parent !== 'p') {
node.tagName = parent;
}
if (node.rawText && node.rawText.length) {
res.text = node.rawText;
}
if (node.tagName && node.tagName.length) {
res.tag = node.tagName;
res[node.tagName] = true;
}
if (node.rawAttrs && node.rawAttrs.length) {
for (const attr in node.attributes) {
res[attr] = node.attributes[attr];
}
}
switch (node.tagName) {
case 'li':
res.parent = node.parentNode.tagName;
res.ordered = res.parent === 'ol';
res.unordered = !res.ordered;
break;
case 'a':
delete res.a;
res.link = true;
break;
case 'img':
delete res.img;
res.image = true;
break;
case 'em':
delete res.em;
res.italics = true;
break;
case 'strong':
delete res.strong;
res.bold = true;
break;
default:
}
return res;
}
}
module.exports = MdToArray;