* * * Fork of htmlparser2@4.1.0 for Joplin. Patch: ```diff diff --git a/node_modules/htmlparser2/lib/Parser.js b/node_modules/htmlparser2/lib/Parser.js index 44b4371..bcd7cc2 100644 --- a/node_modules/htmlparser2/lib/Parser.js +++ b/node_modules/htmlparser2/lib/Parser.js @@ -212,6 +212,13 @@ var Parser = /** @class */ (function (_super) { this._tagname = ""; }; Parser.prototype.onclosetag = function (name) { + // When this is true, the onclosetag event will always be emitted + // for closing tags (eg ) even if that tag was not previously + // open. This is needed because we reconstruct the HTML based on + // fragments that don't necessarily contain the opening tag. + // Without this patch, onopentagname would not be emitted, and + // so the closing tag would disappear from the output. + var alwaysClose = true; this._updatePosition(1); if (this._lowerCaseTagNames) { name = name.toLowerCase(); @@ -236,11 +243,15 @@ var Parser = /** @class */ (function (_super) { else if (name === "p" && !this._options.xmlMode) { this.onopentagname(name); this._closeCurrentTag(); + } else if (!this._stack.length && alwaysClose) { + this._cbs.onclosetag(name); } } else if (!this._options.xmlMode && (name === "br" || name === "p")) { this.onopentagname(name); this._closeCurrentTag(); + } else if (!this._stack.length && alwaysClose) { + this._cbs.onclosetag(name); } }; Parser.prototype.onselfclosingtag = function () { @@ -331,7 +342,11 @@ var Parser = /** @class */ (function (_super) { }; Parser.prototype.onend = function () { if (this._cbs.onclosetag) { - for (var i = this._stack.length; i > 0; this._cbs.onclosetag(this._stack[--i])) + // Prevent the parser from auto-closing tags. Since we deal with fragments that + // maybe contain the opening tag but not the closing one, we don't want that + // closing tag to be auto-added. + // + // for (var i = this._stack.length; i > 0; this._cbs.onclosetag(this._stack[--i])) ; } if (this._cbs.onend) ``` To fix an HTML parsing issue (tags were allowed to start with non-alphanumeric characters), [this upstream commit](https://github.com/fb55/htmlparser2/commit/bc010de9df09f2d730a69734e05e5175ea8bd2d7) has also been applied. * * * # htmlparser2 [![NPM version](http://img.shields.io/npm/v/htmlparser2.svg?style=flat)](https://npmjs.org/package/htmlparser2) [![Downloads](https://img.shields.io/npm/dm/htmlparser2.svg?style=flat)](https://npmjs.org/package/htmlparser2) [![Build Status](http://img.shields.io/travis/fb55/htmlparser2/master.svg?style=flat)](http://travis-ci.org/fb55/htmlparser2) [![Coverage](http://img.shields.io/coveralls/fb55/htmlparser2.svg?style=flat)](https://coveralls.io/r/fb55/htmlparser2) A forgiving HTML/XML/RSS parser. The parser can handle streams and provides a callback interface. ## Installation npm install htmlparser2 A live demo of htmlparser2 is available [here](https://astexplorer.net/#/2AmVrGuGVJ). ## Usage ```javascript const htmlparser2 = require("htmlparser2"); const parser = new htmlparser2.Parser( { onopentag(name, attribs) { if (name === "script" && attribs.type === "text/javascript") { console.log("JS! Hooray!"); } }, ontext(text) { console.log("-->", text); }, onclosetag(tagname) { if (tagname === "script") { console.log("That's it?!"); } } }, { decodeEntities: true } ); parser.write( "Xyz