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()