'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
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
'use strict';
 
var WritableStream = require('stream').Writable,
    inherits = require('util').inherits,
    Parser = require('./index');
 
var ParserStream = module.exports = function (options) {
    WritableStream.call(this);
 
    this.parser = new Parser(options);
 
    this.lastChunkWritten = false;
    this.writeCallback = null;
    this.pausedByScript = false;
 
    this.document = this.parser.treeAdapter.createDocument();
 
    this.pendingHtmlInsertions = [];
 
    this._resume = this._resume.bind(this);
    this._documentWrite = this._documentWrite.bind(this);
    this._scriptHandler = this._scriptHandler.bind(this);
 
    this.parser._bootstrap(this.document, null);
};
 
inherits(ParserStream, WritableStream);
 
//WritableStream implementation
ParserStream.prototype._write = function (chunk, encoding, callback) {
    this.writeCallback = callback;
    this.parser.tokenizer.write(chunk.toString('utf8'), this.lastChunkWritten);
    this._runParsingLoop();
};
 
ParserStream.prototype.end = function (chunk, encoding, callback) {
    this.lastChunkWritten = true;
    WritableStream.prototype.end.call(this, chunk || '', encoding, callback);
};
 
//Scriptable parser implementation
ParserStream.prototype._runParsingLoop = function () {
    this.parser.runParsingLoopForCurrentChunk(this.writeCallback, this._scriptHandler);
};
 
ParserStream.prototype._resume = function () {
    if (!this.pausedByScript)
        throw new Error('Parser was already resumed');
 
    while (this.pendingHtmlInsertions.length) {
        var html = this.pendingHtmlInsertions.pop();
 
        this.parser.tokenizer.insertHtmlAtCurrentPos(html);
    }
 
    this.pausedByScript = false;
 
    //NOTE: keep parsing if we don't wait for the next input chunk
    if (this.parser.tokenizer.active)
        this._runParsingLoop();
};
 
ParserStream.prototype._documentWrite = function (html) {
    if (!this.parser.stopped)
        this.pendingHtmlInsertions.push(html);
};
 
ParserStream.prototype._scriptHandler = function (scriptElement) {
    if (this.listeners('script').length) {
        this.pausedByScript = true;
        this.emit('script', scriptElement, this._documentWrite, this._resume);
    }
    else
        this._runParsingLoop();
};