diff --git a/lib/ace/mode/xml/sax.js b/lib/ace/mode/xml/sax.js index 9aa61df8290..81b1c5dbf76 100644 --- a/lib/ace/mode/xml/sax.js +++ b/lib/ace/mode/xml/sax.js @@ -98,7 +98,10 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ } switch(source.charAt(i+1)){ case '/': - var end = source.indexOf('>',i+3); + var regex = new RegExp("\\s*>"); + var subSource = source.substr(i+2); + var end = subSource.search(regex); + end = end + i + 2; var tagName = source.substring(i+2,end); var config; if (parseStack.length > 1) { @@ -108,7 +111,7 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ break; } var localNSMap = config.localNSMap; - + if(config.tagName != tagName){ errorHandler.fatalError("end tag name: " + tagName + " does not match the current start tagName: "+config.tagName ); } @@ -132,9 +135,9 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ default: try{ locator&&position(i); - + var el = new ElementAttributes(); - + //elStartEnd var end = parseElementStartPart(source,i,el,entityReplacer,errorHandler); var len = el.length; @@ -155,8 +158,8 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){ } } appendElement(el,domBuilder,parseStack); - - + + if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){ end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder) }else{ @@ -180,7 +183,7 @@ function copyLocator(f,t){ t.lineNumber = f.lineNumber; t.columnNumber = f.columnNumber; return t; - + } /** @@ -368,7 +371,7 @@ function appendElement(el,domBuilder,parseStack){ } //can not set prefix,because prefix !== '' a.localName = localName ; - //prefix == null for no ns prefix attribute + //prefix == null for no ns prefix attribute if(nsPrefix !== false){//hack!! if(localNSMap == null){ localNSMap = {} @@ -378,7 +381,7 @@ function appendElement(el,domBuilder,parseStack){ } currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value; a.uri = 'http://www.w3.org/2000/xmlns/' - domBuilder.startPrefixMapping(nsPrefix, value) + domBuilder.startPrefixMapping(nsPrefix, value) } } var i = el.length; @@ -390,7 +393,7 @@ function appendElement(el,domBuilder,parseStack){ a.uri = 'http://www.w3.org/XML/1998/namespace'; }if(prefix !== 'xmlns'){ a.uri = currentNSMap[prefix] - + //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)} } } @@ -412,7 +415,7 @@ function appendElement(el,domBuilder,parseStack){ domBuilder.endElement(ns,localName,tagName); if(localNSMap){ for(prefix in localNSMap){ - domBuilder.endPrefixMapping(prefix) + domBuilder.endPrefixMapping(prefix) } } }else{ @@ -438,7 +441,7 @@ function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBui domBuilder.characters(text,0,text.length); return elEndStart; //} - + } } return elStartEnd+1; @@ -448,10 +451,17 @@ function fixSelfClosed(source,elStartEnd,tagName,closeMap){ var pos = closeMap[tagName]; if(pos == null){ //console.log(tagName) - pos = closeMap[tagName] = source.lastIndexOf('') + var regex = new RegExp("", "gi"); + var match = source.match(regex); + if (match && match.length >= 1) { + var lastIndex = source.lastIndexOf(match[match.length-1]); + pos = closeMap[tagName] = lastIndex; + } else { + pos = -1; + } } return pos