Update update_deps.js for xmldom

This commit is contained in:
Smirnov O. A 2015-01-14 14:32:26 +03:00
commit fb41c6ce4e
4 changed files with 60 additions and 127 deletions

View file

@ -1,8 +1,8 @@
define(function(require, exports, module) {
'use strict';
'use strict';
var XMLReader = require('./sax'),
DOMImplementation = require('./dom');
var XMLReader = require('./sax'),
DOMImplementation = require('./dom');
function DOMParser(options){
this.options = options ||{locator:{}};
@ -89,7 +89,7 @@ function position(locator,node){
*/
DOMHandler.prototype = {
startDocument : function() {
this.document = DOMImplementation.createDocument(null, null, null);
this.document = new DOMImplementation().createDocument(null, null, null);
if (this.locator) {
this.document.documentURI = this.locator.systemId;
}
@ -111,9 +111,6 @@ DOMHandler.prototype = {
position(attr.getOffset(1),attr)
}
attr.value = attr.nodeValue = value;
// Fork : сохраняем тип кавычки (" или ')
if (attrs[i].quotSymbol){ attr.quotSymbol = attrs[i].quotSymbol; }
// endFork
el.setAttributeNode(attr)
}
},
@ -257,6 +254,7 @@ function appendElement (hander,node) {
}//appendChild and setAttributeNS are preformance key
return {
DOMParser: DOMParser
};
});
DOMParser: DOMParser
};
});

View file

@ -269,12 +269,12 @@ DOMImplementation.prototype = {
// Introduced in DOM Level 2:
createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
var doc = new Document();
doc.implementation = this;
doc.childNodes = new NodeList();
doc.doctype = doctype;
if(doctype){
doc.appendChild(doctype);
}
doc.implementation = this;
doc.childNodes = new NodeList();
if(qualifiedName){
var root = doc.createElementNS(namespaceURI,qualifiedName);
doc.appendChild(root);
@ -407,25 +407,9 @@ function _xmlEncoder(c){
c == '>' && '>' ||
c == '&' && '&' ||
c == '"' && '"' ||
// Fork : сохраняем тип кавычки (" или ')
c == '\'' && ''' ||
// endFork
'&#'+c.charCodeAt()+';'
}
// Fork : не реплейсим символьные коды
function replaceSpecialSymbols(string, symbolRegExp){
var newString = string.replace(symbolRegExp,_xmlEncoder);
// нужно заменить & на & кроме случаев, когда & - начало символьного кода (напр., " или  )
// заменяем в несколько этапов, сначала заменяем символьные коды на спец. конструкцию
newString = newString.replace(/&(\w+|#\d+);/g,'~HtmlCode::$1::endHtmlCode~');
// после заменяем все &, которые не являются началом символьного кода
newString = newString.replace(/&/g,'&');
// меняем спец. конструкции обратно на символьные коды
newString = newString.replace(/~HtmlCode::(\w+|#\d+)::endHtmlCode~/g,'&$1;');
return newString;
}
// endFork
copy(NodeType,Node);
copy(NodeType,Node.prototype);
@ -777,7 +761,7 @@ Element.prototype = {
},
setAttributeNS : function(namespaceURI, qualifiedName, value){
var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
attr.value = attr.nodeValue = value;
attr.value = attr.nodeValue = "" + value;
this.setAttributeNode(attr)
},
getAttributeNodeNS : function(namespaceURI, localName){
@ -799,7 +783,7 @@ Element.prototype = {
return new LiveNodeList(this,function(base){
var ls = [];
_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);
}
});
@ -935,14 +919,12 @@ function serializeToString(node,buf){
var len = attrs.length;
var child = node.firstChild;
var nodeName = node.tagName;
// Fork : считаем, что у нас HTML-документ
var isHTML = true;//htmlns === node.namespaceURI
// endFork
var isHTML = htmlns === node.namespaceURI
buf.push('<',nodeName);
for(var i=0;i<len;i++){
serializeToString(attrs.item(i),buf,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('>');
//if is cdata child node
if(isHTML && /^script$/i.test(nodeName)){
@ -969,18 +951,9 @@ function serializeToString(node,buf){
}
return;
case ATTRIBUTE_NODE:
// Fork : сохраняем тип кавычки (" или ') + аттрибут config всегда должен сохранять значение в одинарных кавычках ( config='{"caption":"Кнопка"}' )
if (node.name === 'config' || (node.quotSymbol === '\'')){
return buf.push(' ', node.name, '=\'', replaceSpecialSymbols(node.value + '', /[<']/g), '\'');
}
// endFork
// Fork : не реплейсим символьные коды
return buf.push(' ',node.name,'="',replaceSpecialSymbols(node.value + '', /[<"]/g),'"');
// endFork
return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
case TEXT_NODE:
// Fork : не реплейсим символьные коды
return buf.push(replaceSpecialSymbols(node.data,/[<]/g));
// endFork
return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
case CDATA_SECTION_NODE:
return buf.push( '<![CDATA[',node.data,']]>');
case COMMENT_NODE:
@ -1106,45 +1079,6 @@ function __set__(object,key,value){
//do dynamic
try{
if(Object.defineProperty){
// Fork : добавлены проперти innerHTML и outerHTML
Object.defineProperty(Element.prototype, 'innerHTML', {
get: function () {
var res = [],
child = this.firstChild;
while(child){
res.push(child.toString());
child = child.nextSibling;
}
return res.join('');
},
set: function (value) {
var
parser = require('js!genie.DocumentParser/resources/xmldom/dom-parser'),
doc, ownNode;
try {
doc = parser.parseFromString("<div>" + value + "</div>", 'text/html');
} catch (e) {
console.log("Error while parsing innerHTML " + e);
}
if (doc) {
ownNode = this.ownerDocument.importNode(doc.documentElement, true);
while (this.firstChild) {
this.removeChild(this.firstChild);
}
while (ownNode.firstChild) {
this.appendChild(ownNode.firstChild);
}
}
}
});
Object.defineProperty(Element.prototype, 'outerHTML', {
get: function () {
return this.toString();
}
});
// endFork
Object.defineProperty(LiveNodeList.prototype,'length',{
get:function(){
_updateLiveList(this);
@ -1200,5 +1134,5 @@ try{
}catch(e){//ie8
}
return new DOMImplementation();
});
return DOMImplementation;
});

View file

@ -1,5 +1,4 @@
define(function(require, exports, module) {
'use strict';
//[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]
@ -61,9 +60,7 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
}
}
function appendText(end){//has some bugs
// Fork : не реплейсим символьные коды
var xt = source.substring(start,end);//.replace(/&#?\w+;/g,entityReplacer);
// endFork
var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
locator&&position(start);
domBuilder.characters(xt,0,end-start);
start = end
@ -103,18 +100,19 @@ function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
case '/':
var end = source.indexOf('>',i+3);
var tagName = source.substring(i+2,end);
if (parseStack.length > 1) {
var config = parseStack.pop();
} else {
errorHandler.fatalError("end tag name not found for: "+tagName);
break;
}
var config;
if (parseStack.length > 1) {
config = parseStack.pop();
} else {
errorHandler.fatalError("end tag name not found for: "+tagName);
break;
}
var localNSMap = config.localNSMap;
if(config.tagName != tagName){
errorHandler.fatalError("end tag name: "+tagName+" does not match the current start tagName:"+config.tagName);
}
domBuilder.endElement(config.uri,config.localName,tagName);
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) ;
@ -214,25 +212,17 @@ function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
start = p+1;
p = source.indexOf(c,start)
if(p>0){
// Fork : не реплейсим символьные коды
value = source.slice(start,p);//.replace(/&#?\w+;/g,entityReplacer);
// endFork
// Fork : сохраняем тип кавычки (" или ')
el.add(attrName,value,start-1, c);
// endFork
value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
el.add(attrName,value,start-1);
s = S_E;
}else{
//fatalError: no end quot match
throw new Error('attribute value no end \''+c+'\' match');
}
}else if(s == S_V){
// Fork : не реплейсим символьные коды
value = source.slice(start,p);//.replace(/&#?\w+;/g,entityReplacer);
// endFork
value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
//console.log(attrName,value,start,p)
// Fork : сохраняем тип кавычки (" или ')
el.add(attrName,value,start, c);
// endFork
el.add(attrName,value,start);
//console.dir(el)
errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
start = p+1;
@ -284,9 +274,7 @@ function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
}
if(s == S_V){
errorHandler.warning('attribute "'+value+'" missed quot(")!!');
// Fork : не реплейсим символьные коды
el.add(attrName,value/*.replace(/&#?\w+;/g,entityReplacer)*/,start)
// endFork
el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
}else{
errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
el.add(value,value,start)
@ -312,9 +300,7 @@ function parseElementStartPart(source,start,el,entityReplacer,errorHandler){
s = S_ATTR_S;
break;
case S_V:
// Fork : не реплейсим символьные коды
var value = source.slice(start,p);//.replace(/&#?\w+;/g,entityReplacer);
// endFork
var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
errorHandler.warning('attribute "'+value+'" missed quot(")!!');
el.add(attrName,value,start)
case S_E:
@ -448,9 +434,7 @@ function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBui
return elEndStart;
//}
}//}else{//text area
// Fork : не реплейсим символьные коды
// text = text.replace(/&#?\w+;/g,entityReplacer);
// endFork
text = text.replace(/&#?\w+;/g,entityReplacer);
domBuilder.characters(text,0,text.length);
return elEndStart;
//}
@ -547,14 +531,12 @@ ElementAttributes.prototype = {
}
this.tagName = tagName
},
// Fork : сохраняем тип кавычки (" или ')
add:function(qName,value,offset, quotSymbol){
add:function(qName,value,offset){
if(!tagNamePattern.test(qName)){
throw new Error('invalid attribute:'+qName)
}
this[this.length++] = {qName:qName,value:value,offset:offset,quotSymbol:quotSymbol}
this[this.length++] = {qName:qName,value:value,offset:offset}
},
// endFork
length:0,
getLocalName:function(i){return this[i].localName},
getOffset:function(i){return this[i].offset},
@ -605,4 +587,6 @@ function split(source,start){
}
return XMLReader;
});
});

View file

@ -204,7 +204,24 @@ var deps = {
});
}
}
}
},
xmldom: {
fetch: function() {
var rootHref = "https://raw.githubusercontent.com/iDeBugger/xmldom/master/"
var fileMap = {
"sax.js": "mode/xml/sax.js",
"dom-parser.js": "mode/xml/dom-parser.js",
"dom.js": "mode/xml/dom.js"
};
async.forEach(Object.keys(fileMap), function(x, next) {
download(rootHref + x, function(e, d) {
fs.writeFile(rootDir + fileMap[x], d, next)
})
}, function() {
console.log("XmlDOM updating done")
});
}
},
};
var download = function(href, callback) {