🐛 fix issue #38

This commit is contained in:
taoqf 2020-04-09 10:36:16 +08:00
parent 130245e09c
commit ee97545974
3 changed files with 29 additions and 7 deletions

View file

@ -598,6 +598,8 @@ export interface Options {
comment?: boolean;
}
const frameflag = 'documentfragmentcontainer';
/**
* Parses HTML and returns a root element
* Parse a chuck of HTML source.
@ -610,6 +612,8 @@ export function parse(data: string, options = {} as Options) {
const stack = [root];
let lastTextPos = -1;
let match: RegExpExecArray;
// https://github.com/taoqf/node-html-parser/issues/38
data = `<${frameflag}>${data}</${frameflag}>`;
while (match = kMarkupPattern.exec(data)) {
if (lastTextPos > -1) {
if (lastTextPos + match[0].length < kMarkupPattern.lastIndex) {
@ -645,9 +649,12 @@ export function parse(data: string, options = {} as Options) {
currentParent = arr_back(stack);
}
}
currentParent = currentParent.appendChild(
new HTMLElement(match[2], attrs, match[3]));
stack.push(currentParent);
if (match[2] !== frameflag) {
// ignore container tag we add above
// https://github.com/taoqf/node-html-parser/issues/38
currentParent = currentParent.appendChild(new HTMLElement(match[2], attrs, match[3]));
stack.push(currentParent);
}
if (kBlockTextElements[match[2]]) {
// a little test to find next </script> or </style> ...
const closeMarkup = '</' + match[2] + '>';

View file

@ -429,10 +429,12 @@ describe('HTML Parser', function () {
});
describe('#removeAttribute', function () {
const root = parseHTML('<input required>');
const input = root.firstChild;
input.removeAttribute('required');
input.toString().should.eql('<input />');
it('should remove attribute required', function () {
const root = parseHTML('<input required>');
const input = root.firstChild;
input.removeAttribute('required');
input.toString().should.eql('<input />');
});
});
describe('#hasAttribute', function () {

13
test/parse.js Normal file
View file

@ -0,0 +1,13 @@
const { parse } = require('../dist');
// https://github.com/taoqf/node-html-parser/issues/38
describe('HTML Parser', function () {
it('should parse text element', function () {
const root = parse('foo bar<div>aaa</div>');
root.toString().should.eql('foo bar<div>aaa</div>');
});
it('should parse pure text element', function () {
const root = parse('foo bar');
root.toString().should.eql('foo bar');
});
})