You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					382 lines
				
				13 KiB
			
		
		
			
		
	
	
					382 lines
				
				13 KiB
			| 
											3 years ago
										 | // Generated by CoffeeScript 1.12.7
 | ||
|  | (function() { | ||
|  |   "use strict"; | ||
|  |   var bom, defaults, events, isEmpty, processItem, processors, sax, setImmediate, | ||
|  |     bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, | ||
|  |     extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, | ||
|  |     hasProp = {}.hasOwnProperty; | ||
|  | 
 | ||
|  |   sax = require('sax'); | ||
|  | 
 | ||
|  |   events = require('events'); | ||
|  | 
 | ||
|  |   bom = require('./bom'); | ||
|  | 
 | ||
|  |   processors = require('./processors'); | ||
|  | 
 | ||
|  |   setImmediate = require('timers').setImmediate; | ||
|  | 
 | ||
|  |   defaults = require('./defaults').defaults; | ||
|  | 
 | ||
|  |   isEmpty = function(thing) { | ||
|  |     return typeof thing === "object" && (thing != null) && Object.keys(thing).length === 0; | ||
|  |   }; | ||
|  | 
 | ||
|  |   processItem = function(processors, item, key) { | ||
|  |     var i, len, process; | ||
|  |     for (i = 0, len = processors.length; i < len; i++) { | ||
|  |       process = processors[i]; | ||
|  |       item = process(item, key); | ||
|  |     } | ||
|  |     return item; | ||
|  |   }; | ||
|  | 
 | ||
|  |   exports.Parser = (function(superClass) { | ||
|  |     extend(Parser, superClass); | ||
|  | 
 | ||
|  |     function Parser(opts) { | ||
|  |       this.parseStringPromise = bind(this.parseStringPromise, this); | ||
|  |       this.parseString = bind(this.parseString, this); | ||
|  |       this.reset = bind(this.reset, this); | ||
|  |       this.assignOrPush = bind(this.assignOrPush, this); | ||
|  |       this.processAsync = bind(this.processAsync, this); | ||
|  |       var key, ref, value; | ||
|  |       if (!(this instanceof exports.Parser)) { | ||
|  |         return new exports.Parser(opts); | ||
|  |       } | ||
|  |       this.options = {}; | ||
|  |       ref = defaults["0.2"]; | ||
|  |       for (key in ref) { | ||
|  |         if (!hasProp.call(ref, key)) continue; | ||
|  |         value = ref[key]; | ||
|  |         this.options[key] = value; | ||
|  |       } | ||
|  |       for (key in opts) { | ||
|  |         if (!hasProp.call(opts, key)) continue; | ||
|  |         value = opts[key]; | ||
|  |         this.options[key] = value; | ||
|  |       } | ||
|  |       if (this.options.xmlns) { | ||
|  |         this.options.xmlnskey = this.options.attrkey + "ns"; | ||
|  |       } | ||
|  |       if (this.options.normalizeTags) { | ||
|  |         if (!this.options.tagNameProcessors) { | ||
|  |           this.options.tagNameProcessors = []; | ||
|  |         } | ||
|  |         this.options.tagNameProcessors.unshift(processors.normalize); | ||
|  |       } | ||
|  |       this.reset(); | ||
|  |     } | ||
|  | 
 | ||
|  |     Parser.prototype.processAsync = function() { | ||
|  |       var chunk, err; | ||
|  |       try { | ||
|  |         if (this.remaining.length <= this.options.chunkSize) { | ||
|  |           chunk = this.remaining; | ||
|  |           this.remaining = ''; | ||
|  |           this.saxParser = this.saxParser.write(chunk); | ||
|  |           return this.saxParser.close(); | ||
|  |         } else { | ||
|  |           chunk = this.remaining.substr(0, this.options.chunkSize); | ||
|  |           this.remaining = this.remaining.substr(this.options.chunkSize, this.remaining.length); | ||
|  |           this.saxParser = this.saxParser.write(chunk); | ||
|  |           return setImmediate(this.processAsync); | ||
|  |         } | ||
|  |       } catch (error1) { | ||
|  |         err = error1; | ||
|  |         if (!this.saxParser.errThrown) { | ||
|  |           this.saxParser.errThrown = true; | ||
|  |           return this.emit(err); | ||
|  |         } | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     Parser.prototype.assignOrPush = function(obj, key, newValue) { | ||
|  |       if (!(key in obj)) { | ||
|  |         if (!this.options.explicitArray) { | ||
|  |           return obj[key] = newValue; | ||
|  |         } else { | ||
|  |           return obj[key] = [newValue]; | ||
|  |         } | ||
|  |       } else { | ||
|  |         if (!(obj[key] instanceof Array)) { | ||
|  |           obj[key] = [obj[key]]; | ||
|  |         } | ||
|  |         return obj[key].push(newValue); | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     Parser.prototype.reset = function() { | ||
|  |       var attrkey, charkey, ontext, stack; | ||
|  |       this.removeAllListeners(); | ||
|  |       this.saxParser = sax.parser(this.options.strict, { | ||
|  |         trim: false, | ||
|  |         normalize: false, | ||
|  |         xmlns: this.options.xmlns | ||
|  |       }); | ||
|  |       this.saxParser.errThrown = false; | ||
|  |       this.saxParser.onerror = (function(_this) { | ||
|  |         return function(error) { | ||
|  |           _this.saxParser.resume(); | ||
|  |           if (!_this.saxParser.errThrown) { | ||
|  |             _this.saxParser.errThrown = true; | ||
|  |             return _this.emit("error", error); | ||
|  |           } | ||
|  |         }; | ||
|  |       })(this); | ||
|  |       this.saxParser.onend = (function(_this) { | ||
|  |         return function() { | ||
|  |           if (!_this.saxParser.ended) { | ||
|  |             _this.saxParser.ended = true; | ||
|  |             return _this.emit("end", _this.resultObject); | ||
|  |           } | ||
|  |         }; | ||
|  |       })(this); | ||
|  |       this.saxParser.ended = false; | ||
|  |       this.EXPLICIT_CHARKEY = this.options.explicitCharkey; | ||
|  |       this.resultObject = null; | ||
|  |       stack = []; | ||
|  |       attrkey = this.options.attrkey; | ||
|  |       charkey = this.options.charkey; | ||
|  |       this.saxParser.onopentag = (function(_this) { | ||
|  |         return function(node) { | ||
|  |           var key, newValue, obj, processedKey, ref; | ||
|  |           obj = {}; | ||
|  |           obj[charkey] = ""; | ||
|  |           if (!_this.options.ignoreAttrs) { | ||
|  |             ref = node.attributes; | ||
|  |             for (key in ref) { | ||
|  |               if (!hasProp.call(ref, key)) continue; | ||
|  |               if (!(attrkey in obj) && !_this.options.mergeAttrs) { | ||
|  |                 obj[attrkey] = {}; | ||
|  |               } | ||
|  |               newValue = _this.options.attrValueProcessors ? processItem(_this.options.attrValueProcessors, node.attributes[key], key) : node.attributes[key]; | ||
|  |               processedKey = _this.options.attrNameProcessors ? processItem(_this.options.attrNameProcessors, key) : key; | ||
|  |               if (_this.options.mergeAttrs) { | ||
|  |                 _this.assignOrPush(obj, processedKey, newValue); | ||
|  |               } else { | ||
|  |                 obj[attrkey][processedKey] = newValue; | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |           obj["#name"] = _this.options.tagNameProcessors ? processItem(_this.options.tagNameProcessors, node.name) : node.name; | ||
|  |           if (_this.options.xmlns) { | ||
|  |             obj[_this.options.xmlnskey] = { | ||
|  |               uri: node.uri, | ||
|  |               local: node.local | ||
|  |             }; | ||
|  |           } | ||
|  |           return stack.push(obj); | ||
|  |         }; | ||
|  |       })(this); | ||
|  |       this.saxParser.onclosetag = (function(_this) { | ||
|  |         return function() { | ||
|  |           var cdata, emptyStr, key, node, nodeName, obj, objClone, old, s, xpath; | ||
|  |           obj = stack.pop(); | ||
|  |           nodeName = obj["#name"]; | ||
|  |           if (!_this.options.explicitChildren || !_this.options.preserveChildrenOrder) { | ||
|  |             delete obj["#name"]; | ||
|  |           } | ||
|  |           if (obj.cdata === true) { | ||
|  |             cdata = obj.cdata; | ||
|  |             delete obj.cdata; | ||
|  |           } | ||
|  |           s = stack[stack.length - 1]; | ||
|  |           if (obj[charkey].match(/^\s*$/) && !cdata) { | ||
|  |             emptyStr = obj[charkey]; | ||
|  |             delete obj[charkey]; | ||
|  |           } else { | ||
|  |             if (_this.options.trim) { | ||
|  |               obj[charkey] = obj[charkey].trim(); | ||
|  |             } | ||
|  |             if (_this.options.normalize) { | ||
|  |               obj[charkey] = obj[charkey].replace(/\s{2,}/g, " ").trim(); | ||
|  |             } | ||
|  |             obj[charkey] = _this.options.valueProcessors ? processItem(_this.options.valueProcessors, obj[charkey], nodeName) : obj[charkey]; | ||
|  |             if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { | ||
|  |               obj = obj[charkey]; | ||
|  |             } | ||
|  |           } | ||
|  |           if (isEmpty(obj)) { | ||
|  |             obj = _this.options.emptyTag !== '' ? _this.options.emptyTag : emptyStr; | ||
|  |           } | ||
|  |           if (_this.options.validator != null) { | ||
|  |             xpath = "/" + ((function() { | ||
|  |               var i, len, results; | ||
|  |               results = []; | ||
|  |               for (i = 0, len = stack.length; i < len; i++) { | ||
|  |                 node = stack[i]; | ||
|  |                 results.push(node["#name"]); | ||
|  |               } | ||
|  |               return results; | ||
|  |             })()).concat(nodeName).join("/"); | ||
|  |             (function() { | ||
|  |               var err; | ||
|  |               try { | ||
|  |                 return obj = _this.options.validator(xpath, s && s[nodeName], obj); | ||
|  |               } catch (error1) { | ||
|  |                 err = error1; | ||
|  |                 return _this.emit("error", err); | ||
|  |               } | ||
|  |             })(); | ||
|  |           } | ||
|  |           if (_this.options.explicitChildren && !_this.options.mergeAttrs && typeof obj === 'object') { | ||
|  |             if (!_this.options.preserveChildrenOrder) { | ||
|  |               node = {}; | ||
|  |               if (_this.options.attrkey in obj) { | ||
|  |                 node[_this.options.attrkey] = obj[_this.options.attrkey]; | ||
|  |                 delete obj[_this.options.attrkey]; | ||
|  |               } | ||
|  |               if (!_this.options.charsAsChildren && _this.options.charkey in obj) { | ||
|  |                 node[_this.options.charkey] = obj[_this.options.charkey]; | ||
|  |                 delete obj[_this.options.charkey]; | ||
|  |               } | ||
|  |               if (Object.getOwnPropertyNames(obj).length > 0) { | ||
|  |                 node[_this.options.childkey] = obj; | ||
|  |               } | ||
|  |               obj = node; | ||
|  |             } else if (s) { | ||
|  |               s[_this.options.childkey] = s[_this.options.childkey] || []; | ||
|  |               objClone = {}; | ||
|  |               for (key in obj) { | ||
|  |                 if (!hasProp.call(obj, key)) continue; | ||
|  |                 objClone[key] = obj[key]; | ||
|  |               } | ||
|  |               s[_this.options.childkey].push(objClone); | ||
|  |               delete obj["#name"]; | ||
|  |               if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { | ||
|  |                 obj = obj[charkey]; | ||
|  |               } | ||
|  |             } | ||
|  |           } | ||
|  |           if (stack.length > 0) { | ||
|  |             return _this.assignOrPush(s, nodeName, obj); | ||
|  |           } else { | ||
|  |             if (_this.options.explicitRoot) { | ||
|  |               old = obj; | ||
|  |               obj = {}; | ||
|  |               obj[nodeName] = old; | ||
|  |             } | ||
|  |             _this.resultObject = obj; | ||
|  |             _this.saxParser.ended = true; | ||
|  |             return _this.emit("end", _this.resultObject); | ||
|  |           } | ||
|  |         }; | ||
|  |       })(this); | ||
|  |       ontext = (function(_this) { | ||
|  |         return function(text) { | ||
|  |           var charChild, s; | ||
|  |           s = stack[stack.length - 1]; | ||
|  |           if (s) { | ||
|  |             s[charkey] += text; | ||
|  |             if (_this.options.explicitChildren && _this.options.preserveChildrenOrder && _this.options.charsAsChildren && (_this.options.includeWhiteChars || text.replace(/\\n/g, '').trim() !== '')) { | ||
|  |               s[_this.options.childkey] = s[_this.options.childkey] || []; | ||
|  |               charChild = { | ||
|  |                 '#name': '__text__' | ||
|  |               }; | ||
|  |               charChild[charkey] = text; | ||
|  |               if (_this.options.normalize) { | ||
|  |                 charChild[charkey] = charChild[charkey].replace(/\s{2,}/g, " ").trim(); | ||
|  |               } | ||
|  |               s[_this.options.childkey].push(charChild); | ||
|  |             } | ||
|  |             return s; | ||
|  |           } | ||
|  |         }; | ||
|  |       })(this); | ||
|  |       this.saxParser.ontext = ontext; | ||
|  |       return this.saxParser.oncdata = (function(_this) { | ||
|  |         return function(text) { | ||
|  |           var s; | ||
|  |           s = ontext(text); | ||
|  |           if (s) { | ||
|  |             return s.cdata = true; | ||
|  |           } | ||
|  |         }; | ||
|  |       })(this); | ||
|  |     }; | ||
|  | 
 | ||
|  |     Parser.prototype.parseString = function(str, cb) { | ||
|  |       var err; | ||
|  |       if ((cb != null) && typeof cb === "function") { | ||
|  |         this.on("end", function(result) { | ||
|  |           this.reset(); | ||
|  |           return cb(null, result); | ||
|  |         }); | ||
|  |         this.on("error", function(err) { | ||
|  |           this.reset(); | ||
|  |           return cb(err); | ||
|  |         }); | ||
|  |       } | ||
|  |       try { | ||
|  |         str = str.toString(); | ||
|  |         if (str.trim() === '') { | ||
|  |           this.emit("end", null); | ||
|  |           return true; | ||
|  |         } | ||
|  |         str = bom.stripBOM(str); | ||
|  |         if (this.options.async) { | ||
|  |           this.remaining = str; | ||
|  |           setImmediate(this.processAsync); | ||
|  |           return this.saxParser; | ||
|  |         } | ||
|  |         return this.saxParser.write(str).close(); | ||
|  |       } catch (error1) { | ||
|  |         err = error1; | ||
|  |         if (!(this.saxParser.errThrown || this.saxParser.ended)) { | ||
|  |           this.emit('error', err); | ||
|  |           return this.saxParser.errThrown = true; | ||
|  |         } else if (this.saxParser.ended) { | ||
|  |           throw err; | ||
|  |         } | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     Parser.prototype.parseStringPromise = function(str) { | ||
|  |       return new Promise((function(_this) { | ||
|  |         return function(resolve, reject) { | ||
|  |           return _this.parseString(str, function(err, value) { | ||
|  |             if (err) { | ||
|  |               return reject(err); | ||
|  |             } else { | ||
|  |               return resolve(value); | ||
|  |             } | ||
|  |           }); | ||
|  |         }; | ||
|  |       })(this)); | ||
|  |     }; | ||
|  | 
 | ||
|  |     return Parser; | ||
|  | 
 | ||
|  |   })(events); | ||
|  | 
 | ||
|  |   exports.parseString = function(str, a, b) { | ||
|  |     var cb, options, parser; | ||
|  |     if (b != null) { | ||
|  |       if (typeof b === 'function') { | ||
|  |         cb = b; | ||
|  |       } | ||
|  |       if (typeof a === 'object') { | ||
|  |         options = a; | ||
|  |       } | ||
|  |     } else { | ||
|  |       if (typeof a === 'function') { | ||
|  |         cb = a; | ||
|  |       } | ||
|  |       options = {}; | ||
|  |     } | ||
|  |     parser = new exports.Parser(options); | ||
|  |     return parser.parseString(str, cb); | ||
|  |   }; | ||
|  | 
 | ||
|  |   exports.parseStringPromise = function(str, a) { | ||
|  |     var options, parser; | ||
|  |     if (typeof a === 'object') { | ||
|  |       options = a; | ||
|  |     } | ||
|  |     parser = new exports.Parser(options); | ||
|  |     return parser.parseStringPromise(str); | ||
|  |   }; | ||
|  | 
 | ||
|  | }).call(this); |