diff --git a/lib/sax.js b/lib/sax.js
index 55c021f25..9ab6c121c 100644
--- a/lib/sax.js
+++ b/lib/sax.js
@@ -1,4 +1,6 @@
-var NAMESPACE = require("./conventions").NAMESPACE;
+var conventions = require("./conventions");
+var NAMESPACE = conventions.NAMESPACE;
+var MIME_TYPE = conventions.MIME_TYPE;
//[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
//[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
@@ -50,6 +52,7 @@ XMLReader.prototype = {
}
}
function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
+ var isHTML = MIME_TYPE.isHTML(domBuilder.mimeType);
function fixedFromCharCode(code) {
// String.prototype.fromCharCode does not supports
// > 2 bytes unicode chars directly
@@ -162,7 +165,15 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
var el = new ElementAttributes();
var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
//elStartEnd
- var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
+ var end = parseElementStartPart(
+ source,
+ tagStart,
+ el,
+ currentNSMap,
+ entityReplacer,
+ errorHandler,
+ isHTML
+ )
var len = el.length;
@@ -191,7 +202,7 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
}
}
- if (NAMESPACE.isHTML(el.uri) && !el.closed) {
+ if (isHTML && !el.closed) {
end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
} else {
end++;
@@ -222,7 +233,9 @@ function copyLocator(f,t){
* @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
* @return end of the elementStartPart(end of elementEndPart for selfClosed el)
*/
-function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
+function parseElementStartPart(
+ source,start,el,currentNSMap,entityReplacer,errorHandler, isHTML
+){
/**
* @param {string} qname
@@ -337,7 +350,7 @@ function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,error
errorHandler.warning('attribute "'+value+'" missed quot(")!');
addAttribute(attrName, value, start)
}else{
- if(!NAMESPACE.isHTML(currentNSMap['']) || !value.match(/^(?:disabled|checked|selected)$/i)){
+ if(!isHTML || !value.match(/^(?:disabled|checked|selected)$/i)){
errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
}
addAttribute(value, value, start)
@@ -385,7 +398,7 @@ function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,error
//case S_ATTR_NOQUOT_VALUE:void();break;
case S_ATTR_SPACE:
var tagName = el.tagName;
- if (!NAMESPACE.isHTML(currentNSMap['']) || !attrName.match(/^(?:disabled|checked|selected)$/i)) {
+ if (!isHTML || !attrName.match(/^(?:disabled|checked|selected)$/i)) {
errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
}
addAttribute(attrName, attrName, start);
diff --git a/test/html/normalize.test.js b/test/html/normalize.test.js
index 3e37aa81a..68cfd1d93 100644
--- a/test/html/normalize.test.js
+++ b/test/html/normalize.test.js
@@ -53,6 +53,27 @@ describe('html normalizer', () => {
})
})
+ it.each([
+ ``,
+ ``,
+ ])(`should %s`, (xml) => {
+ const { errors, parser } = getTestParser()
+
+ const actual = parser.parseFromString(xml, 'application/xml')
+
+ expect(actual.documentElement.firstChild.textContent).toBe('let message = " & ETH";');
+ })
+ it.each([
+ ``,
+ ``,
+ ])(`should %s`, (xml) => {
+ const { errors, parser } = getTestParser()
+
+ const actual = parser.parseFromString(xml, 'text/html')
+
+ expect(actual.documentElement.firstChild.textContent).toBe('let message = " & ETH";');
+ })
+
it('European entities', () => {
const { errors, parser } = getTestParser()