-
-
Notifications
You must be signed in to change notification settings - Fork 8.7k
/
HTMLParser.js
88 lines (68 loc) · 1.84 KB
/
HTMLParser.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
const posthtml = require("posthtml");
const {
imports,
urls
} = require("@posthtml/esm");
const {
HTMLURLDependency,
HTMLImportDependency,
HTMLExportDependency
} = require("./dependencies");
const {
OriginalSource
} = require("webpack-sources");
const isDependency = (msg) => {
return msg.type.includes("import") || msg.type.includes("export");
};
class HTMLParser {
constructor(options = {}) {
this.options = options;
}
parse(source, state, cb) {
const plugins = [
urls({ url: true }),
imports({ imports: true })
];
const options = {
to: state.module.resource,
from: state.module.resource
};
posthtml(plugins)
.process(source, options)
.then(({ tree, html, messages }) => {
state.module._ast = tree;
state.module._source = new OriginalSource(html);
const dependencies = messages.filter(isDependency);
// HACK PostHTML Bug (#250)
messages.length = 0;
return dependencies
.reduce((done, dep) => new Promise((resolve, reject) => {
if(dep.name.includes("HTML__URL")) {
const dependency = new HTMLURLDependency(dep.url, dep.name);
state.module.addDependency(dependency, (err) => {
if(err) reject(err);
resolve();
});
}
if(dep.name.includes("HTML__IMPORT")) {
const dependency = new HTMLImportDependency(dep.url, dep.name);
state.module.addDependency(dependency, (err) => {
if(err) reject(err);
resolve();
});
}
if(dep.name.includes("HTML__EXPORT")) {
const dependency = new HTMLExportDependency(dep.export(), dep.name);
state.module.addDependency(dependency, (err) => {
if(err) reject(err);
resolve();
});
}
resolve();
}), Promise.resolve());
})
.then(() => cb(null, state))
.catch((err) => cb(err));
}
}
module.exports = HTMLParser;