diff --git a/lib/ace/mode/xml/dom-parser.js b/lib/ace/mode/xml/dom-parser.js index 669cd985..c99ded42 100644 --- a/lib/ace/mode/xml/dom-parser.js +++ b/lib/ace/mode/xml/dom-parser.js @@ -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 - }; -}); \ No newline at end of file + DOMParser: DOMParser + }; +}); + diff --git a/lib/ace/mode/xml/dom.js b/lib/ace/mode/xml/dom.js index 8845f35c..f843e726 100644 --- a/lib/ace/mode/xml/dom.js +++ b/lib/ace/mode/xml/dom.js @@ -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'); //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( ''); 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("
" + value + "
", '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(); -}); \ No newline at end of file +return DOMImplementation; +}); diff --git a/lib/ace/mode/xml/sax.js b/lib/ace/mode/xml/sax.js index 952e6979..1fde0540 100644 --- a/lib/ace/mode/xml/sax.js +++ b/lib/ace/mode/xml/sax.js @@ -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; -}); \ No newline at end of file +}); + + diff --git a/tool/update_deps.js b/tool/update_deps.js index d02581ae..c3648d9c 100644 --- a/tool/update_deps.js +++ b/tool/update_deps.js @@ -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) {