feat(HtmlParser): better error message when a void tag has content
This commit is contained in:
committed by
Jeremy Elbourn
parent
9c6b929c7b
commit
62c2ed7c43
@@ -128,21 +128,21 @@ class TreeBuilder {
|
||||
attrs.push(this._consumeAttr(this._advance()));
|
||||
}
|
||||
var fullName = getElementFullName(prefix, name, this._getParentElement());
|
||||
var voidElement = false;
|
||||
var selfClosing = false;
|
||||
// Note: There could have been a tokenizer error
|
||||
// so that we don't get a token for the end tag...
|
||||
if (this.peek.type === HtmlTokenType.TAG_OPEN_END_VOID) {
|
||||
this._advance();
|
||||
voidElement = true;
|
||||
selfClosing = true;
|
||||
} else if (this.peek.type === HtmlTokenType.TAG_OPEN_END) {
|
||||
this._advance();
|
||||
voidElement = false;
|
||||
selfClosing = false;
|
||||
}
|
||||
var end = this.peek.sourceSpan.start;
|
||||
var el = new HtmlElementAst(fullName, attrs, [],
|
||||
new ParseSourceSpan(startTagToken.sourceSpan.start, end));
|
||||
this._pushElement(el);
|
||||
if (voidElement) {
|
||||
if (selfClosing) {
|
||||
this._popElement(fullName);
|
||||
}
|
||||
}
|
||||
@@ -172,18 +172,27 @@ class TreeBuilder {
|
||||
var fullName =
|
||||
getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getParentElement());
|
||||
if (!this._popElement(fullName)) {
|
||||
this.errors.push(HtmlTreeError.create(fullName, endTagToken.sourceSpan.start,
|
||||
`Unexpected closing tag "${endTagToken.parts[1]}"`));
|
||||
let msg;
|
||||
|
||||
if (getHtmlTagDefinition(fullName).isVoid) {
|
||||
msg =
|
||||
`Void elements do not have end tags (they can not have content) "${endTagToken.parts[1]}"`;
|
||||
} else {
|
||||
msg = `Unexpected closing tag "${endTagToken.parts[1]}"`;
|
||||
}
|
||||
|
||||
this.errors.push(HtmlTreeError.create(fullName, endTagToken.sourceSpan.start, msg));
|
||||
}
|
||||
}
|
||||
|
||||
private _popElement(fullName: string): boolean {
|
||||
for (let stackIndex = this.elementStack.length - 1; stackIndex >= 0; stackIndex--) {
|
||||
var el = this.elementStack[stackIndex];
|
||||
let el = this.elementStack[stackIndex];
|
||||
if (el.name.toLowerCase() == fullName.toLowerCase()) {
|
||||
ListWrapper.splice(this.elementStack, stackIndex, this.elementStack.length - stackIndex);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!getHtmlTagDefinition(el.name).closedByParent) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user