@desertnet/html-parser
Version:
HTML parser and non-strict validator
159 lines (130 loc) • 8.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Class for recording syntactic and semantic HTML errors.
*/
var HTMLParseError = function () {
function HTMLParseError() {
_classCallCheck(this, HTMLParseError);
/**
* @private
* @type {string} message
*/
this._message = "Unknown parse error";
/**
* @private
* @type {Array.<Foundation.Scanner.Token>}
*/
this._tokens = [];
}
/**
* @param {string} message
*/
_createClass(HTMLParseError, [{
key: "addToken",
/**
* @param {Foundation.Scanner.Token} token
*/
value: function addToken(token) {
this._tokens.push(token);
this._tokens.sort(function (a, b) {
return a.index < b.index ? -1 : 1;
});
}
/**
* @param {Foundation.HTML.Parser.HTMLNode} node
*/
}, {
key: "addTokensFromNode",
value: function addTokensFromNode(node) {
var _this = this;
node.tokens.forEach(function (token) {
return _this.addToken(token);
});
}
/**
* The offset in the source string where the error begins.
* @public
* @return {number}
*/
}, {
key: "assertTokensHaveBeenAdded",
/**
* @private
*/
value: function assertTokensHaveBeenAdded() {
if (this._tokens.length === 0) {
throw new Error("No tokens added to error object.");
}
}
/**
* @private
* @return {Array.<Foundation.Scanner.Token>}
*/
}, {
key: "message",
set: function set(message) {
this._message = message;
}
/**
* @public
* @return {string}
*/
,
get: function get() {
return this._message;
}
}, {
key: "startIndex",
get: function get() {
this.assertTokensHaveBeenAdded();
return this._tokens[0].index;
}
/**
* The offset in the source string where the error stops.
* @public
* @return {number}
*/
}, {
key: "endIndex",
get: function get() {
this.assertTokensHaveBeenAdded();
var lastToken = this._tokens[this._tokens.length - 1];
return lastToken.index + lastToken.value.length;
}
/**
* The line number in the source string where the error begins.
* @public
* @return {number}
*/
}, {
key: "line",
get: function get() {
this.assertTokensHaveBeenAdded();
return this._tokens[0].line;
}
/**
* The column number of the line in the source string where the error begins.
* @public
* @return {number}
*/
}, {
key: "column",
get: function get() {
this.assertTokensHaveBeenAdded();
return this._tokens[0].column;
}
}, {
key: "tokens",
get: function get() {
return this._tokens.slice(0);
}
}]);
return HTMLParseError;
}();
exports.default = HTMLParseError;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9IVE1MUGFyc2VFcnJvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7OztJQUdxQixjO0FBQ25CLDRCQUFlO0FBQUE7O0FBQ2I7Ozs7QUFJQSxTQUFLLFFBQUwsR0FBZ0IscUJBQWhCOztBQUVBOzs7O0FBSUEsU0FBSyxPQUFMLEdBQWUsRUFBZjtBQUNEOztBQUVEOzs7Ozs7Ozs7QUFlQTs7OzZCQUdVLEssRUFBTztBQUNmLFdBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsS0FBbEI7QUFDQSxXQUFLLE9BQUwsQ0FBYSxJQUFiLENBQWtCLFVBQUMsQ0FBRCxFQUFJLENBQUo7QUFBQSxlQUFXLEVBQUUsS0FBRixHQUFVLEVBQUUsS0FBYixHQUFzQixDQUFDLENBQXZCLEdBQTJCLENBQXJDO0FBQUEsT0FBbEI7QUFDRDs7QUFFRDs7Ozs7O3NDQUdtQixJLEVBQU07QUFBQTs7QUFDdkIsV0FBSyxNQUFMLENBQVksT0FBWixDQUFvQjtBQUFBLGVBQVMsTUFBSyxRQUFMLENBQWMsS0FBZCxDQUFUO0FBQUEsT0FBcEI7QUFDRDs7QUFFRDs7Ozs7Ozs7OztBQXlDQTs7O2dEQUc2QjtBQUMzQixVQUFJLEtBQUssT0FBTCxDQUFhLE1BQWIsS0FBd0IsQ0FBNUIsRUFBK0I7QUFDN0IsY0FBTSxJQUFJLEtBQUosQ0FBVSxrQ0FBVixDQUFOO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7OztzQkE3RWEsTyxFQUFTO0FBQ3BCLFdBQUssUUFBTCxHQUFnQixPQUFoQjtBQUNEOztBQUVEOzs7Ozt3QkFJZTtBQUNiLGFBQU8sS0FBSyxRQUFaO0FBQ0Q7Ozt3QkFzQmlCO0FBQ2hCLFdBQUsseUJBQUw7QUFDQSxhQUFPLEtBQUssT0FBTCxDQUFhLENBQWIsRUFBZ0IsS0FBdkI7QUFDRDs7QUFFRDs7Ozs7Ozs7d0JBS2dCO0FBQ2QsV0FBSyx5QkFBTDtBQUNBLFVBQUksWUFBWSxLQUFLLE9BQUwsQ0FBYSxLQUFLLE9BQUwsQ0FBYSxNQUFiLEdBQXNCLENBQW5DLENBQWhCO0FBQ0EsYUFBTyxVQUFVLEtBQVYsR0FBa0IsVUFBVSxLQUFWLENBQWdCLE1BQXpDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O3dCQUtZO0FBQ1YsV0FBSyx5QkFBTDtBQUNBLGFBQU8sS0FBSyxPQUFMLENBQWEsQ0FBYixFQUFnQixJQUF2QjtBQUNEOztBQUVEOzs7Ozs7Ozt3QkFLYztBQUNaLFdBQUsseUJBQUw7QUFDQSxhQUFPLEtBQUssT0FBTCxDQUFhLENBQWIsRUFBZ0IsTUFBdkI7QUFDRDs7O3dCQWVhO0FBQ1osYUFBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLENBQW1CLENBQW5CLENBQVA7QUFDRDs7Ozs7O2tCQXJHa0IsYyIsImZpbGUiOiJIVE1MUGFyc2VFcnJvci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhc3MgZm9yIHJlY29yZGluZyBzeW50YWN0aWMgYW5kIHNlbWFudGljIEhUTUwgZXJyb3JzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVE1MUGFyc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICAgKi9cbiAgICB0aGlzLl9tZXNzYWdlID0gXCJVbmtub3duIHBhcnNlIGVycm9yXCI7XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtBcnJheS48Rm91bmRhdGlvbi5TY2FubmVyLlRva2VuPn1cbiAgICAgKi9cbiAgICB0aGlzLl90b2tlbnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKi9cbiAgc2V0IG1lc3NhZ2UgKG1lc3NhZ2UpIHtcbiAgICB0aGlzLl9tZXNzYWdlID0gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBtZXNzYWdlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0ZvdW5kYXRpb24uU2Nhbm5lci5Ub2tlbn0gdG9rZW5cbiAgICovXG4gIGFkZFRva2VuICh0b2tlbikge1xuICAgIHRoaXMuX3Rva2Vucy5wdXNoKHRva2VuKTtcbiAgICB0aGlzLl90b2tlbnMuc29ydCgoYSwgYikgPT4gKGEuaW5kZXggPCBiLmluZGV4KSA/IC0xIDogMSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3VuZGF0aW9uLkhUTUwuUGFyc2VyLkhUTUxOb2RlfSBub2RlXG4gICAqL1xuICBhZGRUb2tlbnNGcm9tTm9kZSAobm9kZSkge1xuICAgIG5vZGUudG9rZW5zLmZvckVhY2godG9rZW4gPT4gdGhpcy5hZGRUb2tlbih0b2tlbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQgaW4gdGhlIHNvdXJjZSBzdHJpbmcgd2hlcmUgdGhlIGVycm9yIGJlZ2lucy5cbiAgICogQHB1YmxpY1xuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgc3RhcnRJbmRleCAoKSB7XG4gICAgdGhpcy5hc3NlcnRUb2tlbnNIYXZlQmVlbkFkZGVkKCk7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2Vuc1swXS5pbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0IGluIHRoZSBzb3VyY2Ugc3RyaW5nIHdoZXJlIHRoZSBlcnJvciBzdG9wcy5cbiAgICogQHB1YmxpY1xuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgZW5kSW5kZXggKCkge1xuICAgIHRoaXMuYXNzZXJ0VG9rZW5zSGF2ZUJlZW5BZGRlZCgpO1xuICAgIHZhciBsYXN0VG9rZW4gPSB0aGlzLl90b2tlbnNbdGhpcy5fdG9rZW5zLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBsYXN0VG9rZW4uaW5kZXggKyBsYXN0VG9rZW4udmFsdWUubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIG51bWJlciBpbiB0aGUgc291cmNlIHN0cmluZyB3aGVyZSB0aGUgZXJyb3IgYmVnaW5zLlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBsaW5lICgpIHtcbiAgICB0aGlzLmFzc2VydFRva2Vuc0hhdmVCZWVuQWRkZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fdG9rZW5zWzBdLmxpbmU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGxpbmUgaW4gdGhlIHNvdXJjZSBzdHJpbmcgd2hlcmUgdGhlIGVycm9yIGJlZ2lucy5cbiAgICogQHB1YmxpY1xuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgY29sdW1uICgpIHtcbiAgICB0aGlzLmFzc2VydFRva2Vuc0hhdmVCZWVuQWRkZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fdG9rZW5zWzBdLmNvbHVtbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYXNzZXJ0VG9rZW5zSGF2ZUJlZW5BZGRlZCAoKSB7XG4gICAgaWYgKHRoaXMuX3Rva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHRva2VucyBhZGRlZCB0byBlcnJvciBvYmplY3QuXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJuIHtBcnJheS48Rm91bmRhdGlvbi5TY2FubmVyLlRva2VuPn1cbiAgICovXG4gIGdldCB0b2tlbnMgKCkge1xuICAgIHJldHVybiB0aGlzLl90b2tlbnMuc2xpY2UoMCk7XG4gIH1cbn1cbiJdfQ==