Comparing version 0.1.19 to 0.1.20
33
dom.js
@@ -270,2 +270,4 @@ /* | ||
var doc = new Document(); | ||
doc.implementation = this; | ||
doc.childNodes = new NodeList(); | ||
doc.doctype = doctype; | ||
@@ -275,4 +277,2 @@ if(doctype){ | ||
} | ||
doc.implementation = this; | ||
doc.childNodes = new NodeList(); | ||
if(qualifiedName){ | ||
@@ -764,3 +764,3 @@ var root = doc.createElementNS(namespaceURI,qualifiedName); | ||
var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName); | ||
attr.value = attr.nodeValue = value; | ||
attr.value = attr.nodeValue = "" + value; | ||
this.setAttributeNode(attr) | ||
@@ -787,3 +787,3 @@ }, | ||
_visitNode(base,function(node){ | ||
if(node !== base && node.nodeType === ELEMENT_NODE && node.namespaceURI === namespaceURI && (localName === '*' || node.localName == localName)){ | ||
if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){ | ||
ls.push(node); | ||
@@ -909,11 +909,11 @@ } | ||
function XMLSerializer(){} | ||
XMLSerializer.prototype.serializeToString = function(node){ | ||
XMLSerializer.prototype.serializeToString = function(node,attributeSorter){ | ||
node.serializeToString(attributeSorter); | ||
} | ||
Node.prototype.toString =function(attributeSorter){ | ||
var buf = []; | ||
serializeToString(node,buf); | ||
serializeToString(this,buf,attributeSorter); | ||
return buf.join(''); | ||
} | ||
Node.prototype.toString =function(){ | ||
return XMLSerializer.prototype.serializeToString(this); | ||
} | ||
function serializeToString(node,buf){ | ||
function serializeToString(node,buf,attributeSorter,isHTML){ | ||
switch(node.nodeType){ | ||
@@ -925,8 +925,11 @@ case ELEMENT_NODE: | ||
var nodeName = node.tagName; | ||
var isHTML = htmlns === node.namespaceURI | ||
isHTML = (htmlns === node.namespaceURI) ||isHTML | ||
buf.push('<',nodeName); | ||
if(attributeSorter){ | ||
buf.sort.apply(attrs, attributeSorter); | ||
} | ||
for(var i=0;i<len;i++){ | ||
serializeToString(attrs.item(i),buf,isHTML); | ||
serializeToString(attrs.item(i),buf,attributeSorter,isHTML); | ||
} | ||
if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){ | ||
if(child || isHTML && !/^(?:meta|link|img|br|hr|input|button)$/i.test(nodeName)){ | ||
buf.push('>'); | ||
@@ -940,3 +943,3 @@ //if is cdata child node | ||
while(child){ | ||
serializeToString(child,buf); | ||
serializeToString(child,buf,attributeSorter,isHTML); | ||
child = child.nextSibling; | ||
@@ -954,3 +957,3 @@ } | ||
while(child){ | ||
serializeToString(child,buf); | ||
serializeToString(child,buf,attributeSorter,isHTML); | ||
child = child.nextSibling; | ||
@@ -957,0 +960,0 @@ } |
{ | ||
"name": "xmldom", | ||
"version": "0.1.19", | ||
"version": "0.1.20", | ||
"description": "A W3C Standard XML DOM(Level2 CORE) implementation and parser(DOMParser/XMLSerializer).", | ||
@@ -5,0 +5,0 @@ "keywords": ["w3c","dom","xml","parser","javascript","DOMParser","XMLSerializer"], |
144
sax.js
@@ -5,3 +5,3 @@ //[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] | ||
var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF | ||
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\u00B7\u0300-\u036F\\ux203F-\u2040]"); | ||
var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\u00B7\u0300-\u036F\\u203F-\u2040]"); | ||
var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$'); | ||
@@ -62,18 +62,20 @@ //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/ | ||
function appendText(end){//has some bugs | ||
var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); | ||
locator&&position(start); | ||
domBuilder.characters(xt,0,end-start); | ||
start = end | ||
if(end>start){ | ||
var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer); | ||
locator&&position(start); | ||
domBuilder.characters(xt,0,end-start); | ||
start = end | ||
} | ||
} | ||
function position(start,m){ | ||
while(start>=endPos && (m = linePattern.exec(source))){ | ||
startPos = m.index; | ||
endPos = startPos + m[0].length; | ||
function position(p,m){ | ||
while(p>=lineEnd && (m = linePattern.exec(source))){ | ||
lineStart = m.index; | ||
lineEnd = lineStart + m[0].length; | ||
locator.lineNumber++; | ||
//console.log('line++:',locator,startPos,endPos) | ||
} | ||
locator.columnNumber = start-startPos+1; | ||
locator.columnNumber = p-lineStart+1; | ||
} | ||
var startPos = 0; | ||
var endPos = 0; | ||
var lineStart = 0; | ||
var lineEnd = 0; | ||
var linePattern = /.+(?:\r\n?|\n)|.*$/g | ||
@@ -86,45 +88,45 @@ var locator = domBuilder.locator; | ||
while(true){ | ||
var i = source.indexOf('<',start); | ||
if(i<0){ | ||
if(!source.substr(start).match(/^\s*$/)){ | ||
var doc = domBuilder.document; | ||
var text = doc.createTextNode(source.substr(start)); | ||
doc.appendChild(text); | ||
domBuilder.currentElement = text; | ||
try{ | ||
var tagStart = source.indexOf('<',start); | ||
if(tagStart<0){ | ||
if(!source.substr(start).match(/^\s*$/)){ | ||
var doc = domBuilder.document; | ||
var text = doc.createTextNode(source.substr(start)); | ||
doc.appendChild(text); | ||
domBuilder.currentElement = text; | ||
} | ||
return; | ||
} | ||
return; | ||
} | ||
if(i>start){ | ||
appendText(i); | ||
} | ||
switch(source.charAt(i+1)){ | ||
case '/': | ||
var end = source.indexOf('>',i+3); | ||
var tagName = source.substring(i+2,end); | ||
var config = parseStack.pop(); | ||
var localNSMap = config.localNSMap; | ||
if(tagStart>start){ | ||
appendText(tagStart); | ||
} | ||
switch(source.charAt(tagStart+1)){ | ||
case '/': | ||
var end = source.indexOf('>',tagStart+3); | ||
var tagName = source.substring(tagStart+2,end); | ||
var config = parseStack.pop(); | ||
var localNSMap = config.localNSMap; | ||
if(config.tagName != tagName){ | ||
errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName ); | ||
} | ||
domBuilder.endElement(config.uri,config.localName,tagName); | ||
if(localNSMap){ | ||
for(var prefix in localNSMap){ | ||
domBuilder.endPrefixMapping(prefix) ; | ||
} | ||
} | ||
end++; | ||
break; | ||
// end elment | ||
case '?':// <?...?> | ||
locator&&position(tagStart); | ||
end = parseInstruction(source,tagStart,domBuilder); | ||
break; | ||
case '!':// <!doctype,<![CDATA,<!-- | ||
locator&&position(tagStart); | ||
end = parseDCC(source,tagStart,domBuilder,errorHandler); | ||
break; | ||
default: | ||
if(config.tagName != tagName){ | ||
errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName ); | ||
} | ||
domBuilder.endElement(config.uri,config.localName,tagName); | ||
if(localNSMap){ | ||
for(var prefix in localNSMap){ | ||
domBuilder.endPrefixMapping(prefix) ; | ||
} | ||
} | ||
end++; | ||
break; | ||
// end elment | ||
case '?':// <?...?> | ||
locator&&position(i); | ||
end = parseInstruction(source,i,domBuilder); | ||
break; | ||
case '!':// <!doctype,<![CDATA,<!-- | ||
locator&&position(i); | ||
end = parseDCC(source,i,domBuilder,errorHandler); | ||
break; | ||
default: | ||
try{ | ||
locator&&position(i); | ||
locator&&position(tagStart); | ||
@@ -134,13 +136,15 @@ var el = new ElementAttributes(); | ||
//elStartEnd | ||
var end = parseElementStartPart(source,i,el,entityReplacer,errorHandler); | ||
var end = parseElementStartPart(source,tagStart,el,entityReplacer,errorHandler); | ||
var len = el.length; | ||
//position fixed | ||
if(len && locator){ | ||
var backup = copyLocator(locator,{}); | ||
for(var i = 0;i<len;i++){ | ||
var a = el[i]; | ||
position(a.offset); | ||
a.offset = copyLocator(locator,{}); | ||
if(locator){ | ||
if(len){ | ||
//attribute position fixed | ||
for(var i = 0;i<len;i++){ | ||
var a = el[i]; | ||
position(a.offset); | ||
a.offset = copyLocator(locator,{}); | ||
} | ||
} | ||
copyLocator(backup,locator); | ||
position(end); | ||
} | ||
@@ -161,13 +165,12 @@ if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){ | ||
} | ||
}catch(e){ | ||
errorHandler.error('element parse error: '+e); | ||
end = -1; | ||
} | ||
}catch(e){ | ||
errorHandler.error('element parse error: '+e); | ||
end = -1; | ||
} | ||
if(end<0){ | ||
if(end>start){ | ||
start = end; | ||
}else{ | ||
//TODO: 这里有可能sax回退,有位置错误风险 | ||
appendText(i+1); | ||
}else{ | ||
start = end; | ||
appendText(Math.max(tagStart,start)+1); | ||
} | ||
@@ -180,3 +183,2 @@ } | ||
return t; | ||
} | ||
@@ -183,0 +185,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
65130
1907