-
Notifications
You must be signed in to change notification settings - Fork 44
/
parse.js
84 lines (74 loc) · 1.91 KB
/
parse.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
var events = require('events');
var util;
try {
util = require('util');
} catch(e) {
util = require('sys');
}
var expat = require('node-expat');
var element = require('./element');
exports.Parser = function() {
var that = this;
this.parser = new expat.Parser('UTF-8');
var el;
this.parser.addListener('startElement', function(name, attrs) {
var child = new element.Element(name, attrs);
if (!el) {
el = child;
} else {
el = el.cnode(child);
}
});
this.parser.addListener('endElement', function(name, attrs) {
if (!el) {
/* Err */
} else if (el && name == el.name) {
if (el.parent)
el = el.parent;
else if (!that.tree) {
that.tree = el;
el = undefined;
}
}
});
this.parser.addListener('text', function(str) {
if (el)
el.t(str);
});
};
util.inherits(exports.Parser, events.EventEmitter);
exports.Parser.prototype.write = function(data) {
if (!this.parser.parse(data, false)) {
this.emit('error', new Error(this.parser.getError()));
// Premature error thrown,
// disable all functionality:
this.write = function() { };
this.end = function() { };
}
};
exports.Parser.prototype.end = function() {
if (!this.parser.parse('', true))
this.emit('error', new Error(this.parser.getError()));
else {
if (this.tree)
this.emit('tree', this.tree);
else
this.emit('error', new Error('Incomplete document'));
}
};
exports.parse = function(data) {
var p = new exports.Parser();
var result = null, error = null;
p.on('tree', function(tree) {
result = tree;
});
p.on('error', function(e) {
error = e;
});
p.write(data);
p.end();
if (error)
throw error;
else
return result;
};