10767 lines
842 KiB
JavaScript
10767 lines
842 KiB
JavaScript
|
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
|||
|
/*!
|
|||
|
* The buffer module from node.js, for the browser.
|
|||
|
*
|
|||
|
* @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
|
|||
|
* @license MIT
|
|||
|
*/
|
|||
|
|
|||
|
var base64 = require('base64-js')
|
|||
|
var ieee754 = require('ieee754')
|
|||
|
var isArray = require('is-array')
|
|||
|
|
|||
|
exports.Buffer = Buffer
|
|||
|
exports.SlowBuffer = Buffer
|
|||
|
exports.INSPECT_MAX_BYTES = 50
|
|||
|
Buffer.poolSize = 8192 // not used by this implementation
|
|||
|
|
|||
|
var kMaxLength = 0x3fffffff
|
|||
|
|
|||
|
/**
|
|||
|
* If `Buffer.TYPED_ARRAY_SUPPORT`:
|
|||
|
* === true Use Uint8Array implementation (fastest)
|
|||
|
* === false Use Object implementation (most compatible, even IE6)
|
|||
|
*
|
|||
|
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
|
|||
|
* Opera 11.6+, iOS 4.2+.
|
|||
|
*
|
|||
|
* Note:
|
|||
|
*
|
|||
|
* - Implementation must support adding new properties to `Uint8Array` instances.
|
|||
|
* Firefox 4-29 lacked support, fixed in Firefox 30+.
|
|||
|
* See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
|
|||
|
*
|
|||
|
* - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
|
|||
|
*
|
|||
|
* - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
|
|||
|
* incorrect length in some situations.
|
|||
|
*
|
|||
|
* We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will
|
|||
|
* get the Object implementation, which is slower but will work correctly.
|
|||
|
*/
|
|||
|
Buffer.TYPED_ARRAY_SUPPORT = (function () {
|
|||
|
try {
|
|||
|
var buf = new ArrayBuffer(0)
|
|||
|
var arr = new Uint8Array(buf)
|
|||
|
arr.foo = function () { return 42 }
|
|||
|
return 42 === arr.foo() && // typed array instances can be augmented
|
|||
|
typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
|
|||
|
new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
|
|||
|
} catch (e) {
|
|||
|
return false
|
|||
|
}
|
|||
|
})()
|
|||
|
|
|||
|
/**
|
|||
|
* Class: Buffer
|
|||
|
* =============
|
|||
|
*
|
|||
|
* The Buffer constructor returns instances of `Uint8Array` that are augmented
|
|||
|
* with function properties for all the node `Buffer` API functions. We use
|
|||
|
* `Uint8Array` so that square bracket notation works as expected -- it returns
|
|||
|
* a single octet.
|
|||
|
*
|
|||
|
* By augmenting the instances, we can avoid modifying the `Uint8Array`
|
|||
|
* prototype.
|
|||
|
*/
|
|||
|
function Buffer (subject, encoding, noZero) {
|
|||
|
if (!(this instanceof Buffer))
|
|||
|
return new Buffer(subject, encoding, noZero)
|
|||
|
|
|||
|
var type = typeof subject
|
|||
|
|
|||
|
// Find the length
|
|||
|
var length
|
|||
|
if (type === 'number')
|
|||
|
length = subject > 0 ? subject >>> 0 : 0
|
|||
|
else if (type === 'string') {
|
|||
|
if (encoding === 'base64')
|
|||
|
subject = base64clean(subject)
|
|||
|
length = Buffer.byteLength(subject, encoding)
|
|||
|
} else if (type === 'object' && subject !== null) { // assume object is array-like
|
|||
|
if (subject.type === 'Buffer' && isArray(subject.data))
|
|||
|
subject = subject.data
|
|||
|
length = +subject.length > 0 ? Math.floor(+subject.length) : 0
|
|||
|
} else
|
|||
|
throw new TypeError('must start with number, buffer, array or string')
|
|||
|
|
|||
|
if (this.length > kMaxLength)
|
|||
|
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
|
|||
|
'size: 0x' + kMaxLength.toString(16) + ' bytes')
|
|||
|
|
|||
|
var buf
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
// Preferred: Return an augmented `Uint8Array` instance for best performance
|
|||
|
buf = Buffer._augment(new Uint8Array(length))
|
|||
|
} else {
|
|||
|
// Fallback: Return THIS instance of Buffer (created by `new`)
|
|||
|
buf = this
|
|||
|
buf.length = length
|
|||
|
buf._isBuffer = true
|
|||
|
}
|
|||
|
|
|||
|
var i
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') {
|
|||
|
// Speed optimization -- use set if we're copying from a typed array
|
|||
|
buf._set(subject)
|
|||
|
} else if (isArrayish(subject)) {
|
|||
|
// Treat array-ish objects as a byte array
|
|||
|
if (Buffer.isBuffer(subject)) {
|
|||
|
for (i = 0; i < length; i++)
|
|||
|
buf[i] = subject.readUInt8(i)
|
|||
|
} else {
|
|||
|
for (i = 0; i < length; i++)
|
|||
|
buf[i] = ((subject[i] % 256) + 256) % 256
|
|||
|
}
|
|||
|
} else if (type === 'string') {
|
|||
|
buf.write(subject, 0, encoding)
|
|||
|
} else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT && !noZero) {
|
|||
|
for (i = 0; i < length; i++) {
|
|||
|
buf[i] = 0
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return buf
|
|||
|
}
|
|||
|
|
|||
|
Buffer.isBuffer = function (b) {
|
|||
|
return !!(b != null && b._isBuffer)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.compare = function (a, b) {
|
|||
|
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b))
|
|||
|
throw new TypeError('Arguments must be Buffers')
|
|||
|
|
|||
|
var x = a.length
|
|||
|
var y = b.length
|
|||
|
for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {}
|
|||
|
if (i !== len) {
|
|||
|
x = a[i]
|
|||
|
y = b[i]
|
|||
|
}
|
|||
|
if (x < y) return -1
|
|||
|
if (y < x) return 1
|
|||
|
return 0
|
|||
|
}
|
|||
|
|
|||
|
Buffer.isEncoding = function (encoding) {
|
|||
|
switch (String(encoding).toLowerCase()) {
|
|||
|
case 'hex':
|
|||
|
case 'utf8':
|
|||
|
case 'utf-8':
|
|||
|
case 'ascii':
|
|||
|
case 'binary':
|
|||
|
case 'base64':
|
|||
|
case 'raw':
|
|||
|
case 'ucs2':
|
|||
|
case 'ucs-2':
|
|||
|
case 'utf16le':
|
|||
|
case 'utf-16le':
|
|||
|
return true
|
|||
|
default:
|
|||
|
return false
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Buffer.concat = function (list, totalLength) {
|
|||
|
if (!isArray(list)) throw new TypeError('Usage: Buffer.concat(list[, length])')
|
|||
|
|
|||
|
if (list.length === 0) {
|
|||
|
return new Buffer(0)
|
|||
|
} else if (list.length === 1) {
|
|||
|
return list[0]
|
|||
|
}
|
|||
|
|
|||
|
var i
|
|||
|
if (totalLength === undefined) {
|
|||
|
totalLength = 0
|
|||
|
for (i = 0; i < list.length; i++) {
|
|||
|
totalLength += list[i].length
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var buf = new Buffer(totalLength)
|
|||
|
var pos = 0
|
|||
|
for (i = 0; i < list.length; i++) {
|
|||
|
var item = list[i]
|
|||
|
item.copy(buf, pos)
|
|||
|
pos += item.length
|
|||
|
}
|
|||
|
return buf
|
|||
|
}
|
|||
|
|
|||
|
Buffer.byteLength = function (str, encoding) {
|
|||
|
var ret
|
|||
|
str = str + ''
|
|||
|
switch (encoding || 'utf8') {
|
|||
|
case 'ascii':
|
|||
|
case 'binary':
|
|||
|
case 'raw':
|
|||
|
ret = str.length
|
|||
|
break
|
|||
|
case 'ucs2':
|
|||
|
case 'ucs-2':
|
|||
|
case 'utf16le':
|
|||
|
case 'utf-16le':
|
|||
|
ret = str.length * 2
|
|||
|
break
|
|||
|
case 'hex':
|
|||
|
ret = str.length >>> 1
|
|||
|
break
|
|||
|
case 'utf8':
|
|||
|
case 'utf-8':
|
|||
|
ret = utf8ToBytes(str).length
|
|||
|
break
|
|||
|
case 'base64':
|
|||
|
ret = base64ToBytes(str).length
|
|||
|
break
|
|||
|
default:
|
|||
|
ret = str.length
|
|||
|
}
|
|||
|
return ret
|
|||
|
}
|
|||
|
|
|||
|
// pre-set for values that may exist in the future
|
|||
|
Buffer.prototype.length = undefined
|
|||
|
Buffer.prototype.parent = undefined
|
|||
|
|
|||
|
// toString(encoding, start=0, end=buffer.length)
|
|||
|
Buffer.prototype.toString = function (encoding, start, end) {
|
|||
|
var loweredCase = false
|
|||
|
|
|||
|
start = start >>> 0
|
|||
|
end = end === undefined || end === Infinity ? this.length : end >>> 0
|
|||
|
|
|||
|
if (!encoding) encoding = 'utf8'
|
|||
|
if (start < 0) start = 0
|
|||
|
if (end > this.length) end = this.length
|
|||
|
if (end <= start) return ''
|
|||
|
|
|||
|
while (true) {
|
|||
|
switch (encoding) {
|
|||
|
case 'hex':
|
|||
|
return hexSlice(this, start, end)
|
|||
|
|
|||
|
case 'utf8':
|
|||
|
case 'utf-8':
|
|||
|
return utf8Slice(this, start, end)
|
|||
|
|
|||
|
case 'ascii':
|
|||
|
return asciiSlice(this, start, end)
|
|||
|
|
|||
|
case 'binary':
|
|||
|
return binarySlice(this, start, end)
|
|||
|
|
|||
|
case 'base64':
|
|||
|
return base64Slice(this, start, end)
|
|||
|
|
|||
|
case 'ucs2':
|
|||
|
case 'ucs-2':
|
|||
|
case 'utf16le':
|
|||
|
case 'utf-16le':
|
|||
|
return utf16leSlice(this, start, end)
|
|||
|
|
|||
|
default:
|
|||
|
if (loweredCase)
|
|||
|
throw new TypeError('Unknown encoding: ' + encoding)
|
|||
|
encoding = (encoding + '').toLowerCase()
|
|||
|
loweredCase = true
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.equals = function (b) {
|
|||
|
if(!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
|
|||
|
return Buffer.compare(this, b) === 0
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.inspect = function () {
|
|||
|
var str = ''
|
|||
|
var max = exports.INSPECT_MAX_BYTES
|
|||
|
if (this.length > 0) {
|
|||
|
str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
|
|||
|
if (this.length > max)
|
|||
|
str += ' ... '
|
|||
|
}
|
|||
|
return '<Buffer ' + str + '>'
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.compare = function (b) {
|
|||
|
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
|
|||
|
return Buffer.compare(this, b)
|
|||
|
}
|
|||
|
|
|||
|
// `get` will be removed in Node 0.13+
|
|||
|
Buffer.prototype.get = function (offset) {
|
|||
|
console.log('.get() is deprecated. Access using array indexes instead.')
|
|||
|
return this.readUInt8(offset)
|
|||
|
}
|
|||
|
|
|||
|
// `set` will be removed in Node 0.13+
|
|||
|
Buffer.prototype.set = function (v, offset) {
|
|||
|
console.log('.set() is deprecated. Access using array indexes instead.')
|
|||
|
return this.writeUInt8(v, offset)
|
|||
|
}
|
|||
|
|
|||
|
function hexWrite (buf, string, offset, length) {
|
|||
|
offset = Number(offset) || 0
|
|||
|
var remaining = buf.length - offset
|
|||
|
if (!length) {
|
|||
|
length = remaining
|
|||
|
} else {
|
|||
|
length = Number(length)
|
|||
|
if (length > remaining) {
|
|||
|
length = remaining
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// must be an even number of digits
|
|||
|
var strLen = string.length
|
|||
|
if (strLen % 2 !== 0) throw new Error('Invalid hex string')
|
|||
|
|
|||
|
if (length > strLen / 2) {
|
|||
|
length = strLen / 2
|
|||
|
}
|
|||
|
for (var i = 0; i < length; i++) {
|
|||
|
var byte = parseInt(string.substr(i * 2, 2), 16)
|
|||
|
if (isNaN(byte)) throw new Error('Invalid hex string')
|
|||
|
buf[offset + i] = byte
|
|||
|
}
|
|||
|
return i
|
|||
|
}
|
|||
|
|
|||
|
function utf8Write (buf, string, offset, length) {
|
|||
|
var charsWritten = blitBuffer(utf8ToBytes(string), buf, offset, length)
|
|||
|
return charsWritten
|
|||
|
}
|
|||
|
|
|||
|
function asciiWrite (buf, string, offset, length) {
|
|||
|
var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length)
|
|||
|
return charsWritten
|
|||
|
}
|
|||
|
|
|||
|
function binaryWrite (buf, string, offset, length) {
|
|||
|
return asciiWrite(buf, string, offset, length)
|
|||
|
}
|
|||
|
|
|||
|
function base64Write (buf, string, offset, length) {
|
|||
|
var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length)
|
|||
|
return charsWritten
|
|||
|
}
|
|||
|
|
|||
|
function utf16leWrite (buf, string, offset, length) {
|
|||
|
var charsWritten = blitBuffer(utf16leToBytes(string), buf, offset, length)
|
|||
|
return charsWritten
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.write = function (string, offset, length, encoding) {
|
|||
|
// Support both (string, offset, length, encoding)
|
|||
|
// and the legacy (string, encoding, offset, length)
|
|||
|
if (isFinite(offset)) {
|
|||
|
if (!isFinite(length)) {
|
|||
|
encoding = length
|
|||
|
length = undefined
|
|||
|
}
|
|||
|
} else { // legacy
|
|||
|
var swap = encoding
|
|||
|
encoding = offset
|
|||
|
offset = length
|
|||
|
length = swap
|
|||
|
}
|
|||
|
|
|||
|
offset = Number(offset) || 0
|
|||
|
var remaining = this.length - offset
|
|||
|
if (!length) {
|
|||
|
length = remaining
|
|||
|
} else {
|
|||
|
length = Number(length)
|
|||
|
if (length > remaining) {
|
|||
|
length = remaining
|
|||
|
}
|
|||
|
}
|
|||
|
encoding = String(encoding || 'utf8').toLowerCase()
|
|||
|
|
|||
|
var ret
|
|||
|
switch (encoding) {
|
|||
|
case 'hex':
|
|||
|
ret = hexWrite(this, string, offset, length)
|
|||
|
break
|
|||
|
case 'utf8':
|
|||
|
case 'utf-8':
|
|||
|
ret = utf8Write(this, string, offset, length)
|
|||
|
break
|
|||
|
case 'ascii':
|
|||
|
ret = asciiWrite(this, string, offset, length)
|
|||
|
break
|
|||
|
case 'binary':
|
|||
|
ret = binaryWrite(this, string, offset, length)
|
|||
|
break
|
|||
|
case 'base64':
|
|||
|
ret = base64Write(this, string, offset, length)
|
|||
|
break
|
|||
|
case 'ucs2':
|
|||
|
case 'ucs-2':
|
|||
|
case 'utf16le':
|
|||
|
case 'utf-16le':
|
|||
|
ret = utf16leWrite(this, string, offset, length)
|
|||
|
break
|
|||
|
default:
|
|||
|
throw new TypeError('Unknown encoding: ' + encoding)
|
|||
|
}
|
|||
|
return ret
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.toJSON = function () {
|
|||
|
return {
|
|||
|
type: 'Buffer',
|
|||
|
data: Array.prototype.slice.call(this._arr || this, 0)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function base64Slice (buf, start, end) {
|
|||
|
if (start === 0 && end === buf.length) {
|
|||
|
return base64.fromByteArray(buf)
|
|||
|
} else {
|
|||
|
return base64.fromByteArray(buf.slice(start, end))
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function utf8Slice (buf, start, end) {
|
|||
|
var res = ''
|
|||
|
var tmp = ''
|
|||
|
end = Math.min(buf.length, end)
|
|||
|
|
|||
|
for (var i = start; i < end; i++) {
|
|||
|
if (buf[i] <= 0x7F) {
|
|||
|
res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
|
|||
|
tmp = ''
|
|||
|
} else {
|
|||
|
tmp += '%' + buf[i].toString(16)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return res + decodeUtf8Char(tmp)
|
|||
|
}
|
|||
|
|
|||
|
function asciiSlice (buf, start, end) {
|
|||
|
var ret = ''
|
|||
|
end = Math.min(buf.length, end)
|
|||
|
|
|||
|
for (var i = start; i < end; i++) {
|
|||
|
ret += String.fromCharCode(buf[i])
|
|||
|
}
|
|||
|
return ret
|
|||
|
}
|
|||
|
|
|||
|
function binarySlice (buf, start, end) {
|
|||
|
return asciiSlice(buf, start, end)
|
|||
|
}
|
|||
|
|
|||
|
function hexSlice (buf, start, end) {
|
|||
|
var len = buf.length
|
|||
|
|
|||
|
if (!start || start < 0) start = 0
|
|||
|
if (!end || end < 0 || end > len) end = len
|
|||
|
|
|||
|
var out = ''
|
|||
|
for (var i = start; i < end; i++) {
|
|||
|
out += toHex(buf[i])
|
|||
|
}
|
|||
|
return out
|
|||
|
}
|
|||
|
|
|||
|
function utf16leSlice (buf, start, end) {
|
|||
|
var bytes = buf.slice(start, end)
|
|||
|
var res = ''
|
|||
|
for (var i = 0; i < bytes.length; i += 2) {
|
|||
|
res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
|
|||
|
}
|
|||
|
return res
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.slice = function (start, end) {
|
|||
|
var len = this.length
|
|||
|
start = ~~start
|
|||
|
end = end === undefined ? len : ~~end
|
|||
|
|
|||
|
if (start < 0) {
|
|||
|
start += len;
|
|||
|
if (start < 0)
|
|||
|
start = 0
|
|||
|
} else if (start > len) {
|
|||
|
start = len
|
|||
|
}
|
|||
|
|
|||
|
if (end < 0) {
|
|||
|
end += len
|
|||
|
if (end < 0)
|
|||
|
end = 0
|
|||
|
} else if (end > len) {
|
|||
|
end = len
|
|||
|
}
|
|||
|
|
|||
|
if (end < start)
|
|||
|
end = start
|
|||
|
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
return Buffer._augment(this.subarray(start, end))
|
|||
|
} else {
|
|||
|
var sliceLen = end - start
|
|||
|
var newBuf = new Buffer(sliceLen, undefined, true)
|
|||
|
for (var i = 0; i < sliceLen; i++) {
|
|||
|
newBuf[i] = this[i + start]
|
|||
|
}
|
|||
|
return newBuf
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
* Need to make sure that buffer isn't trying to write out of bounds.
|
|||
|
*/
|
|||
|
function checkOffset (offset, ext, length) {
|
|||
|
if ((offset % 1) !== 0 || offset < 0)
|
|||
|
throw new RangeError('offset is not uint')
|
|||
|
if (offset + ext > length)
|
|||
|
throw new RangeError('Trying to access beyond buffer length')
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readUInt8 = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 1, this.length)
|
|||
|
return this[offset]
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readUInt16LE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 2, this.length)
|
|||
|
return this[offset] | (this[offset + 1] << 8)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readUInt16BE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 2, this.length)
|
|||
|
return (this[offset] << 8) | this[offset + 1]
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readUInt32LE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 4, this.length)
|
|||
|
|
|||
|
return ((this[offset]) |
|
|||
|
(this[offset + 1] << 8) |
|
|||
|
(this[offset + 2] << 16)) +
|
|||
|
(this[offset + 3] * 0x1000000)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readUInt32BE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 4, this.length)
|
|||
|
|
|||
|
return (this[offset] * 0x1000000) +
|
|||
|
((this[offset + 1] << 16) |
|
|||
|
(this[offset + 2] << 8) |
|
|||
|
this[offset + 3])
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readInt8 = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 1, this.length)
|
|||
|
if (!(this[offset] & 0x80))
|
|||
|
return (this[offset])
|
|||
|
return ((0xff - this[offset] + 1) * -1)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readInt16LE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 2, this.length)
|
|||
|
var val = this[offset] | (this[offset + 1] << 8)
|
|||
|
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readInt16BE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 2, this.length)
|
|||
|
var val = this[offset + 1] | (this[offset] << 8)
|
|||
|
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readInt32LE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 4, this.length)
|
|||
|
|
|||
|
return (this[offset]) |
|
|||
|
(this[offset + 1] << 8) |
|
|||
|
(this[offset + 2] << 16) |
|
|||
|
(this[offset + 3] << 24)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readInt32BE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 4, this.length)
|
|||
|
|
|||
|
return (this[offset] << 24) |
|
|||
|
(this[offset + 1] << 16) |
|
|||
|
(this[offset + 2] << 8) |
|
|||
|
(this[offset + 3])
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readFloatLE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 4, this.length)
|
|||
|
return ieee754.read(this, offset, true, 23, 4)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readFloatBE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 4, this.length)
|
|||
|
return ieee754.read(this, offset, false, 23, 4)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readDoubleLE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 8, this.length)
|
|||
|
return ieee754.read(this, offset, true, 52, 8)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.readDoubleBE = function (offset, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkOffset(offset, 8, this.length)
|
|||
|
return ieee754.read(this, offset, false, 52, 8)
|
|||
|
}
|
|||
|
|
|||
|
function checkInt (buf, value, offset, ext, max, min) {
|
|||
|
if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
|
|||
|
if (value > max || value < min) throw new TypeError('value is out of bounds')
|
|||
|
if (offset + ext > buf.length) throw new TypeError('index out of range')
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeUInt8 = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 1, 0xff, 0)
|
|||
|
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
|
|||
|
this[offset] = value
|
|||
|
return offset + 1
|
|||
|
}
|
|||
|
|
|||
|
function objectWriteUInt16 (buf, value, offset, littleEndian) {
|
|||
|
if (value < 0) value = 0xffff + value + 1
|
|||
|
for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
|
|||
|
buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
|
|||
|
(littleEndian ? i : 1 - i) * 8
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 2, 0xffff, 0)
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
this[offset] = value
|
|||
|
this[offset + 1] = (value >>> 8)
|
|||
|
} else objectWriteUInt16(this, value, offset, true)
|
|||
|
return offset + 2
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 2, 0xffff, 0)
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
this[offset] = (value >>> 8)
|
|||
|
this[offset + 1] = value
|
|||
|
} else objectWriteUInt16(this, value, offset, false)
|
|||
|
return offset + 2
|
|||
|
}
|
|||
|
|
|||
|
function objectWriteUInt32 (buf, value, offset, littleEndian) {
|
|||
|
if (value < 0) value = 0xffffffff + value + 1
|
|||
|
for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
|
|||
|
buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
this[offset + 3] = (value >>> 24)
|
|||
|
this[offset + 2] = (value >>> 16)
|
|||
|
this[offset + 1] = (value >>> 8)
|
|||
|
this[offset] = value
|
|||
|
} else objectWriteUInt32(this, value, offset, true)
|
|||
|
return offset + 4
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
this[offset] = (value >>> 24)
|
|||
|
this[offset + 1] = (value >>> 16)
|
|||
|
this[offset + 2] = (value >>> 8)
|
|||
|
this[offset + 3] = value
|
|||
|
} else objectWriteUInt32(this, value, offset, false)
|
|||
|
return offset + 4
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeInt8 = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 1, 0x7f, -0x80)
|
|||
|
if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
|
|||
|
if (value < 0) value = 0xff + value + 1
|
|||
|
this[offset] = value
|
|||
|
return offset + 1
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeInt16LE = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
this[offset] = value
|
|||
|
this[offset + 1] = (value >>> 8)
|
|||
|
} else objectWriteUInt16(this, value, offset, true)
|
|||
|
return offset + 2
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeInt16BE = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
this[offset] = (value >>> 8)
|
|||
|
this[offset + 1] = value
|
|||
|
} else objectWriteUInt16(this, value, offset, false)
|
|||
|
return offset + 2
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeInt32LE = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
this[offset] = value
|
|||
|
this[offset + 1] = (value >>> 8)
|
|||
|
this[offset + 2] = (value >>> 16)
|
|||
|
this[offset + 3] = (value >>> 24)
|
|||
|
} else objectWriteUInt32(this, value, offset, true)
|
|||
|
return offset + 4
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeInt32BE = function (value, offset, noAssert) {
|
|||
|
value = +value
|
|||
|
offset = offset >>> 0
|
|||
|
if (!noAssert)
|
|||
|
checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|||
|
if (value < 0) value = 0xffffffff + value + 1
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
this[offset] = (value >>> 24)
|
|||
|
this[offset + 1] = (value >>> 16)
|
|||
|
this[offset + 2] = (value >>> 8)
|
|||
|
this[offset + 3] = value
|
|||
|
} else objectWriteUInt32(this, value, offset, false)
|
|||
|
return offset + 4
|
|||
|
}
|
|||
|
|
|||
|
function checkIEEE754 (buf, value, offset, ext, max, min) {
|
|||
|
if (value > max || value < min) throw new TypeError('value is out of bounds')
|
|||
|
if (offset + ext > buf.length) throw new TypeError('index out of range')
|
|||
|
}
|
|||
|
|
|||
|
function writeFloat (buf, value, offset, littleEndian, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
|
|||
|
ieee754.write(buf, value, offset, littleEndian, 23, 4)
|
|||
|
return offset + 4
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeFloatLE = function (value, offset, noAssert) {
|
|||
|
return writeFloat(this, value, offset, true, noAssert)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeFloatBE = function (value, offset, noAssert) {
|
|||
|
return writeFloat(this, value, offset, false, noAssert)
|
|||
|
}
|
|||
|
|
|||
|
function writeDouble (buf, value, offset, littleEndian, noAssert) {
|
|||
|
if (!noAssert)
|
|||
|
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
|
|||
|
ieee754.write(buf, value, offset, littleEndian, 52, 8)
|
|||
|
return offset + 8
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) {
|
|||
|
return writeDouble(this, value, offset, true, noAssert)
|
|||
|
}
|
|||
|
|
|||
|
Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) {
|
|||
|
return writeDouble(this, value, offset, false, noAssert)
|
|||
|
}
|
|||
|
|
|||
|
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
|
|||
|
Buffer.prototype.copy = function (target, target_start, start, end) {
|
|||
|
var source = this
|
|||
|
|
|||
|
if (!start) start = 0
|
|||
|
if (!end && end !== 0) end = this.length
|
|||
|
if (!target_start) target_start = 0
|
|||
|
|
|||
|
// Copy 0 bytes; we're done
|
|||
|
if (end === start) return
|
|||
|
if (target.length === 0 || source.length === 0) return
|
|||
|
|
|||
|
// Fatal error conditions
|
|||
|
if (end < start) throw new TypeError('sourceEnd < sourceStart')
|
|||
|
if (target_start < 0 || target_start >= target.length)
|
|||
|
throw new TypeError('targetStart out of bounds')
|
|||
|
if (start < 0 || start >= source.length) throw new TypeError('sourceStart out of bounds')
|
|||
|
if (end < 0 || end > source.length) throw new TypeError('sourceEnd out of bounds')
|
|||
|
|
|||
|
// Are we oob?
|
|||
|
if (end > this.length)
|
|||
|
end = this.length
|
|||
|
if (target.length - target_start < end - start)
|
|||
|
end = target.length - target_start + start
|
|||
|
|
|||
|
var len = end - start
|
|||
|
|
|||
|
if (len < 100 || !Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
for (var i = 0; i < len; i++) {
|
|||
|
target[i + target_start] = this[i + start]
|
|||
|
}
|
|||
|
} else {
|
|||
|
target._set(this.subarray(start, start + len), target_start)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// fill(value, start=0, end=buffer.length)
|
|||
|
Buffer.prototype.fill = function (value, start, end) {
|
|||
|
if (!value) value = 0
|
|||
|
if (!start) start = 0
|
|||
|
if (!end) end = this.length
|
|||
|
|
|||
|
if (end < start) throw new TypeError('end < start')
|
|||
|
|
|||
|
// Fill 0 bytes; we're done
|
|||
|
if (end === start) return
|
|||
|
if (this.length === 0) return
|
|||
|
|
|||
|
if (start < 0 || start >= this.length) throw new TypeError('start out of bounds')
|
|||
|
if (end < 0 || end > this.length) throw new TypeError('end out of bounds')
|
|||
|
|
|||
|
var i
|
|||
|
if (typeof value === 'number') {
|
|||
|
for (i = start; i < end; i++) {
|
|||
|
this[i] = value
|
|||
|
}
|
|||
|
} else {
|
|||
|
var bytes = utf8ToBytes(value.toString())
|
|||
|
var len = bytes.length
|
|||
|
for (i = start; i < end; i++) {
|
|||
|
this[i] = bytes[i % len]
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return this
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
|
|||
|
* Added in Node 0.12. Only available in browsers that support ArrayBuffer.
|
|||
|
*/
|
|||
|
Buffer.prototype.toArrayBuffer = function () {
|
|||
|
if (typeof Uint8Array !== 'undefined') {
|
|||
|
if (Buffer.TYPED_ARRAY_SUPPORT) {
|
|||
|
return (new Buffer(this)).buffer
|
|||
|
} else {
|
|||
|
var buf = new Uint8Array(this.length)
|
|||
|
for (var i = 0, len = buf.length; i < len; i += 1) {
|
|||
|
buf[i] = this[i]
|
|||
|
}
|
|||
|
return buf.buffer
|
|||
|
}
|
|||
|
} else {
|
|||
|
throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// HELPER FUNCTIONS
|
|||
|
// ================
|
|||
|
|
|||
|
var BP = Buffer.prototype
|
|||
|
|
|||
|
/**
|
|||
|
* Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
|
|||
|
*/
|
|||
|
Buffer._augment = function (arr) {
|
|||
|
arr._isBuffer = true
|
|||
|
|
|||
|
// save reference to original Uint8Array get/set methods before overwriting
|
|||
|
arr._get = arr.get
|
|||
|
arr._set = arr.set
|
|||
|
|
|||
|
// deprecated, will be removed in node 0.13+
|
|||
|
arr.get = BP.get
|
|||
|
arr.set = BP.set
|
|||
|
|
|||
|
arr.write = BP.write
|
|||
|
arr.toString = BP.toString
|
|||
|
arr.toLocaleString = BP.toString
|
|||
|
arr.toJSON = BP.toJSON
|
|||
|
arr.equals = BP.equals
|
|||
|
arr.compare = BP.compare
|
|||
|
arr.copy = BP.copy
|
|||
|
arr.slice = BP.slice
|
|||
|
arr.readUInt8 = BP.readUInt8
|
|||
|
arr.readUInt16LE = BP.readUInt16LE
|
|||
|
arr.readUInt16BE = BP.readUInt16BE
|
|||
|
arr.readUInt32LE = BP.readUInt32LE
|
|||
|
arr.readUInt32BE = BP.readUInt32BE
|
|||
|
arr.readInt8 = BP.readInt8
|
|||
|
arr.readInt16LE = BP.readInt16LE
|
|||
|
arr.readInt16BE = BP.readInt16BE
|
|||
|
arr.readInt32LE = BP.readInt32LE
|
|||
|
arr.readInt32BE = BP.readInt32BE
|
|||
|
arr.readFloatLE = BP.readFloatLE
|
|||
|
arr.readFloatBE = BP.readFloatBE
|
|||
|
arr.readDoubleLE = BP.readDoubleLE
|
|||
|
arr.readDoubleBE = BP.readDoubleBE
|
|||
|
arr.writeUInt8 = BP.writeUInt8
|
|||
|
arr.writeUInt16LE = BP.writeUInt16LE
|
|||
|
arr.writeUInt16BE = BP.writeUInt16BE
|
|||
|
arr.writeUInt32LE = BP.writeUInt32LE
|
|||
|
arr.writeUInt32BE = BP.writeUInt32BE
|
|||
|
arr.writeInt8 = BP.writeInt8
|
|||
|
arr.writeInt16LE = BP.writeInt16LE
|
|||
|
arr.writeInt16BE = BP.writeInt16BE
|
|||
|
arr.writeInt32LE = BP.writeInt32LE
|
|||
|
arr.writeInt32BE = BP.writeInt32BE
|
|||
|
arr.writeFloatLE = BP.writeFloatLE
|
|||
|
arr.writeFloatBE = BP.writeFloatBE
|
|||
|
arr.writeDoubleLE = BP.writeDoubleLE
|
|||
|
arr.writeDoubleBE = BP.writeDoubleBE
|
|||
|
arr.fill = BP.fill
|
|||
|
arr.inspect = BP.inspect
|
|||
|
arr.toArrayBuffer = BP.toArrayBuffer
|
|||
|
|
|||
|
return arr
|
|||
|
}
|
|||
|
|
|||
|
var INVALID_BASE64_RE = /[^+\/0-9A-z]/g
|
|||
|
|
|||
|
function base64clean (str) {
|
|||
|
// Node strips out invalid characters like \n and \t from the string, base64-js does not
|
|||
|
str = stringtrim(str).replace(INVALID_BASE64_RE, '')
|
|||
|
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
|
|||
|
while (str.length % 4 !== 0) {
|
|||
|
str = str + '='
|
|||
|
}
|
|||
|
return str
|
|||
|
}
|
|||
|
|
|||
|
function stringtrim (str) {
|
|||
|
if (str.trim) return str.trim()
|
|||
|
return str.replace(/^\s+|\s+$/g, '')
|
|||
|
}
|
|||
|
|
|||
|
function isArrayish (subject) {
|
|||
|
return isArray(subject) || Buffer.isBuffer(subject) ||
|
|||
|
subject && typeof subject === 'object' &&
|
|||
|
typeof subject.length === 'number'
|
|||
|
}
|
|||
|
|
|||
|
function toHex (n) {
|
|||
|
if (n < 16) return '0' + n.toString(16)
|
|||
|
return n.toString(16)
|
|||
|
}
|
|||
|
|
|||
|
function utf8ToBytes (str) {
|
|||
|
var byteArray = []
|
|||
|
for (var i = 0; i < str.length; i++) {
|
|||
|
var b = str.charCodeAt(i)
|
|||
|
if (b <= 0x7F) {
|
|||
|
byteArray.push(b)
|
|||
|
} else {
|
|||
|
var start = i
|
|||
|
if (b >= 0xD800 && b <= 0xDFFF) i++
|
|||
|
var h = encodeURIComponent(str.slice(start, i+1)).substr(1).split('%')
|
|||
|
for (var j = 0; j < h.length; j++) {
|
|||
|
byteArray.push(parseInt(h[j], 16))
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return byteArray
|
|||
|
}
|
|||
|
|
|||
|
function asciiToBytes (str) {
|
|||
|
var byteArray = []
|
|||
|
for (var i = 0; i < str.length; i++) {
|
|||
|
// Node's code seems to be doing this and not & 0x7F..
|
|||
|
byteArray.push(str.charCodeAt(i) & 0xFF)
|
|||
|
}
|
|||
|
return byteArray
|
|||
|
}
|
|||
|
|
|||
|
function utf16leToBytes (str) {
|
|||
|
var c, hi, lo
|
|||
|
var byteArray = []
|
|||
|
for (var i = 0; i < str.length; i++) {
|
|||
|
c = str.charCodeAt(i)
|
|||
|
hi = c >> 8
|
|||
|
lo = c % 256
|
|||
|
byteArray.push(lo)
|
|||
|
byteArray.push(hi)
|
|||
|
}
|
|||
|
|
|||
|
return byteArray
|
|||
|
}
|
|||
|
|
|||
|
function base64ToBytes (str) {
|
|||
|
return base64.toByteArray(str)
|
|||
|
}
|
|||
|
|
|||
|
function blitBuffer (src, dst, offset, length) {
|
|||
|
for (var i = 0; i < length; i++) {
|
|||
|
if ((i + offset >= dst.length) || (i >= src.length))
|
|||
|
break
|
|||
|
dst[i + offset] = src[i]
|
|||
|
}
|
|||
|
return i
|
|||
|
}
|
|||
|
|
|||
|
function decodeUtf8Char (str) {
|
|||
|
try {
|
|||
|
return decodeURIComponent(str)
|
|||
|
} catch (err) {
|
|||
|
return String.fromCharCode(0xFFFD) // UTF 8 invalid char
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
},{"base64-js":2,"ieee754":3,"is-array":4}],2:[function(require,module,exports){
|
|||
|
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|||
|
|
|||
|
;(function (exports) {
|
|||
|
'use strict';
|
|||
|
|
|||
|
var Arr = (typeof Uint8Array !== 'undefined')
|
|||
|
? Uint8Array
|
|||
|
: Array
|
|||
|
|
|||
|
var PLUS = '+'.charCodeAt(0)
|
|||
|
var SLASH = '/'.charCodeAt(0)
|
|||
|
var NUMBER = '0'.charCodeAt(0)
|
|||
|
var LOWER = 'a'.charCodeAt(0)
|
|||
|
var UPPER = 'A'.charCodeAt(0)
|
|||
|
|
|||
|
function decode (elt) {
|
|||
|
var code = elt.charCodeAt(0)
|
|||
|
if (code === PLUS)
|
|||
|
return 62 // '+'
|
|||
|
if (code === SLASH)
|
|||
|
return 63 // '/'
|
|||
|
if (code < NUMBER)
|
|||
|
return -1 //no match
|
|||
|
if (code < NUMBER + 10)
|
|||
|
return code - NUMBER + 26 + 26
|
|||
|
if (code < UPPER + 26)
|
|||
|
return code - UPPER
|
|||
|
if (code < LOWER + 26)
|
|||
|
return code - LOWER + 26
|
|||
|
}
|
|||
|
|
|||
|
function b64ToByteArray (b64) {
|
|||
|
var i, j, l, tmp, placeHolders, arr
|
|||
|
|
|||
|
if (b64.length % 4 > 0) {
|
|||
|
throw new Error('Invalid string. Length must be a multiple of 4')
|
|||
|
}
|
|||
|
|
|||
|
// the number of equal signs (place holders)
|
|||
|
// if there are two placeholders, than the two characters before it
|
|||
|
// represent one byte
|
|||
|
// if there is only one, then the three characters before it represent 2 bytes
|
|||
|
// this is just a cheap hack to not do indexOf twice
|
|||
|
var len = b64.length
|
|||
|
placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
|
|||
|
|
|||
|
// base64 is 4/3 + up to two characters of the original data
|
|||
|
arr = new Arr(b64.length * 3 / 4 - placeHolders)
|
|||
|
|
|||
|
// if there are placeholders, only get up to the last complete 4 chars
|
|||
|
l = placeHolders > 0 ? b64.length - 4 : b64.length
|
|||
|
|
|||
|
var L = 0
|
|||
|
|
|||
|
function push (v) {
|
|||
|
arr[L++] = v
|
|||
|
}
|
|||
|
|
|||
|
for (i = 0, j = 0; i < l; i += 4, j += 3) {
|
|||
|
tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
|
|||
|
push((tmp & 0xFF0000) >> 16)
|
|||
|
push((tmp & 0xFF00) >> 8)
|
|||
|
push(tmp & 0xFF)
|
|||
|
}
|
|||
|
|
|||
|
if (placeHolders === 2) {
|
|||
|
tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
|
|||
|
push(tmp & 0xFF)
|
|||
|
} else if (placeHolders === 1) {
|
|||
|
tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
|
|||
|
push((tmp >> 8) & 0xFF)
|
|||
|
push(tmp & 0xFF)
|
|||
|
}
|
|||
|
|
|||
|
return arr
|
|||
|
}
|
|||
|
|
|||
|
function uint8ToBase64 (uint8) {
|
|||
|
var i,
|
|||
|
extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
|
|||
|
output = "",
|
|||
|
temp, length
|
|||
|
|
|||
|
function encode (num) {
|
|||
|
return lookup.charAt(num)
|
|||
|
}
|
|||
|
|
|||
|
function tripletToBase64 (num) {
|
|||
|
return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
|
|||
|
}
|
|||
|
|
|||
|
// go through the array every three bytes, we'll deal with trailing stuff later
|
|||
|
for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
|
|||
|
temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
|
|||
|
output += tripletToBase64(temp)
|
|||
|
}
|
|||
|
|
|||
|
// pad the end with zeros, but make sure to not forget the extra bytes
|
|||
|
switch (extraBytes) {
|
|||
|
case 1:
|
|||
|
temp = uint8[uint8.length - 1]
|
|||
|
output += encode(temp >> 2)
|
|||
|
output += encode((temp << 4) & 0x3F)
|
|||
|
output += '=='
|
|||
|
break
|
|||
|
case 2:
|
|||
|
temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
|
|||
|
output += encode(temp >> 10)
|
|||
|
output += encode((temp >> 4) & 0x3F)
|
|||
|
output += encode((temp << 2) & 0x3F)
|
|||
|
output += '='
|
|||
|
break
|
|||
|
}
|
|||
|
|
|||
|
return output
|
|||
|
}
|
|||
|
|
|||
|
exports.toByteArray = b64ToByteArray
|
|||
|
exports.fromByteArray = uint8ToBase64
|
|||
|
}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
|
|||
|
|
|||
|
},{}],3:[function(require,module,exports){
|
|||
|
exports.read = function(buffer, offset, isLE, mLen, nBytes) {
|
|||
|
var e, m,
|
|||
|
eLen = nBytes * 8 - mLen - 1,
|
|||
|
eMax = (1 << eLen) - 1,
|
|||
|
eBias = eMax >> 1,
|
|||
|
nBits = -7,
|
|||
|
i = isLE ? (nBytes - 1) : 0,
|
|||
|
d = isLE ? -1 : 1,
|
|||
|
s = buffer[offset + i];
|
|||
|
|
|||
|
i += d;
|
|||
|
|
|||
|
e = s & ((1 << (-nBits)) - 1);
|
|||
|
s >>= (-nBits);
|
|||
|
nBits += eLen;
|
|||
|
for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);
|
|||
|
|
|||
|
m = e & ((1 << (-nBits)) - 1);
|
|||
|
e >>= (-nBits);
|
|||
|
nBits += mLen;
|
|||
|
for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);
|
|||
|
|
|||
|
if (e === 0) {
|
|||
|
e = 1 - eBias;
|
|||
|
} else if (e === eMax) {
|
|||
|
return m ? NaN : ((s ? -1 : 1) * Infinity);
|
|||
|
} else {
|
|||
|
m = m + Math.pow(2, mLen);
|
|||
|
e = e - eBias;
|
|||
|
}
|
|||
|
return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
|
|||
|
};
|
|||
|
|
|||
|
exports.write = function(buffer, value, offset, isLE, mLen, nBytes) {
|
|||
|
var e, m, c,
|
|||
|
eLen = nBytes * 8 - mLen - 1,
|
|||
|
eMax = (1 << eLen) - 1,
|
|||
|
eBias = eMax >> 1,
|
|||
|
rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),
|
|||
|
i = isLE ? 0 : (nBytes - 1),
|
|||
|
d = isLE ? 1 : -1,
|
|||
|
s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
|
|||
|
|
|||
|
value = Math.abs(value);
|
|||
|
|
|||
|
if (isNaN(value) || value === Infinity) {
|
|||
|
m = isNaN(value) ? 1 : 0;
|
|||
|
e = eMax;
|
|||
|
} else {
|
|||
|
e = Math.floor(Math.log(value) / Math.LN2);
|
|||
|
if (value * (c = Math.pow(2, -e)) < 1) {
|
|||
|
e--;
|
|||
|
c *= 2;
|
|||
|
}
|
|||
|
if (e + eBias >= 1) {
|
|||
|
value += rt / c;
|
|||
|
} else {
|
|||
|
value += rt * Math.pow(2, 1 - eBias);
|
|||
|
}
|
|||
|
if (value * c >= 2) {
|
|||
|
e++;
|
|||
|
c /= 2;
|
|||
|
}
|
|||
|
|
|||
|
if (e + eBias >= eMax) {
|
|||
|
m = 0;
|
|||
|
e = eMax;
|
|||
|
} else if (e + eBias >= 1) {
|
|||
|
m = (value * c - 1) * Math.pow(2, mLen);
|
|||
|
e = e + eBias;
|
|||
|
} else {
|
|||
|
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
|
|||
|
e = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);
|
|||
|
|
|||
|
e = (e << mLen) | m;
|
|||
|
eLen += mLen;
|
|||
|
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);
|
|||
|
|
|||
|
buffer[offset + i - d] |= s * 128;
|
|||
|
};
|
|||
|
|
|||
|
},{}],4:[function(require,module,exports){
|
|||
|
|
|||
|
/**
|
|||
|
* isArray
|
|||
|
*/
|
|||
|
|
|||
|
var isArray = Array.isArray;
|
|||
|
|
|||
|
/**
|
|||
|
* toString
|
|||
|
*/
|
|||
|
|
|||
|
var str = Object.prototype.toString;
|
|||
|
|
|||
|
/**
|
|||
|
* Whether or not the given `val`
|
|||
|
* is an array.
|
|||
|
*
|
|||
|
* example:
|
|||
|
*
|
|||
|
* isArray([]);
|
|||
|
* // > true
|
|||
|
* isArray(arguments);
|
|||
|
* // > false
|
|||
|
* isArray('');
|
|||
|
* // > false
|
|||
|
*
|
|||
|
* @param {mixed} val
|
|||
|
* @return {bool}
|
|||
|
*/
|
|||
|
|
|||
|
module.exports = isArray || function (val) {
|
|||
|
return !! val && '[object Array]' == str.call(val);
|
|||
|
};
|
|||
|
|
|||
|
},{}],5:[function(require,module,exports){
|
|||
|
// Copyright Joyent, Inc. and other Node contributors.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
|
// copy of this software and associated documentation files (the
|
|||
|
// "Software"), to deal in the Software without restriction, including
|
|||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
|
// persons to whom the Software is furnished to do so, subject to the
|
|||
|
// following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included
|
|||
|
// in all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|
|||
|
function EventEmitter() {
|
|||
|
this._events = this._events || {};
|
|||
|
this._maxListeners = this._maxListeners || undefined;
|
|||
|
}
|
|||
|
module.exports = EventEmitter;
|
|||
|
|
|||
|
// Backwards-compat with node 0.10.x
|
|||
|
EventEmitter.EventEmitter = EventEmitter;
|
|||
|
|
|||
|
EventEmitter.prototype._events = undefined;
|
|||
|
EventEmitter.prototype._maxListeners = undefined;
|
|||
|
|
|||
|
// By default EventEmitters will print a warning if more than 10 listeners are
|
|||
|
// added to it. This is a useful default which helps finding memory leaks.
|
|||
|
EventEmitter.defaultMaxListeners = 10;
|
|||
|
|
|||
|
// Obviously not all Emitters should be limited to 10. This function allows
|
|||
|
// that to be increased. Set to zero for unlimited.
|
|||
|
EventEmitter.prototype.setMaxListeners = function(n) {
|
|||
|
if (!isNumber(n) || n < 0 || isNaN(n))
|
|||
|
throw TypeError('n must be a positive number');
|
|||
|
this._maxListeners = n;
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
EventEmitter.prototype.emit = function(type) {
|
|||
|
var er, handler, len, args, i, listeners;
|
|||
|
|
|||
|
if (!this._events)
|
|||
|
this._events = {};
|
|||
|
|
|||
|
// If there is no 'error' event listener then throw.
|
|||
|
if (type === 'error') {
|
|||
|
if (!this._events.error ||
|
|||
|
(isObject(this._events.error) && !this._events.error.length)) {
|
|||
|
er = arguments[1];
|
|||
|
if (er instanceof Error) {
|
|||
|
throw er; // Unhandled 'error' event
|
|||
|
}
|
|||
|
throw TypeError('Uncaught, unspecified "error" event.');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
handler = this._events[type];
|
|||
|
|
|||
|
if (isUndefined(handler))
|
|||
|
return false;
|
|||
|
|
|||
|
if (isFunction(handler)) {
|
|||
|
switch (arguments.length) {
|
|||
|
// fast cases
|
|||
|
case 1:
|
|||
|
handler.call(this);
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
handler.call(this, arguments[1]);
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
handler.call(this, arguments[1], arguments[2]);
|
|||
|
break;
|
|||
|
// slower
|
|||
|
default:
|
|||
|
len = arguments.length;
|
|||
|
args = new Array(len - 1);
|
|||
|
for (i = 1; i < len; i++)
|
|||
|
args[i - 1] = arguments[i];
|
|||
|
handler.apply(this, args);
|
|||
|
}
|
|||
|
} else if (isObject(handler)) {
|
|||
|
len = arguments.length;
|
|||
|
args = new Array(len - 1);
|
|||
|
for (i = 1; i < len; i++)
|
|||
|
args[i - 1] = arguments[i];
|
|||
|
|
|||
|
listeners = handler.slice();
|
|||
|
len = listeners.length;
|
|||
|
for (i = 0; i < len; i++)
|
|||
|
listeners[i].apply(this, args);
|
|||
|
}
|
|||
|
|
|||
|
return true;
|
|||
|
};
|
|||
|
|
|||
|
EventEmitter.prototype.addListener = function(type, listener) {
|
|||
|
var m;
|
|||
|
|
|||
|
if (!isFunction(listener))
|
|||
|
throw TypeError('listener must be a function');
|
|||
|
|
|||
|
if (!this._events)
|
|||
|
this._events = {};
|
|||
|
|
|||
|
// To avoid recursion in the case that type === "newListener"! Before
|
|||
|
// adding it to the listeners, first emit "newListener".
|
|||
|
if (this._events.newListener)
|
|||
|
this.emit('newListener', type,
|
|||
|
isFunction(listener.listener) ?
|
|||
|
listener.listener : listener);
|
|||
|
|
|||
|
if (!this._events[type])
|
|||
|
// Optimize the case of one listener. Don't need the extra array object.
|
|||
|
this._events[type] = listener;
|
|||
|
else if (isObject(this._events[type]))
|
|||
|
// If we've already got an array, just append.
|
|||
|
this._events[type].push(listener);
|
|||
|
else
|
|||
|
// Adding the second element, need to change to array.
|
|||
|
this._events[type] = [this._events[type], listener];
|
|||
|
|
|||
|
// Check for listener leak
|
|||
|
if (isObject(this._events[type]) && !this._events[type].warned) {
|
|||
|
var m;
|
|||
|
if (!isUndefined(this._maxListeners)) {
|
|||
|
m = this._maxListeners;
|
|||
|
} else {
|
|||
|
m = EventEmitter.defaultMaxListeners;
|
|||
|
}
|
|||
|
|
|||
|
if (m && m > 0 && this._events[type].length > m) {
|
|||
|
this._events[type].warned = true;
|
|||
|
console.error('(node) warning: possible EventEmitter memory ' +
|
|||
|
'leak detected. %d listeners added. ' +
|
|||
|
'Use emitter.setMaxListeners() to increase limit.',
|
|||
|
this._events[type].length);
|
|||
|
if (typeof console.trace === 'function') {
|
|||
|
// not supported in IE 10
|
|||
|
console.trace();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
|
|||
|
|
|||
|
EventEmitter.prototype.once = function(type, listener) {
|
|||
|
if (!isFunction(listener))
|
|||
|
throw TypeError('listener must be a function');
|
|||
|
|
|||
|
var fired = false;
|
|||
|
|
|||
|
function g() {
|
|||
|
this.removeListener(type, g);
|
|||
|
|
|||
|
if (!fired) {
|
|||
|
fired = true;
|
|||
|
listener.apply(this, arguments);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
g.listener = listener;
|
|||
|
this.on(type, g);
|
|||
|
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
// emits a 'removeListener' event iff the listener was removed
|
|||
|
EventEmitter.prototype.removeListener = function(type, listener) {
|
|||
|
var list, position, length, i;
|
|||
|
|
|||
|
if (!isFunction(listener))
|
|||
|
throw TypeError('listener must be a function');
|
|||
|
|
|||
|
if (!this._events || !this._events[type])
|
|||
|
return this;
|
|||
|
|
|||
|
list = this._events[type];
|
|||
|
length = list.length;
|
|||
|
position = -1;
|
|||
|
|
|||
|
if (list === listener ||
|
|||
|
(isFunction(list.listener) && list.listener === listener)) {
|
|||
|
delete this._events[type];
|
|||
|
if (this._events.removeListener)
|
|||
|
this.emit('removeListener', type, listener);
|
|||
|
|
|||
|
} else if (isObject(list)) {
|
|||
|
for (i = length; i-- > 0;) {
|
|||
|
if (list[i] === listener ||
|
|||
|
(list[i].listener && list[i].listener === listener)) {
|
|||
|
position = i;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (position < 0)
|
|||
|
return this;
|
|||
|
|
|||
|
if (list.length === 1) {
|
|||
|
list.length = 0;
|
|||
|
delete this._events[type];
|
|||
|
} else {
|
|||
|
list.splice(position, 1);
|
|||
|
}
|
|||
|
|
|||
|
if (this._events.removeListener)
|
|||
|
this.emit('removeListener', type, listener);
|
|||
|
}
|
|||
|
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
EventEmitter.prototype.removeAllListeners = function(type) {
|
|||
|
var key, listeners;
|
|||
|
|
|||
|
if (!this._events)
|
|||
|
return this;
|
|||
|
|
|||
|
// not listening for removeListener, no need to emit
|
|||
|
if (!this._events.removeListener) {
|
|||
|
if (arguments.length === 0)
|
|||
|
this._events = {};
|
|||
|
else if (this._events[type])
|
|||
|
delete this._events[type];
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// emit removeListener for all listeners on all events
|
|||
|
if (arguments.length === 0) {
|
|||
|
for (key in this._events) {
|
|||
|
if (key === 'removeListener') continue;
|
|||
|
this.removeAllListeners(key);
|
|||
|
}
|
|||
|
this.removeAllListeners('removeListener');
|
|||
|
this._events = {};
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
listeners = this._events[type];
|
|||
|
|
|||
|
if (isFunction(listeners)) {
|
|||
|
this.removeListener(type, listeners);
|
|||
|
} else {
|
|||
|
// LIFO order
|
|||
|
while (listeners.length)
|
|||
|
this.removeListener(type, listeners[listeners.length - 1]);
|
|||
|
}
|
|||
|
delete this._events[type];
|
|||
|
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
EventEmitter.prototype.listeners = function(type) {
|
|||
|
var ret;
|
|||
|
if (!this._events || !this._events[type])
|
|||
|
ret = [];
|
|||
|
else if (isFunction(this._events[type]))
|
|||
|
ret = [this._events[type]];
|
|||
|
else
|
|||
|
ret = this._events[type].slice();
|
|||
|
return ret;
|
|||
|
};
|
|||
|
|
|||
|
EventEmitter.listenerCount = function(emitter, type) {
|
|||
|
var ret;
|
|||
|
if (!emitter._events || !emitter._events[type])
|
|||
|
ret = 0;
|
|||
|
else if (isFunction(emitter._events[type]))
|
|||
|
ret = 1;
|
|||
|
else
|
|||
|
ret = emitter._events[type].length;
|
|||
|
return ret;
|
|||
|
};
|
|||
|
|
|||
|
function isFunction(arg) {
|
|||
|
return typeof arg === 'function';
|
|||
|
}
|
|||
|
|
|||
|
function isNumber(arg) {
|
|||
|
return typeof arg === 'number';
|
|||
|
}
|
|||
|
|
|||
|
function isObject(arg) {
|
|||
|
return typeof arg === 'object' && arg !== null;
|
|||
|
}
|
|||
|
|
|||
|
function isUndefined(arg) {
|
|||
|
return arg === void 0;
|
|||
|
}
|
|||
|
|
|||
|
},{}],6:[function(require,module,exports){
|
|||
|
if (typeof Object.create === 'function') {
|
|||
|
// implementation from standard node.js 'util' module
|
|||
|
module.exports = function inherits(ctor, superCtor) {
|
|||
|
ctor.super_ = superCtor
|
|||
|
ctor.prototype = Object.create(superCtor.prototype, {
|
|||
|
constructor: {
|
|||
|
value: ctor,
|
|||
|
enumerable: false,
|
|||
|
writable: true,
|
|||
|
configurable: true
|
|||
|
}
|
|||
|
});
|
|||
|
};
|
|||
|
} else {
|
|||
|
// old school shim for old browsers
|
|||
|
module.exports = function inherits(ctor, superCtor) {
|
|||
|
ctor.super_ = superCtor
|
|||
|
var TempCtor = function () {}
|
|||
|
TempCtor.prototype = superCtor.prototype
|
|||
|
ctor.prototype = new TempCtor()
|
|||
|
ctor.prototype.constructor = ctor
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
},{}],7:[function(require,module,exports){
|
|||
|
module.exports = Array.isArray || function (arr) {
|
|||
|
return Object.prototype.toString.call(arr) == '[object Array]';
|
|||
|
};
|
|||
|
|
|||
|
},{}],8:[function(require,module,exports){
|
|||
|
// shim for using process in browser
|
|||
|
|
|||
|
var process = module.exports = {};
|
|||
|
|
|||
|
process.nextTick = (function () {
|
|||
|
var canSetImmediate = typeof window !== 'undefined'
|
|||
|
&& window.setImmediate;
|
|||
|
var canMutationObserver = typeof window !== 'undefined'
|
|||
|
&& window.MutationObserver;
|
|||
|
var canPost = typeof window !== 'undefined'
|
|||
|
&& window.postMessage && window.addEventListener
|
|||
|
;
|
|||
|
|
|||
|
if (canSetImmediate) {
|
|||
|
return function (f) { return window.setImmediate(f) };
|
|||
|
}
|
|||
|
|
|||
|
var queue = [];
|
|||
|
|
|||
|
if (canMutationObserver) {
|
|||
|
var hiddenDiv = document.createElement("div");
|
|||
|
var observer = new MutationObserver(function () {
|
|||
|
var queueList = queue.slice();
|
|||
|
queue.length = 0;
|
|||
|
queueList.forEach(function (fn) {
|
|||
|
fn();
|
|||
|
});
|
|||
|
});
|
|||
|
|
|||
|
observer.observe(hiddenDiv, { attributes: true });
|
|||
|
|
|||
|
return function nextTick(fn) {
|
|||
|
if (!queue.length) {
|
|||
|
hiddenDiv.setAttribute('yes', 'no');
|
|||
|
}
|
|||
|
queue.push(fn);
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
if (canPost) {
|
|||
|
window.addEventListener('message', function (ev) {
|
|||
|
var source = ev.source;
|
|||
|
if ((source === window || source === null) && ev.data === 'process-tick') {
|
|||
|
ev.stopPropagation();
|
|||
|
if (queue.length > 0) {
|
|||
|
var fn = queue.shift();
|
|||
|
fn();
|
|||
|
}
|
|||
|
}
|
|||
|
}, true);
|
|||
|
|
|||
|
return function nextTick(fn) {
|
|||
|
queue.push(fn);
|
|||
|
window.postMessage('process-tick', '*');
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
return function nextTick(fn) {
|
|||
|
setTimeout(fn, 0);
|
|||
|
};
|
|||
|
})();
|
|||
|
|
|||
|
process.title = 'browser';
|
|||
|
process.browser = true;
|
|||
|
process.env = {};
|
|||
|
process.argv = [];
|
|||
|
|
|||
|
function noop() {}
|
|||
|
|
|||
|
process.on = noop;
|
|||
|
process.addListener = noop;
|
|||
|
process.once = noop;
|
|||
|
process.off = noop;
|
|||
|
process.removeListener = noop;
|
|||
|
process.removeAllListeners = noop;
|
|||
|
process.emit = noop;
|
|||
|
|
|||
|
process.binding = function (name) {
|
|||
|
throw new Error('process.binding is not supported');
|
|||
|
};
|
|||
|
|
|||
|
// TODO(shtylman)
|
|||
|
process.cwd = function () { return '/' };
|
|||
|
process.chdir = function (dir) {
|
|||
|
throw new Error('process.chdir is not supported');
|
|||
|
};
|
|||
|
|
|||
|
},{}],9:[function(require,module,exports){
|
|||
|
module.exports = require("./lib/_stream_duplex.js")
|
|||
|
|
|||
|
},{"./lib/_stream_duplex.js":10}],10:[function(require,module,exports){
|
|||
|
(function (process){
|
|||
|
// Copyright Joyent, Inc. and other Node contributors.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
|
// copy of this software and associated documentation files (the
|
|||
|
// "Software"), to deal in the Software without restriction, including
|
|||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
|
// persons to whom the Software is furnished to do so, subject to the
|
|||
|
// following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included
|
|||
|
// in all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|
|||
|
// a duplex stream is just a stream that is both readable and writable.
|
|||
|
// Since JS doesn't have multiple prototypal inheritance, this class
|
|||
|
// prototypally inherits from Readable, and then parasitically from
|
|||
|
// Writable.
|
|||
|
|
|||
|
module.exports = Duplex;
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
var objectKeys = Object.keys || function (obj) {
|
|||
|
var keys = [];
|
|||
|
for (var key in obj) keys.push(key);
|
|||
|
return keys;
|
|||
|
}
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
var util = require('core-util-is');
|
|||
|
util.inherits = require('inherits');
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
var Readable = require('./_stream_readable');
|
|||
|
var Writable = require('./_stream_writable');
|
|||
|
|
|||
|
util.inherits(Duplex, Readable);
|
|||
|
|
|||
|
forEach(objectKeys(Writable.prototype), function(method) {
|
|||
|
if (!Duplex.prototype[method])
|
|||
|
Duplex.prototype[method] = Writable.prototype[method];
|
|||
|
});
|
|||
|
|
|||
|
function Duplex(options) {
|
|||
|
if (!(this instanceof Duplex))
|
|||
|
return new Duplex(options);
|
|||
|
|
|||
|
Readable.call(this, options);
|
|||
|
Writable.call(this, options);
|
|||
|
|
|||
|
if (options && options.readable === false)
|
|||
|
this.readable = false;
|
|||
|
|
|||
|
if (options && options.writable === false)
|
|||
|
this.writable = false;
|
|||
|
|
|||
|
this.allowHalfOpen = true;
|
|||
|
if (options && options.allowHalfOpen === false)
|
|||
|
this.allowHalfOpen = false;
|
|||
|
|
|||
|
this.once('end', onend);
|
|||
|
}
|
|||
|
|
|||
|
// the no-half-open enforcer
|
|||
|
function onend() {
|
|||
|
// if we allow half-open state, or if the writable side ended,
|
|||
|
// then we're ok.
|
|||
|
if (this.allowHalfOpen || this._writableState.ended)
|
|||
|
return;
|
|||
|
|
|||
|
// no more data can be written.
|
|||
|
// But allow more writes to happen in this tick.
|
|||
|
process.nextTick(this.end.bind(this));
|
|||
|
}
|
|||
|
|
|||
|
function forEach (xs, f) {
|
|||
|
for (var i = 0, l = xs.length; i < l; i++) {
|
|||
|
f(xs[i], i);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}).call(this,require('_process'))
|
|||
|
},{"./_stream_readable":12,"./_stream_writable":14,"_process":8,"core-util-is":15,"inherits":6}],11:[function(require,module,exports){
|
|||
|
// Copyright Joyent, Inc. and other Node contributors.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
|
// copy of this software and associated documentation files (the
|
|||
|
// "Software"), to deal in the Software without restriction, including
|
|||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
|
// persons to whom the Software is furnished to do so, subject to the
|
|||
|
// following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included
|
|||
|
// in all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|
|||
|
// a passthrough stream.
|
|||
|
// basically just the most minimal sort of Transform stream.
|
|||
|
// Every written chunk gets output as-is.
|
|||
|
|
|||
|
module.exports = PassThrough;
|
|||
|
|
|||
|
var Transform = require('./_stream_transform');
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
var util = require('core-util-is');
|
|||
|
util.inherits = require('inherits');
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
util.inherits(PassThrough, Transform);
|
|||
|
|
|||
|
function PassThrough(options) {
|
|||
|
if (!(this instanceof PassThrough))
|
|||
|
return new PassThrough(options);
|
|||
|
|
|||
|
Transform.call(this, options);
|
|||
|
}
|
|||
|
|
|||
|
PassThrough.prototype._transform = function(chunk, encoding, cb) {
|
|||
|
cb(null, chunk);
|
|||
|
};
|
|||
|
|
|||
|
},{"./_stream_transform":13,"core-util-is":15,"inherits":6}],12:[function(require,module,exports){
|
|||
|
(function (process){
|
|||
|
// Copyright Joyent, Inc. and other Node contributors.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
|
// copy of this software and associated documentation files (the
|
|||
|
// "Software"), to deal in the Software without restriction, including
|
|||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
|
// persons to whom the Software is furnished to do so, subject to the
|
|||
|
// following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included
|
|||
|
// in all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|
|||
|
module.exports = Readable;
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
var isArray = require('isarray');
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
var Buffer = require('buffer').Buffer;
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
Readable.ReadableState = ReadableState;
|
|||
|
|
|||
|
var EE = require('events').EventEmitter;
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
if (!EE.listenerCount) EE.listenerCount = function(emitter, type) {
|
|||
|
return emitter.listeners(type).length;
|
|||
|
};
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
var Stream = require('stream');
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
var util = require('core-util-is');
|
|||
|
util.inherits = require('inherits');
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
var StringDecoder;
|
|||
|
|
|||
|
util.inherits(Readable, Stream);
|
|||
|
|
|||
|
function ReadableState(options, stream) {
|
|||
|
options = options || {};
|
|||
|
|
|||
|
// the point at which it stops calling _read() to fill the buffer
|
|||
|
// Note: 0 is a valid value, means "don't call _read preemptively ever"
|
|||
|
var hwm = options.highWaterMark;
|
|||
|
this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
|
|||
|
|
|||
|
// cast to ints.
|
|||
|
this.highWaterMark = ~~this.highWaterMark;
|
|||
|
|
|||
|
this.buffer = [];
|
|||
|
this.length = 0;
|
|||
|
this.pipes = null;
|
|||
|
this.pipesCount = 0;
|
|||
|
this.flowing = false;
|
|||
|
this.ended = false;
|
|||
|
this.endEmitted = false;
|
|||
|
this.reading = false;
|
|||
|
|
|||
|
// In streams that never have any data, and do push(null) right away,
|
|||
|
// the consumer can miss the 'end' event if they do some I/O before
|
|||
|
// consuming the stream. So, we don't emit('end') until some reading
|
|||
|
// happens.
|
|||
|
this.calledRead = false;
|
|||
|
|
|||
|
// a flag to be able to tell if the onwrite cb is called immediately,
|
|||
|
// or on a later tick. We set this to true at first, becuase any
|
|||
|
// actions that shouldn't happen until "later" should generally also
|
|||
|
// not happen before the first write call.
|
|||
|
this.sync = true;
|
|||
|
|
|||
|
// whenever we return null, then we set a flag to say
|
|||
|
// that we're awaiting a 'readable' event emission.
|
|||
|
this.needReadable = false;
|
|||
|
this.emittedReadable = false;
|
|||
|
this.readableListening = false;
|
|||
|
|
|||
|
|
|||
|
// object stream flag. Used to make read(n) ignore n and to
|
|||
|
// make all the buffer merging and length checks go away
|
|||
|
this.objectMode = !!options.objectMode;
|
|||
|
|
|||
|
// Crypto is kind of old and crusty. Historically, its default string
|
|||
|
// encoding is 'binary' so we have to make this configurable.
|
|||
|
// Everything else in the universe uses 'utf8', though.
|
|||
|
this.defaultEncoding = options.defaultEncoding || 'utf8';
|
|||
|
|
|||
|
// when piping, we only care about 'readable' events that happen
|
|||
|
// after read()ing all the bytes and not getting any pushback.
|
|||
|
this.ranOut = false;
|
|||
|
|
|||
|
// the number of writers that are awaiting a drain event in .pipe()s
|
|||
|
this.awaitDrain = 0;
|
|||
|
|
|||
|
// if true, a maybeReadMore has been scheduled
|
|||
|
this.readingMore = false;
|
|||
|
|
|||
|
this.decoder = null;
|
|||
|
this.encoding = null;
|
|||
|
if (options.encoding) {
|
|||
|
if (!StringDecoder)
|
|||
|
StringDecoder = require('string_decoder/').StringDecoder;
|
|||
|
this.decoder = new StringDecoder(options.encoding);
|
|||
|
this.encoding = options.encoding;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function Readable(options) {
|
|||
|
if (!(this instanceof Readable))
|
|||
|
return new Readable(options);
|
|||
|
|
|||
|
this._readableState = new ReadableState(options, this);
|
|||
|
|
|||
|
// legacy
|
|||
|
this.readable = true;
|
|||
|
|
|||
|
Stream.call(this);
|
|||
|
}
|
|||
|
|
|||
|
// Manually shove something into the read() buffer.
|
|||
|
// This returns true if the highWaterMark has not been hit yet,
|
|||
|
// similar to how Writable.write() returns true if you should
|
|||
|
// write() some more.
|
|||
|
Readable.prototype.push = function(chunk, encoding) {
|
|||
|
var state = this._readableState;
|
|||
|
|
|||
|
if (typeof chunk === 'string' && !state.objectMode) {
|
|||
|
encoding = encoding || state.defaultEncoding;
|
|||
|
if (encoding !== state.encoding) {
|
|||
|
chunk = new Buffer(chunk, encoding);
|
|||
|
encoding = '';
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return readableAddChunk(this, state, chunk, encoding, false);
|
|||
|
};
|
|||
|
|
|||
|
// Unshift should *always* be something directly out of read()
|
|||
|
Readable.prototype.unshift = function(chunk) {
|
|||
|
var state = this._readableState;
|
|||
|
return readableAddChunk(this, state, chunk, '', true);
|
|||
|
};
|
|||
|
|
|||
|
function readableAddChunk(stream, state, chunk, encoding, addToFront) {
|
|||
|
var er = chunkInvalid(state, chunk);
|
|||
|
if (er) {
|
|||
|
stream.emit('error', er);
|
|||
|
} else if (chunk === null || chunk === undefined) {
|
|||
|
state.reading = false;
|
|||
|
if (!state.ended)
|
|||
|
onEofChunk(stream, state);
|
|||
|
} else if (state.objectMode || chunk && chunk.length > 0) {
|
|||
|
if (state.ended && !addToFront) {
|
|||
|
var e = new Error('stream.push() after EOF');
|
|||
|
stream.emit('error', e);
|
|||
|
} else if (state.endEmitted && addToFront) {
|
|||
|
var e = new Error('stream.unshift() after end event');
|
|||
|
stream.emit('error', e);
|
|||
|
} else {
|
|||
|
if (state.decoder && !addToFront && !encoding)
|
|||
|
chunk = state.decoder.write(chunk);
|
|||
|
|
|||
|
// update the buffer info.
|
|||
|
state.length += state.objectMode ? 1 : chunk.length;
|
|||
|
if (addToFront) {
|
|||
|
state.buffer.unshift(chunk);
|
|||
|
} else {
|
|||
|
state.reading = false;
|
|||
|
state.buffer.push(chunk);
|
|||
|
}
|
|||
|
|
|||
|
if (state.needReadable)
|
|||
|
emitReadable(stream);
|
|||
|
|
|||
|
maybeReadMore(stream, state);
|
|||
|
}
|
|||
|
} else if (!addToFront) {
|
|||
|
state.reading = false;
|
|||
|
}
|
|||
|
|
|||
|
return needMoreData(state);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// if it's past the high water mark, we can push in some more.
|
|||
|
// Also, if we have no data yet, we can stand some
|
|||
|
// more bytes. This is to work around cases where hwm=0,
|
|||
|
// such as the repl. Also, if the push() triggered a
|
|||
|
// readable event, and the user called read(largeNumber) such that
|
|||
|
// needReadable was set, then we ought to push more, so that another
|
|||
|
// 'readable' event will be triggered.
|
|||
|
function needMoreData(state) {
|
|||
|
return !state.ended &&
|
|||
|
(state.needReadable ||
|
|||
|
state.length < state.highWaterMark ||
|
|||
|
state.length === 0);
|
|||
|
}
|
|||
|
|
|||
|
// backwards compatibility.
|
|||
|
Readable.prototype.setEncoding = function(enc) {
|
|||
|
if (!StringDecoder)
|
|||
|
StringDecoder = require('string_decoder/').StringDecoder;
|
|||
|
this._readableState.decoder = new StringDecoder(enc);
|
|||
|
this._readableState.encoding = enc;
|
|||
|
};
|
|||
|
|
|||
|
// Don't raise the hwm > 128MB
|
|||
|
var MAX_HWM = 0x800000;
|
|||
|
function roundUpToNextPowerOf2(n) {
|
|||
|
if (n >= MAX_HWM) {
|
|||
|
n = MAX_HWM;
|
|||
|
} else {
|
|||
|
// Get the next highest power of 2
|
|||
|
n--;
|
|||
|
for (var p = 1; p < 32; p <<= 1) n |= n >> p;
|
|||
|
n++;
|
|||
|
}
|
|||
|
return n;
|
|||
|
}
|
|||
|
|
|||
|
function howMuchToRead(n, state) {
|
|||
|
if (state.length === 0 && state.ended)
|
|||
|
return 0;
|
|||
|
|
|||
|
if (state.objectMode)
|
|||
|
return n === 0 ? 0 : 1;
|
|||
|
|
|||
|
if (n === null || isNaN(n)) {
|
|||
|
// only flow one buffer at a time
|
|||
|
if (state.flowing && state.buffer.length)
|
|||
|
return state.buffer[0].length;
|
|||
|
else
|
|||
|
return state.length;
|
|||
|
}
|
|||
|
|
|||
|
if (n <= 0)
|
|||
|
return 0;
|
|||
|
|
|||
|
// If we're asking for more than the target buffer level,
|
|||
|
// then raise the water mark. Bump up to the next highest
|
|||
|
// power of 2, to prevent increasing it excessively in tiny
|
|||
|
// amounts.
|
|||
|
if (n > state.highWaterMark)
|
|||
|
state.highWaterMark = roundUpToNextPowerOf2(n);
|
|||
|
|
|||
|
// don't have that much. return null, unless we've ended.
|
|||
|
if (n > state.length) {
|
|||
|
if (!state.ended) {
|
|||
|
state.needReadable = true;
|
|||
|
return 0;
|
|||
|
} else
|
|||
|
return state.length;
|
|||
|
}
|
|||
|
|
|||
|
return n;
|
|||
|
}
|
|||
|
|
|||
|
// you can override either this method, or the async _read(n) below.
|
|||
|
Readable.prototype.read = function(n) {
|
|||
|
var state = this._readableState;
|
|||
|
state.calledRead = true;
|
|||
|
var nOrig = n;
|
|||
|
var ret;
|
|||
|
|
|||
|
if (typeof n !== 'number' || n > 0)
|
|||
|
state.emittedReadable = false;
|
|||
|
|
|||
|
// if we're doing read(0) to trigger a readable event, but we
|
|||
|
// already have a bunch of data in the buffer, then just trigger
|
|||
|
// the 'readable' event and move on.
|
|||
|
if (n === 0 &&
|
|||
|
state.needReadable &&
|
|||
|
(state.length >= state.highWaterMark || state.ended)) {
|
|||
|
emitReadable(this);
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
n = howMuchToRead(n, state);
|
|||
|
|
|||
|
// if we've ended, and we're now clear, then finish it up.
|
|||
|
if (n === 0 && state.ended) {
|
|||
|
ret = null;
|
|||
|
|
|||
|
// In cases where the decoder did not receive enough data
|
|||
|
// to produce a full chunk, then immediately received an
|
|||
|
// EOF, state.buffer will contain [<Buffer >, <Buffer 00 ...>].
|
|||
|
// howMuchToRead will see this and coerce the amount to
|
|||
|
// read to zero (because it's looking at the length of the
|
|||
|
// first <Buffer > in state.buffer), and we'll end up here.
|
|||
|
//
|
|||
|
// This can only happen via state.decoder -- no other venue
|
|||
|
// exists for pushing a zero-length chunk into state.buffer
|
|||
|
// and triggering this behavior. In this case, we return our
|
|||
|
// remaining data and end the stream, if appropriate.
|
|||
|
if (state.length > 0 && state.decoder) {
|
|||
|
ret = fromList(n, state);
|
|||
|
state.length -= ret.length;
|
|||
|
}
|
|||
|
|
|||
|
if (state.length === 0)
|
|||
|
endReadable(this);
|
|||
|
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
// All the actual chunk generation logic needs to be
|
|||
|
// *below* the call to _read. The reason is that in certain
|
|||
|
// synthetic stream cases, such as passthrough streams, _read
|
|||
|
// may be a completely synchronous operation which may change
|
|||
|
// the state of the read buffer, providing enough data when
|
|||
|
// before there was *not* enough.
|
|||
|
//
|
|||
|
// So, the steps are:
|
|||
|
// 1. Figure out what the state of things will be after we do
|
|||
|
// a read from the buffer.
|
|||
|
//
|
|||
|
// 2. If that resulting state will trigger a _read, then call _read.
|
|||
|
// Note that this may be asynchronous, or synchronous. Yes, it is
|
|||
|
// deeply ugly to write APIs this way, but that still doesn't mean
|
|||
|
// that the Readable class should behave improperly, as streams are
|
|||
|
// designed to be sync/async agnostic.
|
|||
|
// Take note if the _read call is sync or async (ie, if the read call
|
|||
|
// has returned yet), so that we know whether or not it's safe to emit
|
|||
|
// 'readable' etc.
|
|||
|
//
|
|||
|
// 3. Actually pull the requested chunks out of the buffer and return.
|
|||
|
|
|||
|
// if we need a readable event, then we need to do some reading.
|
|||
|
var doRead = state.needReadable;
|
|||
|
|
|||
|
// if we currently have less than the highWaterMark, then also read some
|
|||
|
if (state.length - n <= state.highWaterMark)
|
|||
|
doRead = true;
|
|||
|
|
|||
|
// however, if we've ended, then there's no point, and if we're already
|
|||
|
// reading, then it's unnecessary.
|
|||
|
if (state.ended || state.reading)
|
|||
|
doRead = false;
|
|||
|
|
|||
|
if (doRead) {
|
|||
|
state.reading = true;
|
|||
|
state.sync = true;
|
|||
|
// if the length is currently zero, then we *need* a readable event.
|
|||
|
if (state.length === 0)
|
|||
|
state.needReadable = true;
|
|||
|
// call internal read method
|
|||
|
this._read(state.highWaterMark);
|
|||
|
state.sync = false;
|
|||
|
}
|
|||
|
|
|||
|
// If _read called its callback synchronously, then `reading`
|
|||
|
// will be false, and we need to re-evaluate how much data we
|
|||
|
// can return to the user.
|
|||
|
if (doRead && !state.reading)
|
|||
|
n = howMuchToRead(nOrig, state);
|
|||
|
|
|||
|
if (n > 0)
|
|||
|
ret = fromList(n, state);
|
|||
|
else
|
|||
|
ret = null;
|
|||
|
|
|||
|
if (ret === null) {
|
|||
|
state.needReadable = true;
|
|||
|
n = 0;
|
|||
|
}
|
|||
|
|
|||
|
state.length -= n;
|
|||
|
|
|||
|
// If we have nothing in the buffer, then we want to know
|
|||
|
// as soon as we *do* get something into the buffer.
|
|||
|
if (state.length === 0 && !state.ended)
|
|||
|
state.needReadable = true;
|
|||
|
|
|||
|
// If we happened to read() exactly the remaining amount in the
|
|||
|
// buffer, and the EOF has been seen at this point, then make sure
|
|||
|
// that we emit 'end' on the very next tick.
|
|||
|
if (state.ended && !state.endEmitted && state.length === 0)
|
|||
|
endReadable(this);
|
|||
|
|
|||
|
return ret;
|
|||
|
};
|
|||
|
|
|||
|
function chunkInvalid(state, chunk) {
|
|||
|
var er = null;
|
|||
|
if (!Buffer.isBuffer(chunk) &&
|
|||
|
'string' !== typeof chunk &&
|
|||
|
chunk !== null &&
|
|||
|
chunk !== undefined &&
|
|||
|
!state.objectMode) {
|
|||
|
er = new TypeError('Invalid non-string/buffer chunk');
|
|||
|
}
|
|||
|
return er;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
function onEofChunk(stream, state) {
|
|||
|
if (state.decoder && !state.ended) {
|
|||
|
var chunk = state.decoder.end();
|
|||
|
if (chunk && chunk.length) {
|
|||
|
state.buffer.push(chunk);
|
|||
|
state.length += state.objectMode ? 1 : chunk.length;
|
|||
|
}
|
|||
|
}
|
|||
|
state.ended = true;
|
|||
|
|
|||
|
// if we've ended and we have some data left, then emit
|
|||
|
// 'readable' now to make sure it gets picked up.
|
|||
|
if (state.length > 0)
|
|||
|
emitReadable(stream);
|
|||
|
else
|
|||
|
endReadable(stream);
|
|||
|
}
|
|||
|
|
|||
|
// Don't emit readable right away in sync mode, because this can trigger
|
|||
|
// another read() call => stack overflow. This way, it might trigger
|
|||
|
// a nextTick recursion warning, but that's not so bad.
|
|||
|
function emitReadable(stream) {
|
|||
|
var state = stream._readableState;
|
|||
|
state.needReadable = false;
|
|||
|
if (state.emittedReadable)
|
|||
|
return;
|
|||
|
|
|||
|
state.emittedReadable = true;
|
|||
|
if (state.sync)
|
|||
|
process.nextTick(function() {
|
|||
|
emitReadable_(stream);
|
|||
|
});
|
|||
|
else
|
|||
|
emitReadable_(stream);
|
|||
|
}
|
|||
|
|
|||
|
function emitReadable_(stream) {
|
|||
|
stream.emit('readable');
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// at this point, the user has presumably seen the 'readable' event,
|
|||
|
// and called read() to consume some data. that may have triggered
|
|||
|
// in turn another _read(n) call, in which case reading = true if
|
|||
|
// it's in progress.
|
|||
|
// However, if we're not ended, or reading, and the length < hwm,
|
|||
|
// then go ahead and try to read some more preemptively.
|
|||
|
function maybeReadMore(stream, state) {
|
|||
|
if (!state.readingMore) {
|
|||
|
state.readingMore = true;
|
|||
|
process.nextTick(function() {
|
|||
|
maybeReadMore_(stream, state);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function maybeReadMore_(stream, state) {
|
|||
|
var len = state.length;
|
|||
|
while (!state.reading && !state.flowing && !state.ended &&
|
|||
|
state.length < state.highWaterMark) {
|
|||
|
stream.read(0);
|
|||
|
if (len === state.length)
|
|||
|
// didn't get any data, stop spinning.
|
|||
|
break;
|
|||
|
else
|
|||
|
len = state.length;
|
|||
|
}
|
|||
|
state.readingMore = false;
|
|||
|
}
|
|||
|
|
|||
|
// abstract method. to be overridden in specific implementation classes.
|
|||
|
// call cb(er, data) where data is <= n in length.
|
|||
|
// for virtual (non-string, non-buffer) streams, "length" is somewhat
|
|||
|
// arbitrary, and perhaps not very meaningful.
|
|||
|
Readable.prototype._read = function(n) {
|
|||
|
this.emit('error', new Error('not implemented'));
|
|||
|
};
|
|||
|
|
|||
|
Readable.prototype.pipe = function(dest, pipeOpts) {
|
|||
|
var src = this;
|
|||
|
var state = this._readableState;
|
|||
|
|
|||
|
switch (state.pipesCount) {
|
|||
|
case 0:
|
|||
|
state.pipes = dest;
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
state.pipes = [state.pipes, dest];
|
|||
|
break;
|
|||
|
default:
|
|||
|
state.pipes.push(dest);
|
|||
|
break;
|
|||
|
}
|
|||
|
state.pipesCount += 1;
|
|||
|
|
|||
|
var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
|
|||
|
dest !== process.stdout &&
|
|||
|
dest !== process.stderr;
|
|||
|
|
|||
|
var endFn = doEnd ? onend : cleanup;
|
|||
|
if (state.endEmitted)
|
|||
|
process.nextTick(endFn);
|
|||
|
else
|
|||
|
src.once('end', endFn);
|
|||
|
|
|||
|
dest.on('unpipe', onunpipe);
|
|||
|
function onunpipe(readable) {
|
|||
|
if (readable !== src) return;
|
|||
|
cleanup();
|
|||
|
}
|
|||
|
|
|||
|
function onend() {
|
|||
|
dest.end();
|
|||
|
}
|
|||
|
|
|||
|
// when the dest drains, it reduces the awaitDrain counter
|
|||
|
// on the source. This would be more elegant with a .once()
|
|||
|
// handler in flow(), but adding and removing repeatedly is
|
|||
|
// too slow.
|
|||
|
var ondrain = pipeOnDrain(src);
|
|||
|
dest.on('drain', ondrain);
|
|||
|
|
|||
|
function cleanup() {
|
|||
|
// cleanup event handlers once the pipe is broken
|
|||
|
dest.removeListener('close', onclose);
|
|||
|
dest.removeListener('finish', onfinish);
|
|||
|
dest.removeListener('drain', ondrain);
|
|||
|
dest.removeListener('error', onerror);
|
|||
|
dest.removeListener('unpipe', onunpipe);
|
|||
|
src.removeListener('end', onend);
|
|||
|
src.removeListener('end', cleanup);
|
|||
|
|
|||
|
// if the reader is waiting for a drain event from this
|
|||
|
// specific writer, then it would cause it to never start
|
|||
|
// flowing again.
|
|||
|
// So, if this is awaiting a drain, then we just call it now.
|
|||
|
// If we don't know, then assume that we are waiting for one.
|
|||
|
if (!dest._writableState || dest._writableState.needDrain)
|
|||
|
ondrain();
|
|||
|
}
|
|||
|
|
|||
|
// if the dest has an error, then stop piping into it.
|
|||
|
// however, don't suppress the throwing behavior for this.
|
|||
|
function onerror(er) {
|
|||
|
unpipe();
|
|||
|
dest.removeListener('error', onerror);
|
|||
|
if (EE.listenerCount(dest, 'error') === 0)
|
|||
|
dest.emit('error', er);
|
|||
|
}
|
|||
|
// This is a brutally ugly hack to make sure that our error handler
|
|||
|
// is attached before any userland ones. NEVER DO THIS.
|
|||
|
if (!dest._events || !dest._events.error)
|
|||
|
dest.on('error', onerror);
|
|||
|
else if (isArray(dest._events.error))
|
|||
|
dest._events.error.unshift(onerror);
|
|||
|
else
|
|||
|
dest._events.error = [onerror, dest._events.error];
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// Both close and finish should trigger unpipe, but only once.
|
|||
|
function onclose() {
|
|||
|
dest.removeListener('finish', onfinish);
|
|||
|
unpipe();
|
|||
|
}
|
|||
|
dest.once('close', onclose);
|
|||
|
function onfinish() {
|
|||
|
dest.removeListener('close', onclose);
|
|||
|
unpipe();
|
|||
|
}
|
|||
|
dest.once('finish', onfinish);
|
|||
|
|
|||
|
function unpipe() {
|
|||
|
src.unpipe(dest);
|
|||
|
}
|
|||
|
|
|||
|
// tell the dest that it's being piped to
|
|||
|
dest.emit('pipe', src);
|
|||
|
|
|||
|
// start the flow if it hasn't been started already.
|
|||
|
if (!state.flowing) {
|
|||
|
// the handler that waits for readable events after all
|
|||
|
// the data gets sucked out in flow.
|
|||
|
// This would be easier to follow with a .once() handler
|
|||
|
// in flow(), but that is too slow.
|
|||
|
this.on('readable', pipeOnReadable);
|
|||
|
|
|||
|
state.flowing = true;
|
|||
|
process.nextTick(function() {
|
|||
|
flow(src);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
return dest;
|
|||
|
};
|
|||
|
|
|||
|
function pipeOnDrain(src) {
|
|||
|
return function() {
|
|||
|
var dest = this;
|
|||
|
var state = src._readableState;
|
|||
|
state.awaitDrain--;
|
|||
|
if (state.awaitDrain === 0)
|
|||
|
flow(src);
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
function flow(src) {
|
|||
|
var state = src._readableState;
|
|||
|
var chunk;
|
|||
|
state.awaitDrain = 0;
|
|||
|
|
|||
|
function write(dest, i, list) {
|
|||
|
var written = dest.write(chunk);
|
|||
|
if (false === written) {
|
|||
|
state.awaitDrain++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
while (state.pipesCount && null !== (chunk = src.read())) {
|
|||
|
|
|||
|
if (state.pipesCount === 1)
|
|||
|
write(state.pipes, 0, null);
|
|||
|
else
|
|||
|
forEach(state.pipes, write);
|
|||
|
|
|||
|
src.emit('data', chunk);
|
|||
|
|
|||
|
// if anyone needs a drain, then we have to wait for that.
|
|||
|
if (state.awaitDrain > 0)
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// if every destination was unpiped, either before entering this
|
|||
|
// function, or in the while loop, then stop flowing.
|
|||
|
//
|
|||
|
// NB: This is a pretty rare edge case.
|
|||
|
if (state.pipesCount === 0) {
|
|||
|
state.flowing = false;
|
|||
|
|
|||
|
// if there were data event listeners added, then switch to old mode.
|
|||
|
if (EE.listenerCount(src, 'data') > 0)
|
|||
|
emitDataEvents(src);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// at this point, no one needed a drain, so we just ran out of data
|
|||
|
// on the next readable event, start it over again.
|
|||
|
state.ranOut = true;
|
|||
|
}
|
|||
|
|
|||
|
function pipeOnReadable() {
|
|||
|
if (this._readableState.ranOut) {
|
|||
|
this._readableState.ranOut = false;
|
|||
|
flow(this);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Readable.prototype.unpipe = function(dest) {
|
|||
|
var state = this._readableState;
|
|||
|
|
|||
|
// if we're not piping anywhere, then do nothing.
|
|||
|
if (state.pipesCount === 0)
|
|||
|
return this;
|
|||
|
|
|||
|
// just one destination. most common case.
|
|||
|
if (state.pipesCount === 1) {
|
|||
|
// passed in one, but it's not the right one.
|
|||
|
if (dest && dest !== state.pipes)
|
|||
|
return this;
|
|||
|
|
|||
|
if (!dest)
|
|||
|
dest = state.pipes;
|
|||
|
|
|||
|
// got a match.
|
|||
|
state.pipes = null;
|
|||
|
state.pipesCount = 0;
|
|||
|
this.removeListener('readable', pipeOnReadable);
|
|||
|
state.flowing = false;
|
|||
|
if (dest)
|
|||
|
dest.emit('unpipe', this);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// slow case. multiple pipe destinations.
|
|||
|
|
|||
|
if (!dest) {
|
|||
|
// remove all.
|
|||
|
var dests = state.pipes;
|
|||
|
var len = state.pipesCount;
|
|||
|
state.pipes = null;
|
|||
|
state.pipesCount = 0;
|
|||
|
this.removeListener('readable', pipeOnReadable);
|
|||
|
state.flowing = false;
|
|||
|
|
|||
|
for (var i = 0; i < len; i++)
|
|||
|
dests[i].emit('unpipe', this);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// try to find the right one.
|
|||
|
var i = indexOf(state.pipes, dest);
|
|||
|
if (i === -1)
|
|||
|
return this;
|
|||
|
|
|||
|
state.pipes.splice(i, 1);
|
|||
|
state.pipesCount -= 1;
|
|||
|
if (state.pipesCount === 1)
|
|||
|
state.pipes = state.pipes[0];
|
|||
|
|
|||
|
dest.emit('unpipe', this);
|
|||
|
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
// set up data events if they are asked for
|
|||
|
// Ensure readable listeners eventually get something
|
|||
|
Readable.prototype.on = function(ev, fn) {
|
|||
|
var res = Stream.prototype.on.call(this, ev, fn);
|
|||
|
|
|||
|
if (ev === 'data' && !this._readableState.flowing)
|
|||
|
emitDataEvents(this);
|
|||
|
|
|||
|
if (ev === 'readable' && this.readable) {
|
|||
|
var state = this._readableState;
|
|||
|
if (!state.readableListening) {
|
|||
|
state.readableListening = true;
|
|||
|
state.emittedReadable = false;
|
|||
|
state.needReadable = true;
|
|||
|
if (!state.reading) {
|
|||
|
this.read(0);
|
|||
|
} else if (state.length) {
|
|||
|
emitReadable(this, state);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return res;
|
|||
|
};
|
|||
|
Readable.prototype.addListener = Readable.prototype.on;
|
|||
|
|
|||
|
// pause() and resume() are remnants of the legacy readable stream API
|
|||
|
// If the user uses them, then switch into old mode.
|
|||
|
Readable.prototype.resume = function() {
|
|||
|
emitDataEvents(this);
|
|||
|
this.read(0);
|
|||
|
this.emit('resume');
|
|||
|
};
|
|||
|
|
|||
|
Readable.prototype.pause = function() {
|
|||
|
emitDataEvents(this, true);
|
|||
|
this.emit('pause');
|
|||
|
};
|
|||
|
|
|||
|
function emitDataEvents(stream, startPaused) {
|
|||
|
var state = stream._readableState;
|
|||
|
|
|||
|
if (state.flowing) {
|
|||
|
// https://github.com/isaacs/readable-stream/issues/16
|
|||
|
throw new Error('Cannot switch to old mode now.');
|
|||
|
}
|
|||
|
|
|||
|
var paused = startPaused || false;
|
|||
|
var readable = false;
|
|||
|
|
|||
|
// convert to an old-style stream.
|
|||
|
stream.readable = true;
|
|||
|
stream.pipe = Stream.prototype.pipe;
|
|||
|
stream.on = stream.addListener = Stream.prototype.on;
|
|||
|
|
|||
|
stream.on('readable', function() {
|
|||
|
readable = true;
|
|||
|
|
|||
|
var c;
|
|||
|
while (!paused && (null !== (c = stream.read())))
|
|||
|
stream.emit('data', c);
|
|||
|
|
|||
|
if (c === null) {
|
|||
|
readable = false;
|
|||
|
stream._readableState.needReadable = true;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
stream.pause = function() {
|
|||
|
paused = true;
|
|||
|
this.emit('pause');
|
|||
|
};
|
|||
|
|
|||
|
stream.resume = function() {
|
|||
|
paused = false;
|
|||
|
if (readable)
|
|||
|
process.nextTick(function() {
|
|||
|
stream.emit('readable');
|
|||
|
});
|
|||
|
else
|
|||
|
this.read(0);
|
|||
|
this.emit('resume');
|
|||
|
};
|
|||
|
|
|||
|
// now make it start, just in case it hadn't already.
|
|||
|
stream.emit('readable');
|
|||
|
}
|
|||
|
|
|||
|
// wrap an old-style stream as the async data source.
|
|||
|
// This is *not* part of the readable stream interface.
|
|||
|
// It is an ugly unfortunate mess of history.
|
|||
|
Readable.prototype.wrap = function(stream) {
|
|||
|
var state = this._readableState;
|
|||
|
var paused = false;
|
|||
|
|
|||
|
var self = this;
|
|||
|
stream.on('end', function() {
|
|||
|
if (state.decoder && !state.ended) {
|
|||
|
var chunk = state.decoder.end();
|
|||
|
if (chunk && chunk.length)
|
|||
|
self.push(chunk);
|
|||
|
}
|
|||
|
|
|||
|
self.push(null);
|
|||
|
});
|
|||
|
|
|||
|
stream.on('data', function(chunk) {
|
|||
|
if (state.decoder)
|
|||
|
chunk = state.decoder.write(chunk);
|
|||
|
|
|||
|
// don't skip over falsy values in objectMode
|
|||
|
//if (state.objectMode && util.isNullOrUndefined(chunk))
|
|||
|
if (state.objectMode && (chunk === null || chunk === undefined))
|
|||
|
return;
|
|||
|
else if (!state.objectMode && (!chunk || !chunk.length))
|
|||
|
return;
|
|||
|
|
|||
|
var ret = self.push(chunk);
|
|||
|
if (!ret) {
|
|||
|
paused = true;
|
|||
|
stream.pause();
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
// proxy all the other methods.
|
|||
|
// important when wrapping filters and duplexes.
|
|||
|
for (var i in stream) {
|
|||
|
if (typeof stream[i] === 'function' &&
|
|||
|
typeof this[i] === 'undefined') {
|
|||
|
this[i] = function(method) { return function() {
|
|||
|
return stream[method].apply(stream, arguments);
|
|||
|
}}(i);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// proxy certain important events.
|
|||
|
var events = ['error', 'close', 'destroy', 'pause', 'resume'];
|
|||
|
forEach(events, function(ev) {
|
|||
|
stream.on(ev, self.emit.bind(self, ev));
|
|||
|
});
|
|||
|
|
|||
|
// when we try to consume some more bytes, simply unpause the
|
|||
|
// underlying stream.
|
|||
|
self._read = function(n) {
|
|||
|
if (paused) {
|
|||
|
paused = false;
|
|||
|
stream.resume();
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
return self;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// exposed for testing purposes only.
|
|||
|
Readable._fromList = fromList;
|
|||
|
|
|||
|
// Pluck off n bytes from an array of buffers.
|
|||
|
// Length is the combined lengths of all the buffers in the list.
|
|||
|
function fromList(n, state) {
|
|||
|
var list = state.buffer;
|
|||
|
var length = state.length;
|
|||
|
var stringMode = !!state.decoder;
|
|||
|
var objectMode = !!state.objectMode;
|
|||
|
var ret;
|
|||
|
|
|||
|
// nothing in the list, definitely empty.
|
|||
|
if (list.length === 0)
|
|||
|
return null;
|
|||
|
|
|||
|
if (length === 0)
|
|||
|
ret = null;
|
|||
|
else if (objectMode)
|
|||
|
ret = list.shift();
|
|||
|
else if (!n || n >= length) {
|
|||
|
// read it all, truncate the array.
|
|||
|
if (stringMode)
|
|||
|
ret = list.join('');
|
|||
|
else
|
|||
|
ret = Buffer.concat(list, length);
|
|||
|
list.length = 0;
|
|||
|
} else {
|
|||
|
// read just some of it.
|
|||
|
if (n < list[0].length) {
|
|||
|
// just take a part of the first list item.
|
|||
|
// slice is the same for buffers and strings.
|
|||
|
var buf = list[0];
|
|||
|
ret = buf.slice(0, n);
|
|||
|
list[0] = buf.slice(n);
|
|||
|
} else if (n === list[0].length) {
|
|||
|
// first list is a perfect match
|
|||
|
ret = list.shift();
|
|||
|
} else {
|
|||
|
// complex case.
|
|||
|
// we have enough to cover it, but it spans past the first buffer.
|
|||
|
if (stringMode)
|
|||
|
ret = '';
|
|||
|
else
|
|||
|
ret = new Buffer(n);
|
|||
|
|
|||
|
var c = 0;
|
|||
|
for (var i = 0, l = list.length; i < l && c < n; i++) {
|
|||
|
var buf = list[0];
|
|||
|
var cpy = Math.min(n - c, buf.length);
|
|||
|
|
|||
|
if (stringMode)
|
|||
|
ret += buf.slice(0, cpy);
|
|||
|
else
|
|||
|
buf.copy(ret, c, 0, cpy);
|
|||
|
|
|||
|
if (cpy < buf.length)
|
|||
|
list[0] = buf.slice(cpy);
|
|||
|
else
|
|||
|
list.shift();
|
|||
|
|
|||
|
c += cpy;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
function endReadable(stream) {
|
|||
|
var state = stream._readableState;
|
|||
|
|
|||
|
// If we get here before consuming all the bytes, then that is a
|
|||
|
// bug in node. Should never happen.
|
|||
|
if (state.length > 0)
|
|||
|
throw new Error('endReadable called on non-empty stream');
|
|||
|
|
|||
|
if (!state.endEmitted && state.calledRead) {
|
|||
|
state.ended = true;
|
|||
|
process.nextTick(function() {
|
|||
|
// Check that we didn't get one last unshift.
|
|||
|
if (!state.endEmitted && state.length === 0) {
|
|||
|
state.endEmitted = true;
|
|||
|
stream.readable = false;
|
|||
|
stream.emit('end');
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function forEach (xs, f) {
|
|||
|
for (var i = 0, l = xs.length; i < l; i++) {
|
|||
|
f(xs[i], i);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function indexOf (xs, x) {
|
|||
|
for (var i = 0, l = xs.length; i < l; i++) {
|
|||
|
if (xs[i] === x) return i;
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
}).call(this,require('_process'))
|
|||
|
},{"_process":8,"buffer":1,"core-util-is":15,"events":5,"inherits":6,"isarray":7,"stream":20,"string_decoder/":21}],13:[function(require,module,exports){
|
|||
|
// Copyright Joyent, Inc. and other Node contributors.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
|
// copy of this software and associated documentation files (the
|
|||
|
// "Software"), to deal in the Software without restriction, including
|
|||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
|
// persons to whom the Software is furnished to do so, subject to the
|
|||
|
// following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included
|
|||
|
// in all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|
|||
|
|
|||
|
// a transform stream is a readable/writable stream where you do
|
|||
|
// something with the data. Sometimes it's called a "filter",
|
|||
|
// but that's not a great name for it, since that implies a thing where
|
|||
|
// some bits pass through, and others are simply ignored. (That would
|
|||
|
// be a valid example of a transform, of course.)
|
|||
|
//
|
|||
|
// While the output is causally related to the input, it's not a
|
|||
|
// necessarily symmetric or synchronous transformation. For example,
|
|||
|
// a zlib stream might take multiple plain-text writes(), and then
|
|||
|
// emit a single compressed chunk some time in the future.
|
|||
|
//
|
|||
|
// Here's how this works:
|
|||
|
//
|
|||
|
// The Transform stream has all the aspects of the readable and writable
|
|||
|
// stream classes. When you write(chunk), that calls _write(chunk,cb)
|
|||
|
// internally, and returns false if there's a lot of pending writes
|
|||
|
// buffered up. When you call read(), that calls _read(n) until
|
|||
|
// there's enough pending readable data buffered up.
|
|||
|
//
|
|||
|
// In a transform stream, the written data is placed in a buffer. When
|
|||
|
// _read(n) is called, it transforms the queued up data, calling the
|
|||
|
// buffered _write cb's as it consumes chunks. If consuming a single
|
|||
|
// written chunk would result in multiple output chunks, then the first
|
|||
|
// outputted bit calls the readcb, and subsequent chunks just go into
|
|||
|
// the read buffer, and will cause it to emit 'readable' if necessary.
|
|||
|
//
|
|||
|
// This way, back-pressure is actually determined by the reading side,
|
|||
|
// since _read has to be called to start processing a new chunk. However,
|
|||
|
// a pathological inflate type of transform can cause excessive buffering
|
|||
|
// here. For example, imagine a stream where every byte of input is
|
|||
|
// interpreted as an integer from 0-255, and then results in that many
|
|||
|
// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
|
|||
|
// 1kb of data being output. In this case, you could write a very small
|
|||
|
// amount of input, and end up with a very large amount of output. In
|
|||
|
// such a pathological inflating mechanism, there'd be no way to tell
|
|||
|
// the system to stop doing the transform. A single 4MB write could
|
|||
|
// cause the system to run out of memory.
|
|||
|
//
|
|||
|
// However, even in such a pathological case, only a single written chunk
|
|||
|
// would be consumed, and then the rest would wait (un-transformed) until
|
|||
|
// the results of the previous transformed chunk were consumed.
|
|||
|
|
|||
|
module.exports = Transform;
|
|||
|
|
|||
|
var Duplex = require('./_stream_duplex');
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
var util = require('core-util-is');
|
|||
|
util.inherits = require('inherits');
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
util.inherits(Transform, Duplex);
|
|||
|
|
|||
|
|
|||
|
function TransformState(options, stream) {
|
|||
|
this.afterTransform = function(er, data) {
|
|||
|
return afterTransform(stream, er, data);
|
|||
|
};
|
|||
|
|
|||
|
this.needTransform = false;
|
|||
|
this.transforming = false;
|
|||
|
this.writecb = null;
|
|||
|
this.writechunk = null;
|
|||
|
}
|
|||
|
|
|||
|
function afterTransform(stream, er, data) {
|
|||
|
var ts = stream._transformState;
|
|||
|
ts.transforming = false;
|
|||
|
|
|||
|
var cb = ts.writecb;
|
|||
|
|
|||
|
if (!cb)
|
|||
|
return stream.emit('error', new Error('no writecb in Transform class'));
|
|||
|
|
|||
|
ts.writechunk = null;
|
|||
|
ts.writecb = null;
|
|||
|
|
|||
|
if (data !== null && data !== undefined)
|
|||
|
stream.push(data);
|
|||
|
|
|||
|
if (cb)
|
|||
|
cb(er);
|
|||
|
|
|||
|
var rs = stream._readableState;
|
|||
|
rs.reading = false;
|
|||
|
if (rs.needReadable || rs.length < rs.highWaterMark) {
|
|||
|
stream._read(rs.highWaterMark);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
function Transform(options) {
|
|||
|
if (!(this instanceof Transform))
|
|||
|
return new Transform(options);
|
|||
|
|
|||
|
Duplex.call(this, options);
|
|||
|
|
|||
|
var ts = this._transformState = new TransformState(options, this);
|
|||
|
|
|||
|
// when the writable side finishes, then flush out anything remaining.
|
|||
|
var stream = this;
|
|||
|
|
|||
|
// start out asking for a readable event once data is transformed.
|
|||
|
this._readableState.needReadable = true;
|
|||
|
|
|||
|
// we have implemented the _read method, and done the other things
|
|||
|
// that Readable wants before the first _read call, so unset the
|
|||
|
// sync guard flag.
|
|||
|
this._readableState.sync = false;
|
|||
|
|
|||
|
this.once('finish', function() {
|
|||
|
if ('function' === typeof this._flush)
|
|||
|
this._flush(function(er) {
|
|||
|
done(stream, er);
|
|||
|
});
|
|||
|
else
|
|||
|
done(stream);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
Transform.prototype.push = function(chunk, encoding) {
|
|||
|
this._transformState.needTransform = false;
|
|||
|
return Duplex.prototype.push.call(this, chunk, encoding);
|
|||
|
};
|
|||
|
|
|||
|
// This is the part where you do stuff!
|
|||
|
// override this function in implementation classes.
|
|||
|
// 'chunk' is an input chunk.
|
|||
|
//
|
|||
|
// Call `push(newChunk)` to pass along transformed output
|
|||
|
// to the readable side. You may call 'push' zero or more times.
|
|||
|
//
|
|||
|
// Call `cb(err)` when you are done with this chunk. If you pass
|
|||
|
// an error, then that'll put the hurt on the whole operation. If you
|
|||
|
// never call cb(), then you'll never get another chunk.
|
|||
|
Transform.prototype._transform = function(chunk, encoding, cb) {
|
|||
|
throw new Error('not implemented');
|
|||
|
};
|
|||
|
|
|||
|
Transform.prototype._write = function(chunk, encoding, cb) {
|
|||
|
var ts = this._transformState;
|
|||
|
ts.writecb = cb;
|
|||
|
ts.writechunk = chunk;
|
|||
|
ts.writeencoding = encoding;
|
|||
|
if (!ts.transforming) {
|
|||
|
var rs = this._readableState;
|
|||
|
if (ts.needTransform ||
|
|||
|
rs.needReadable ||
|
|||
|
rs.length < rs.highWaterMark)
|
|||
|
this._read(rs.highWaterMark);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// Doesn't matter what the args are here.
|
|||
|
// _transform does all the work.
|
|||
|
// That we got here means that the readable side wants more data.
|
|||
|
Transform.prototype._read = function(n) {
|
|||
|
var ts = this._transformState;
|
|||
|
|
|||
|
if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
|
|||
|
ts.transforming = true;
|
|||
|
this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
|
|||
|
} else {
|
|||
|
// mark that we need a transform, so that any data that comes in
|
|||
|
// will get processed, now that we've asked for it.
|
|||
|
ts.needTransform = true;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
function done(stream, er) {
|
|||
|
if (er)
|
|||
|
return stream.emit('error', er);
|
|||
|
|
|||
|
// if there's nothing in the write buffer, then that means
|
|||
|
// that nothing more will ever be provided
|
|||
|
var ws = stream._writableState;
|
|||
|
var rs = stream._readableState;
|
|||
|
var ts = stream._transformState;
|
|||
|
|
|||
|
if (ws.length)
|
|||
|
throw new Error('calling transform done when ws.length != 0');
|
|||
|
|
|||
|
if (ts.transforming)
|
|||
|
throw new Error('calling transform done when still transforming');
|
|||
|
|
|||
|
return stream.push(null);
|
|||
|
}
|
|||
|
|
|||
|
},{"./_stream_duplex":10,"core-util-is":15,"inherits":6}],14:[function(require,module,exports){
|
|||
|
(function (process){
|
|||
|
// Copyright Joyent, Inc. and other Node contributors.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
|
// copy of this software and associated documentation files (the
|
|||
|
// "Software"), to deal in the Software without restriction, including
|
|||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
|
// persons to whom the Software is furnished to do so, subject to the
|
|||
|
// following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included
|
|||
|
// in all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|
|||
|
// A bit simpler than readable streams.
|
|||
|
// Implement an async ._write(chunk, cb), and it'll handle all
|
|||
|
// the drain event emission and buffering.
|
|||
|
|
|||
|
module.exports = Writable;
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
var Buffer = require('buffer').Buffer;
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
Writable.WritableState = WritableState;
|
|||
|
|
|||
|
|
|||
|
/*<replacement>*/
|
|||
|
var util = require('core-util-is');
|
|||
|
util.inherits = require('inherits');
|
|||
|
/*</replacement>*/
|
|||
|
|
|||
|
var Stream = require('stream');
|
|||
|
|
|||
|
util.inherits(Writable, Stream);
|
|||
|
|
|||
|
function WriteReq(chunk, encoding, cb) {
|
|||
|
this.chunk = chunk;
|
|||
|
this.encoding = encoding;
|
|||
|
this.callback = cb;
|
|||
|
}
|
|||
|
|
|||
|
function WritableState(options, stream) {
|
|||
|
options = options || {};
|
|||
|
|
|||
|
// the point at which write() starts returning false
|
|||
|
// Note: 0 is a valid value, means that we always return false if
|
|||
|
// the entire buffer is not flushed immediately on write()
|
|||
|
var hwm = options.highWaterMark;
|
|||
|
this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
|
|||
|
|
|||
|
// object stream flag to indicate whether or not this stream
|
|||
|
// contains buffers or objects.
|
|||
|
this.objectMode = !!options.objectMode;
|
|||
|
|
|||
|
// cast to ints.
|
|||
|
this.highWaterMark = ~~this.highWaterMark;
|
|||
|
|
|||
|
this.needDrain = false;
|
|||
|
// at the start of calling end()
|
|||
|
this.ending = false;
|
|||
|
// when end() has been called, and returned
|
|||
|
this.ended = false;
|
|||
|
// when 'finish' is emitted
|
|||
|
this.finished = false;
|
|||
|
|
|||
|
// should we decode strings into buffers before passing to _write?
|
|||
|
// this is here so that some node-core streams can optimize string
|
|||
|
// handling at a lower level.
|
|||
|
var noDecode = options.decodeStrings === false;
|
|||
|
this.decodeStrings = !noDecode;
|
|||
|
|
|||
|
// Crypto is kind of old and crusty. Historically, its default string
|
|||
|
// encoding is 'binary' so we have to make this configurable.
|
|||
|
// Everything else in the universe uses 'utf8', though.
|
|||
|
this.defaultEncoding = options.defaultEncoding || 'utf8';
|
|||
|
|
|||
|
// not an actual buffer we keep track of, but a measurement
|
|||
|
// of how much we're waiting to get pushed to some underlying
|
|||
|
// socket or file.
|
|||
|
this.length = 0;
|
|||
|
|
|||
|
// a flag to see when we're in the middle of a write.
|
|||
|
this.writing = false;
|
|||
|
|
|||
|
// a flag to be able to tell if the onwrite cb is called immediately,
|
|||
|
// or on a later tick. We set this to true at first, becuase any
|
|||
|
// actions that shouldn't happen until "later" should generally also
|
|||
|
// not happen before the first write call.
|
|||
|
this.sync = true;
|
|||
|
|
|||
|
// a flag to know if we're processing previously buffered items, which
|
|||
|
// may call the _write() callback in the same tick, so that we don't
|
|||
|
// end up in an overlapped onwrite situation.
|
|||
|
this.bufferProcessing = false;
|
|||
|
|
|||
|
// the callback that's passed to _write(chunk,cb)
|
|||
|
this.onwrite = function(er) {
|
|||
|
onwrite(stream, er);
|
|||
|
};
|
|||
|
|
|||
|
// the callback that the user supplies to write(chunk,encoding,cb)
|
|||
|
this.writecb = null;
|
|||
|
|
|||
|
// the amount that is being written when _write is called.
|
|||
|
this.writelen = 0;
|
|||
|
|
|||
|
this.buffer = [];
|
|||
|
|
|||
|
// True if the error was already emitted and should not be thrown again
|
|||
|
this.errorEmitted = false;
|
|||
|
}
|
|||
|
|
|||
|
function Writable(options) {
|
|||
|
var Duplex = require('./_stream_duplex');
|
|||
|
|
|||
|
// Writable ctor is applied to Duplexes, though they're not
|
|||
|
// instanceof Writable, they're instanceof Readable.
|
|||
|
if (!(this instanceof Writable) && !(this instanceof Duplex))
|
|||
|
return new Writable(options);
|
|||
|
|
|||
|
this._writableState = new WritableState(options, this);
|
|||
|
|
|||
|
// legacy.
|
|||
|
this.writable = true;
|
|||
|
|
|||
|
Stream.call(this);
|
|||
|
}
|
|||
|
|
|||
|
// Otherwise people can pipe Writable streams, which is just wrong.
|
|||
|
Writable.prototype.pipe = function() {
|
|||
|
this.emit('error', new Error('Cannot pipe. Not readable.'));
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
function writeAfterEnd(stream, state, cb) {
|
|||
|
var er = new Error('write after end');
|
|||
|
// TODO: defer error events consistently everywhere, not just the cb
|
|||
|
stream.emit('error', er);
|
|||
|
process.nextTick(function() {
|
|||
|
cb(er);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// If we get something that is not a buffer, string, null, or undefined,
|
|||
|
// and we're not in objectMode, then that's an error.
|
|||
|
// Otherwise stream chunks are all considered to be of length=1, and the
|
|||
|
// watermarks determine how many objects to keep in the buffer, rather than
|
|||
|
// how many bytes or characters.
|
|||
|
function validChunk(stream, state, chunk, cb) {
|
|||
|
var valid = true;
|
|||
|
if (!Buffer.isBuffer(chunk) &&
|
|||
|
'string' !== typeof chunk &&
|
|||
|
chunk !== null &&
|
|||
|
chunk !== undefined &&
|
|||
|
!state.objectMode) {
|
|||
|
var er = new TypeError('Invalid non-string/buffer chunk');
|
|||
|
stream.emit('error', er);
|
|||
|
process.nextTick(function() {
|
|||
|
cb(er);
|
|||
|
});
|
|||
|
valid = false;
|
|||
|
}
|
|||
|
return valid;
|
|||
|
}
|
|||
|
|
|||
|
Writable.prototype.write = function(chunk, encoding, cb) {
|
|||
|
var state = this._writableState;
|
|||
|
var ret = false;
|
|||
|
|
|||
|
if (typeof encoding === 'function') {
|
|||
|
cb = encoding;
|
|||
|
encoding = null;
|
|||
|
}
|
|||
|
|
|||
|
if (Buffer.isBuffer(chunk))
|
|||
|
encoding = 'buffer';
|
|||
|
else if (!encoding)
|
|||
|
encoding = state.defaultEncoding;
|
|||
|
|
|||
|
if (typeof cb !== 'function')
|
|||
|
cb = function() {};
|
|||
|
|
|||
|
if (state.ended)
|
|||
|
writeAfterEnd(this, state, cb);
|
|||
|
else if (validChunk(this, state, chunk, cb))
|
|||
|
ret = writeOrBuffer(this, state, chunk, encoding, cb);
|
|||
|
|
|||
|
return ret;
|
|||
|
};
|
|||
|
|
|||
|
function decodeChunk(state, chunk, encoding) {
|
|||
|
if (!state.objectMode &&
|
|||
|
state.decodeStrings !== false &&
|
|||
|
typeof chunk === 'string') {
|
|||
|
chunk = new Buffer(chunk, encoding);
|
|||
|
}
|
|||
|
return chunk;
|
|||
|
}
|
|||
|
|
|||
|
// if we're already writing something, then just put this
|
|||
|
// in the queue, and wait our turn. Otherwise, call _write
|
|||
|
// If we return false, then we need a drain event, so set that flag.
|
|||
|
function writeOrBuffer(stream, state, chunk, encoding, cb) {
|
|||
|
chunk = decodeChunk(state, chunk, encoding);
|
|||
|
if (Buffer.isBuffer(chunk))
|
|||
|
encoding = 'buffer';
|
|||
|
var len = state.objectMode ? 1 : chunk.length;
|
|||
|
|
|||
|
state.length += len;
|
|||
|
|
|||
|
var ret = state.length < state.highWaterMark;
|
|||
|
// we must ensure that previous needDrain will not be reset to false.
|
|||
|
if (!ret)
|
|||
|
state.needDrain = true;
|
|||
|
|
|||
|
if (state.writing)
|
|||
|
state.buffer.push(new WriteReq(chunk, encoding, cb));
|
|||
|
else
|
|||
|
doWrite(stream, state, len, chunk, encoding, cb);
|
|||
|
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
function doWrite(stream, state, len, chunk, encoding, cb) {
|
|||
|
state.writelen = len;
|
|||
|
state.writecb = cb;
|
|||
|
state.writing = true;
|
|||
|
state.sync = true;
|
|||
|
stream._write(chunk, encoding, state.onwrite);
|
|||
|
state.sync = false;
|
|||
|
}
|
|||
|
|
|||
|
function onwriteError(stream, state, sync, er, cb) {
|
|||
|
if (sync)
|
|||
|
process.nextTick(function() {
|
|||
|
cb(er);
|
|||
|
});
|
|||
|
else
|
|||
|
cb(er);
|
|||
|
|
|||
|
stream._writableState.errorEmitted = true;
|
|||
|
stream.emit('error', er);
|
|||
|
}
|
|||
|
|
|||
|
function onwriteStateUpdate(state) {
|
|||
|
state.writing = false;
|
|||
|
state.writecb = null;
|
|||
|
state.length -= state.writelen;
|
|||
|
state.writelen = 0;
|
|||
|
}
|
|||
|
|
|||
|
function onwrite(stream, er) {
|
|||
|
var state = stream._writableState;
|
|||
|
var sync = state.sync;
|
|||
|
var cb = state.writecb;
|
|||
|
|
|||
|
onwriteStateUpdate(state);
|
|||
|
|
|||
|
if (er)
|
|||
|
onwriteError(stream, state, sync, er, cb);
|
|||
|
else {
|
|||
|
// Check if we're actually ready to finish, but don't emit yet
|
|||
|
var finished = needFinish(stream, state);
|
|||
|
|
|||
|
if (!finished && !state.bufferProcessing && state.buffer.length)
|
|||
|
clearBuffer(stream, state);
|
|||
|
|
|||
|
if (sync) {
|
|||
|
process.nextTick(function() {
|
|||
|
afterWrite(stream, state, finished, cb);
|
|||
|
});
|
|||
|
} else {
|
|||
|
afterWrite(stream, state, finished, cb);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function afterWrite(stream, state, finished, cb) {
|
|||
|
if (!finished)
|
|||
|
onwriteDrain(stream, state);
|
|||
|
cb();
|
|||
|
if (finished)
|
|||
|
finishMaybe(stream, state);
|
|||
|
}
|
|||
|
|
|||
|
// Must force callback to be called on nextTick, so that we don't
|
|||
|
// emit 'drain' before the write() consumer gets the 'false' return
|
|||
|
// value, and has a chance to attach a 'drain' listener.
|
|||
|
function onwriteDrain(stream, state) {
|
|||
|
if (state.length === 0 && state.needDrain) {
|
|||
|
state.needDrain = false;
|
|||
|
stream.emit('drain');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// if there's something in the buffer waiting, then process it
|
|||
|
function clearBuffer(stream, state) {
|
|||
|
state.bufferProcessing = true;
|
|||
|
|
|||
|
for (var c = 0; c < state.buffer.length; c++) {
|
|||
|
var entry = state.buffer[c];
|
|||
|
var chunk = entry.chunk;
|
|||
|
var encoding = entry.encoding;
|
|||
|
var cb = entry.callback;
|
|||
|
var len = state.objectMode ? 1 : chunk.length;
|
|||
|
|
|||
|
doWrite(stream, state, len, chunk, encoding, cb);
|
|||
|
|
|||
|
// if we didn't call the onwrite immediately, then
|
|||
|
// it means that we need to wait until it does.
|
|||
|
// also, that means that the chunk and cb are currently
|
|||
|
// being processed, so move the buffer counter past them.
|
|||
|
if (state.writing) {
|
|||
|
c++;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
state.bufferProcessing = false;
|
|||
|
if (c < state.buffer.length)
|
|||
|
state.buffer = state.buffer.slice(c);
|
|||
|
else
|
|||
|
state.buffer.length = 0;
|
|||
|
}
|
|||
|
|
|||
|
Writable.prototype._write = function(chunk, encoding, cb) {
|
|||
|
cb(new Error('not implemented'));
|
|||
|
};
|
|||
|
|
|||
|
Writable.prototype.end = function(chunk, encoding, cb) {
|
|||
|
var state = this._writableState;
|
|||
|
|
|||
|
if (typeof chunk === 'function') {
|
|||
|
cb = chunk;
|
|||
|
chunk = null;
|
|||
|
encoding = null;
|
|||
|
} else if (typeof encoding === 'function') {
|
|||
|
cb = encoding;
|
|||
|
encoding = null;
|
|||
|
}
|
|||
|
|
|||
|
if (typeof chunk !== 'undefined' && chunk !== null)
|
|||
|
this.write(chunk, encoding);
|
|||
|
|
|||
|
// ignore unnecessary end() calls.
|
|||
|
if (!state.ending && !state.finished)
|
|||
|
endWritable(this, state, cb);
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
function needFinish(stream, state) {
|
|||
|
return (state.ending &&
|
|||
|
state.length === 0 &&
|
|||
|
!state.finished &&
|
|||
|
!state.writing);
|
|||
|
}
|
|||
|
|
|||
|
function finishMaybe(stream, state) {
|
|||
|
var need = needFinish(stream, state);
|
|||
|
if (need) {
|
|||
|
state.finished = true;
|
|||
|
stream.emit('finish');
|
|||
|
}
|
|||
|
return need;
|
|||
|
}
|
|||
|
|
|||
|
function endWritable(stream, state, cb) {
|
|||
|
state.ending = true;
|
|||
|
finishMaybe(stream, state);
|
|||
|
if (cb) {
|
|||
|
if (state.finished)
|
|||
|
process.nextTick(cb);
|
|||
|
else
|
|||
|
stream.once('finish', cb);
|
|||
|
}
|
|||
|
state.ended = true;
|
|||
|
}
|
|||
|
|
|||
|
}).call(this,require('_process'))
|
|||
|
},{"./_stream_duplex":10,"_process":8,"buffer":1,"core-util-is":15,"inherits":6,"stream":20}],15:[function(require,module,exports){
|
|||
|
(function (Buffer){
|
|||
|
// Copyright Joyent, Inc. and other Node contributors.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
|
// copy of this software and associated documentation files (the
|
|||
|
// "Software"), to deal in the Software without restriction, including
|
|||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
|
// persons to whom the Software is furnished to do so, subject to the
|
|||
|
// following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included
|
|||
|
// in all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|
|||
|
// NOTE: These type checking functions intentionally don't use `instanceof`
|
|||
|
// because it is fragile and can be easily faked with `Object.create()`.
|
|||
|
function isArray(ar) {
|
|||
|
return Array.isArray(ar);
|
|||
|
}
|
|||
|
exports.isArray = isArray;
|
|||
|
|
|||
|
function isBoolean(arg) {
|
|||
|
return typeof arg === 'boolean';
|
|||
|
}
|
|||
|
exports.isBoolean = isBoolean;
|
|||
|
|
|||
|
function isNull(arg) {
|
|||
|
return arg === null;
|
|||
|
}
|
|||
|
exports.isNull = isNull;
|
|||
|
|
|||
|
function isNullOrUndefined(arg) {
|
|||
|
return arg == null;
|
|||
|
}
|
|||
|
exports.isNullOrUndefined = isNullOrUndefined;
|
|||
|
|
|||
|
function isNumber(arg) {
|
|||
|
return typeof arg === 'number';
|
|||
|
}
|
|||
|
exports.isNumber = isNumber;
|
|||
|
|
|||
|
function isString(arg) {
|
|||
|
return typeof arg === 'string';
|
|||
|
}
|
|||
|
exports.isString = isString;
|
|||
|
|
|||
|
function isSymbol(arg) {
|
|||
|
return typeof arg === 'symbol';
|
|||
|
}
|
|||
|
exports.isSymbol = isSymbol;
|
|||
|
|
|||
|
function isUndefined(arg) {
|
|||
|
return arg === void 0;
|
|||
|
}
|
|||
|
exports.isUndefined = isUndefined;
|
|||
|
|
|||
|
function isRegExp(re) {
|
|||
|
return isObject(re) && objectToString(re) === '[object RegExp]';
|
|||
|
}
|
|||
|
exports.isRegExp = isRegExp;
|
|||
|
|
|||
|
function isObject(arg) {
|
|||
|
return typeof arg === 'object' && arg !== null;
|
|||
|
}
|
|||
|
exports.isObject = isObject;
|
|||
|
|
|||
|
function isDate(d) {
|
|||
|
return isObject(d) && objectToString(d) === '[object Date]';
|
|||
|
}
|
|||
|
exports.isDate = isDate;
|
|||
|
|
|||
|
function isError(e) {
|
|||
|
return isObject(e) &&
|
|||
|
(objectToString(e) === '[object Error]' || e instanceof Error);
|
|||
|
}
|
|||
|
exports.isError = isError;
|
|||
|
|
|||
|
function isFunction(arg) {
|
|||
|
return typeof arg === 'function';
|
|||
|
}
|
|||
|
exports.isFunction = isFunction;
|
|||
|
|
|||
|
function isPrimitive(arg) {
|
|||
|
return arg === null ||
|
|||
|
typeof arg === 'boolean' ||
|
|||
|
typeof arg === 'number' ||
|
|||
|
typeof arg === 'string' ||
|
|||
|
typeof arg === 'symbol' || // ES6 symbol
|
|||
|
typeof arg === 'undefined';
|
|||
|
}
|
|||
|
exports.isPrimitive = isPrimitive;
|
|||
|
|
|||
|
function isBuffer(arg) {
|
|||
|
return Buffer.isBuffer(arg);
|
|||
|
}
|
|||
|
exports.isBuffer = isBuffer;
|
|||
|
|
|||
|
function objectToString(o) {
|
|||
|
return Object.prototype.toString.call(o);
|
|||
|
}
|
|||
|
}).call(this,require("buffer").Buffer)
|
|||
|
},{"buffer":1}],16:[function(require,module,exports){
|
|||
|
module.exports = require("./lib/_stream_passthrough.js")
|
|||
|
|
|||
|
},{"./lib/_stream_passthrough.js":11}],17:[function(require,module,exports){
|
|||
|
require('stream'); // hack to fix a circular dependency issue when used with browserify
|
|||
|
exports = module.exports = require('./lib/_stream_readable.js');
|
|||
|
exports.Readable = exports;
|
|||
|
exports.Writable = require('./lib/_stream_writable.js');
|
|||
|
exports.Duplex = require('./lib/_stream_duplex.js');
|
|||
|
exports.Transform = require('./lib/_stream_transform.js');
|
|||
|
exports.PassThrough = require('./lib/_stream_passthrough.js');
|
|||
|
|
|||
|
},{"./lib/_stream_duplex.js":10,"./lib/_stream_passthrough.js":11,"./lib/_stream_readable.js":12,"./lib/_stream_transform.js":13,"./lib/_stream_writable.js":14,"stream":20}],18:[function(require,module,exports){
|
|||
|
module.exports = require("./lib/_stream_transform.js")
|
|||
|
|
|||
|
},{"./lib/_stream_transform.js":13}],19:[function(require,module,exports){
|
|||
|
module.exports = require("./lib/_stream_writable.js")
|
|||
|
|
|||
|
},{"./lib/_stream_writable.js":14}],20:[function(require,module,exports){
|
|||
|
// Copyright Joyent, Inc. and other Node contributors.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
|
// copy of this software and associated documentation files (the
|
|||
|
// "Software"), to deal in the Software without restriction, including
|
|||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
|
// persons to whom the Software is furnished to do so, subject to the
|
|||
|
// following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included
|
|||
|
// in all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|
|||
|
module.exports = Stream;
|
|||
|
|
|||
|
var EE = require('events').EventEmitter;
|
|||
|
var inherits = require('inherits');
|
|||
|
|
|||
|
inherits(Stream, EE);
|
|||
|
Stream.Readable = require('readable-stream/readable.js');
|
|||
|
Stream.Writable = require('readable-stream/writable.js');
|
|||
|
Stream.Duplex = require('readable-stream/duplex.js');
|
|||
|
Stream.Transform = require('readable-stream/transform.js');
|
|||
|
Stream.PassThrough = require('readable-stream/passthrough.js');
|
|||
|
|
|||
|
// Backwards-compat with node 0.4.x
|
|||
|
Stream.Stream = Stream;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// old-style streams. Note that the pipe method (the only relevant
|
|||
|
// part of this class) is overridden in the Readable class.
|
|||
|
|
|||
|
function Stream() {
|
|||
|
EE.call(this);
|
|||
|
}
|
|||
|
|
|||
|
Stream.prototype.pipe = function(dest, options) {
|
|||
|
var source = this;
|
|||
|
|
|||
|
function ondata(chunk) {
|
|||
|
if (dest.writable) {
|
|||
|
if (false === dest.write(chunk) && source.pause) {
|
|||
|
source.pause();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
source.on('data', ondata);
|
|||
|
|
|||
|
function ondrain() {
|
|||
|
if (source.readable && source.resume) {
|
|||
|
source.resume();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
dest.on('drain', ondrain);
|
|||
|
|
|||
|
// If the 'end' option is not supplied, dest.end() will be called when
|
|||
|
// source gets the 'end' or 'close' events. Only dest.end() once.
|
|||
|
if (!dest._isStdio && (!options || options.end !== false)) {
|
|||
|
source.on('end', onend);
|
|||
|
source.on('close', onclose);
|
|||
|
}
|
|||
|
|
|||
|
var didOnEnd = false;
|
|||
|
function onend() {
|
|||
|
if (didOnEnd) return;
|
|||
|
didOnEnd = true;
|
|||
|
|
|||
|
dest.end();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
function onclose() {
|
|||
|
if (didOnEnd) return;
|
|||
|
didOnEnd = true;
|
|||
|
|
|||
|
if (typeof dest.destroy === 'function') dest.destroy();
|
|||
|
}
|
|||
|
|
|||
|
// don't leave dangling pipes when there are errors.
|
|||
|
function onerror(er) {
|
|||
|
cleanup();
|
|||
|
if (EE.listenerCount(this, 'error') === 0) {
|
|||
|
throw er; // Unhandled stream error in pipe.
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
source.on('error', onerror);
|
|||
|
dest.on('error', onerror);
|
|||
|
|
|||
|
// remove all the event listeners that were added.
|
|||
|
function cleanup() {
|
|||
|
source.removeListener('data', ondata);
|
|||
|
dest.removeListener('drain', ondrain);
|
|||
|
|
|||
|
source.removeListener('end', onend);
|
|||
|
source.removeListener('close', onclose);
|
|||
|
|
|||
|
source.removeListener('error', onerror);
|
|||
|
dest.removeListener('error', onerror);
|
|||
|
|
|||
|
source.removeListener('end', cleanup);
|
|||
|
source.removeListener('close', cleanup);
|
|||
|
|
|||
|
dest.removeListener('close', cleanup);
|
|||
|
}
|
|||
|
|
|||
|
source.on('end', cleanup);
|
|||
|
source.on('close', cleanup);
|
|||
|
|
|||
|
dest.on('close', cleanup);
|
|||
|
|
|||
|
dest.emit('pipe', source);
|
|||
|
|
|||
|
// Allow for unix-like usage: A.pipe(B).pipe(C)
|
|||
|
return dest;
|
|||
|
};
|
|||
|
|
|||
|
},{"events":5,"inherits":6,"readable-stream/duplex.js":9,"readable-stream/passthrough.js":16,"readable-stream/readable.js":17,"readable-stream/transform.js":18,"readable-stream/writable.js":19}],21:[function(require,module,exports){
|
|||
|
// Copyright Joyent, Inc. and other Node contributors.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|||
|
// copy of this software and associated documentation files (the
|
|||
|
// "Software"), to deal in the Software without restriction, including
|
|||
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|||
|
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
|||
|
// persons to whom the Software is furnished to do so, subject to the
|
|||
|
// following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included
|
|||
|
// in all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|||
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|||
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|||
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|||
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|||
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
|||
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
|
|||
|
var Buffer = require('buffer').Buffer;
|
|||
|
|
|||
|
var isBufferEncoding = Buffer.isEncoding
|
|||
|
|| function(encoding) {
|
|||
|
switch (encoding && encoding.toLowerCase()) {
|
|||
|
case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
|
|||
|
default: return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
function assertEncoding(encoding) {
|
|||
|
if (encoding && !isBufferEncoding(encoding)) {
|
|||
|
throw new Error('Unknown encoding: ' + encoding);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// StringDecoder provides an interface for efficiently splitting a series of
|
|||
|
// buffers into a series of JS strings without breaking apart multi-byte
|
|||
|
// characters. CESU-8 is handled as part of the UTF-8 encoding.
|
|||
|
//
|
|||
|
// @TODO Handling all encodings inside a single object makes it very difficult
|
|||
|
// to reason about this code, so it should be split up in the future.
|
|||
|
// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
|
|||
|
// points as used by CESU-8.
|
|||
|
var StringDecoder = exports.StringDecoder = function(encoding) {
|
|||
|
this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
|
|||
|
assertEncoding(encoding);
|
|||
|
switch (this.encoding) {
|
|||
|
case 'utf8':
|
|||
|
// CESU-8 represents each of Surrogate Pair by 3-bytes
|
|||
|
this.surrogateSize = 3;
|
|||
|
break;
|
|||
|
case 'ucs2':
|
|||
|
case 'utf16le':
|
|||
|
// UTF-16 represents each of Surrogate Pair by 2-bytes
|
|||
|
this.surrogateSize = 2;
|
|||
|
this.detectIncompleteChar = utf16DetectIncompleteChar;
|
|||
|
break;
|
|||
|
case 'base64':
|
|||
|
// Base-64 stores 3 bytes in 4 chars, and pads the remainder.
|
|||
|
this.surrogateSize = 3;
|
|||
|
this.detectIncompleteChar = base64DetectIncompleteChar;
|
|||
|
break;
|
|||
|
default:
|
|||
|
this.write = passThroughWrite;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// Enough space to store all bytes of a single character. UTF-8 needs 4
|
|||
|
// bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
|
|||
|
this.charBuffer = new Buffer(6);
|
|||
|
// Number of bytes received for the current incomplete multi-byte character.
|
|||
|
this.charReceived = 0;
|
|||
|
// Number of bytes expected for the current incomplete multi-byte character.
|
|||
|
this.charLength = 0;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
// write decodes the given buffer and returns it as JS string that is
|
|||
|
// guaranteed to not contain any partial multi-byte characters. Any partial
|
|||
|
// character found at the end of the buffer is buffered up, and will be
|
|||
|
// returned when calling write again with the remaining bytes.
|
|||
|
//
|
|||
|
// Note: Converting a Buffer containing an orphan surrogate to a String
|
|||
|
// currently works, but converting a String to a Buffer (via `new Buffer`, or
|
|||
|
// Buffer#write) will replace incomplete surrogates with the unicode
|
|||
|
// replacement character. See https://codereview.chromium.org/121173009/ .
|
|||
|
StringDecoder.prototype.write = function(buffer) {
|
|||
|
var charStr = '';
|
|||
|
// if our last write ended with an incomplete multibyte character
|
|||
|
while (this.charLength) {
|
|||
|
// determine how many remaining bytes this buffer has to offer for this char
|
|||
|
var available = (buffer.length >= this.charLength - this.charReceived) ?
|
|||
|
this.charLength - this.charReceived :
|
|||
|
buffer.length;
|
|||
|
|
|||
|
// add the new bytes to the char buffer
|
|||
|
buffer.copy(this.charBuffer, this.charReceived, 0, available);
|
|||
|
this.charReceived += available;
|
|||
|
|
|||
|
if (this.charReceived < this.charLength) {
|
|||
|
// still not enough chars in this buffer? wait for more ...
|
|||
|
return '';
|
|||
|
}
|
|||
|
|
|||
|
// remove bytes belonging to the current character from the buffer
|
|||
|
buffer = buffer.slice(available, buffer.length);
|
|||
|
|
|||
|
// get the character that was split
|
|||
|
charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
|
|||
|
|
|||
|
// CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
|
|||
|
var charCode = charStr.charCodeAt(charStr.length - 1);
|
|||
|
if (charCode >= 0xD800 && charCode <= 0xDBFF) {
|
|||
|
this.charLength += this.surrogateSize;
|
|||
|
charStr = '';
|
|||
|
continue;
|
|||
|
}
|
|||
|
this.charReceived = this.charLength = 0;
|
|||
|
|
|||
|
// if there are no more bytes in this buffer, just emit our char
|
|||
|
if (buffer.length === 0) {
|
|||
|
return charStr;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// determine and set charLength / charReceived
|
|||
|
this.detectIncompleteChar(buffer);
|
|||
|
|
|||
|
var end = buffer.length;
|
|||
|
if (this.charLength) {
|
|||
|
// buffer the incomplete character bytes we got
|
|||
|
buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
|
|||
|
end -= this.charReceived;
|
|||
|
}
|
|||
|
|
|||
|
charStr += buffer.toString(this.encoding, 0, end);
|
|||
|
|
|||
|
var end = charStr.length - 1;
|
|||
|
var charCode = charStr.charCodeAt(end);
|
|||
|
// CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
|
|||
|
if (charCode >= 0xD800 && charCode <= 0xDBFF) {
|
|||
|
var size = this.surrogateSize;
|
|||
|
this.charLength += size;
|
|||
|
this.charReceived += size;
|
|||
|
this.charBuffer.copy(this.charBuffer, size, 0, size);
|
|||
|
buffer.copy(this.charBuffer, 0, 0, size);
|
|||
|
return charStr.substring(0, end);
|
|||
|
}
|
|||
|
|
|||
|
// or just emit the charStr
|
|||
|
return charStr;
|
|||
|
};
|
|||
|
|
|||
|
// detectIncompleteChar determines if there is an incomplete UTF-8 character at
|
|||
|
// the end of the given buffer. If so, it sets this.charLength to the byte
|
|||
|
// length that character, and sets this.charReceived to the number of bytes
|
|||
|
// that are available for this character.
|
|||
|
StringDecoder.prototype.detectIncompleteChar = function(buffer) {
|
|||
|
// determine how many bytes we have to check at the end of this buffer
|
|||
|
var i = (buffer.length >= 3) ? 3 : buffer.length;
|
|||
|
|
|||
|
// Figure out if one of the last i bytes of our buffer announces an
|
|||
|
// incomplete char.
|
|||
|
for (; i > 0; i--) {
|
|||
|
var c = buffer[buffer.length - i];
|
|||
|
|
|||
|
// See http://en.wikipedia.org/wiki/UTF-8#Description
|
|||
|
|
|||
|
// 110XXXXX
|
|||
|
if (i == 1 && c >> 5 == 0x06) {
|
|||
|
this.charLength = 2;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// 1110XXXX
|
|||
|
if (i <= 2 && c >> 4 == 0x0E) {
|
|||
|
this.charLength = 3;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// 11110XXX
|
|||
|
if (i <= 3 && c >> 3 == 0x1E) {
|
|||
|
this.charLength = 4;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
this.charReceived = i;
|
|||
|
};
|
|||
|
|
|||
|
StringDecoder.prototype.end = function(buffer) {
|
|||
|
var res = '';
|
|||
|
if (buffer && buffer.length)
|
|||
|
res = this.write(buffer);
|
|||
|
|
|||
|
if (this.charReceived) {
|
|||
|
var cr = this.charReceived;
|
|||
|
var buf = this.charBuffer;
|
|||
|
var enc = this.encoding;
|
|||
|
res += buf.slice(0, cr).toString(enc);
|
|||
|
}
|
|||
|
|
|||
|
return res;
|
|||
|
};
|
|||
|
|
|||
|
function passThroughWrite(buffer) {
|
|||
|
return buffer.toString(this.encoding);
|
|||
|
}
|
|||
|
|
|||
|
function utf16DetectIncompleteChar(buffer) {
|
|||
|
this.charReceived = buffer.length % 2;
|
|||
|
this.charLength = this.charReceived ? 2 : 0;
|
|||
|
}
|
|||
|
|
|||
|
function base64DetectIncompleteChar(buffer) {
|
|||
|
this.charReceived = buffer.length % 3;
|
|||
|
this.charLength = this.charReceived ? 3 : 0;
|
|||
|
}
|
|||
|
|
|||
|
},{"buffer":1}],22:[function(require,module,exports){
|
|||
|
// Underscore.js 1.7.0
|
|||
|
// http://underscorejs.org
|
|||
|
// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
// Underscore may be freely distributed under the MIT license.
|
|||
|
|
|||
|
(function() {
|
|||
|
|
|||
|
// Baseline setup
|
|||
|
// --------------
|
|||
|
|
|||
|
// Establish the root object, `window` in the browser, or `exports` on the server.
|
|||
|
var root = this;
|
|||
|
|
|||
|
// Save the previous value of the `_` variable.
|
|||
|
var previousUnderscore = root._;
|
|||
|
|
|||
|
// Save bytes in the minified (but not gzipped) version:
|
|||
|
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
|
|||
|
|
|||
|
// Create quick reference variables for speed access to core prototypes.
|
|||
|
var
|
|||
|
push = ArrayProto.push,
|
|||
|
slice = ArrayProto.slice,
|
|||
|
concat = ArrayProto.concat,
|
|||
|
toString = ObjProto.toString,
|
|||
|
hasOwnProperty = ObjProto.hasOwnProperty;
|
|||
|
|
|||
|
// All **ECMAScript 5** native function implementations that we hope to use
|
|||
|
// are declared here.
|
|||
|
var
|
|||
|
nativeIsArray = Array.isArray,
|
|||
|
nativeKeys = Object.keys,
|
|||
|
nativeBind = FuncProto.bind;
|
|||
|
|
|||
|
// Create a safe reference to the Underscore object for use below.
|
|||
|
var _ = function(obj) {
|
|||
|
if (obj instanceof _) return obj;
|
|||
|
if (!(this instanceof _)) return new _(obj);
|
|||
|
this._wrapped = obj;
|
|||
|
};
|
|||
|
|
|||
|
// Export the Underscore object for **Node.js**, with
|
|||
|
// backwards-compatibility for the old `require()` API. If we're in
|
|||
|
// the browser, add `_` as a global object.
|
|||
|
if (typeof exports !== 'undefined') {
|
|||
|
if (typeof module !== 'undefined' && module.exports) {
|
|||
|
exports = module.exports = _;
|
|||
|
}
|
|||
|
exports._ = _;
|
|||
|
} else {
|
|||
|
root._ = _;
|
|||
|
}
|
|||
|
|
|||
|
// Current version.
|
|||
|
_.VERSION = '1.7.0';
|
|||
|
|
|||
|
// Internal function that returns an efficient (for current engines) version
|
|||
|
// of the passed-in callback, to be repeatedly applied in other Underscore
|
|||
|
// functions.
|
|||
|
var createCallback = function(func, context, argCount) {
|
|||
|
if (context === void 0) return func;
|
|||
|
switch (argCount == null ? 3 : argCount) {
|
|||
|
case 1: return function(value) {
|
|||
|
return func.call(context, value);
|
|||
|
};
|
|||
|
case 2: return function(value, other) {
|
|||
|
return func.call(context, value, other);
|
|||
|
};
|
|||
|
case 3: return function(value, index, collection) {
|
|||
|
return func.call(context, value, index, collection);
|
|||
|
};
|
|||
|
case 4: return function(accumulator, value, index, collection) {
|
|||
|
return func.call(context, accumulator, value, index, collection);
|
|||
|
};
|
|||
|
}
|
|||
|
return function() {
|
|||
|
return func.apply(context, arguments);
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// A mostly-internal function to generate callbacks that can be applied
|
|||
|
// to each element in a collection, returning the desired result — either
|
|||
|
// identity, an arbitrary callback, a property matcher, or a property accessor.
|
|||
|
_.iteratee = function(value, context, argCount) {
|
|||
|
if (value == null) return _.identity;
|
|||
|
if (_.isFunction(value)) return createCallback(value, context, argCount);
|
|||
|
if (_.isObject(value)) return _.matches(value);
|
|||
|
return _.property(value);
|
|||
|
};
|
|||
|
|
|||
|
// Collection Functions
|
|||
|
// --------------------
|
|||
|
|
|||
|
// The cornerstone, an `each` implementation, aka `forEach`.
|
|||
|
// Handles raw objects in addition to array-likes. Treats all
|
|||
|
// sparse array-likes as if they were dense.
|
|||
|
_.each = _.forEach = function(obj, iteratee, context) {
|
|||
|
if (obj == null) return obj;
|
|||
|
iteratee = createCallback(iteratee, context);
|
|||
|
var i, length = obj.length;
|
|||
|
if (length === +length) {
|
|||
|
for (i = 0; i < length; i++) {
|
|||
|
iteratee(obj[i], i, obj);
|
|||
|
}
|
|||
|
} else {
|
|||
|
var keys = _.keys(obj);
|
|||
|
for (i = 0, length = keys.length; i < length; i++) {
|
|||
|
iteratee(obj[keys[i]], keys[i], obj);
|
|||
|
}
|
|||
|
}
|
|||
|
return obj;
|
|||
|
};
|
|||
|
|
|||
|
// Return the results of applying the iteratee to each element.
|
|||
|
_.map = _.collect = function(obj, iteratee, context) {
|
|||
|
if (obj == null) return [];
|
|||
|
iteratee = _.iteratee(iteratee, context);
|
|||
|
var keys = obj.length !== +obj.length && _.keys(obj),
|
|||
|
length = (keys || obj).length,
|
|||
|
results = Array(length),
|
|||
|
currentKey;
|
|||
|
for (var index = 0; index < length; index++) {
|
|||
|
currentKey = keys ? keys[index] : index;
|
|||
|
results[index] = iteratee(obj[currentKey], currentKey, obj);
|
|||
|
}
|
|||
|
return results;
|
|||
|
};
|
|||
|
|
|||
|
var reduceError = 'Reduce of empty array with no initial value';
|
|||
|
|
|||
|
// **Reduce** builds up a single result from a list of values, aka `inject`,
|
|||
|
// or `foldl`.
|
|||
|
_.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
|
|||
|
if (obj == null) obj = [];
|
|||
|
iteratee = createCallback(iteratee, context, 4);
|
|||
|
var keys = obj.length !== +obj.length && _.keys(obj),
|
|||
|
length = (keys || obj).length,
|
|||
|
index = 0, currentKey;
|
|||
|
if (arguments.length < 3) {
|
|||
|
if (!length) throw new TypeError(reduceError);
|
|||
|
memo = obj[keys ? keys[index++] : index++];
|
|||
|
}
|
|||
|
for (; index < length; index++) {
|
|||
|
currentKey = keys ? keys[index] : index;
|
|||
|
memo = iteratee(memo, obj[currentKey], currentKey, obj);
|
|||
|
}
|
|||
|
return memo;
|
|||
|
};
|
|||
|
|
|||
|
// The right-associative version of reduce, also known as `foldr`.
|
|||
|
_.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
|
|||
|
if (obj == null) obj = [];
|
|||
|
iteratee = createCallback(iteratee, context, 4);
|
|||
|
var keys = obj.length !== + obj.length && _.keys(obj),
|
|||
|
index = (keys || obj).length,
|
|||
|
currentKey;
|
|||
|
if (arguments.length < 3) {
|
|||
|
if (!index) throw new TypeError(reduceError);
|
|||
|
memo = obj[keys ? keys[--index] : --index];
|
|||
|
}
|
|||
|
while (index--) {
|
|||
|
currentKey = keys ? keys[index] : index;
|
|||
|
memo = iteratee(memo, obj[currentKey], currentKey, obj);
|
|||
|
}
|
|||
|
return memo;
|
|||
|
};
|
|||
|
|
|||
|
// Return the first value which passes a truth test. Aliased as `detect`.
|
|||
|
_.find = _.detect = function(obj, predicate, context) {
|
|||
|
var result;
|
|||
|
predicate = _.iteratee(predicate, context);
|
|||
|
_.some(obj, function(value, index, list) {
|
|||
|
if (predicate(value, index, list)) {
|
|||
|
result = value;
|
|||
|
return true;
|
|||
|
}
|
|||
|
});
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
// Return all the elements that pass a truth test.
|
|||
|
// Aliased as `select`.
|
|||
|
_.filter = _.select = function(obj, predicate, context) {
|
|||
|
var results = [];
|
|||
|
if (obj == null) return results;
|
|||
|
predicate = _.iteratee(predicate, context);
|
|||
|
_.each(obj, function(value, index, list) {
|
|||
|
if (predicate(value, index, list)) results.push(value);
|
|||
|
});
|
|||
|
return results;
|
|||
|
};
|
|||
|
|
|||
|
// Return all the elements for which a truth test fails.
|
|||
|
_.reject = function(obj, predicate, context) {
|
|||
|
return _.filter(obj, _.negate(_.iteratee(predicate)), context);
|
|||
|
};
|
|||
|
|
|||
|
// Determine whether all of the elements match a truth test.
|
|||
|
// Aliased as `all`.
|
|||
|
_.every = _.all = function(obj, predicate, context) {
|
|||
|
if (obj == null) return true;
|
|||
|
predicate = _.iteratee(predicate, context);
|
|||
|
var keys = obj.length !== +obj.length && _.keys(obj),
|
|||
|
length = (keys || obj).length,
|
|||
|
index, currentKey;
|
|||
|
for (index = 0; index < length; index++) {
|
|||
|
currentKey = keys ? keys[index] : index;
|
|||
|
if (!predicate(obj[currentKey], currentKey, obj)) return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
};
|
|||
|
|
|||
|
// Determine if at least one element in the object matches a truth test.
|
|||
|
// Aliased as `any`.
|
|||
|
_.some = _.any = function(obj, predicate, context) {
|
|||
|
if (obj == null) return false;
|
|||
|
predicate = _.iteratee(predicate, context);
|
|||
|
var keys = obj.length !== +obj.length && _.keys(obj),
|
|||
|
length = (keys || obj).length,
|
|||
|
index, currentKey;
|
|||
|
for (index = 0; index < length; index++) {
|
|||
|
currentKey = keys ? keys[index] : index;
|
|||
|
if (predicate(obj[currentKey], currentKey, obj)) return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
};
|
|||
|
|
|||
|
// Determine if the array or object contains a given value (using `===`).
|
|||
|
// Aliased as `include`.
|
|||
|
_.contains = _.include = function(obj, target) {
|
|||
|
if (obj == null) return false;
|
|||
|
if (obj.length !== +obj.length) obj = _.values(obj);
|
|||
|
return _.indexOf(obj, target) >= 0;
|
|||
|
};
|
|||
|
|
|||
|
// Invoke a method (with arguments) on every item in a collection.
|
|||
|
_.invoke = function(obj, method) {
|
|||
|
var args = slice.call(arguments, 2);
|
|||
|
var isFunc = _.isFunction(method);
|
|||
|
return _.map(obj, function(value) {
|
|||
|
return (isFunc ? method : value[method]).apply(value, args);
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
// Convenience version of a common use case of `map`: fetching a property.
|
|||
|
_.pluck = function(obj, key) {
|
|||
|
return _.map(obj, _.property(key));
|
|||
|
};
|
|||
|
|
|||
|
// Convenience version of a common use case of `filter`: selecting only objects
|
|||
|
// containing specific `key:value` pairs.
|
|||
|
_.where = function(obj, attrs) {
|
|||
|
return _.filter(obj, _.matches(attrs));
|
|||
|
};
|
|||
|
|
|||
|
// Convenience version of a common use case of `find`: getting the first object
|
|||
|
// containing specific `key:value` pairs.
|
|||
|
_.findWhere = function(obj, attrs) {
|
|||
|
return _.find(obj, _.matches(attrs));
|
|||
|
};
|
|||
|
|
|||
|
// Return the maximum element (or element-based computation).
|
|||
|
_.max = function(obj, iteratee, context) {
|
|||
|
var result = -Infinity, lastComputed = -Infinity,
|
|||
|
value, computed;
|
|||
|
if (iteratee == null && obj != null) {
|
|||
|
obj = obj.length === +obj.length ? obj : _.values(obj);
|
|||
|
for (var i = 0, length = obj.length; i < length; i++) {
|
|||
|
value = obj[i];
|
|||
|
if (value > result) {
|
|||
|
result = value;
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
iteratee = _.iteratee(iteratee, context);
|
|||
|
_.each(obj, function(value, index, list) {
|
|||
|
computed = iteratee(value, index, list);
|
|||
|
if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
|
|||
|
result = value;
|
|||
|
lastComputed = computed;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
// Return the minimum element (or element-based computation).
|
|||
|
_.min = function(obj, iteratee, context) {
|
|||
|
var result = Infinity, lastComputed = Infinity,
|
|||
|
value, computed;
|
|||
|
if (iteratee == null && obj != null) {
|
|||
|
obj = obj.length === +obj.length ? obj : _.values(obj);
|
|||
|
for (var i = 0, length = obj.length; i < length; i++) {
|
|||
|
value = obj[i];
|
|||
|
if (value < result) {
|
|||
|
result = value;
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
iteratee = _.iteratee(iteratee, context);
|
|||
|
_.each(obj, function(value, index, list) {
|
|||
|
computed = iteratee(value, index, list);
|
|||
|
if (computed < lastComputed || computed === Infinity && result === Infinity) {
|
|||
|
result = value;
|
|||
|
lastComputed = computed;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
// Shuffle a collection, using the modern version of the
|
|||
|
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
|
|||
|
_.shuffle = function(obj) {
|
|||
|
var set = obj && obj.length === +obj.length ? obj : _.values(obj);
|
|||
|
var length = set.length;
|
|||
|
var shuffled = Array(length);
|
|||
|
for (var index = 0, rand; index < length; index++) {
|
|||
|
rand = _.random(0, index);
|
|||
|
if (rand !== index) shuffled[index] = shuffled[rand];
|
|||
|
shuffled[rand] = set[index];
|
|||
|
}
|
|||
|
return shuffled;
|
|||
|
};
|
|||
|
|
|||
|
// Sample **n** random values from a collection.
|
|||
|
// If **n** is not specified, returns a single random element.
|
|||
|
// The internal `guard` argument allows it to work with `map`.
|
|||
|
_.sample = function(obj, n, guard) {
|
|||
|
if (n == null || guard) {
|
|||
|
if (obj.length !== +obj.length) obj = _.values(obj);
|
|||
|
return obj[_.random(obj.length - 1)];
|
|||
|
}
|
|||
|
return _.shuffle(obj).slice(0, Math.max(0, n));
|
|||
|
};
|
|||
|
|
|||
|
// Sort the object's values by a criterion produced by an iteratee.
|
|||
|
_.sortBy = function(obj, iteratee, context) {
|
|||
|
iteratee = _.iteratee(iteratee, context);
|
|||
|
return _.pluck(_.map(obj, function(value, index, list) {
|
|||
|
return {
|
|||
|
value: value,
|
|||
|
index: index,
|
|||
|
criteria: iteratee(value, index, list)
|
|||
|
};
|
|||
|
}).sort(function(left, right) {
|
|||
|
var a = left.criteria;
|
|||
|
var b = right.criteria;
|
|||
|
if (a !== b) {
|
|||
|
if (a > b || a === void 0) return 1;
|
|||
|
if (a < b || b === void 0) return -1;
|
|||
|
}
|
|||
|
return left.index - right.index;
|
|||
|
}), 'value');
|
|||
|
};
|
|||
|
|
|||
|
// An internal function used for aggregate "group by" operations.
|
|||
|
var group = function(behavior) {
|
|||
|
return function(obj, iteratee, context) {
|
|||
|
var result = {};
|
|||
|
iteratee = _.iteratee(iteratee, context);
|
|||
|
_.each(obj, function(value, index) {
|
|||
|
var key = iteratee(value, index, obj);
|
|||
|
behavior(result, value, key);
|
|||
|
});
|
|||
|
return result;
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Groups the object's values by a criterion. Pass either a string attribute
|
|||
|
// to group by, or a function that returns the criterion.
|
|||
|
_.groupBy = group(function(result, value, key) {
|
|||
|
if (_.has(result, key)) result[key].push(value); else result[key] = [value];
|
|||
|
});
|
|||
|
|
|||
|
// Indexes the object's values by a criterion, similar to `groupBy`, but for
|
|||
|
// when you know that your index values will be unique.
|
|||
|
_.indexBy = group(function(result, value, key) {
|
|||
|
result[key] = value;
|
|||
|
});
|
|||
|
|
|||
|
// Counts instances of an object that group by a certain criterion. Pass
|
|||
|
// either a string attribute to count by, or a function that returns the
|
|||
|
// criterion.
|
|||
|
_.countBy = group(function(result, value, key) {
|
|||
|
if (_.has(result, key)) result[key]++; else result[key] = 1;
|
|||
|
});
|
|||
|
|
|||
|
// Use a comparator function to figure out the smallest index at which
|
|||
|
// an object should be inserted so as to maintain order. Uses binary search.
|
|||
|
_.sortedIndex = function(array, obj, iteratee, context) {
|
|||
|
iteratee = _.iteratee(iteratee, context, 1);
|
|||
|
var value = iteratee(obj);
|
|||
|
var low = 0, high = array.length;
|
|||
|
while (low < high) {
|
|||
|
var mid = low + high >>> 1;
|
|||
|
if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
|
|||
|
}
|
|||
|
return low;
|
|||
|
};
|
|||
|
|
|||
|
// Safely create a real, live array from anything iterable.
|
|||
|
_.toArray = function(obj) {
|
|||
|
if (!obj) return [];
|
|||
|
if (_.isArray(obj)) return slice.call(obj);
|
|||
|
if (obj.length === +obj.length) return _.map(obj, _.identity);
|
|||
|
return _.values(obj);
|
|||
|
};
|
|||
|
|
|||
|
// Return the number of elements in an object.
|
|||
|
_.size = function(obj) {
|
|||
|
if (obj == null) return 0;
|
|||
|
return obj.length === +obj.length ? obj.length : _.keys(obj).length;
|
|||
|
};
|
|||
|
|
|||
|
// Split a collection into two arrays: one whose elements all satisfy the given
|
|||
|
// predicate, and one whose elements all do not satisfy the predicate.
|
|||
|
_.partition = function(obj, predicate, context) {
|
|||
|
predicate = _.iteratee(predicate, context);
|
|||
|
var pass = [], fail = [];
|
|||
|
_.each(obj, function(value, key, obj) {
|
|||
|
(predicate(value, key, obj) ? pass : fail).push(value);
|
|||
|
});
|
|||
|
return [pass, fail];
|
|||
|
};
|
|||
|
|
|||
|
// Array Functions
|
|||
|
// ---------------
|
|||
|
|
|||
|
// Get the first element of an array. Passing **n** will return the first N
|
|||
|
// values in the array. Aliased as `head` and `take`. The **guard** check
|
|||
|
// allows it to work with `_.map`.
|
|||
|
_.first = _.head = _.take = function(array, n, guard) {
|
|||
|
if (array == null) return void 0;
|
|||
|
if (n == null || guard) return array[0];
|
|||
|
if (n < 0) return [];
|
|||
|
return slice.call(array, 0, n);
|
|||
|
};
|
|||
|
|
|||
|
// Returns everything but the last entry of the array. Especially useful on
|
|||
|
// the arguments object. Passing **n** will return all the values in
|
|||
|
// the array, excluding the last N. The **guard** check allows it to work with
|
|||
|
// `_.map`.
|
|||
|
_.initial = function(array, n, guard) {
|
|||
|
return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
|
|||
|
};
|
|||
|
|
|||
|
// Get the last element of an array. Passing **n** will return the last N
|
|||
|
// values in the array. The **guard** check allows it to work with `_.map`.
|
|||
|
_.last = function(array, n, guard) {
|
|||
|
if (array == null) return void 0;
|
|||
|
if (n == null || guard) return array[array.length - 1];
|
|||
|
return slice.call(array, Math.max(array.length - n, 0));
|
|||
|
};
|
|||
|
|
|||
|
// Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
|
|||
|
// Especially useful on the arguments object. Passing an **n** will return
|
|||
|
// the rest N values in the array. The **guard**
|
|||
|
// check allows it to work with `_.map`.
|
|||
|
_.rest = _.tail = _.drop = function(array, n, guard) {
|
|||
|
return slice.call(array, n == null || guard ? 1 : n);
|
|||
|
};
|
|||
|
|
|||
|
// Trim out all falsy values from an array.
|
|||
|
_.compact = function(array) {
|
|||
|
return _.filter(array, _.identity);
|
|||
|
};
|
|||
|
|
|||
|
// Internal implementation of a recursive `flatten` function.
|
|||
|
var flatten = function(input, shallow, strict, output) {
|
|||
|
if (shallow && _.every(input, _.isArray)) {
|
|||
|
return concat.apply(output, input);
|
|||
|
}
|
|||
|
for (var i = 0, length = input.length; i < length; i++) {
|
|||
|
var value = input[i];
|
|||
|
if (!_.isArray(value) && !_.isArguments(value)) {
|
|||
|
if (!strict) output.push(value);
|
|||
|
} else if (shallow) {
|
|||
|
push.apply(output, value);
|
|||
|
} else {
|
|||
|
flatten(value, shallow, strict, output);
|
|||
|
}
|
|||
|
}
|
|||
|
return output;
|
|||
|
};
|
|||
|
|
|||
|
// Flatten out an array, either recursively (by default), or just one level.
|
|||
|
_.flatten = function(array, shallow) {
|
|||
|
return flatten(array, shallow, false, []);
|
|||
|
};
|
|||
|
|
|||
|
// Return a version of the array that does not contain the specified value(s).
|
|||
|
_.without = function(array) {
|
|||
|
return _.difference(array, slice.call(arguments, 1));
|
|||
|
};
|
|||
|
|
|||
|
// Produce a duplicate-free version of the array. If the array has already
|
|||
|
// been sorted, you have the option of using a faster algorithm.
|
|||
|
// Aliased as `unique`.
|
|||
|
_.uniq = _.unique = function(array, isSorted, iteratee, context) {
|
|||
|
if (array == null) return [];
|
|||
|
if (!_.isBoolean(isSorted)) {
|
|||
|
context = iteratee;
|
|||
|
iteratee = isSorted;
|
|||
|
isSorted = false;
|
|||
|
}
|
|||
|
if (iteratee != null) iteratee = _.iteratee(iteratee, context);
|
|||
|
var result = [];
|
|||
|
var seen = [];
|
|||
|
for (var i = 0, length = array.length; i < length; i++) {
|
|||
|
var value = array[i];
|
|||
|
if (isSorted) {
|
|||
|
if (!i || seen !== value) result.push(value);
|
|||
|
seen = value;
|
|||
|
} else if (iteratee) {
|
|||
|
var computed = iteratee(value, i, array);
|
|||
|
if (_.indexOf(seen, computed) < 0) {
|
|||
|
seen.push(computed);
|
|||
|
result.push(value);
|
|||
|
}
|
|||
|
} else if (_.indexOf(result, value) < 0) {
|
|||
|
result.push(value);
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
// Produce an array that contains the union: each distinct element from all of
|
|||
|
// the passed-in arrays.
|
|||
|
_.union = function() {
|
|||
|
return _.uniq(flatten(arguments, true, true, []));
|
|||
|
};
|
|||
|
|
|||
|
// Produce an array that contains every item shared between all the
|
|||
|
// passed-in arrays.
|
|||
|
_.intersection = function(array) {
|
|||
|
if (array == null) return [];
|
|||
|
var result = [];
|
|||
|
var argsLength = arguments.length;
|
|||
|
for (var i = 0, length = array.length; i < length; i++) {
|
|||
|
var item = array[i];
|
|||
|
if (_.contains(result, item)) continue;
|
|||
|
for (var j = 1; j < argsLength; j++) {
|
|||
|
if (!_.contains(arguments[j], item)) break;
|
|||
|
}
|
|||
|
if (j === argsLength) result.push(item);
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
// Take the difference between one array and a number of other arrays.
|
|||
|
// Only the elements present in just the first array will remain.
|
|||
|
_.difference = function(array) {
|
|||
|
var rest = flatten(slice.call(arguments, 1), true, true, []);
|
|||
|
return _.filter(array, function(value){
|
|||
|
return !_.contains(rest, value);
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
// Zip together multiple lists into a single array -- elements that share
|
|||
|
// an index go together.
|
|||
|
_.zip = function(array) {
|
|||
|
if (array == null) return [];
|
|||
|
var length = _.max(arguments, 'length').length;
|
|||
|
var results = Array(length);
|
|||
|
for (var i = 0; i < length; i++) {
|
|||
|
results[i] = _.pluck(arguments, i);
|
|||
|
}
|
|||
|
return results;
|
|||
|
};
|
|||
|
|
|||
|
// Converts lists into objects. Pass either a single array of `[key, value]`
|
|||
|
// pairs, or two parallel arrays of the same length -- one of keys, and one of
|
|||
|
// the corresponding values.
|
|||
|
_.object = function(list, values) {
|
|||
|
if (list == null) return {};
|
|||
|
var result = {};
|
|||
|
for (var i = 0, length = list.length; i < length; i++) {
|
|||
|
if (values) {
|
|||
|
result[list[i]] = values[i];
|
|||
|
} else {
|
|||
|
result[list[i][0]] = list[i][1];
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
// Return the position of the first occurrence of an item in an array,
|
|||
|
// or -1 if the item is not included in the array.
|
|||
|
// If the array is large and already in sort order, pass `true`
|
|||
|
// for **isSorted** to use binary search.
|
|||
|
_.indexOf = function(array, item, isSorted) {
|
|||
|
if (array == null) return -1;
|
|||
|
var i = 0, length = array.length;
|
|||
|
if (isSorted) {
|
|||
|
if (typeof isSorted == 'number') {
|
|||
|
i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
|
|||
|
} else {
|
|||
|
i = _.sortedIndex(array, item);
|
|||
|
return array[i] === item ? i : -1;
|
|||
|
}
|
|||
|
}
|
|||
|
for (; i < length; i++) if (array[i] === item) return i;
|
|||
|
return -1;
|
|||
|
};
|
|||
|
|
|||
|
_.lastIndexOf = function(array, item, from) {
|
|||
|
if (array == null) return -1;
|
|||
|
var idx = array.length;
|
|||
|
if (typeof from == 'number') {
|
|||
|
idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
|
|||
|
}
|
|||
|
while (--idx >= 0) if (array[idx] === item) return idx;
|
|||
|
return -1;
|
|||
|
};
|
|||
|
|
|||
|
// Generate an integer Array containing an arithmetic progression. A port of
|
|||
|
// the native Python `range()` function. See
|
|||
|
// [the Python documentation](http://docs.python.org/library/functions.html#range).
|
|||
|
_.range = function(start, stop, step) {
|
|||
|
if (arguments.length <= 1) {
|
|||
|
stop = start || 0;
|
|||
|
start = 0;
|
|||
|
}
|
|||
|
step = step || 1;
|
|||
|
|
|||
|
var length = Math.max(Math.ceil((stop - start) / step), 0);
|
|||
|
var range = Array(length);
|
|||
|
|
|||
|
for (var idx = 0; idx < length; idx++, start += step) {
|
|||
|
range[idx] = start;
|
|||
|
}
|
|||
|
|
|||
|
return range;
|
|||
|
};
|
|||
|
|
|||
|
// Function (ahem) Functions
|
|||
|
// ------------------
|
|||
|
|
|||
|
// Reusable constructor function for prototype setting.
|
|||
|
var Ctor = function(){};
|
|||
|
|
|||
|
// Create a function bound to a given object (assigning `this`, and arguments,
|
|||
|
// optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
|
|||
|
// available.
|
|||
|
_.bind = function(func, context) {
|
|||
|
var args, bound;
|
|||
|
if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
|
|||
|
if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
|
|||
|
args = slice.call(arguments, 2);
|
|||
|
bound = function() {
|
|||
|
if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
|
|||
|
Ctor.prototype = func.prototype;
|
|||
|
var self = new Ctor;
|
|||
|
Ctor.prototype = null;
|
|||
|
var result = func.apply(self, args.concat(slice.call(arguments)));
|
|||
|
if (_.isObject(result)) return result;
|
|||
|
return self;
|
|||
|
};
|
|||
|
return bound;
|
|||
|
};
|
|||
|
|
|||
|
// Partially apply a function by creating a version that has had some of its
|
|||
|
// arguments pre-filled, without changing its dynamic `this` context. _ acts
|
|||
|
// as a placeholder, allowing any combination of arguments to be pre-filled.
|
|||
|
_.partial = function(func) {
|
|||
|
var boundArgs = slice.call(arguments, 1);
|
|||
|
return function() {
|
|||
|
var position = 0;
|
|||
|
var args = boundArgs.slice();
|
|||
|
for (var i = 0, length = args.length; i < length; i++) {
|
|||
|
if (args[i] === _) args[i] = arguments[position++];
|
|||
|
}
|
|||
|
while (position < arguments.length) args.push(arguments[position++]);
|
|||
|
return func.apply(this, args);
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Bind a number of an object's methods to that object. Remaining arguments
|
|||
|
// are the method names to be bound. Useful for ensuring that all callbacks
|
|||
|
// defined on an object belong to it.
|
|||
|
_.bindAll = function(obj) {
|
|||
|
var i, length = arguments.length, key;
|
|||
|
if (length <= 1) throw new Error('bindAll must be passed function names');
|
|||
|
for (i = 1; i < length; i++) {
|
|||
|
key = arguments[i];
|
|||
|
obj[key] = _.bind(obj[key], obj);
|
|||
|
}
|
|||
|
return obj;
|
|||
|
};
|
|||
|
|
|||
|
// Memoize an expensive function by storing its results.
|
|||
|
_.memoize = function(func, hasher) {
|
|||
|
var memoize = function(key) {
|
|||
|
var cache = memoize.cache;
|
|||
|
var address = hasher ? hasher.apply(this, arguments) : key;
|
|||
|
if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
|
|||
|
return cache[address];
|
|||
|
};
|
|||
|
memoize.cache = {};
|
|||
|
return memoize;
|
|||
|
};
|
|||
|
|
|||
|
// Delays a function for the given number of milliseconds, and then calls
|
|||
|
// it with the arguments supplied.
|
|||
|
_.delay = function(func, wait) {
|
|||
|
var args = slice.call(arguments, 2);
|
|||
|
return setTimeout(function(){
|
|||
|
return func.apply(null, args);
|
|||
|
}, wait);
|
|||
|
};
|
|||
|
|
|||
|
// Defers a function, scheduling it to run after the current call stack has
|
|||
|
// cleared.
|
|||
|
_.defer = function(func) {
|
|||
|
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
|
|||
|
};
|
|||
|
|
|||
|
// Returns a function, that, when invoked, will only be triggered at most once
|
|||
|
// during a given window of time. Normally, the throttled function will run
|
|||
|
// as much as it can, without ever going more than once per `wait` duration;
|
|||
|
// but if you'd like to disable the execution on the leading edge, pass
|
|||
|
// `{leading: false}`. To disable execution on the trailing edge, ditto.
|
|||
|
_.throttle = function(func, wait, options) {
|
|||
|
var context, args, result;
|
|||
|
var timeout = null;
|
|||
|
var previous = 0;
|
|||
|
if (!options) options = {};
|
|||
|
var later = function() {
|
|||
|
previous = options.leading === false ? 0 : _.now();
|
|||
|
timeout = null;
|
|||
|
result = func.apply(context, args);
|
|||
|
if (!timeout) context = args = null;
|
|||
|
};
|
|||
|
return function() {
|
|||
|
var now = _.now();
|
|||
|
if (!previous && options.leading === false) previous = now;
|
|||
|
var remaining = wait - (now - previous);
|
|||
|
context = this;
|
|||
|
args = arguments;
|
|||
|
if (remaining <= 0 || remaining > wait) {
|
|||
|
clearTimeout(timeout);
|
|||
|
timeout = null;
|
|||
|
previous = now;
|
|||
|
result = func.apply(context, args);
|
|||
|
if (!timeout) context = args = null;
|
|||
|
} else if (!timeout && options.trailing !== false) {
|
|||
|
timeout = setTimeout(later, remaining);
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Returns a function, that, as long as it continues to be invoked, will not
|
|||
|
// be triggered. The function will be called after it stops being called for
|
|||
|
// N milliseconds. If `immediate` is passed, trigger the function on the
|
|||
|
// leading edge, instead of the trailing.
|
|||
|
_.debounce = function(func, wait, immediate) {
|
|||
|
var timeout, args, context, timestamp, result;
|
|||
|
|
|||
|
var later = function() {
|
|||
|
var last = _.now() - timestamp;
|
|||
|
|
|||
|
if (last < wait && last > 0) {
|
|||
|
timeout = setTimeout(later, wait - last);
|
|||
|
} else {
|
|||
|
timeout = null;
|
|||
|
if (!immediate) {
|
|||
|
result = func.apply(context, args);
|
|||
|
if (!timeout) context = args = null;
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
return function() {
|
|||
|
context = this;
|
|||
|
args = arguments;
|
|||
|
timestamp = _.now();
|
|||
|
var callNow = immediate && !timeout;
|
|||
|
if (!timeout) timeout = setTimeout(later, wait);
|
|||
|
if (callNow) {
|
|||
|
result = func.apply(context, args);
|
|||
|
context = args = null;
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Returns the first function passed as an argument to the second,
|
|||
|
// allowing you to adjust arguments, run code before and after, and
|
|||
|
// conditionally execute the original function.
|
|||
|
_.wrap = function(func, wrapper) {
|
|||
|
return _.partial(wrapper, func);
|
|||
|
};
|
|||
|
|
|||
|
// Returns a negated version of the passed-in predicate.
|
|||
|
_.negate = function(predicate) {
|
|||
|
return function() {
|
|||
|
return !predicate.apply(this, arguments);
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Returns a function that is the composition of a list of functions, each
|
|||
|
// consuming the return value of the function that follows.
|
|||
|
_.compose = function() {
|
|||
|
var args = arguments;
|
|||
|
var start = args.length - 1;
|
|||
|
return function() {
|
|||
|
var i = start;
|
|||
|
var result = args[start].apply(this, arguments);
|
|||
|
while (i--) result = args[i].call(this, result);
|
|||
|
return result;
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Returns a function that will only be executed after being called N times.
|
|||
|
_.after = function(times, func) {
|
|||
|
return function() {
|
|||
|
if (--times < 1) {
|
|||
|
return func.apply(this, arguments);
|
|||
|
}
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Returns a function that will only be executed before being called N times.
|
|||
|
_.before = function(times, func) {
|
|||
|
var memo;
|
|||
|
return function() {
|
|||
|
if (--times > 0) {
|
|||
|
memo = func.apply(this, arguments);
|
|||
|
} else {
|
|||
|
func = null;
|
|||
|
}
|
|||
|
return memo;
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Returns a function that will be executed at most one time, no matter how
|
|||
|
// often you call it. Useful for lazy initialization.
|
|||
|
_.once = _.partial(_.before, 2);
|
|||
|
|
|||
|
// Object Functions
|
|||
|
// ----------------
|
|||
|
|
|||
|
// Retrieve the names of an object's properties.
|
|||
|
// Delegates to **ECMAScript 5**'s native `Object.keys`
|
|||
|
_.keys = function(obj) {
|
|||
|
if (!_.isObject(obj)) return [];
|
|||
|
if (nativeKeys) return nativeKeys(obj);
|
|||
|
var keys = [];
|
|||
|
for (var key in obj) if (_.has(obj, key)) keys.push(key);
|
|||
|
return keys;
|
|||
|
};
|
|||
|
|
|||
|
// Retrieve the values of an object's properties.
|
|||
|
_.values = function(obj) {
|
|||
|
var keys = _.keys(obj);
|
|||
|
var length = keys.length;
|
|||
|
var values = Array(length);
|
|||
|
for (var i = 0; i < length; i++) {
|
|||
|
values[i] = obj[keys[i]];
|
|||
|
}
|
|||
|
return values;
|
|||
|
};
|
|||
|
|
|||
|
// Convert an object into a list of `[key, value]` pairs.
|
|||
|
_.pairs = function(obj) {
|
|||
|
var keys = _.keys(obj);
|
|||
|
var length = keys.length;
|
|||
|
var pairs = Array(length);
|
|||
|
for (var i = 0; i < length; i++) {
|
|||
|
pairs[i] = [keys[i], obj[keys[i]]];
|
|||
|
}
|
|||
|
return pairs;
|
|||
|
};
|
|||
|
|
|||
|
// Invert the keys and values of an object. The values must be serializable.
|
|||
|
_.invert = function(obj) {
|
|||
|
var result = {};
|
|||
|
var keys = _.keys(obj);
|
|||
|
for (var i = 0, length = keys.length; i < length; i++) {
|
|||
|
result[obj[keys[i]]] = keys[i];
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
// Return a sorted list of the function names available on the object.
|
|||
|
// Aliased as `methods`
|
|||
|
_.functions = _.methods = function(obj) {
|
|||
|
var names = [];
|
|||
|
for (var key in obj) {
|
|||
|
if (_.isFunction(obj[key])) names.push(key);
|
|||
|
}
|
|||
|
return names.sort();
|
|||
|
};
|
|||
|
|
|||
|
// Extend a given object with all the properties in passed-in object(s).
|
|||
|
_.extend = function(obj) {
|
|||
|
if (!_.isObject(obj)) return obj;
|
|||
|
var source, prop;
|
|||
|
for (var i = 1, length = arguments.length; i < length; i++) {
|
|||
|
source = arguments[i];
|
|||
|
for (prop in source) {
|
|||
|
if (hasOwnProperty.call(source, prop)) {
|
|||
|
obj[prop] = source[prop];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return obj;
|
|||
|
};
|
|||
|
|
|||
|
// Return a copy of the object only containing the whitelisted properties.
|
|||
|
_.pick = function(obj, iteratee, context) {
|
|||
|
var result = {}, key;
|
|||
|
if (obj == null) return result;
|
|||
|
if (_.isFunction(iteratee)) {
|
|||
|
iteratee = createCallback(iteratee, context);
|
|||
|
for (key in obj) {
|
|||
|
var value = obj[key];
|
|||
|
if (iteratee(value, key, obj)) result[key] = value;
|
|||
|
}
|
|||
|
} else {
|
|||
|
var keys = concat.apply([], slice.call(arguments, 1));
|
|||
|
obj = new Object(obj);
|
|||
|
for (var i = 0, length = keys.length; i < length; i++) {
|
|||
|
key = keys[i];
|
|||
|
if (key in obj) result[key] = obj[key];
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
// Return a copy of the object without the blacklisted properties.
|
|||
|
_.omit = function(obj, iteratee, context) {
|
|||
|
if (_.isFunction(iteratee)) {
|
|||
|
iteratee = _.negate(iteratee);
|
|||
|
} else {
|
|||
|
var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
|
|||
|
iteratee = function(value, key) {
|
|||
|
return !_.contains(keys, key);
|
|||
|
};
|
|||
|
}
|
|||
|
return _.pick(obj, iteratee, context);
|
|||
|
};
|
|||
|
|
|||
|
// Fill in a given object with default properties.
|
|||
|
_.defaults = function(obj) {
|
|||
|
if (!_.isObject(obj)) return obj;
|
|||
|
for (var i = 1, length = arguments.length; i < length; i++) {
|
|||
|
var source = arguments[i];
|
|||
|
for (var prop in source) {
|
|||
|
if (obj[prop] === void 0) obj[prop] = source[prop];
|
|||
|
}
|
|||
|
}
|
|||
|
return obj;
|
|||
|
};
|
|||
|
|
|||
|
// Create a (shallow-cloned) duplicate of an object.
|
|||
|
_.clone = function(obj) {
|
|||
|
if (!_.isObject(obj)) return obj;
|
|||
|
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
|
|||
|
};
|
|||
|
|
|||
|
// Invokes interceptor with the obj, and then returns obj.
|
|||
|
// The primary purpose of this method is to "tap into" a method chain, in
|
|||
|
// order to perform operations on intermediate results within the chain.
|
|||
|
_.tap = function(obj, interceptor) {
|
|||
|
interceptor(obj);
|
|||
|
return obj;
|
|||
|
};
|
|||
|
|
|||
|
// Internal recursive comparison function for `isEqual`.
|
|||
|
var eq = function(a, b, aStack, bStack) {
|
|||
|
// Identical objects are equal. `0 === -0`, but they aren't identical.
|
|||
|
// See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
|
|||
|
if (a === b) return a !== 0 || 1 / a === 1 / b;
|
|||
|
// A strict comparison is necessary because `null == undefined`.
|
|||
|
if (a == null || b == null) return a === b;
|
|||
|
// Unwrap any wrapped objects.
|
|||
|
if (a instanceof _) a = a._wrapped;
|
|||
|
if (b instanceof _) b = b._wrapped;
|
|||
|
// Compare `[[Class]]` names.
|
|||
|
var className = toString.call(a);
|
|||
|
if (className !== toString.call(b)) return false;
|
|||
|
switch (className) {
|
|||
|
// Strings, numbers, regular expressions, dates, and booleans are compared by value.
|
|||
|
case '[object RegExp]':
|
|||
|
// RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
|
|||
|
case '[object String]':
|
|||
|
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
|
|||
|
// equivalent to `new String("5")`.
|
|||
|
return '' + a === '' + b;
|
|||
|
case '[object Number]':
|
|||
|
// `NaN`s are equivalent, but non-reflexive.
|
|||
|
// Object(NaN) is equivalent to NaN
|
|||
|
if (+a !== +a) return +b !== +b;
|
|||
|
// An `egal` comparison is performed for other numeric values.
|
|||
|
return +a === 0 ? 1 / +a === 1 / b : +a === +b;
|
|||
|
case '[object Date]':
|
|||
|
case '[object Boolean]':
|
|||
|
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
|
|||
|
// millisecond representations. Note that invalid dates with millisecond representations
|
|||
|
// of `NaN` are not equivalent.
|
|||
|
return +a === +b;
|
|||
|
}
|
|||
|
if (typeof a != 'object' || typeof b != 'object') return false;
|
|||
|
// Assume equality for cyclic structures. The algorithm for detecting cyclic
|
|||
|
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
|
|||
|
var length = aStack.length;
|
|||
|
while (length--) {
|
|||
|
// Linear search. Performance is inversely proportional to the number of
|
|||
|
// unique nested structures.
|
|||
|
if (aStack[length] === a) return bStack[length] === b;
|
|||
|
}
|
|||
|
// Objects with different constructors are not equivalent, but `Object`s
|
|||
|
// from different frames are.
|
|||
|
var aCtor = a.constructor, bCtor = b.constructor;
|
|||
|
if (
|
|||
|
aCtor !== bCtor &&
|
|||
|
// Handle Object.create(x) cases
|
|||
|
'constructor' in a && 'constructor' in b &&
|
|||
|
!(_.isFunction(aCtor) && aCtor instanceof aCtor &&
|
|||
|
_.isFunction(bCtor) && bCtor instanceof bCtor)
|
|||
|
) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// Add the first object to the stack of traversed objects.
|
|||
|
aStack.push(a);
|
|||
|
bStack.push(b);
|
|||
|
var size, result;
|
|||
|
// Recursively compare objects and arrays.
|
|||
|
if (className === '[object Array]') {
|
|||
|
// Compare array lengths to determine if a deep comparison is necessary.
|
|||
|
size = a.length;
|
|||
|
result = size === b.length;
|
|||
|
if (result) {
|
|||
|
// Deep compare the contents, ignoring non-numeric properties.
|
|||
|
while (size--) {
|
|||
|
if (!(result = eq(a[size], b[size], aStack, bStack))) break;
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
// Deep compare objects.
|
|||
|
var keys = _.keys(a), key;
|
|||
|
size = keys.length;
|
|||
|
// Ensure that both objects contain the same number of properties before comparing deep equality.
|
|||
|
result = _.keys(b).length === size;
|
|||
|
if (result) {
|
|||
|
while (size--) {
|
|||
|
// Deep compare each member
|
|||
|
key = keys[size];
|
|||
|
if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// Remove the first object from the stack of traversed objects.
|
|||
|
aStack.pop();
|
|||
|
bStack.pop();
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
// Perform a deep comparison to check if two objects are equal.
|
|||
|
_.isEqual = function(a, b) {
|
|||
|
return eq(a, b, [], []);
|
|||
|
};
|
|||
|
|
|||
|
// Is a given array, string, or object empty?
|
|||
|
// An "empty" object has no enumerable own-properties.
|
|||
|
_.isEmpty = function(obj) {
|
|||
|
if (obj == null) return true;
|
|||
|
if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
|
|||
|
for (var key in obj) if (_.has(obj, key)) return false;
|
|||
|
return true;
|
|||
|
};
|
|||
|
|
|||
|
// Is a given value a DOM element?
|
|||
|
_.isElement = function(obj) {
|
|||
|
return !!(obj && obj.nodeType === 1);
|
|||
|
};
|
|||
|
|
|||
|
// Is a given value an array?
|
|||
|
// Delegates to ECMA5's native Array.isArray
|
|||
|
_.isArray = nativeIsArray || function(obj) {
|
|||
|
return toString.call(obj) === '[object Array]';
|
|||
|
};
|
|||
|
|
|||
|
// Is a given variable an object?
|
|||
|
_.isObject = function(obj) {
|
|||
|
var type = typeof obj;
|
|||
|
return type === 'function' || type === 'object' && !!obj;
|
|||
|
};
|
|||
|
|
|||
|
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
|
|||
|
_.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
|
|||
|
_['is' + name] = function(obj) {
|
|||
|
return toString.call(obj) === '[object ' + name + ']';
|
|||
|
};
|
|||
|
});
|
|||
|
|
|||
|
// Define a fallback version of the method in browsers (ahem, IE), where
|
|||
|
// there isn't any inspectable "Arguments" type.
|
|||
|
if (!_.isArguments(arguments)) {
|
|||
|
_.isArguments = function(obj) {
|
|||
|
return _.has(obj, 'callee');
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
// Optimize `isFunction` if appropriate. Work around an IE 11 bug.
|
|||
|
if (typeof /./ !== 'function') {
|
|||
|
_.isFunction = function(obj) {
|
|||
|
return typeof obj == 'function' || false;
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
// Is a given object a finite number?
|
|||
|
_.isFinite = function(obj) {
|
|||
|
return isFinite(obj) && !isNaN(parseFloat(obj));
|
|||
|
};
|
|||
|
|
|||
|
// Is the given value `NaN`? (NaN is the only number which does not equal itself).
|
|||
|
_.isNaN = function(obj) {
|
|||
|
return _.isNumber(obj) && obj !== +obj;
|
|||
|
};
|
|||
|
|
|||
|
// Is a given value a boolean?
|
|||
|
_.isBoolean = function(obj) {
|
|||
|
return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
|
|||
|
};
|
|||
|
|
|||
|
// Is a given value equal to null?
|
|||
|
_.isNull = function(obj) {
|
|||
|
return obj === null;
|
|||
|
};
|
|||
|
|
|||
|
// Is a given variable undefined?
|
|||
|
_.isUndefined = function(obj) {
|
|||
|
return obj === void 0;
|
|||
|
};
|
|||
|
|
|||
|
// Shortcut function for checking if an object has a given property directly
|
|||
|
// on itself (in other words, not on a prototype).
|
|||
|
_.has = function(obj, key) {
|
|||
|
return obj != null && hasOwnProperty.call(obj, key);
|
|||
|
};
|
|||
|
|
|||
|
// Utility Functions
|
|||
|
// -----------------
|
|||
|
|
|||
|
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
|
|||
|
// previous owner. Returns a reference to the Underscore object.
|
|||
|
_.noConflict = function() {
|
|||
|
root._ = previousUnderscore;
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
// Keep the identity function around for default iteratees.
|
|||
|
_.identity = function(value) {
|
|||
|
return value;
|
|||
|
};
|
|||
|
|
|||
|
_.constant = function(value) {
|
|||
|
return function() {
|
|||
|
return value;
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
_.noop = function(){};
|
|||
|
|
|||
|
_.property = function(key) {
|
|||
|
return function(obj) {
|
|||
|
return obj[key];
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Returns a predicate for checking whether an object has a given set of `key:value` pairs.
|
|||
|
_.matches = function(attrs) {
|
|||
|
var pairs = _.pairs(attrs), length = pairs.length;
|
|||
|
return function(obj) {
|
|||
|
if (obj == null) return !length;
|
|||
|
obj = new Object(obj);
|
|||
|
for (var i = 0; i < length; i++) {
|
|||
|
var pair = pairs[i], key = pair[0];
|
|||
|
if (pair[1] !== obj[key] || !(key in obj)) return false;
|
|||
|
}
|
|||
|
return true;
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
// Run a function **n** times.
|
|||
|
_.times = function(n, iteratee, context) {
|
|||
|
var accum = Array(Math.max(0, n));
|
|||
|
iteratee = createCallback(iteratee, context, 1);
|
|||
|
for (var i = 0; i < n; i++) accum[i] = iteratee(i);
|
|||
|
return accum;
|
|||
|
};
|
|||
|
|
|||
|
// Return a random integer between min and max (inclusive).
|
|||
|
_.random = function(min, max) {
|
|||
|
if (max == null) {
|
|||
|
max = min;
|
|||
|
min = 0;
|
|||
|
}
|
|||
|
return min + Math.floor(Math.random() * (max - min + 1));
|
|||
|
};
|
|||
|
|
|||
|
// A (possibly faster) way to get the current timestamp as an integer.
|
|||
|
_.now = Date.now || function() {
|
|||
|
return new Date().getTime();
|
|||
|
};
|
|||
|
|
|||
|
// List of HTML entities for escaping.
|
|||
|
var escapeMap = {
|
|||
|
'&': '&',
|
|||
|
'<': '<',
|
|||
|
'>': '>',
|
|||
|
'"': '"',
|
|||
|
"'": ''',
|
|||
|
'`': '`'
|
|||
|
};
|
|||
|
var unescapeMap = _.invert(escapeMap);
|
|||
|
|
|||
|
// Functions for escaping and unescaping strings to/from HTML interpolation.
|
|||
|
var createEscaper = function(map) {
|
|||
|
var escaper = function(match) {
|
|||
|
return map[match];
|
|||
|
};
|
|||
|
// Regexes for identifying a key that needs to be escaped
|
|||
|
var source = '(?:' + _.keys(map).join('|') + ')';
|
|||
|
var testRegexp = RegExp(source);
|
|||
|
var replaceRegexp = RegExp(source, 'g');
|
|||
|
return function(string) {
|
|||
|
string = string == null ? '' : '' + string;
|
|||
|
return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
|
|||
|
};
|
|||
|
};
|
|||
|
_.escape = createEscaper(escapeMap);
|
|||
|
_.unescape = createEscaper(unescapeMap);
|
|||
|
|
|||
|
// If the value of the named `property` is a function then invoke it with the
|
|||
|
// `object` as context; otherwise, return it.
|
|||
|
_.result = function(object, property) {
|
|||
|
if (object == null) return void 0;
|
|||
|
var value = object[property];
|
|||
|
return _.isFunction(value) ? object[property]() : value;
|
|||
|
};
|
|||
|
|
|||
|
// Generate a unique integer id (unique within the entire client session).
|
|||
|
// Useful for temporary DOM ids.
|
|||
|
var idCounter = 0;
|
|||
|
_.uniqueId = function(prefix) {
|
|||
|
var id = ++idCounter + '';
|
|||
|
return prefix ? prefix + id : id;
|
|||
|
};
|
|||
|
|
|||
|
// By default, Underscore uses ERB-style template delimiters, change the
|
|||
|
// following template settings to use alternative delimiters.
|
|||
|
_.templateSettings = {
|
|||
|
evaluate : /<%([\s\S]+?)%>/g,
|
|||
|
interpolate : /<%=([\s\S]+?)%>/g,
|
|||
|
escape : /<%-([\s\S]+?)%>/g
|
|||
|
};
|
|||
|
|
|||
|
// When customizing `templateSettings`, if you don't want to define an
|
|||
|
// interpolation, evaluation or escaping regex, we need one that is
|
|||
|
// guaranteed not to match.
|
|||
|
var noMatch = /(.)^/;
|
|||
|
|
|||
|
// Certain characters need to be escaped so that they can be put into a
|
|||
|
// string literal.
|
|||
|
var escapes = {
|
|||
|
"'": "'",
|
|||
|
'\\': '\\',
|
|||
|
'\r': 'r',
|
|||
|
'\n': 'n',
|
|||
|
'\u2028': 'u2028',
|
|||
|
'\u2029': 'u2029'
|
|||
|
};
|
|||
|
|
|||
|
var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
|
|||
|
|
|||
|
var escapeChar = function(match) {
|
|||
|
return '\\' + escapes[match];
|
|||
|
};
|
|||
|
|
|||
|
// JavaScript micro-templating, similar to John Resig's implementation.
|
|||
|
// Underscore templating handles arbitrary delimiters, preserves whitespace,
|
|||
|
// and correctly escapes quotes within interpolated code.
|
|||
|
// NB: `oldSettings` only exists for backwards compatibility.
|
|||
|
_.template = function(text, settings, oldSettings) {
|
|||
|
if (!settings && oldSettings) settings = oldSettings;
|
|||
|
settings = _.defaults({}, settings, _.templateSettings);
|
|||
|
|
|||
|
// Combine delimiters into one regular expression via alternation.
|
|||
|
var matcher = RegExp([
|
|||
|
(settings.escape || noMatch).source,
|
|||
|
(settings.interpolate || noMatch).source,
|
|||
|
(settings.evaluate || noMatch).source
|
|||
|
].join('|') + '|$', 'g');
|
|||
|
|
|||
|
// Compile the template source, escaping string literals appropriately.
|
|||
|
var index = 0;
|
|||
|
var source = "__p+='";
|
|||
|
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
|
|||
|
source += text.slice(index, offset).replace(escaper, escapeChar);
|
|||
|
index = offset + match.length;
|
|||
|
|
|||
|
if (escape) {
|
|||
|
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
|
|||
|
} else if (interpolate) {
|
|||
|
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
|
|||
|
} else if (evaluate) {
|
|||
|
source += "';\n" + evaluate + "\n__p+='";
|
|||
|
}
|
|||
|
|
|||
|
// Adobe VMs need the match returned to produce the correct offest.
|
|||
|
return match;
|
|||
|
});
|
|||
|
source += "';\n";
|
|||
|
|
|||
|
// If a variable is not specified, place data values in local scope.
|
|||
|
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
|
|||
|
|
|||
|
source = "var __t,__p='',__j=Array.prototype.join," +
|
|||
|
"print=function(){__p+=__j.call(arguments,'');};\n" +
|
|||
|
source + 'return __p;\n';
|
|||
|
|
|||
|
try {
|
|||
|
var render = new Function(settings.variable || 'obj', '_', source);
|
|||
|
} catch (e) {
|
|||
|
e.source = source;
|
|||
|
throw e;
|
|||
|
}
|
|||
|
|
|||
|
var template = function(data) {
|
|||
|
return render.call(this, data, _);
|
|||
|
};
|
|||
|
|
|||
|
// Provide the compiled source as a convenience for precompilation.
|
|||
|
var argument = settings.variable || 'obj';
|
|||
|
template.source = 'function(' + argument + '){\n' + source + '}';
|
|||
|
|
|||
|
return template;
|
|||
|
};
|
|||
|
|
|||
|
// Add a "chain" function. Start chaining a wrapped Underscore object.
|
|||
|
_.chain = function(obj) {
|
|||
|
var instance = _(obj);
|
|||
|
instance._chain = true;
|
|||
|
return instance;
|
|||
|
};
|
|||
|
|
|||
|
// OOP
|
|||
|
// ---------------
|
|||
|
// If Underscore is called as a function, it returns a wrapped object that
|
|||
|
// can be used OO-style. This wrapper holds altered versions of all the
|
|||
|
// underscore functions. Wrapped objects may be chained.
|
|||
|
|
|||
|
// Helper function to continue chaining intermediate results.
|
|||
|
var result = function(obj) {
|
|||
|
return this._chain ? _(obj).chain() : obj;
|
|||
|
};
|
|||
|
|
|||
|
// Add your own custom functions to the Underscore object.
|
|||
|
_.mixin = function(obj) {
|
|||
|
_.each(_.functions(obj), function(name) {
|
|||
|
var func = _[name] = obj[name];
|
|||
|
_.prototype[name] = function() {
|
|||
|
var args = [this._wrapped];
|
|||
|
push.apply(args, arguments);
|
|||
|
return result.call(this, func.apply(_, args));
|
|||
|
};
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
// Add all of the Underscore functions to the wrapper object.
|
|||
|
_.mixin(_);
|
|||
|
|
|||
|
// Add all mutator Array functions to the wrapper.
|
|||
|
_.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
|
|||
|
var method = ArrayProto[name];
|
|||
|
_.prototype[name] = function() {
|
|||
|
var obj = this._wrapped;
|
|||
|
method.apply(obj, arguments);
|
|||
|
if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
|
|||
|
return result.call(this, obj);
|
|||
|
};
|
|||
|
});
|
|||
|
|
|||
|
// Add all accessor Array functions to the wrapper.
|
|||
|
_.each(['concat', 'join', 'slice'], function(name) {
|
|||
|
var method = ArrayProto[name];
|
|||
|
_.prototype[name] = function() {
|
|||
|
return result.call(this, method.apply(this._wrapped, arguments));
|
|||
|
};
|
|||
|
});
|
|||
|
|
|||
|
// Extracts the result from a wrapped and chained object.
|
|||
|
_.prototype.value = function() {
|
|||
|
return this._wrapped;
|
|||
|
};
|
|||
|
|
|||
|
// AMD registration happens at the end for compatibility with AMD loaders
|
|||
|
// that may not enforce next-turn semantics on modules. Even though general
|
|||
|
// practice for AMD registration is to be anonymous, underscore registers
|
|||
|
// as a named module because, like jQuery, it is a base library that is
|
|||
|
// popular enough to be bundled in a third party lib, but not be part of
|
|||
|
// an AMD load request. Those cases could generate an error when an
|
|||
|
// anonymous define() is called outside of a loader request.
|
|||
|
if (typeof define === 'function' && define.amd) {
|
|||
|
define('underscore', [], function() {
|
|||
|
return _;
|
|||
|
});
|
|||
|
}
|
|||
|
}.call(this));
|
|||
|
|
|||
|
},{}],23:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.7.1
|
|||
|
(function() {
|
|||
|
var xml2js;
|
|||
|
|
|||
|
xml2js = require('../lib/xml2js');
|
|||
|
|
|||
|
exports.stripBOM = function(str) {
|
|||
|
if (str[0] === '\uFEFF') {
|
|||
|
return str.substring(1);
|
|||
|
} else {
|
|||
|
return str;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"../lib/xml2js":25}],24:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.7.1
|
|||
|
(function() {
|
|||
|
var prefixMatch;
|
|||
|
|
|||
|
prefixMatch = new RegExp(/(?!xmlns)^.*:/);
|
|||
|
|
|||
|
exports.normalize = function(str) {
|
|||
|
return str.toLowerCase();
|
|||
|
};
|
|||
|
|
|||
|
exports.firstCharLowerCase = function(str) {
|
|||
|
return str.charAt(0).toLowerCase() + str.slice(1);
|
|||
|
};
|
|||
|
|
|||
|
exports.stripPrefix = function(str) {
|
|||
|
return str.replace(prefixMatch, '');
|
|||
|
};
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{}],25:[function(require,module,exports){
|
|||
|
(function (process){
|
|||
|
// Generated by CoffeeScript 1.7.1
|
|||
|
(function() {
|
|||
|
var bom, builder, events, isEmpty, processName, processors, sax,
|
|||
|
__hasProp = {}.hasOwnProperty,
|
|||
|
__extends = 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; },
|
|||
|
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
|||
|
|
|||
|
sax = require('sax');
|
|||
|
|
|||
|
events = require('events');
|
|||
|
|
|||
|
builder = require('xmlbuilder');
|
|||
|
|
|||
|
bom = require('./bom');
|
|||
|
|
|||
|
processors = require('./processors');
|
|||
|
|
|||
|
isEmpty = function(thing) {
|
|||
|
return typeof thing === "object" && (thing != null) && Object.keys(thing).length === 0;
|
|||
|
};
|
|||
|
|
|||
|
processName = function(processors, processedName) {
|
|||
|
var process, _i, _len;
|
|||
|
for (_i = 0, _len = processors.length; _i < _len; _i++) {
|
|||
|
process = processors[_i];
|
|||
|
processedName = process(processedName);
|
|||
|
}
|
|||
|
return processedName;
|
|||
|
};
|
|||
|
|
|||
|
exports.processors = processors;
|
|||
|
|
|||
|
exports.defaults = {
|
|||
|
"0.1": {
|
|||
|
explicitCharkey: false,
|
|||
|
trim: true,
|
|||
|
normalize: true,
|
|||
|
normalizeTags: false,
|
|||
|
attrkey: "@",
|
|||
|
charkey: "#",
|
|||
|
explicitArray: false,
|
|||
|
ignoreAttrs: false,
|
|||
|
mergeAttrs: false,
|
|||
|
explicitRoot: false,
|
|||
|
validator: null,
|
|||
|
xmlns: false,
|
|||
|
explicitChildren: false,
|
|||
|
childkey: '@@',
|
|||
|
charsAsChildren: false,
|
|||
|
async: false,
|
|||
|
strict: true,
|
|||
|
attrNameProcessors: null,
|
|||
|
tagNameProcessors: null
|
|||
|
},
|
|||
|
"0.2": {
|
|||
|
explicitCharkey: false,
|
|||
|
trim: false,
|
|||
|
normalize: false,
|
|||
|
normalizeTags: false,
|
|||
|
attrkey: "$",
|
|||
|
charkey: "_",
|
|||
|
explicitArray: true,
|
|||
|
ignoreAttrs: false,
|
|||
|
mergeAttrs: false,
|
|||
|
explicitRoot: true,
|
|||
|
validator: null,
|
|||
|
xmlns: false,
|
|||
|
explicitChildren: false,
|
|||
|
childkey: '$$',
|
|||
|
charsAsChildren: false,
|
|||
|
async: false,
|
|||
|
strict: true,
|
|||
|
attrNameProcessors: null,
|
|||
|
tagNameProcessors: null,
|
|||
|
rootName: 'root',
|
|||
|
xmldec: {
|
|||
|
'version': '1.0',
|
|||
|
'encoding': 'UTF-8',
|
|||
|
'standalone': true
|
|||
|
},
|
|||
|
doctype: null,
|
|||
|
renderOpts: {
|
|||
|
'pretty': true,
|
|||
|
'indent': ' ',
|
|||
|
'newline': '\n'
|
|||
|
},
|
|||
|
headless: false
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
exports.ValidationError = (function(_super) {
|
|||
|
__extends(ValidationError, _super);
|
|||
|
|
|||
|
function ValidationError(message) {
|
|||
|
this.message = message;
|
|||
|
}
|
|||
|
|
|||
|
return ValidationError;
|
|||
|
|
|||
|
})(Error);
|
|||
|
|
|||
|
exports.Builder = (function() {
|
|||
|
function Builder(opts) {
|
|||
|
var key, value, _ref;
|
|||
|
this.options = {};
|
|||
|
_ref = exports.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;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Builder.prototype.buildObject = function(rootObj) {
|
|||
|
var attrkey, charkey, render, rootElement, rootName;
|
|||
|
attrkey = this.options.attrkey;
|
|||
|
charkey = this.options.charkey;
|
|||
|
if ((Object.keys(rootObj).length === 1) && (this.options.rootName === exports.defaults['0.2'].rootName)) {
|
|||
|
rootName = Object.keys(rootObj)[0];
|
|||
|
rootObj = rootObj[rootName];
|
|||
|
} else {
|
|||
|
rootName = this.options.rootName;
|
|||
|
}
|
|||
|
render = function(element, obj) {
|
|||
|
var attr, child, entry, index, key, value, _ref, _ref1;
|
|||
|
if (typeof obj !== 'object') {
|
|||
|
element.txt(obj);
|
|||
|
} else {
|
|||
|
for (key in obj) {
|
|||
|
if (!__hasProp.call(obj, key)) continue;
|
|||
|
child = obj[key];
|
|||
|
if (key === attrkey) {
|
|||
|
if (typeof child === "object") {
|
|||
|
for (attr in child) {
|
|||
|
value = child[attr];
|
|||
|
element = element.att(attr, value);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (key === charkey) {
|
|||
|
element = element.txt(child);
|
|||
|
} else if (typeof child === 'object' && ((child != null ? child.constructor : void 0) != null) && ((child != null ? (_ref = child.constructor) != null ? _ref.name : void 0 : void 0) != null) && (child != null ? (_ref1 = child.constructor) != null ? _ref1.name : void 0 : void 0) === 'Array') {
|
|||
|
for (index in child) {
|
|||
|
if (!__hasProp.call(child, index)) continue;
|
|||
|
entry = child[index];
|
|||
|
if (typeof entry === 'string') {
|
|||
|
element = element.ele(key, entry).up();
|
|||
|
} else {
|
|||
|
element = arguments.callee(element.ele(key), entry).up();
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (typeof child === "object") {
|
|||
|
element = arguments.callee(element.ele(key), child).up();
|
|||
|
} else {
|
|||
|
element = element.ele(key, child.toString()).up();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return element;
|
|||
|
};
|
|||
|
rootElement = builder.create(rootName, this.options.xmldec, this.options.doctype, {
|
|||
|
headless: this.options.headless
|
|||
|
});
|
|||
|
return render(rootElement, rootObj).end(this.options.renderOpts);
|
|||
|
};
|
|||
|
|
|||
|
return Builder;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
exports.Parser = (function(_super) {
|
|||
|
__extends(Parser, _super);
|
|||
|
|
|||
|
function Parser(opts) {
|
|||
|
this.parseString = __bind(this.parseString, this);
|
|||
|
this.reset = __bind(this.reset, this);
|
|||
|
this.assignOrPush = __bind(this.assignOrPush, this);
|
|||
|
var key, value, _ref;
|
|||
|
if (!(this instanceof exports.Parser)) {
|
|||
|
return new exports.Parser(opts);
|
|||
|
}
|
|||
|
this.options = {};
|
|||
|
_ref = exports.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.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.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 = node.attributes[key];
|
|||
|
processedKey = _this.options.attrNameProcessors ? processName(_this.options.attrNameProcessors, key) : key;
|
|||
|
if (_this.options.mergeAttrs) {
|
|||
|
_this.assignOrPush(obj, processedKey, newValue);
|
|||
|
} else {
|
|||
|
obj[attrkey][processedKey] = newValue;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
obj["#name"] = _this.options.tagNameProcessors ? processName(_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, err, node, nodeName, obj, old, s, xpath;
|
|||
|
obj = stack.pop();
|
|||
|
nodeName = obj["#name"];
|
|||
|
delete obj["#name"];
|
|||
|
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();
|
|||
|
}
|
|||
|
if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) {
|
|||
|
obj = obj[charkey];
|
|||
|
}
|
|||
|
}
|
|||
|
if (isEmpty(obj)) {
|
|||
|
obj = _this.options.emptyTag !== void 0 ? _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("/");
|
|||
|
try {
|
|||
|
obj = _this.options.validator(xpath, s && s[nodeName], obj);
|
|||
|
} catch (_error) {
|
|||
|
err = _error;
|
|||
|
_this.emit("error", err);
|
|||
|
}
|
|||
|
}
|
|||
|
if (_this.options.explicitChildren && !_this.options.mergeAttrs && typeof obj === 'object') {
|
|||
|
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;
|
|||
|
}
|
|||
|
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 s;
|
|||
|
s = stack[stack.length - 1];
|
|||
|
if (s) {
|
|||
|
s[charkey] += text;
|
|||
|
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();
|
|||
|
if (this.options.async) {
|
|||
|
return process.nextTick(function() {
|
|||
|
return cb(null, result);
|
|||
|
});
|
|||
|
} else {
|
|||
|
return cb(null, result);
|
|||
|
}
|
|||
|
});
|
|||
|
this.on("error", function(err) {
|
|||
|
this.reset();
|
|||
|
if (this.options.async) {
|
|||
|
return process.nextTick(function() {
|
|||
|
return cb(err);
|
|||
|
});
|
|||
|
} else {
|
|||
|
return cb(err);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
if (str.toString().trim() === '') {
|
|||
|
this.emit("end", null);
|
|||
|
return true;
|
|||
|
}
|
|||
|
try {
|
|||
|
return this.saxParser.write(bom.stripBOM(str.toString())).close();
|
|||
|
} catch (_error) {
|
|||
|
err = _error;
|
|||
|
if (!(this.saxParser.errThrown || this.saxParser.ended)) {
|
|||
|
this.emit('error', err);
|
|||
|
return this.saxParser.errThrown = true;
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
return Parser;
|
|||
|
|
|||
|
})(events.EventEmitter);
|
|||
|
|
|||
|
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);
|
|||
|
};
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
}).call(this,require('_process'))
|
|||
|
},{"./bom":23,"./processors":24,"_process":8,"events":5,"sax":26,"xmlbuilder":43}],26:[function(require,module,exports){
|
|||
|
(function (Buffer){
|
|||
|
// wrapper for non-node envs
|
|||
|
;(function (sax) {
|
|||
|
|
|||
|
sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
|
|||
|
sax.SAXParser = SAXParser
|
|||
|
sax.SAXStream = SAXStream
|
|||
|
sax.createStream = createStream
|
|||
|
|
|||
|
// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
|
|||
|
// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
|
|||
|
// since that's the earliest that a buffer overrun could occur. This way, checks are
|
|||
|
// as rare as required, but as often as necessary to ensure never crossing this bound.
|
|||
|
// Furthermore, buffers are only tested at most once per write(), so passing a very
|
|||
|
// large string into write() might have undesirable effects, but this is manageable by
|
|||
|
// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme
|
|||
|
// edge case, result in creating at most one complete copy of the string passed in.
|
|||
|
// Set to Infinity to have unlimited buffers.
|
|||
|
sax.MAX_BUFFER_LENGTH = 64 * 1024
|
|||
|
|
|||
|
var buffers = [
|
|||
|
"comment", "sgmlDecl", "textNode", "tagName", "doctype",
|
|||
|
"procInstName", "procInstBody", "entity", "attribName",
|
|||
|
"attribValue", "cdata", "script"
|
|||
|
]
|
|||
|
|
|||
|
sax.EVENTS = // for discoverability.
|
|||
|
[ "text"
|
|||
|
, "processinginstruction"
|
|||
|
, "sgmldeclaration"
|
|||
|
, "doctype"
|
|||
|
, "comment"
|
|||
|
, "attribute"
|
|||
|
, "opentag"
|
|||
|
, "closetag"
|
|||
|
, "opencdata"
|
|||
|
, "cdata"
|
|||
|
, "closecdata"
|
|||
|
, "error"
|
|||
|
, "end"
|
|||
|
, "ready"
|
|||
|
, "script"
|
|||
|
, "opennamespace"
|
|||
|
, "closenamespace"
|
|||
|
]
|
|||
|
|
|||
|
function SAXParser (strict, opt) {
|
|||
|
if (!(this instanceof SAXParser)) return new SAXParser(strict, opt)
|
|||
|
|
|||
|
var parser = this
|
|||
|
clearBuffers(parser)
|
|||
|
parser.q = parser.c = ""
|
|||
|
parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
|
|||
|
parser.opt = opt || {}
|
|||
|
parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
|
|||
|
parser.looseCase = parser.opt.lowercase ? "toLowerCase" : "toUpperCase"
|
|||
|
parser.tags = []
|
|||
|
parser.closed = parser.closedRoot = parser.sawRoot = false
|
|||
|
parser.tag = parser.error = null
|
|||
|
parser.strict = !!strict
|
|||
|
parser.noscript = !!(strict || parser.opt.noscript)
|
|||
|
parser.state = S.BEGIN
|
|||
|
parser.ENTITIES = Object.create(sax.ENTITIES)
|
|||
|
parser.attribList = []
|
|||
|
|
|||
|
// namespaces form a prototype chain.
|
|||
|
// it always points at the current tag,
|
|||
|
// which protos to its parent tag.
|
|||
|
if (parser.opt.xmlns) parser.ns = Object.create(rootNS)
|
|||
|
|
|||
|
// mostly just for error reporting
|
|||
|
parser.trackPosition = parser.opt.position !== false
|
|||
|
if (parser.trackPosition) {
|
|||
|
parser.position = parser.line = parser.column = 0
|
|||
|
}
|
|||
|
emit(parser, "onready")
|
|||
|
}
|
|||
|
|
|||
|
if (!Object.create) Object.create = function (o) {
|
|||
|
function f () { this.__proto__ = o }
|
|||
|
f.prototype = o
|
|||
|
return new f
|
|||
|
}
|
|||
|
|
|||
|
if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) {
|
|||
|
return o.__proto__
|
|||
|
}
|
|||
|
|
|||
|
if (!Object.keys) Object.keys = function (o) {
|
|||
|
var a = []
|
|||
|
for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
|
|||
|
return a
|
|||
|
}
|
|||
|
|
|||
|
function checkBufferLength (parser) {
|
|||
|
var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
|
|||
|
, maxActual = 0
|
|||
|
for (var i = 0, l = buffers.length; i < l; i ++) {
|
|||
|
var len = parser[buffers[i]].length
|
|||
|
if (len > maxAllowed) {
|
|||
|
// Text/cdata nodes can get big, and since they're buffered,
|
|||
|
// we can get here under normal conditions.
|
|||
|
// Avoid issues by emitting the text node now,
|
|||
|
// so at least it won't get any bigger.
|
|||
|
switch (buffers[i]) {
|
|||
|
case "textNode":
|
|||
|
closeText(parser)
|
|||
|
break
|
|||
|
|
|||
|
case "cdata":
|
|||
|
emitNode(parser, "oncdata", parser.cdata)
|
|||
|
parser.cdata = ""
|
|||
|
break
|
|||
|
|
|||
|
case "script":
|
|||
|
emitNode(parser, "onscript", parser.script)
|
|||
|
parser.script = ""
|
|||
|
break
|
|||
|
|
|||
|
default:
|
|||
|
error(parser, "Max buffer length exceeded: "+buffers[i])
|
|||
|
}
|
|||
|
}
|
|||
|
maxActual = Math.max(maxActual, len)
|
|||
|
}
|
|||
|
// schedule the next check for the earliest possible buffer overrun.
|
|||
|
parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual)
|
|||
|
+ parser.position
|
|||
|
}
|
|||
|
|
|||
|
function clearBuffers (parser) {
|
|||
|
for (var i = 0, l = buffers.length; i < l; i ++) {
|
|||
|
parser[buffers[i]] = ""
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function flushBuffers (parser) {
|
|||
|
closeText(parser)
|
|||
|
if (parser.cdata !== "") {
|
|||
|
emitNode(parser, "oncdata", parser.cdata)
|
|||
|
parser.cdata = ""
|
|||
|
}
|
|||
|
if (parser.script !== "") {
|
|||
|
emitNode(parser, "onscript", parser.script)
|
|||
|
parser.script = ""
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
SAXParser.prototype =
|
|||
|
{ end: function () { end(this) }
|
|||
|
, write: write
|
|||
|
, resume: function () { this.error = null; return this }
|
|||
|
, close: function () { return this.write(null) }
|
|||
|
, flush: function () { flushBuffers(this) }
|
|||
|
}
|
|||
|
|
|||
|
try {
|
|||
|
var Stream = require("stream").Stream
|
|||
|
} catch (ex) {
|
|||
|
var Stream = function () {}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
var streamWraps = sax.EVENTS.filter(function (ev) {
|
|||
|
return ev !== "error" && ev !== "end"
|
|||
|
})
|
|||
|
|
|||
|
function createStream (strict, opt) {
|
|||
|
return new SAXStream(strict, opt)
|
|||
|
}
|
|||
|
|
|||
|
function SAXStream (strict, opt) {
|
|||
|
if (!(this instanceof SAXStream)) return new SAXStream(strict, opt)
|
|||
|
|
|||
|
Stream.apply(this)
|
|||
|
|
|||
|
this._parser = new SAXParser(strict, opt)
|
|||
|
this.writable = true
|
|||
|
this.readable = true
|
|||
|
|
|||
|
|
|||
|
var me = this
|
|||
|
|
|||
|
this._parser.onend = function () {
|
|||
|
me.emit("end")
|
|||
|
}
|
|||
|
|
|||
|
this._parser.onerror = function (er) {
|
|||
|
me.emit("error", er)
|
|||
|
|
|||
|
// if didn't throw, then means error was handled.
|
|||
|
// go ahead and clear error, so we can write again.
|
|||
|
me._parser.error = null
|
|||
|
}
|
|||
|
|
|||
|
this._decoder = null;
|
|||
|
|
|||
|
streamWraps.forEach(function (ev) {
|
|||
|
Object.defineProperty(me, "on" + ev, {
|
|||
|
get: function () { return me._parser["on" + ev] },
|
|||
|
set: function (h) {
|
|||
|
if (!h) {
|
|||
|
me.removeAllListeners(ev)
|
|||
|
return me._parser["on"+ev] = h
|
|||
|
}
|
|||
|
me.on(ev, h)
|
|||
|
},
|
|||
|
enumerable: true,
|
|||
|
configurable: false
|
|||
|
})
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
SAXStream.prototype = Object.create(Stream.prototype,
|
|||
|
{ constructor: { value: SAXStream } })
|
|||
|
|
|||
|
SAXStream.prototype.write = function (data) {
|
|||
|
if (typeof Buffer === 'function' &&
|
|||
|
typeof Buffer.isBuffer === 'function' &&
|
|||
|
Buffer.isBuffer(data)) {
|
|||
|
if (!this._decoder) {
|
|||
|
var SD = require('string_decoder').StringDecoder
|
|||
|
this._decoder = new SD('utf8')
|
|||
|
}
|
|||
|
data = this._decoder.write(data);
|
|||
|
}
|
|||
|
|
|||
|
this._parser.write(data.toString())
|
|||
|
this.emit("data", data)
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
SAXStream.prototype.end = function (chunk) {
|
|||
|
if (chunk && chunk.length) this.write(chunk)
|
|||
|
this._parser.end()
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
SAXStream.prototype.on = function (ev, handler) {
|
|||
|
var me = this
|
|||
|
if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) {
|
|||
|
me._parser["on"+ev] = function () {
|
|||
|
var args = arguments.length === 1 ? [arguments[0]]
|
|||
|
: Array.apply(null, arguments)
|
|||
|
args.splice(0, 0, ev)
|
|||
|
me.emit.apply(me, args)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return Stream.prototype.on.call(me, ev, handler)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// character classes and tokens
|
|||
|
var whitespace = "\r\n\t "
|
|||
|
// this really needs to be replaced with character classes.
|
|||
|
// XML allows all manner of ridiculous numbers and digits.
|
|||
|
, number = "0124356789"
|
|||
|
, letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|||
|
// (Letter | "_" | ":")
|
|||
|
, quote = "'\""
|
|||
|
, entity = number+letter+"#"
|
|||
|
, attribEnd = whitespace + ">"
|
|||
|
, CDATA = "[CDATA["
|
|||
|
, DOCTYPE = "DOCTYPE"
|
|||
|
, XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
|
|||
|
, XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"
|
|||
|
, rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
|
|||
|
|
|||
|
// turn all the string character sets into character class objects.
|
|||
|
whitespace = charClass(whitespace)
|
|||
|
number = charClass(number)
|
|||
|
letter = charClass(letter)
|
|||
|
|
|||
|
// http://www.w3.org/TR/REC-xml/#NT-NameStartChar
|
|||
|
// This implementation works on strings, a single character at a time
|
|||
|
// as such, it cannot ever support astral-plane characters (10000-EFFFF)
|
|||
|
// without a significant breaking change to either this parser, or the
|
|||
|
// JavaScript language. Implementation of an emoji-capable xml parser
|
|||
|
// is left as an exercise for the reader.
|
|||
|
var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
|
|||
|
|
|||
|
var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/
|
|||
|
|
|||
|
quote = charClass(quote)
|
|||
|
entity = charClass(entity)
|
|||
|
attribEnd = charClass(attribEnd)
|
|||
|
|
|||
|
function charClass (str) {
|
|||
|
return str.split("").reduce(function (s, c) {
|
|||
|
s[c] = true
|
|||
|
return s
|
|||
|
}, {})
|
|||
|
}
|
|||
|
|
|||
|
function isRegExp (c) {
|
|||
|
return Object.prototype.toString.call(c) === '[object RegExp]'
|
|||
|
}
|
|||
|
|
|||
|
function is (charclass, c) {
|
|||
|
return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]
|
|||
|
}
|
|||
|
|
|||
|
function not (charclass, c) {
|
|||
|
return !is(charclass, c)
|
|||
|
}
|
|||
|
|
|||
|
var S = 0
|
|||
|
sax.STATE =
|
|||
|
{ BEGIN : S++
|
|||
|
, TEXT : S++ // general stuff
|
|||
|
, TEXT_ENTITY : S++ // & and such.
|
|||
|
, OPEN_WAKA : S++ // <
|
|||
|
, SGML_DECL : S++ // <!BLARG
|
|||
|
, SGML_DECL_QUOTED : S++ // <!BLARG foo "bar
|
|||
|
, DOCTYPE : S++ // <!DOCTYPE
|
|||
|
, DOCTYPE_QUOTED : S++ // <!DOCTYPE "//blah
|
|||
|
, DOCTYPE_DTD : S++ // <!DOCTYPE "//blah" [ ...
|
|||
|
, DOCTYPE_DTD_QUOTED : S++ // <!DOCTYPE "//blah" [ "foo
|
|||
|
, COMMENT_STARTING : S++ // <!-
|
|||
|
, COMMENT : S++ // <!--
|
|||
|
, COMMENT_ENDING : S++ // <!-- blah -
|
|||
|
, COMMENT_ENDED : S++ // <!-- blah --
|
|||
|
, CDATA : S++ // <![CDATA[ something
|
|||
|
, CDATA_ENDING : S++ // ]
|
|||
|
, CDATA_ENDING_2 : S++ // ]]
|
|||
|
, PROC_INST : S++ // <?hi
|
|||
|
, PROC_INST_BODY : S++ // <?hi there
|
|||
|
, PROC_INST_ENDING : S++ // <?hi "there" ?
|
|||
|
, OPEN_TAG : S++ // <strong
|
|||
|
, OPEN_TAG_SLASH : S++ // <strong /
|
|||
|
, ATTRIB : S++ // <a
|
|||
|
, ATTRIB_NAME : S++ // <a foo
|
|||
|
, ATTRIB_NAME_SAW_WHITE : S++ // <a foo _
|
|||
|
, ATTRIB_VALUE : S++ // <a foo=
|
|||
|
, ATTRIB_VALUE_QUOTED : S++ // <a foo="bar
|
|||
|
, ATTRIB_VALUE_CLOSED : S++ // <a foo="bar"
|
|||
|
, ATTRIB_VALUE_UNQUOTED : S++ // <a foo=bar
|
|||
|
, ATTRIB_VALUE_ENTITY_Q : S++ // <foo bar="""
|
|||
|
, ATTRIB_VALUE_ENTITY_U : S++ // <foo bar="
|
|||
|
, CLOSE_TAG : S++ // </a
|
|||
|
, CLOSE_TAG_SAW_WHITE : S++ // </a >
|
|||
|
, SCRIPT : S++ // <script> ...
|
|||
|
, SCRIPT_ENDING : S++ // <script> ... <
|
|||
|
}
|
|||
|
|
|||
|
sax.ENTITIES =
|
|||
|
{ "amp" : "&"
|
|||
|
, "gt" : ">"
|
|||
|
, "lt" : "<"
|
|||
|
, "quot" : "\""
|
|||
|
, "apos" : "'"
|
|||
|
, "AElig" : 198
|
|||
|
, "Aacute" : 193
|
|||
|
, "Acirc" : 194
|
|||
|
, "Agrave" : 192
|
|||
|
, "Aring" : 197
|
|||
|
, "Atilde" : 195
|
|||
|
, "Auml" : 196
|
|||
|
, "Ccedil" : 199
|
|||
|
, "ETH" : 208
|
|||
|
, "Eacute" : 201
|
|||
|
, "Ecirc" : 202
|
|||
|
, "Egrave" : 200
|
|||
|
, "Euml" : 203
|
|||
|
, "Iacute" : 205
|
|||
|
, "Icirc" : 206
|
|||
|
, "Igrave" : 204
|
|||
|
, "Iuml" : 207
|
|||
|
, "Ntilde" : 209
|
|||
|
, "Oacute" : 211
|
|||
|
, "Ocirc" : 212
|
|||
|
, "Ograve" : 210
|
|||
|
, "Oslash" : 216
|
|||
|
, "Otilde" : 213
|
|||
|
, "Ouml" : 214
|
|||
|
, "THORN" : 222
|
|||
|
, "Uacute" : 218
|
|||
|
, "Ucirc" : 219
|
|||
|
, "Ugrave" : 217
|
|||
|
, "Uuml" : 220
|
|||
|
, "Yacute" : 221
|
|||
|
, "aacute" : 225
|
|||
|
, "acirc" : 226
|
|||
|
, "aelig" : 230
|
|||
|
, "agrave" : 224
|
|||
|
, "aring" : 229
|
|||
|
, "atilde" : 227
|
|||
|
, "auml" : 228
|
|||
|
, "ccedil" : 231
|
|||
|
, "eacute" : 233
|
|||
|
, "ecirc" : 234
|
|||
|
, "egrave" : 232
|
|||
|
, "eth" : 240
|
|||
|
, "euml" : 235
|
|||
|
, "iacute" : 237
|
|||
|
, "icirc" : 238
|
|||
|
, "igrave" : 236
|
|||
|
, "iuml" : 239
|
|||
|
, "ntilde" : 241
|
|||
|
, "oacute" : 243
|
|||
|
, "ocirc" : 244
|
|||
|
, "ograve" : 242
|
|||
|
, "oslash" : 248
|
|||
|
, "otilde" : 245
|
|||
|
, "ouml" : 246
|
|||
|
, "szlig" : 223
|
|||
|
, "thorn" : 254
|
|||
|
, "uacute" : 250
|
|||
|
, "ucirc" : 251
|
|||
|
, "ugrave" : 249
|
|||
|
, "uuml" : 252
|
|||
|
, "yacute" : 253
|
|||
|
, "yuml" : 255
|
|||
|
, "copy" : 169
|
|||
|
, "reg" : 174
|
|||
|
, "nbsp" : 160
|
|||
|
, "iexcl" : 161
|
|||
|
, "cent" : 162
|
|||
|
, "pound" : 163
|
|||
|
, "curren" : 164
|
|||
|
, "yen" : 165
|
|||
|
, "brvbar" : 166
|
|||
|
, "sect" : 167
|
|||
|
, "uml" : 168
|
|||
|
, "ordf" : 170
|
|||
|
, "laquo" : 171
|
|||
|
, "not" : 172
|
|||
|
, "shy" : 173
|
|||
|
, "macr" : 175
|
|||
|
, "deg" : 176
|
|||
|
, "plusmn" : 177
|
|||
|
, "sup1" : 185
|
|||
|
, "sup2" : 178
|
|||
|
, "sup3" : 179
|
|||
|
, "acute" : 180
|
|||
|
, "micro" : 181
|
|||
|
, "para" : 182
|
|||
|
, "middot" : 183
|
|||
|
, "cedil" : 184
|
|||
|
, "ordm" : 186
|
|||
|
, "raquo" : 187
|
|||
|
, "frac14" : 188
|
|||
|
, "frac12" : 189
|
|||
|
, "frac34" : 190
|
|||
|
, "iquest" : 191
|
|||
|
, "times" : 215
|
|||
|
, "divide" : 247
|
|||
|
, "OElig" : 338
|
|||
|
, "oelig" : 339
|
|||
|
, "Scaron" : 352
|
|||
|
, "scaron" : 353
|
|||
|
, "Yuml" : 376
|
|||
|
, "fnof" : 402
|
|||
|
, "circ" : 710
|
|||
|
, "tilde" : 732
|
|||
|
, "Alpha" : 913
|
|||
|
, "Beta" : 914
|
|||
|
, "Gamma" : 915
|
|||
|
, "Delta" : 916
|
|||
|
, "Epsilon" : 917
|
|||
|
, "Zeta" : 918
|
|||
|
, "Eta" : 919
|
|||
|
, "Theta" : 920
|
|||
|
, "Iota" : 921
|
|||
|
, "Kappa" : 922
|
|||
|
, "Lambda" : 923
|
|||
|
, "Mu" : 924
|
|||
|
, "Nu" : 925
|
|||
|
, "Xi" : 926
|
|||
|
, "Omicron" : 927
|
|||
|
, "Pi" : 928
|
|||
|
, "Rho" : 929
|
|||
|
, "Sigma" : 931
|
|||
|
, "Tau" : 932
|
|||
|
, "Upsilon" : 933
|
|||
|
, "Phi" : 934
|
|||
|
, "Chi" : 935
|
|||
|
, "Psi" : 936
|
|||
|
, "Omega" : 937
|
|||
|
, "alpha" : 945
|
|||
|
, "beta" : 946
|
|||
|
, "gamma" : 947
|
|||
|
, "delta" : 948
|
|||
|
, "epsilon" : 949
|
|||
|
, "zeta" : 950
|
|||
|
, "eta" : 951
|
|||
|
, "theta" : 952
|
|||
|
, "iota" : 953
|
|||
|
, "kappa" : 954
|
|||
|
, "lambda" : 955
|
|||
|
, "mu" : 956
|
|||
|
, "nu" : 957
|
|||
|
, "xi" : 958
|
|||
|
, "omicron" : 959
|
|||
|
, "pi" : 960
|
|||
|
, "rho" : 961
|
|||
|
, "sigmaf" : 962
|
|||
|
, "sigma" : 963
|
|||
|
, "tau" : 964
|
|||
|
, "upsilon" : 965
|
|||
|
, "phi" : 966
|
|||
|
, "chi" : 967
|
|||
|
, "psi" : 968
|
|||
|
, "omega" : 969
|
|||
|
, "thetasym" : 977
|
|||
|
, "upsih" : 978
|
|||
|
, "piv" : 982
|
|||
|
, "ensp" : 8194
|
|||
|
, "emsp" : 8195
|
|||
|
, "thinsp" : 8201
|
|||
|
, "zwnj" : 8204
|
|||
|
, "zwj" : 8205
|
|||
|
, "lrm" : 8206
|
|||
|
, "rlm" : 8207
|
|||
|
, "ndash" : 8211
|
|||
|
, "mdash" : 8212
|
|||
|
, "lsquo" : 8216
|
|||
|
, "rsquo" : 8217
|
|||
|
, "sbquo" : 8218
|
|||
|
, "ldquo" : 8220
|
|||
|
, "rdquo" : 8221
|
|||
|
, "bdquo" : 8222
|
|||
|
, "dagger" : 8224
|
|||
|
, "Dagger" : 8225
|
|||
|
, "bull" : 8226
|
|||
|
, "hellip" : 8230
|
|||
|
, "permil" : 8240
|
|||
|
, "prime" : 8242
|
|||
|
, "Prime" : 8243
|
|||
|
, "lsaquo" : 8249
|
|||
|
, "rsaquo" : 8250
|
|||
|
, "oline" : 8254
|
|||
|
, "frasl" : 8260
|
|||
|
, "euro" : 8364
|
|||
|
, "image" : 8465
|
|||
|
, "weierp" : 8472
|
|||
|
, "real" : 8476
|
|||
|
, "trade" : 8482
|
|||
|
, "alefsym" : 8501
|
|||
|
, "larr" : 8592
|
|||
|
, "uarr" : 8593
|
|||
|
, "rarr" : 8594
|
|||
|
, "darr" : 8595
|
|||
|
, "harr" : 8596
|
|||
|
, "crarr" : 8629
|
|||
|
, "lArr" : 8656
|
|||
|
, "uArr" : 8657
|
|||
|
, "rArr" : 8658
|
|||
|
, "dArr" : 8659
|
|||
|
, "hArr" : 8660
|
|||
|
, "forall" : 8704
|
|||
|
, "part" : 8706
|
|||
|
, "exist" : 8707
|
|||
|
, "empty" : 8709
|
|||
|
, "nabla" : 8711
|
|||
|
, "isin" : 8712
|
|||
|
, "notin" : 8713
|
|||
|
, "ni" : 8715
|
|||
|
, "prod" : 8719
|
|||
|
, "sum" : 8721
|
|||
|
, "minus" : 8722
|
|||
|
, "lowast" : 8727
|
|||
|
, "radic" : 8730
|
|||
|
, "prop" : 8733
|
|||
|
, "infin" : 8734
|
|||
|
, "ang" : 8736
|
|||
|
, "and" : 8743
|
|||
|
, "or" : 8744
|
|||
|
, "cap" : 8745
|
|||
|
, "cup" : 8746
|
|||
|
, "int" : 8747
|
|||
|
, "there4" : 8756
|
|||
|
, "sim" : 8764
|
|||
|
, "cong" : 8773
|
|||
|
, "asymp" : 8776
|
|||
|
, "ne" : 8800
|
|||
|
, "equiv" : 8801
|
|||
|
, "le" : 8804
|
|||
|
, "ge" : 8805
|
|||
|
, "sub" : 8834
|
|||
|
, "sup" : 8835
|
|||
|
, "nsub" : 8836
|
|||
|
, "sube" : 8838
|
|||
|
, "supe" : 8839
|
|||
|
, "oplus" : 8853
|
|||
|
, "otimes" : 8855
|
|||
|
, "perp" : 8869
|
|||
|
, "sdot" : 8901
|
|||
|
, "lceil" : 8968
|
|||
|
, "rceil" : 8969
|
|||
|
, "lfloor" : 8970
|
|||
|
, "rfloor" : 8971
|
|||
|
, "lang" : 9001
|
|||
|
, "rang" : 9002
|
|||
|
, "loz" : 9674
|
|||
|
, "spades" : 9824
|
|||
|
, "clubs" : 9827
|
|||
|
, "hearts" : 9829
|
|||
|
, "diams" : 9830
|
|||
|
}
|
|||
|
|
|||
|
Object.keys(sax.ENTITIES).forEach(function (key) {
|
|||
|
var e = sax.ENTITIES[key]
|
|||
|
var s = typeof e === 'number' ? String.fromCharCode(e) : e
|
|||
|
sax.ENTITIES[key] = s
|
|||
|
})
|
|||
|
|
|||
|
for (var S in sax.STATE) sax.STATE[sax.STATE[S]] = S
|
|||
|
|
|||
|
// shorthand
|
|||
|
S = sax.STATE
|
|||
|
|
|||
|
function emit (parser, event, data) {
|
|||
|
parser[event] && parser[event](data)
|
|||
|
}
|
|||
|
|
|||
|
function emitNode (parser, nodeType, data) {
|
|||
|
if (parser.textNode) closeText(parser)
|
|||
|
emit(parser, nodeType, data)
|
|||
|
}
|
|||
|
|
|||
|
function closeText (parser) {
|
|||
|
parser.textNode = textopts(parser.opt, parser.textNode)
|
|||
|
if (parser.textNode) emit(parser, "ontext", parser.textNode)
|
|||
|
parser.textNode = ""
|
|||
|
}
|
|||
|
|
|||
|
function textopts (opt, text) {
|
|||
|
if (opt.trim) text = text.trim()
|
|||
|
if (opt.normalize) text = text.replace(/\s+/g, " ")
|
|||
|
return text
|
|||
|
}
|
|||
|
|
|||
|
function error (parser, er) {
|
|||
|
closeText(parser)
|
|||
|
if (parser.trackPosition) {
|
|||
|
er += "\nLine: "+parser.line+
|
|||
|
"\nColumn: "+parser.column+
|
|||
|
"\nChar: "+parser.c
|
|||
|
}
|
|||
|
er = new Error(er)
|
|||
|
parser.error = er
|
|||
|
emit(parser, "onerror", er)
|
|||
|
return parser
|
|||
|
}
|
|||
|
|
|||
|
function end (parser) {
|
|||
|
if (!parser.closedRoot) strictFail(parser, "Unclosed root tag")
|
|||
|
if ((parser.state !== S.BEGIN) && (parser.state !== S.TEXT)) error(parser, "Unexpected end")
|
|||
|
closeText(parser)
|
|||
|
parser.c = ""
|
|||
|
parser.closed = true
|
|||
|
emit(parser, "onend")
|
|||
|
SAXParser.call(parser, parser.strict, parser.opt)
|
|||
|
return parser
|
|||
|
}
|
|||
|
|
|||
|
function strictFail (parser, message) {
|
|||
|
if (typeof parser !== 'object' || !(parser instanceof SAXParser))
|
|||
|
throw new Error('bad call to strictFail');
|
|||
|
if (parser.strict) error(parser, message)
|
|||
|
}
|
|||
|
|
|||
|
function newTag (parser) {
|
|||
|
if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()
|
|||
|
var parent = parser.tags[parser.tags.length - 1] || parser
|
|||
|
, tag = parser.tag = { name : parser.tagName, attributes : {} }
|
|||
|
|
|||
|
// will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
|
|||
|
if (parser.opt.xmlns) tag.ns = parent.ns
|
|||
|
parser.attribList.length = 0
|
|||
|
}
|
|||
|
|
|||
|
function qname (name, attribute) {
|
|||
|
var i = name.indexOf(":")
|
|||
|
, qualName = i < 0 ? [ "", name ] : name.split(":")
|
|||
|
, prefix = qualName[0]
|
|||
|
, local = qualName[1]
|
|||
|
|
|||
|
// <x "xmlns"="http://foo">
|
|||
|
if (attribute && name === "xmlns") {
|
|||
|
prefix = "xmlns"
|
|||
|
local = ""
|
|||
|
}
|
|||
|
|
|||
|
return { prefix: prefix, local: local }
|
|||
|
}
|
|||
|
|
|||
|
function attrib (parser) {
|
|||
|
if (!parser.strict) parser.attribName = parser.attribName[parser.looseCase]()
|
|||
|
|
|||
|
if (parser.attribList.indexOf(parser.attribName) !== -1 ||
|
|||
|
parser.tag.attributes.hasOwnProperty(parser.attribName)) {
|
|||
|
return parser.attribName = parser.attribValue = ""
|
|||
|
}
|
|||
|
|
|||
|
if (parser.opt.xmlns) {
|
|||
|
var qn = qname(parser.attribName, true)
|
|||
|
, prefix = qn.prefix
|
|||
|
, local = qn.local
|
|||
|
|
|||
|
if (prefix === "xmlns") {
|
|||
|
// namespace binding attribute; push the binding into scope
|
|||
|
if (local === "xml" && parser.attribValue !== XML_NAMESPACE) {
|
|||
|
strictFail( parser
|
|||
|
, "xml: prefix must be bound to " + XML_NAMESPACE + "\n"
|
|||
|
+ "Actual: " + parser.attribValue )
|
|||
|
} else if (local === "xmlns" && parser.attribValue !== XMLNS_NAMESPACE) {
|
|||
|
strictFail( parser
|
|||
|
, "xmlns: prefix must be bound to " + XMLNS_NAMESPACE + "\n"
|
|||
|
+ "Actual: " + parser.attribValue )
|
|||
|
} else {
|
|||
|
var tag = parser.tag
|
|||
|
, parent = parser.tags[parser.tags.length - 1] || parser
|
|||
|
if (tag.ns === parent.ns) {
|
|||
|
tag.ns = Object.create(parent.ns)
|
|||
|
}
|
|||
|
tag.ns[local] = parser.attribValue
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// defer onattribute events until all attributes have been seen
|
|||
|
// so any new bindings can take effect; preserve attribute order
|
|||
|
// so deferred events can be emitted in document order
|
|||
|
parser.attribList.push([parser.attribName, parser.attribValue])
|
|||
|
} else {
|
|||
|
// in non-xmlns mode, we can emit the event right away
|
|||
|
parser.tag.attributes[parser.attribName] = parser.attribValue
|
|||
|
emitNode( parser
|
|||
|
, "onattribute"
|
|||
|
, { name: parser.attribName
|
|||
|
, value: parser.attribValue } )
|
|||
|
}
|
|||
|
|
|||
|
parser.attribName = parser.attribValue = ""
|
|||
|
}
|
|||
|
|
|||
|
function openTag (parser, selfClosing) {
|
|||
|
if (parser.opt.xmlns) {
|
|||
|
// emit namespace binding events
|
|||
|
var tag = parser.tag
|
|||
|
|
|||
|
// add namespace info to tag
|
|||
|
var qn = qname(parser.tagName)
|
|||
|
tag.prefix = qn.prefix
|
|||
|
tag.local = qn.local
|
|||
|
tag.uri = tag.ns[qn.prefix] || ""
|
|||
|
|
|||
|
if (tag.prefix && !tag.uri) {
|
|||
|
strictFail(parser, "Unbound namespace prefix: "
|
|||
|
+ JSON.stringify(parser.tagName))
|
|||
|
tag.uri = qn.prefix
|
|||
|
}
|
|||
|
|
|||
|
var parent = parser.tags[parser.tags.length - 1] || parser
|
|||
|
if (tag.ns && parent.ns !== tag.ns) {
|
|||
|
Object.keys(tag.ns).forEach(function (p) {
|
|||
|
emitNode( parser
|
|||
|
, "onopennamespace"
|
|||
|
, { prefix: p , uri: tag.ns[p] } )
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// handle deferred onattribute events
|
|||
|
// Note: do not apply default ns to attributes:
|
|||
|
// http://www.w3.org/TR/REC-xml-names/#defaulting
|
|||
|
for (var i = 0, l = parser.attribList.length; i < l; i ++) {
|
|||
|
var nv = parser.attribList[i]
|
|||
|
var name = nv[0]
|
|||
|
, value = nv[1]
|
|||
|
, qualName = qname(name, true)
|
|||
|
, prefix = qualName.prefix
|
|||
|
, local = qualName.local
|
|||
|
, uri = prefix == "" ? "" : (tag.ns[prefix] || "")
|
|||
|
, a = { name: name
|
|||
|
, value: value
|
|||
|
, prefix: prefix
|
|||
|
, local: local
|
|||
|
, uri: uri
|
|||
|
}
|
|||
|
|
|||
|
// if there's any attributes with an undefined namespace,
|
|||
|
// then fail on them now.
|
|||
|
if (prefix && prefix != "xmlns" && !uri) {
|
|||
|
strictFail(parser, "Unbound namespace prefix: "
|
|||
|
+ JSON.stringify(prefix))
|
|||
|
a.uri = prefix
|
|||
|
}
|
|||
|
parser.tag.attributes[name] = a
|
|||
|
emitNode(parser, "onattribute", a)
|
|||
|
}
|
|||
|
parser.attribList.length = 0
|
|||
|
}
|
|||
|
|
|||
|
parser.tag.isSelfClosing = !!selfClosing
|
|||
|
|
|||
|
// process the tag
|
|||
|
parser.sawRoot = true
|
|||
|
parser.tags.push(parser.tag)
|
|||
|
emitNode(parser, "onopentag", parser.tag)
|
|||
|
if (!selfClosing) {
|
|||
|
// special case for <script> in non-strict mode.
|
|||
|
if (!parser.noscript && parser.tagName.toLowerCase() === "script") {
|
|||
|
parser.state = S.SCRIPT
|
|||
|
} else {
|
|||
|
parser.state = S.TEXT
|
|||
|
}
|
|||
|
parser.tag = null
|
|||
|
parser.tagName = ""
|
|||
|
}
|
|||
|
parser.attribName = parser.attribValue = ""
|
|||
|
parser.attribList.length = 0
|
|||
|
}
|
|||
|
|
|||
|
function closeTag (parser) {
|
|||
|
if (!parser.tagName) {
|
|||
|
strictFail(parser, "Weird empty close tag.")
|
|||
|
parser.textNode += "</>"
|
|||
|
parser.state = S.TEXT
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if (parser.script) {
|
|||
|
if (parser.tagName !== "script") {
|
|||
|
parser.script += "</" + parser.tagName + ">"
|
|||
|
parser.tagName = ""
|
|||
|
parser.state = S.SCRIPT
|
|||
|
return
|
|||
|
}
|
|||
|
emitNode(parser, "onscript", parser.script)
|
|||
|
parser.script = ""
|
|||
|
}
|
|||
|
|
|||
|
// first make sure that the closing tag actually exists.
|
|||
|
// <a><b></c></b></a> will close everything, otherwise.
|
|||
|
var t = parser.tags.length
|
|||
|
var tagName = parser.tagName
|
|||
|
if (!parser.strict) tagName = tagName[parser.looseCase]()
|
|||
|
var closeTo = tagName
|
|||
|
while (t --) {
|
|||
|
var close = parser.tags[t]
|
|||
|
if (close.name !== closeTo) {
|
|||
|
// fail the first time in strict mode
|
|||
|
strictFail(parser, "Unexpected close tag")
|
|||
|
} else break
|
|||
|
}
|
|||
|
|
|||
|
// didn't find it. we already failed for strict, so just abort.
|
|||
|
if (t < 0) {
|
|||
|
strictFail(parser, "Unmatched closing tag: "+parser.tagName)
|
|||
|
parser.textNode += "</" + parser.tagName + ">"
|
|||
|
parser.state = S.TEXT
|
|||
|
return
|
|||
|
}
|
|||
|
parser.tagName = tagName
|
|||
|
var s = parser.tags.length
|
|||
|
while (s --> t) {
|
|||
|
var tag = parser.tag = parser.tags.pop()
|
|||
|
parser.tagName = parser.tag.name
|
|||
|
emitNode(parser, "onclosetag", parser.tagName)
|
|||
|
|
|||
|
var x = {}
|
|||
|
for (var i in tag.ns) x[i] = tag.ns[i]
|
|||
|
|
|||
|
var parent = parser.tags[parser.tags.length - 1] || parser
|
|||
|
if (parser.opt.xmlns && tag.ns !== parent.ns) {
|
|||
|
// remove namespace bindings introduced by tag
|
|||
|
Object.keys(tag.ns).forEach(function (p) {
|
|||
|
var n = tag.ns[p]
|
|||
|
emitNode(parser, "onclosenamespace", { prefix: p, uri: n })
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
if (t === 0) parser.closedRoot = true
|
|||
|
parser.tagName = parser.attribValue = parser.attribName = ""
|
|||
|
parser.attribList.length = 0
|
|||
|
parser.state = S.TEXT
|
|||
|
}
|
|||
|
|
|||
|
function parseEntity (parser) {
|
|||
|
var entity = parser.entity
|
|||
|
, entityLC = entity.toLowerCase()
|
|||
|
, num
|
|||
|
, numStr = ""
|
|||
|
if (parser.ENTITIES[entity])
|
|||
|
return parser.ENTITIES[entity]
|
|||
|
if (parser.ENTITIES[entityLC])
|
|||
|
return parser.ENTITIES[entityLC]
|
|||
|
entity = entityLC
|
|||
|
if (entity.charAt(0) === "#") {
|
|||
|
if (entity.charAt(1) === "x") {
|
|||
|
entity = entity.slice(2)
|
|||
|
num = parseInt(entity, 16)
|
|||
|
numStr = num.toString(16)
|
|||
|
} else {
|
|||
|
entity = entity.slice(1)
|
|||
|
num = parseInt(entity, 10)
|
|||
|
numStr = num.toString(10)
|
|||
|
}
|
|||
|
}
|
|||
|
entity = entity.replace(/^0+/, "")
|
|||
|
if (numStr.toLowerCase() !== entity) {
|
|||
|
strictFail(parser, "Invalid character entity")
|
|||
|
return "&"+parser.entity + ";"
|
|||
|
}
|
|||
|
|
|||
|
return String.fromCodePoint(num)
|
|||
|
}
|
|||
|
|
|||
|
function write (chunk) {
|
|||
|
var parser = this
|
|||
|
if (this.error) throw this.error
|
|||
|
if (parser.closed) return error(parser,
|
|||
|
"Cannot write after close. Assign an onready handler.")
|
|||
|
if (chunk === null) return end(parser)
|
|||
|
var i = 0, c = ""
|
|||
|
while (parser.c = c = chunk.charAt(i++)) {
|
|||
|
if (parser.trackPosition) {
|
|||
|
parser.position ++
|
|||
|
if (c === "\n") {
|
|||
|
parser.line ++
|
|||
|
parser.column = 0
|
|||
|
} else parser.column ++
|
|||
|
}
|
|||
|
switch (parser.state) {
|
|||
|
|
|||
|
case S.BEGIN:
|
|||
|
if (c === "<") {
|
|||
|
parser.state = S.OPEN_WAKA
|
|||
|
parser.startTagPosition = parser.position
|
|||
|
} else if (not(whitespace,c)) {
|
|||
|
// have to process this as a text node.
|
|||
|
// weird, but happens.
|
|||
|
strictFail(parser, "Non-whitespace before first tag.")
|
|||
|
parser.textNode = c
|
|||
|
parser.state = S.TEXT
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.TEXT:
|
|||
|
if (parser.sawRoot && !parser.closedRoot) {
|
|||
|
var starti = i-1
|
|||
|
while (c && c!=="<" && c!=="&") {
|
|||
|
c = chunk.charAt(i++)
|
|||
|
if (c && parser.trackPosition) {
|
|||
|
parser.position ++
|
|||
|
if (c === "\n") {
|
|||
|
parser.line ++
|
|||
|
parser.column = 0
|
|||
|
} else parser.column ++
|
|||
|
}
|
|||
|
}
|
|||
|
parser.textNode += chunk.substring(starti, i-1)
|
|||
|
}
|
|||
|
if (c === "<") {
|
|||
|
parser.state = S.OPEN_WAKA
|
|||
|
parser.startTagPosition = parser.position
|
|||
|
} else {
|
|||
|
if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot))
|
|||
|
strictFail(parser, "Text data outside of root node.")
|
|||
|
if (c === "&") parser.state = S.TEXT_ENTITY
|
|||
|
else parser.textNode += c
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.SCRIPT:
|
|||
|
// only non-strict
|
|||
|
if (c === "<") {
|
|||
|
parser.state = S.SCRIPT_ENDING
|
|||
|
} else parser.script += c
|
|||
|
continue
|
|||
|
|
|||
|
case S.SCRIPT_ENDING:
|
|||
|
if (c === "/") {
|
|||
|
parser.state = S.CLOSE_TAG
|
|||
|
} else {
|
|||
|
parser.script += "<" + c
|
|||
|
parser.state = S.SCRIPT
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.OPEN_WAKA:
|
|||
|
// either a /, ?, !, or text is coming next.
|
|||
|
if (c === "!") {
|
|||
|
parser.state = S.SGML_DECL
|
|||
|
parser.sgmlDecl = ""
|
|||
|
} else if (is(whitespace, c)) {
|
|||
|
// wait for it...
|
|||
|
} else if (is(nameStart,c)) {
|
|||
|
parser.state = S.OPEN_TAG
|
|||
|
parser.tagName = c
|
|||
|
} else if (c === "/") {
|
|||
|
parser.state = S.CLOSE_TAG
|
|||
|
parser.tagName = ""
|
|||
|
} else if (c === "?") {
|
|||
|
parser.state = S.PROC_INST
|
|||
|
parser.procInstName = parser.procInstBody = ""
|
|||
|
} else {
|
|||
|
strictFail(parser, "Unencoded <")
|
|||
|
// if there was some whitespace, then add that in.
|
|||
|
if (parser.startTagPosition + 1 < parser.position) {
|
|||
|
var pad = parser.position - parser.startTagPosition
|
|||
|
c = new Array(pad).join(" ") + c
|
|||
|
}
|
|||
|
parser.textNode += "<" + c
|
|||
|
parser.state = S.TEXT
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.SGML_DECL:
|
|||
|
if ((parser.sgmlDecl+c).toUpperCase() === CDATA) {
|
|||
|
emitNode(parser, "onopencdata")
|
|||
|
parser.state = S.CDATA
|
|||
|
parser.sgmlDecl = ""
|
|||
|
parser.cdata = ""
|
|||
|
} else if (parser.sgmlDecl+c === "--") {
|
|||
|
parser.state = S.COMMENT
|
|||
|
parser.comment = ""
|
|||
|
parser.sgmlDecl = ""
|
|||
|
} else if ((parser.sgmlDecl+c).toUpperCase() === DOCTYPE) {
|
|||
|
parser.state = S.DOCTYPE
|
|||
|
if (parser.doctype || parser.sawRoot) strictFail(parser,
|
|||
|
"Inappropriately located doctype declaration")
|
|||
|
parser.doctype = ""
|
|||
|
parser.sgmlDecl = ""
|
|||
|
} else if (c === ">") {
|
|||
|
emitNode(parser, "onsgmldeclaration", parser.sgmlDecl)
|
|||
|
parser.sgmlDecl = ""
|
|||
|
parser.state = S.TEXT
|
|||
|
} else if (is(quote, c)) {
|
|||
|
parser.state = S.SGML_DECL_QUOTED
|
|||
|
parser.sgmlDecl += c
|
|||
|
} else parser.sgmlDecl += c
|
|||
|
continue
|
|||
|
|
|||
|
case S.SGML_DECL_QUOTED:
|
|||
|
if (c === parser.q) {
|
|||
|
parser.state = S.SGML_DECL
|
|||
|
parser.q = ""
|
|||
|
}
|
|||
|
parser.sgmlDecl += c
|
|||
|
continue
|
|||
|
|
|||
|
case S.DOCTYPE:
|
|||
|
if (c === ">") {
|
|||
|
parser.state = S.TEXT
|
|||
|
emitNode(parser, "ondoctype", parser.doctype)
|
|||
|
parser.doctype = true // just remember that we saw it.
|
|||
|
} else {
|
|||
|
parser.doctype += c
|
|||
|
if (c === "[") parser.state = S.DOCTYPE_DTD
|
|||
|
else if (is(quote, c)) {
|
|||
|
parser.state = S.DOCTYPE_QUOTED
|
|||
|
parser.q = c
|
|||
|
}
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.DOCTYPE_QUOTED:
|
|||
|
parser.doctype += c
|
|||
|
if (c === parser.q) {
|
|||
|
parser.q = ""
|
|||
|
parser.state = S.DOCTYPE
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.DOCTYPE_DTD:
|
|||
|
parser.doctype += c
|
|||
|
if (c === "]") parser.state = S.DOCTYPE
|
|||
|
else if (is(quote,c)) {
|
|||
|
parser.state = S.DOCTYPE_DTD_QUOTED
|
|||
|
parser.q = c
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.DOCTYPE_DTD_QUOTED:
|
|||
|
parser.doctype += c
|
|||
|
if (c === parser.q) {
|
|||
|
parser.state = S.DOCTYPE_DTD
|
|||
|
parser.q = ""
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.COMMENT:
|
|||
|
if (c === "-") parser.state = S.COMMENT_ENDING
|
|||
|
else parser.comment += c
|
|||
|
continue
|
|||
|
|
|||
|
case S.COMMENT_ENDING:
|
|||
|
if (c === "-") {
|
|||
|
parser.state = S.COMMENT_ENDED
|
|||
|
parser.comment = textopts(parser.opt, parser.comment)
|
|||
|
if (parser.comment) emitNode(parser, "oncomment", parser.comment)
|
|||
|
parser.comment = ""
|
|||
|
} else {
|
|||
|
parser.comment += "-" + c
|
|||
|
parser.state = S.COMMENT
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.COMMENT_ENDED:
|
|||
|
if (c !== ">") {
|
|||
|
strictFail(parser, "Malformed comment")
|
|||
|
// allow <!-- blah -- bloo --> in non-strict mode,
|
|||
|
// which is a comment of " blah -- bloo "
|
|||
|
parser.comment += "--" + c
|
|||
|
parser.state = S.COMMENT
|
|||
|
} else parser.state = S.TEXT
|
|||
|
continue
|
|||
|
|
|||
|
case S.CDATA:
|
|||
|
if (c === "]") parser.state = S.CDATA_ENDING
|
|||
|
else parser.cdata += c
|
|||
|
continue
|
|||
|
|
|||
|
case S.CDATA_ENDING:
|
|||
|
if (c === "]") parser.state = S.CDATA_ENDING_2
|
|||
|
else {
|
|||
|
parser.cdata += "]" + c
|
|||
|
parser.state = S.CDATA
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.CDATA_ENDING_2:
|
|||
|
if (c === ">") {
|
|||
|
if (parser.cdata) emitNode(parser, "oncdata", parser.cdata)
|
|||
|
emitNode(parser, "onclosecdata")
|
|||
|
parser.cdata = ""
|
|||
|
parser.state = S.TEXT
|
|||
|
} else if (c === "]") {
|
|||
|
parser.cdata += "]"
|
|||
|
} else {
|
|||
|
parser.cdata += "]]" + c
|
|||
|
parser.state = S.CDATA
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.PROC_INST:
|
|||
|
if (c === "?") parser.state = S.PROC_INST_ENDING
|
|||
|
else if (is(whitespace, c)) parser.state = S.PROC_INST_BODY
|
|||
|
else parser.procInstName += c
|
|||
|
continue
|
|||
|
|
|||
|
case S.PROC_INST_BODY:
|
|||
|
if (!parser.procInstBody && is(whitespace, c)) continue
|
|||
|
else if (c === "?") parser.state = S.PROC_INST_ENDING
|
|||
|
else parser.procInstBody += c
|
|||
|
continue
|
|||
|
|
|||
|
case S.PROC_INST_ENDING:
|
|||
|
if (c === ">") {
|
|||
|
emitNode(parser, "onprocessinginstruction", {
|
|||
|
name : parser.procInstName,
|
|||
|
body : parser.procInstBody
|
|||
|
})
|
|||
|
parser.procInstName = parser.procInstBody = ""
|
|||
|
parser.state = S.TEXT
|
|||
|
} else {
|
|||
|
parser.procInstBody += "?" + c
|
|||
|
parser.state = S.PROC_INST_BODY
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.OPEN_TAG:
|
|||
|
if (is(nameBody, c)) parser.tagName += c
|
|||
|
else {
|
|||
|
newTag(parser)
|
|||
|
if (c === ">") openTag(parser)
|
|||
|
else if (c === "/") parser.state = S.OPEN_TAG_SLASH
|
|||
|
else {
|
|||
|
if (not(whitespace, c)) strictFail(
|
|||
|
parser, "Invalid character in tag name")
|
|||
|
parser.state = S.ATTRIB
|
|||
|
}
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.OPEN_TAG_SLASH:
|
|||
|
if (c === ">") {
|
|||
|
openTag(parser, true)
|
|||
|
closeTag(parser)
|
|||
|
} else {
|
|||
|
strictFail(parser, "Forward-slash in opening tag not followed by >")
|
|||
|
parser.state = S.ATTRIB
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.ATTRIB:
|
|||
|
// haven't read the attribute name yet.
|
|||
|
if (is(whitespace, c)) continue
|
|||
|
else if (c === ">") openTag(parser)
|
|||
|
else if (c === "/") parser.state = S.OPEN_TAG_SLASH
|
|||
|
else if (is(nameStart, c)) {
|
|||
|
parser.attribName = c
|
|||
|
parser.attribValue = ""
|
|||
|
parser.state = S.ATTRIB_NAME
|
|||
|
} else strictFail(parser, "Invalid attribute name")
|
|||
|
continue
|
|||
|
|
|||
|
case S.ATTRIB_NAME:
|
|||
|
if (c === "=") parser.state = S.ATTRIB_VALUE
|
|||
|
else if (c === ">") {
|
|||
|
strictFail(parser, "Attribute without value")
|
|||
|
parser.attribValue = parser.attribName
|
|||
|
attrib(parser)
|
|||
|
openTag(parser)
|
|||
|
}
|
|||
|
else if (is(whitespace, c)) parser.state = S.ATTRIB_NAME_SAW_WHITE
|
|||
|
else if (is(nameBody, c)) parser.attribName += c
|
|||
|
else strictFail(parser, "Invalid attribute name")
|
|||
|
continue
|
|||
|
|
|||
|
case S.ATTRIB_NAME_SAW_WHITE:
|
|||
|
if (c === "=") parser.state = S.ATTRIB_VALUE
|
|||
|
else if (is(whitespace, c)) continue
|
|||
|
else {
|
|||
|
strictFail(parser, "Attribute without value")
|
|||
|
parser.tag.attributes[parser.attribName] = ""
|
|||
|
parser.attribValue = ""
|
|||
|
emitNode(parser, "onattribute",
|
|||
|
{ name : parser.attribName, value : "" })
|
|||
|
parser.attribName = ""
|
|||
|
if (c === ">") openTag(parser)
|
|||
|
else if (is(nameStart, c)) {
|
|||
|
parser.attribName = c
|
|||
|
parser.state = S.ATTRIB_NAME
|
|||
|
} else {
|
|||
|
strictFail(parser, "Invalid attribute name")
|
|||
|
parser.state = S.ATTRIB
|
|||
|
}
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.ATTRIB_VALUE:
|
|||
|
if (is(whitespace, c)) continue
|
|||
|
else if (is(quote, c)) {
|
|||
|
parser.q = c
|
|||
|
parser.state = S.ATTRIB_VALUE_QUOTED
|
|||
|
} else {
|
|||
|
strictFail(parser, "Unquoted attribute value")
|
|||
|
parser.state = S.ATTRIB_VALUE_UNQUOTED
|
|||
|
parser.attribValue = c
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.ATTRIB_VALUE_QUOTED:
|
|||
|
if (c !== parser.q) {
|
|||
|
if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_Q
|
|||
|
else parser.attribValue += c
|
|||
|
continue
|
|||
|
}
|
|||
|
attrib(parser)
|
|||
|
parser.q = ""
|
|||
|
parser.state = S.ATTRIB_VALUE_CLOSED
|
|||
|
continue
|
|||
|
|
|||
|
case S.ATTRIB_VALUE_CLOSED:
|
|||
|
if (is(whitespace, c)) {
|
|||
|
parser.state = S.ATTRIB
|
|||
|
} else if (c === ">") openTag(parser)
|
|||
|
else if (c === "/") parser.state = S.OPEN_TAG_SLASH
|
|||
|
else if (is(nameStart, c)) {
|
|||
|
strictFail(parser, "No whitespace between attributes")
|
|||
|
parser.attribName = c
|
|||
|
parser.attribValue = ""
|
|||
|
parser.state = S.ATTRIB_NAME
|
|||
|
} else strictFail(parser, "Invalid attribute name")
|
|||
|
continue
|
|||
|
|
|||
|
case S.ATTRIB_VALUE_UNQUOTED:
|
|||
|
if (not(attribEnd,c)) {
|
|||
|
if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_U
|
|||
|
else parser.attribValue += c
|
|||
|
continue
|
|||
|
}
|
|||
|
attrib(parser)
|
|||
|
if (c === ">") openTag(parser)
|
|||
|
else parser.state = S.ATTRIB
|
|||
|
continue
|
|||
|
|
|||
|
case S.CLOSE_TAG:
|
|||
|
if (!parser.tagName) {
|
|||
|
if (is(whitespace, c)) continue
|
|||
|
else if (not(nameStart, c)) {
|
|||
|
if (parser.script) {
|
|||
|
parser.script += "</" + c
|
|||
|
parser.state = S.SCRIPT
|
|||
|
} else {
|
|||
|
strictFail(parser, "Invalid tagname in closing tag.")
|
|||
|
}
|
|||
|
} else parser.tagName = c
|
|||
|
}
|
|||
|
else if (c === ">") closeTag(parser)
|
|||
|
else if (is(nameBody, c)) parser.tagName += c
|
|||
|
else if (parser.script) {
|
|||
|
parser.script += "</" + parser.tagName
|
|||
|
parser.tagName = ""
|
|||
|
parser.state = S.SCRIPT
|
|||
|
} else {
|
|||
|
if (not(whitespace, c)) strictFail(parser,
|
|||
|
"Invalid tagname in closing tag")
|
|||
|
parser.state = S.CLOSE_TAG_SAW_WHITE
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
case S.CLOSE_TAG_SAW_WHITE:
|
|||
|
if (is(whitespace, c)) continue
|
|||
|
if (c === ">") closeTag(parser)
|
|||
|
else strictFail(parser, "Invalid characters in closing tag")
|
|||
|
continue
|
|||
|
|
|||
|
case S.TEXT_ENTITY:
|
|||
|
case S.ATTRIB_VALUE_ENTITY_Q:
|
|||
|
case S.ATTRIB_VALUE_ENTITY_U:
|
|||
|
switch(parser.state) {
|
|||
|
case S.TEXT_ENTITY:
|
|||
|
var returnState = S.TEXT, buffer = "textNode"
|
|||
|
break
|
|||
|
|
|||
|
case S.ATTRIB_VALUE_ENTITY_Q:
|
|||
|
var returnState = S.ATTRIB_VALUE_QUOTED, buffer = "attribValue"
|
|||
|
break
|
|||
|
|
|||
|
case S.ATTRIB_VALUE_ENTITY_U:
|
|||
|
var returnState = S.ATTRIB_VALUE_UNQUOTED, buffer = "attribValue"
|
|||
|
break
|
|||
|
}
|
|||
|
if (c === ";") {
|
|||
|
parser[buffer] += parseEntity(parser)
|
|||
|
parser.entity = ""
|
|||
|
parser.state = returnState
|
|||
|
}
|
|||
|
else if (is(entity, c)) parser.entity += c
|
|||
|
else {
|
|||
|
strictFail(parser, "Invalid character entity")
|
|||
|
parser[buffer] += "&" + parser.entity + c
|
|||
|
parser.entity = ""
|
|||
|
parser.state = returnState
|
|||
|
}
|
|||
|
continue
|
|||
|
|
|||
|
default:
|
|||
|
throw new Error(parser, "Unknown state: " + parser.state)
|
|||
|
}
|
|||
|
} // while
|
|||
|
// cdata blocks can get very big under normal conditions. emit and move on.
|
|||
|
// if (parser.state === S.CDATA && parser.cdata) {
|
|||
|
// emitNode(parser, "oncdata", parser.cdata)
|
|||
|
// parser.cdata = ""
|
|||
|
// }
|
|||
|
if (parser.position >= parser.bufferCheckPosition) checkBufferLength(parser)
|
|||
|
return parser
|
|||
|
}
|
|||
|
|
|||
|
/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
|
|||
|
if (!String.fromCodePoint) {
|
|||
|
(function() {
|
|||
|
var stringFromCharCode = String.fromCharCode;
|
|||
|
var floor = Math.floor;
|
|||
|
var fromCodePoint = function() {
|
|||
|
var MAX_SIZE = 0x4000;
|
|||
|
var codeUnits = [];
|
|||
|
var highSurrogate;
|
|||
|
var lowSurrogate;
|
|||
|
var index = -1;
|
|||
|
var length = arguments.length;
|
|||
|
if (!length) {
|
|||
|
return '';
|
|||
|
}
|
|||
|
var result = '';
|
|||
|
while (++index < length) {
|
|||
|
var codePoint = Number(arguments[index]);
|
|||
|
if (
|
|||
|
!isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`
|
|||
|
codePoint < 0 || // not a valid Unicode code point
|
|||
|
codePoint > 0x10FFFF || // not a valid Unicode code point
|
|||
|
floor(codePoint) != codePoint // not an integer
|
|||
|
) {
|
|||
|
throw RangeError('Invalid code point: ' + codePoint);
|
|||
|
}
|
|||
|
if (codePoint <= 0xFFFF) { // BMP code point
|
|||
|
codeUnits.push(codePoint);
|
|||
|
} else { // Astral code point; split in surrogate halves
|
|||
|
// http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
|
|||
|
codePoint -= 0x10000;
|
|||
|
highSurrogate = (codePoint >> 10) + 0xD800;
|
|||
|
lowSurrogate = (codePoint % 0x400) + 0xDC00;
|
|||
|
codeUnits.push(highSurrogate, lowSurrogate);
|
|||
|
}
|
|||
|
if (index + 1 == length || codeUnits.length > MAX_SIZE) {
|
|||
|
result += stringFromCharCode.apply(null, codeUnits);
|
|||
|
codeUnits.length = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
if (Object.defineProperty) {
|
|||
|
Object.defineProperty(String, 'fromCodePoint', {
|
|||
|
'value': fromCodePoint,
|
|||
|
'configurable': true,
|
|||
|
'writable': true
|
|||
|
});
|
|||
|
} else {
|
|||
|
String.fromCodePoint = fromCodePoint;
|
|||
|
}
|
|||
|
}());
|
|||
|
}
|
|||
|
|
|||
|
})(typeof exports === "undefined" ? sax = {} : exports);
|
|||
|
|
|||
|
}).call(this,require("buffer").Buffer)
|
|||
|
},{"buffer":1,"stream":20,"string_decoder":21}],27:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLAttribute, create;
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
module.exports = XMLAttribute = (function() {
|
|||
|
function XMLAttribute(parent, name, value) {
|
|||
|
this.stringify = parent.stringify;
|
|||
|
if (name == null) {
|
|||
|
throw new Error("Missing attribute name");
|
|||
|
}
|
|||
|
if (value == null) {
|
|||
|
throw new Error("Missing attribute value");
|
|||
|
}
|
|||
|
this.name = this.stringify.attName(name);
|
|||
|
this.value = this.stringify.attValue(value);
|
|||
|
}
|
|||
|
|
|||
|
XMLAttribute.prototype.clone = function() {
|
|||
|
return create(XMLAttribute.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLAttribute.prototype.toString = function(options, level) {
|
|||
|
return ' ' + this.name + '="' + this.value + '"';
|
|||
|
};
|
|||
|
|
|||
|
return XMLAttribute;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"lodash-node/modern/objects/create":56}],28:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLBuilder, XMLDeclaration, XMLDocType, XMLElement, XMLStringifier;
|
|||
|
|
|||
|
XMLStringifier = require('./XMLStringifier');
|
|||
|
|
|||
|
XMLDeclaration = require('./XMLDeclaration');
|
|||
|
|
|||
|
XMLDocType = require('./XMLDocType');
|
|||
|
|
|||
|
XMLElement = require('./XMLElement');
|
|||
|
|
|||
|
module.exports = XMLBuilder = (function() {
|
|||
|
function XMLBuilder(name, options) {
|
|||
|
var root, temp;
|
|||
|
if (name == null) {
|
|||
|
throw new Error("Root element needs a name");
|
|||
|
}
|
|||
|
if (options == null) {
|
|||
|
options = {};
|
|||
|
}
|
|||
|
this.options = options;
|
|||
|
this.stringify = new XMLStringifier(options);
|
|||
|
temp = new XMLElement(this, 'doc');
|
|||
|
root = temp.element(name);
|
|||
|
root.isRoot = true;
|
|||
|
root.documentObject = this;
|
|||
|
this.rootObject = root;
|
|||
|
if (!options.headless) {
|
|||
|
root.declaration(options);
|
|||
|
if ((options.pubID != null) || (options.sysID != null)) {
|
|||
|
root.doctype(options);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
XMLBuilder.prototype.root = function() {
|
|||
|
return this.rootObject;
|
|||
|
};
|
|||
|
|
|||
|
XMLBuilder.prototype.end = function(options) {
|
|||
|
return this.toString(options);
|
|||
|
};
|
|||
|
|
|||
|
XMLBuilder.prototype.toString = function(options) {
|
|||
|
var indent, newline, offset, pretty, r, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
r = '';
|
|||
|
if (this.xmldec != null) {
|
|||
|
r += this.xmldec.toString(options);
|
|||
|
}
|
|||
|
if (this.doctype != null) {
|
|||
|
r += this.doctype.toString(options);
|
|||
|
}
|
|||
|
r += this.rootObject.toString(options);
|
|||
|
if (pretty && r.slice(-newline.length) === newline) {
|
|||
|
r = r.slice(0, -newline.length);
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLBuilder;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLDeclaration":35,"./XMLDocType":36,"./XMLElement":37,"./XMLStringifier":41}],29:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLCData, XMLNode, create,
|
|||
|
__hasProp = {}.hasOwnProperty,
|
|||
|
__extends = 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; };
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
XMLNode = require('./XMLNode');
|
|||
|
|
|||
|
module.exports = XMLCData = (function(_super) {
|
|||
|
__extends(XMLCData, _super);
|
|||
|
|
|||
|
function XMLCData(parent, text) {
|
|||
|
XMLCData.__super__.constructor.call(this, parent);
|
|||
|
if (text == null) {
|
|||
|
throw new Error("Missing CDATA text");
|
|||
|
}
|
|||
|
this.text = this.stringify.cdata(text);
|
|||
|
}
|
|||
|
|
|||
|
XMLCData.prototype.clone = function() {
|
|||
|
return create(XMLCData.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLCData.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<![CDATA[' + this.text + ']]>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLCData;
|
|||
|
|
|||
|
})(XMLNode);
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLNode":38,"lodash-node/modern/objects/create":56}],30:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLComment, XMLNode, create,
|
|||
|
__hasProp = {}.hasOwnProperty,
|
|||
|
__extends = 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; };
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
XMLNode = require('./XMLNode');
|
|||
|
|
|||
|
module.exports = XMLComment = (function(_super) {
|
|||
|
__extends(XMLComment, _super);
|
|||
|
|
|||
|
function XMLComment(parent, text) {
|
|||
|
XMLComment.__super__.constructor.call(this, parent);
|
|||
|
if (text == null) {
|
|||
|
throw new Error("Missing comment text");
|
|||
|
}
|
|||
|
this.text = this.stringify.comment(text);
|
|||
|
}
|
|||
|
|
|||
|
XMLComment.prototype.clone = function() {
|
|||
|
return create(XMLComment.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLComment.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<!-- ' + this.text + ' -->';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLComment;
|
|||
|
|
|||
|
})(XMLNode);
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLNode":38,"lodash-node/modern/objects/create":56}],31:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLDTDAttList, create;
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
module.exports = XMLDTDAttList = (function() {
|
|||
|
function XMLDTDAttList(parent, elementName, attributeName, attributeType, defaultValueType, defaultValue) {
|
|||
|
this.stringify = parent.stringify;
|
|||
|
if (elementName == null) {
|
|||
|
throw new Error("Missing DTD element name");
|
|||
|
}
|
|||
|
if (attributeName == null) {
|
|||
|
throw new Error("Missing DTD attribute name");
|
|||
|
}
|
|||
|
if (!attributeType) {
|
|||
|
throw new Error("Missing DTD attribute type");
|
|||
|
}
|
|||
|
if (!defaultValueType) {
|
|||
|
throw new Error("Missing DTD attribute default");
|
|||
|
}
|
|||
|
if (defaultValueType.indexOf('#') !== 0) {
|
|||
|
defaultValueType = '#' + defaultValueType;
|
|||
|
}
|
|||
|
if (!defaultValueType.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/)) {
|
|||
|
throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT");
|
|||
|
}
|
|||
|
if (defaultValue && !defaultValueType.match(/^(#FIXED|#DEFAULT)$/)) {
|
|||
|
throw new Error("Default value only applies to #FIXED or #DEFAULT");
|
|||
|
}
|
|||
|
this.elementName = this.stringify.eleName(elementName);
|
|||
|
this.attributeName = this.stringify.attName(attributeName);
|
|||
|
this.attributeType = this.stringify.dtdAttType(attributeType);
|
|||
|
this.defaultValue = this.stringify.dtdAttDefault(defaultValue);
|
|||
|
this.defaultValueType = defaultValueType;
|
|||
|
}
|
|||
|
|
|||
|
XMLDTDAttList.prototype.clone = function() {
|
|||
|
return create(XMLDTDAttList.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLDTDAttList.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<!ATTLIST ' + this.elementName + ' ' + this.attributeName + ' ' + this.attributeType;
|
|||
|
if (this.defaultValueType !== '#DEFAULT') {
|
|||
|
r += ' ' + this.defaultValueType;
|
|||
|
}
|
|||
|
if (this.defaultValue) {
|
|||
|
r += ' "' + this.defaultValue + '"';
|
|||
|
}
|
|||
|
r += '>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLDTDAttList;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"lodash-node/modern/objects/create":56}],32:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLDTDElement, create, isArray;
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
isArray = require('lodash-node/modern/objects/isArray');
|
|||
|
|
|||
|
module.exports = XMLDTDElement = (function() {
|
|||
|
function XMLDTDElement(parent, name, value) {
|
|||
|
this.stringify = parent.stringify;
|
|||
|
if (name == null) {
|
|||
|
throw new Error("Missing DTD element name");
|
|||
|
}
|
|||
|
if (!value) {
|
|||
|
value = '(#PCDATA)';
|
|||
|
}
|
|||
|
if (isArray(value)) {
|
|||
|
value = '(' + value.join(',') + ')';
|
|||
|
}
|
|||
|
this.name = this.stringify.eleName(name);
|
|||
|
this.value = this.stringify.dtdElementValue(value);
|
|||
|
}
|
|||
|
|
|||
|
XMLDTDElement.prototype.clone = function() {
|
|||
|
return create(XMLDTDElement.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLDTDElement.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<!ELEMENT ' + this.name + ' ' + this.value + '>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLDTDElement;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"lodash-node/modern/objects/create":56,"lodash-node/modern/objects/isArray":58}],33:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLDTDEntity, create, isObject;
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
isObject = require('lodash-node/modern/objects/isObject');
|
|||
|
|
|||
|
module.exports = XMLDTDEntity = (function() {
|
|||
|
function XMLDTDEntity(parent, pe, name, value) {
|
|||
|
this.stringify = parent.stringify;
|
|||
|
if (name == null) {
|
|||
|
throw new Error("Missing entity name");
|
|||
|
}
|
|||
|
if (value == null) {
|
|||
|
throw new Error("Missing entity value");
|
|||
|
}
|
|||
|
this.pe = !!pe;
|
|||
|
this.name = this.stringify.eleName(name);
|
|||
|
if (!isObject(value)) {
|
|||
|
this.value = this.stringify.dtdEntityValue(value);
|
|||
|
} else {
|
|||
|
if (!value.pubID && !value.sysID) {
|
|||
|
throw new Error("Public and/or system identifiers are required for an external entity");
|
|||
|
}
|
|||
|
if (value.pubID && !value.sysID) {
|
|||
|
throw new Error("System identifier is required for a public external entity");
|
|||
|
}
|
|||
|
if (value.pubID != null) {
|
|||
|
this.pubID = this.stringify.dtdPubID(value.pubID);
|
|||
|
}
|
|||
|
if (value.sysID != null) {
|
|||
|
this.sysID = this.stringify.dtdSysID(value.sysID);
|
|||
|
}
|
|||
|
if (value.nData != null) {
|
|||
|
this.nData = this.stringify.dtdNData(value.nData);
|
|||
|
}
|
|||
|
if (this.pe && this.nData) {
|
|||
|
throw new Error("Notation declaration is not allowed in a parameter entity");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
XMLDTDEntity.prototype.clone = function() {
|
|||
|
return create(XMLDTDEntity.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLDTDEntity.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<!ENTITY';
|
|||
|
if (this.pe) {
|
|||
|
r += ' %';
|
|||
|
}
|
|||
|
r += ' ' + this.name;
|
|||
|
if (this.value) {
|
|||
|
r += ' "' + this.value + '"';
|
|||
|
} else {
|
|||
|
if (this.pubID && this.sysID) {
|
|||
|
r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
|
|||
|
} else if (this.sysID) {
|
|||
|
r += ' SYSTEM "' + this.sysID + '"';
|
|||
|
}
|
|||
|
if (this.nData) {
|
|||
|
r += ' NDATA ' + this.nData;
|
|||
|
}
|
|||
|
}
|
|||
|
r += '>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLDTDEntity;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"lodash-node/modern/objects/create":56,"lodash-node/modern/objects/isObject":61}],34:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLDTDNotation, create;
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
module.exports = XMLDTDNotation = (function() {
|
|||
|
function XMLDTDNotation(parent, name, value) {
|
|||
|
this.stringify = parent.stringify;
|
|||
|
if (name == null) {
|
|||
|
throw new Error("Missing notation name");
|
|||
|
}
|
|||
|
if (!value.pubID && !value.sysID) {
|
|||
|
throw new Error("Public or system identifiers are required for an external entity");
|
|||
|
}
|
|||
|
this.name = this.stringify.eleName(name);
|
|||
|
if (value.pubID != null) {
|
|||
|
this.pubID = this.stringify.dtdPubID(value.pubID);
|
|||
|
}
|
|||
|
if (value.sysID != null) {
|
|||
|
this.sysID = this.stringify.dtdSysID(value.sysID);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
XMLDTDNotation.prototype.clone = function() {
|
|||
|
return create(XMLDTDNotation.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLDTDNotation.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<!NOTATION ' + this.name;
|
|||
|
if (this.pubID && this.sysID) {
|
|||
|
r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
|
|||
|
} else if (this.pubID) {
|
|||
|
r += ' PUBLIC "' + this.pubID + '"';
|
|||
|
} else if (this.sysID) {
|
|||
|
r += ' SYSTEM "' + this.sysID + '"';
|
|||
|
}
|
|||
|
r += '>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLDTDNotation;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"lodash-node/modern/objects/create":56}],35:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLDeclaration, XMLNode, create, isObject,
|
|||
|
__hasProp = {}.hasOwnProperty,
|
|||
|
__extends = 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; };
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
isObject = require('lodash-node/modern/objects/isObject');
|
|||
|
|
|||
|
XMLNode = require('./XMLNode');
|
|||
|
|
|||
|
module.exports = XMLDeclaration = (function(_super) {
|
|||
|
__extends(XMLDeclaration, _super);
|
|||
|
|
|||
|
function XMLDeclaration(parent, version, encoding, standalone) {
|
|||
|
var _ref;
|
|||
|
XMLDeclaration.__super__.constructor.call(this, parent);
|
|||
|
if (isObject(version)) {
|
|||
|
_ref = version, version = _ref.version, encoding = _ref.encoding, standalone = _ref.standalone;
|
|||
|
}
|
|||
|
if (!version) {
|
|||
|
version = '1.0';
|
|||
|
}
|
|||
|
if (version != null) {
|
|||
|
this.version = this.stringify.xmlVersion(version);
|
|||
|
}
|
|||
|
if (encoding != null) {
|
|||
|
this.encoding = this.stringify.xmlEncoding(encoding);
|
|||
|
}
|
|||
|
if (standalone != null) {
|
|||
|
this.standalone = this.stringify.xmlStandalone(standalone);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
XMLDeclaration.prototype.clone = function() {
|
|||
|
return create(XMLDeclaration.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLDeclaration.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<?xml';
|
|||
|
if (this.version != null) {
|
|||
|
r += ' version="' + this.version + '"';
|
|||
|
}
|
|||
|
if (this.encoding != null) {
|
|||
|
r += ' encoding="' + this.encoding + '"';
|
|||
|
}
|
|||
|
if (this.standalone != null) {
|
|||
|
r += ' standalone="' + this.standalone + '"';
|
|||
|
}
|
|||
|
r += '?>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLDeclaration;
|
|||
|
|
|||
|
})(XMLNode);
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLNode":38,"lodash-node/modern/objects/create":56,"lodash-node/modern/objects/isObject":61}],36:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLDocType, create, isObject;
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
isObject = require('lodash-node/modern/objects/isObject');
|
|||
|
|
|||
|
module.exports = XMLDocType = (function() {
|
|||
|
function XMLDocType(parent, pubID, sysID) {
|
|||
|
var _ref, _ref1;
|
|||
|
this.documentObject = parent;
|
|||
|
this.stringify = this.documentObject.stringify;
|
|||
|
this.children = [];
|
|||
|
if (isObject(pubID)) {
|
|||
|
_ref = pubID, pubID = _ref.pubID, sysID = _ref.sysID;
|
|||
|
}
|
|||
|
if (sysID == null) {
|
|||
|
_ref1 = [pubID, sysID], sysID = _ref1[0], pubID = _ref1[1];
|
|||
|
}
|
|||
|
if (pubID != null) {
|
|||
|
this.pubID = this.stringify.dtdPubID(pubID);
|
|||
|
}
|
|||
|
if (sysID != null) {
|
|||
|
this.sysID = this.stringify.dtdSysID(sysID);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
XMLDocType.prototype.clone = function() {
|
|||
|
return create(XMLDocType.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.element = function(name, value) {
|
|||
|
var XMLDTDElement, child;
|
|||
|
XMLDTDElement = require('./XMLDTDElement');
|
|||
|
child = new XMLDTDElement(this, name, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.attList = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
|
|||
|
var XMLDTDAttList, child;
|
|||
|
XMLDTDAttList = require('./XMLDTDAttList');
|
|||
|
child = new XMLDTDAttList(this, elementName, attributeName, attributeType, defaultValueType, defaultValue);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.entity = function(name, value) {
|
|||
|
var XMLDTDEntity, child;
|
|||
|
XMLDTDEntity = require('./XMLDTDEntity');
|
|||
|
child = new XMLDTDEntity(this, false, name, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.pEntity = function(name, value) {
|
|||
|
var XMLDTDEntity, child;
|
|||
|
XMLDTDEntity = require('./XMLDTDEntity');
|
|||
|
child = new XMLDTDEntity(this, true, name, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.notation = function(name, value) {
|
|||
|
var XMLDTDNotation, child;
|
|||
|
XMLDTDNotation = require('./XMLDTDNotation');
|
|||
|
child = new XMLDTDNotation(this, name, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.cdata = function(value) {
|
|||
|
var XMLCData, child;
|
|||
|
XMLCData = require('./XMLCData');
|
|||
|
child = new XMLCData(this, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.comment = function(value) {
|
|||
|
var XMLComment, child;
|
|||
|
XMLComment = require('./XMLComment');
|
|||
|
child = new XMLComment(this, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.instruction = function(target, value) {
|
|||
|
var XMLProcessingInstruction, child;
|
|||
|
XMLProcessingInstruction = require('./XMLProcessingInstruction');
|
|||
|
child = new XMLProcessingInstruction(this, target, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.root = function() {
|
|||
|
return this.documentObject.root();
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.document = function() {
|
|||
|
return this.documentObject;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.toString = function(options, level) {
|
|||
|
var child, indent, newline, offset, pretty, r, space, _i, _len, _ref, _ref1, _ref2, _ref3;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<!DOCTYPE ' + this.root().name;
|
|||
|
if (this.pubID && this.sysID) {
|
|||
|
r += ' PUBLIC "' + this.pubID + '" "' + this.sysID + '"';
|
|||
|
} else if (this.sysID) {
|
|||
|
r += ' SYSTEM "' + this.sysID + '"';
|
|||
|
}
|
|||
|
if (this.children.length > 0) {
|
|||
|
r += ' [';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
_ref3 = this.children;
|
|||
|
for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
|
|||
|
child = _ref3[_i];
|
|||
|
r += child.toString(options, level + 1);
|
|||
|
}
|
|||
|
r += ']';
|
|||
|
}
|
|||
|
r += '>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.ele = function(name, value) {
|
|||
|
return this.element(name, value);
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.att = function(elementName, attributeName, attributeType, defaultValueType, defaultValue) {
|
|||
|
return this.attList(elementName, attributeName, attributeType, defaultValueType, defaultValue);
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.ent = function(name, value) {
|
|||
|
return this.entity(name, value);
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.pent = function(name, value) {
|
|||
|
return this.pEntity(name, value);
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.not = function(name, value) {
|
|||
|
return this.notation(name, value);
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.dat = function(value) {
|
|||
|
return this.cdata(value);
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.com = function(value) {
|
|||
|
return this.comment(value);
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.ins = function(target, value) {
|
|||
|
return this.instruction(target, value);
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.up = function() {
|
|||
|
return this.root();
|
|||
|
};
|
|||
|
|
|||
|
XMLDocType.prototype.doc = function() {
|
|||
|
return this.document();
|
|||
|
};
|
|||
|
|
|||
|
return XMLDocType;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLCData":29,"./XMLComment":30,"./XMLDTDAttList":31,"./XMLDTDElement":32,"./XMLDTDEntity":33,"./XMLDTDNotation":34,"./XMLProcessingInstruction":39,"lodash-node/modern/objects/create":56,"lodash-node/modern/objects/isObject":61}],37:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLAttribute, XMLElement, XMLNode, XMLProcessingInstruction, create, isArray, isFunction, isObject,
|
|||
|
__hasProp = {}.hasOwnProperty,
|
|||
|
__extends = 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; };
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
isObject = require('lodash-node/modern/objects/isObject');
|
|||
|
|
|||
|
isArray = require('lodash-node/modern/objects/isArray');
|
|||
|
|
|||
|
isFunction = require('lodash-node/modern/objects/isFunction');
|
|||
|
|
|||
|
XMLNode = require('./XMLNode');
|
|||
|
|
|||
|
XMLAttribute = require('./XMLAttribute');
|
|||
|
|
|||
|
XMLProcessingInstruction = require('./XMLProcessingInstruction');
|
|||
|
|
|||
|
module.exports = XMLElement = (function(_super) {
|
|||
|
__extends(XMLElement, _super);
|
|||
|
|
|||
|
function XMLElement(parent, name, attributes) {
|
|||
|
XMLElement.__super__.constructor.call(this, parent);
|
|||
|
if (name == null) {
|
|||
|
throw new Error("Missing element name");
|
|||
|
}
|
|||
|
this.name = this.stringify.eleName(name);
|
|||
|
this.children = [];
|
|||
|
this.instructions = [];
|
|||
|
this.attributes = {};
|
|||
|
if (attributes != null) {
|
|||
|
this.attribute(attributes);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
XMLElement.prototype.clone = function() {
|
|||
|
var att, attName, clonedSelf, pi, _i, _len, _ref, _ref1;
|
|||
|
clonedSelf = create(XMLElement.prototype, this);
|
|||
|
clonedSelf.attributes = {};
|
|||
|
_ref = this.attributes;
|
|||
|
for (attName in _ref) {
|
|||
|
if (!__hasProp.call(_ref, attName)) continue;
|
|||
|
att = _ref[attName];
|
|||
|
clonedSelf.attributes[attName] = att.clone();
|
|||
|
}
|
|||
|
clonedSelf.instructions = [];
|
|||
|
_ref1 = this.instructions;
|
|||
|
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
|
|||
|
pi = _ref1[_i];
|
|||
|
clonedSelf.instructions.push(pi.clone());
|
|||
|
}
|
|||
|
clonedSelf.children = [];
|
|||
|
this.children.forEach(function(child) {
|
|||
|
var clonedChild;
|
|||
|
clonedChild = child.clone();
|
|||
|
clonedChild.parent = clonedSelf;
|
|||
|
return clonedSelf.children.push(clonedChild);
|
|||
|
});
|
|||
|
return clonedSelf;
|
|||
|
};
|
|||
|
|
|||
|
XMLElement.prototype.attribute = function(name, value) {
|
|||
|
var attName, attValue;
|
|||
|
if (name != null) {
|
|||
|
name = name.valueOf();
|
|||
|
}
|
|||
|
if (isObject(name)) {
|
|||
|
for (attName in name) {
|
|||
|
if (!__hasProp.call(name, attName)) continue;
|
|||
|
attValue = name[attName];
|
|||
|
this.attribute(attName, attValue);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (isFunction(value)) {
|
|||
|
value = value.apply();
|
|||
|
}
|
|||
|
if (!this.options.skipNullAttributes || (value != null)) {
|
|||
|
this.attributes[name] = new XMLAttribute(this, name, value);
|
|||
|
}
|
|||
|
}
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLElement.prototype.removeAttribute = function(name) {
|
|||
|
var attName, _i, _len;
|
|||
|
if (name == null) {
|
|||
|
throw new Error("Missing attribute name");
|
|||
|
}
|
|||
|
name = name.valueOf();
|
|||
|
if (isArray(name)) {
|
|||
|
for (_i = 0, _len = name.length; _i < _len; _i++) {
|
|||
|
attName = name[_i];
|
|||
|
delete this.attributes[attName];
|
|||
|
}
|
|||
|
} else {
|
|||
|
delete this.attributes[name];
|
|||
|
}
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLElement.prototype.instruction = function(target, value) {
|
|||
|
var insTarget, insValue, instruction, _i, _len;
|
|||
|
if (target != null) {
|
|||
|
target = target.valueOf();
|
|||
|
}
|
|||
|
if (value != null) {
|
|||
|
value = value.valueOf();
|
|||
|
}
|
|||
|
if (isArray(target)) {
|
|||
|
for (_i = 0, _len = target.length; _i < _len; _i++) {
|
|||
|
insTarget = target[_i];
|
|||
|
this.instruction(insTarget);
|
|||
|
}
|
|||
|
} else if (isObject(target)) {
|
|||
|
for (insTarget in target) {
|
|||
|
if (!__hasProp.call(target, insTarget)) continue;
|
|||
|
insValue = target[insTarget];
|
|||
|
this.instruction(insTarget, insValue);
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (isFunction(value)) {
|
|||
|
value = value.apply();
|
|||
|
}
|
|||
|
instruction = new XMLProcessingInstruction(this, target, value);
|
|||
|
this.instructions.push(instruction);
|
|||
|
}
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLElement.prototype.toString = function(options, level) {
|
|||
|
var att, child, indent, instruction, name, newline, offset, pretty, r, space, _i, _j, _len, _len1, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
_ref3 = this.instructions;
|
|||
|
for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
|
|||
|
instruction = _ref3[_i];
|
|||
|
r += instruction.toString(options, level + 1);
|
|||
|
}
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<' + this.name;
|
|||
|
_ref4 = this.attributes;
|
|||
|
for (name in _ref4) {
|
|||
|
if (!__hasProp.call(_ref4, name)) continue;
|
|||
|
att = _ref4[name];
|
|||
|
r += att.toString(options);
|
|||
|
}
|
|||
|
if (this.children.length === 0) {
|
|||
|
r += '/>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
} else if (pretty && this.children.length === 1 && (this.children[0].value != null)) {
|
|||
|
r += '>';
|
|||
|
r += this.children[0].value;
|
|||
|
r += '</' + this.name + '>';
|
|||
|
r += newline;
|
|||
|
} else {
|
|||
|
r += '>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
_ref5 = this.children;
|
|||
|
for (_j = 0, _len1 = _ref5.length; _j < _len1; _j++) {
|
|||
|
child = _ref5[_j];
|
|||
|
r += child.toString(options, level + 1);
|
|||
|
}
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '</' + this.name + '>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
XMLElement.prototype.att = function(name, value) {
|
|||
|
return this.attribute(name, value);
|
|||
|
};
|
|||
|
|
|||
|
XMLElement.prototype.ins = function(target, value) {
|
|||
|
return this.instruction(target, value);
|
|||
|
};
|
|||
|
|
|||
|
XMLElement.prototype.a = function(name, value) {
|
|||
|
return this.attribute(name, value);
|
|||
|
};
|
|||
|
|
|||
|
XMLElement.prototype.i = function(target, value) {
|
|||
|
return this.instruction(target, value);
|
|||
|
};
|
|||
|
|
|||
|
return XMLElement;
|
|||
|
|
|||
|
})(XMLNode);
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLAttribute":27,"./XMLNode":38,"./XMLProcessingInstruction":39,"lodash-node/modern/objects/create":56,"lodash-node/modern/objects/isArray":58,"lodash-node/modern/objects/isFunction":60,"lodash-node/modern/objects/isObject":61}],38:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLNode, isArray, isEmpty, isFunction, isObject,
|
|||
|
__hasProp = {}.hasOwnProperty;
|
|||
|
|
|||
|
isObject = require('lodash-node/modern/objects/isObject');
|
|||
|
|
|||
|
isArray = require('lodash-node/modern/objects/isArray');
|
|||
|
|
|||
|
isFunction = require('lodash-node/modern/objects/isFunction');
|
|||
|
|
|||
|
isEmpty = require('lodash-node/modern/objects/isEmpty');
|
|||
|
|
|||
|
module.exports = XMLNode = (function() {
|
|||
|
function XMLNode(parent) {
|
|||
|
this.parent = parent;
|
|||
|
this.options = this.parent.options;
|
|||
|
this.stringify = this.parent.stringify;
|
|||
|
}
|
|||
|
|
|||
|
XMLNode.prototype.clone = function() {
|
|||
|
throw new Error("Cannot clone generic XMLNode");
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.element = function(name, attributes, text) {
|
|||
|
var item, key, lastChild, val, _i, _len, _ref;
|
|||
|
lastChild = null;
|
|||
|
if (attributes == null) {
|
|||
|
attributes = {};
|
|||
|
}
|
|||
|
attributes = attributes.valueOf();
|
|||
|
if (!isObject(attributes)) {
|
|||
|
_ref = [attributes, text], text = _ref[0], attributes = _ref[1];
|
|||
|
}
|
|||
|
if (name != null) {
|
|||
|
name = name.valueOf();
|
|||
|
}
|
|||
|
if (isArray(name)) {
|
|||
|
for (_i = 0, _len = name.length; _i < _len; _i++) {
|
|||
|
item = name[_i];
|
|||
|
lastChild = this.element(item);
|
|||
|
}
|
|||
|
} else if (isFunction(name)) {
|
|||
|
lastChild = this.element(name.apply());
|
|||
|
} else if (isObject(name)) {
|
|||
|
for (key in name) {
|
|||
|
if (!__hasProp.call(name, key)) continue;
|
|||
|
val = name[key];
|
|||
|
if (isFunction(val)) {
|
|||
|
val = val.apply();
|
|||
|
}
|
|||
|
if ((isObject(val)) && (isEmpty(val))) {
|
|||
|
val = null;
|
|||
|
}
|
|||
|
if (!this.options.ignoreDecorators && this.stringify.convertAttKey && key.indexOf(this.stringify.convertAttKey) === 0) {
|
|||
|
lastChild = this.attribute(key.substr(this.stringify.convertAttKey.length), val);
|
|||
|
} else if (!this.options.ignoreDecorators && this.stringify.convertPIKey && key.indexOf(this.stringify.convertPIKey) === 0) {
|
|||
|
lastChild = this.instruction(key.substr(this.stringify.convertPIKey.length), val);
|
|||
|
} else if (isObject(val)) {
|
|||
|
if (!this.options.ignoreDecorators && this.stringify.convertListKey && key.indexOf(this.stringify.convertListKey) === 0 && isArray(val)) {
|
|||
|
lastChild = this.element(val);
|
|||
|
} else {
|
|||
|
lastChild = this.element(key);
|
|||
|
lastChild.element(val);
|
|||
|
}
|
|||
|
} else {
|
|||
|
lastChild = this.element(key, val);
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
if (!this.options.ignoreDecorators && this.stringify.convertTextKey && name.indexOf(this.stringify.convertTextKey) === 0) {
|
|||
|
lastChild = this.text(text);
|
|||
|
} else if (!this.options.ignoreDecorators && this.stringify.convertCDataKey && name.indexOf(this.stringify.convertCDataKey) === 0) {
|
|||
|
lastChild = this.cdata(text);
|
|||
|
} else if (!this.options.ignoreDecorators && this.stringify.convertCommentKey && name.indexOf(this.stringify.convertCommentKey) === 0) {
|
|||
|
lastChild = this.comment(text);
|
|||
|
} else if (!this.options.ignoreDecorators && this.stringify.convertRawKey && name.indexOf(this.stringify.convertRawKey) === 0) {
|
|||
|
lastChild = this.raw(text);
|
|||
|
} else {
|
|||
|
lastChild = this.node(name, attributes, text);
|
|||
|
}
|
|||
|
}
|
|||
|
if (lastChild == null) {
|
|||
|
throw new Error("Could not create any elements with: " + name);
|
|||
|
}
|
|||
|
return lastChild;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.insertBefore = function(name, attributes, text) {
|
|||
|
var child, i, removed;
|
|||
|
if (this.isRoot) {
|
|||
|
throw new Error("Cannot insert elements at root level");
|
|||
|
}
|
|||
|
i = this.parent.children.indexOf(this);
|
|||
|
removed = this.parent.children.splice(i);
|
|||
|
child = this.parent.element(name, attributes, text);
|
|||
|
Array.prototype.push.apply(this.parent.children, removed);
|
|||
|
return child;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.insertAfter = function(name, attributes, text) {
|
|||
|
var child, i, removed;
|
|||
|
if (this.isRoot) {
|
|||
|
throw new Error("Cannot insert elements at root level");
|
|||
|
}
|
|||
|
i = this.parent.children.indexOf(this);
|
|||
|
removed = this.parent.children.splice(i + 1);
|
|||
|
child = this.parent.element(name, attributes, text);
|
|||
|
Array.prototype.push.apply(this.parent.children, removed);
|
|||
|
return child;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.remove = function() {
|
|||
|
var i, _ref;
|
|||
|
if (this.isRoot) {
|
|||
|
throw new Error("Cannot remove the root element");
|
|||
|
}
|
|||
|
i = this.parent.children.indexOf(this);
|
|||
|
[].splice.apply(this.parent.children, [i, i - i + 1].concat(_ref = [])), _ref;
|
|||
|
return this.parent;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.node = function(name, attributes, text) {
|
|||
|
var XMLElement, child, _ref;
|
|||
|
if (name != null) {
|
|||
|
name = name.valueOf();
|
|||
|
}
|
|||
|
if (attributes == null) {
|
|||
|
attributes = {};
|
|||
|
}
|
|||
|
attributes = attributes.valueOf();
|
|||
|
if (!isObject(attributes)) {
|
|||
|
_ref = [attributes, text], text = _ref[0], attributes = _ref[1];
|
|||
|
}
|
|||
|
XMLElement = require('./XMLElement');
|
|||
|
child = new XMLElement(this, name, attributes);
|
|||
|
if (text != null) {
|
|||
|
child.text(text);
|
|||
|
}
|
|||
|
this.children.push(child);
|
|||
|
return child;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.text = function(value) {
|
|||
|
var XMLText, child;
|
|||
|
XMLText = require('./XMLText');
|
|||
|
child = new XMLText(this, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.cdata = function(value) {
|
|||
|
var XMLCData, child;
|
|||
|
XMLCData = require('./XMLCData');
|
|||
|
child = new XMLCData(this, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.comment = function(value) {
|
|||
|
var XMLComment, child;
|
|||
|
XMLComment = require('./XMLComment');
|
|||
|
child = new XMLComment(this, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.raw = function(value) {
|
|||
|
var XMLRaw, child;
|
|||
|
XMLRaw = require('./XMLRaw');
|
|||
|
child = new XMLRaw(this, value);
|
|||
|
this.children.push(child);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.declaration = function(version, encoding, standalone) {
|
|||
|
var XMLDeclaration, doc, xmldec;
|
|||
|
doc = this.document();
|
|||
|
XMLDeclaration = require('./XMLDeclaration');
|
|||
|
xmldec = new XMLDeclaration(doc, version, encoding, standalone);
|
|||
|
doc.xmldec = xmldec;
|
|||
|
return doc.root();
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.doctype = function(pubID, sysID) {
|
|||
|
var XMLDocType, doc, doctype;
|
|||
|
doc = this.document();
|
|||
|
XMLDocType = require('./XMLDocType');
|
|||
|
doctype = new XMLDocType(doc, pubID, sysID);
|
|||
|
doc.doctype = doctype;
|
|||
|
return doctype;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.up = function() {
|
|||
|
if (this.isRoot) {
|
|||
|
throw new Error("The root node has no parent. Use doc() if you need to get the document object.");
|
|||
|
}
|
|||
|
return this.parent;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.root = function() {
|
|||
|
var child;
|
|||
|
if (this.isRoot) {
|
|||
|
return this;
|
|||
|
}
|
|||
|
child = this.parent;
|
|||
|
while (!child.isRoot) {
|
|||
|
child = child.parent;
|
|||
|
}
|
|||
|
return child;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.document = function() {
|
|||
|
return this.root().documentObject;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.end = function(options) {
|
|||
|
return this.document().toString(options);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.prev = function() {
|
|||
|
var i;
|
|||
|
if (this.isRoot) {
|
|||
|
throw new Error("Root node has no siblings");
|
|||
|
}
|
|||
|
i = this.parent.children.indexOf(this);
|
|||
|
if (i < 1) {
|
|||
|
throw new Error("Already at the first node");
|
|||
|
}
|
|||
|
return this.parent.children[i - 1];
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.next = function() {
|
|||
|
var i;
|
|||
|
if (this.isRoot) {
|
|||
|
throw new Error("Root node has no siblings");
|
|||
|
}
|
|||
|
i = this.parent.children.indexOf(this);
|
|||
|
if (i === -1 || i === this.parent.children.length - 1) {
|
|||
|
throw new Error("Already at the last node");
|
|||
|
}
|
|||
|
return this.parent.children[i + 1];
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.importXMLBuilder = function(xmlbuilder) {
|
|||
|
var clonedRoot;
|
|||
|
clonedRoot = xmlbuilder.root().clone();
|
|||
|
clonedRoot.parent = this;
|
|||
|
clonedRoot.isRoot = false;
|
|||
|
this.children.push(clonedRoot);
|
|||
|
return this;
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.ele = function(name, attributes, text) {
|
|||
|
return this.element(name, attributes, text);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.nod = function(name, attributes, text) {
|
|||
|
return this.node(name, attributes, text);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.txt = function(value) {
|
|||
|
return this.text(value);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.dat = function(value) {
|
|||
|
return this.cdata(value);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.com = function(value) {
|
|||
|
return this.comment(value);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.doc = function() {
|
|||
|
return this.document();
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.dec = function(version, encoding, standalone) {
|
|||
|
return this.declaration(version, encoding, standalone);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.dtd = function(pubID, sysID) {
|
|||
|
return this.doctype(pubID, sysID);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.e = function(name, attributes, text) {
|
|||
|
return this.element(name, attributes, text);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.n = function(name, attributes, text) {
|
|||
|
return this.node(name, attributes, text);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.t = function(value) {
|
|||
|
return this.text(value);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.d = function(value) {
|
|||
|
return this.cdata(value);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.c = function(value) {
|
|||
|
return this.comment(value);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.r = function(value) {
|
|||
|
return this.raw(value);
|
|||
|
};
|
|||
|
|
|||
|
XMLNode.prototype.u = function() {
|
|||
|
return this.up();
|
|||
|
};
|
|||
|
|
|||
|
return XMLNode;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLCData":29,"./XMLComment":30,"./XMLDeclaration":35,"./XMLDocType":36,"./XMLElement":37,"./XMLRaw":40,"./XMLText":42,"lodash-node/modern/objects/isArray":58,"lodash-node/modern/objects/isEmpty":59,"lodash-node/modern/objects/isFunction":60,"lodash-node/modern/objects/isObject":61}],39:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLProcessingInstruction, create;
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
module.exports = XMLProcessingInstruction = (function() {
|
|||
|
function XMLProcessingInstruction(parent, target, value) {
|
|||
|
this.stringify = parent.stringify;
|
|||
|
if (target == null) {
|
|||
|
throw new Error("Missing instruction target");
|
|||
|
}
|
|||
|
this.target = this.stringify.insTarget(target);
|
|||
|
if (value) {
|
|||
|
this.value = this.stringify.insValue(value);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
XMLProcessingInstruction.prototype.clone = function() {
|
|||
|
return create(XMLProcessingInstruction.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLProcessingInstruction.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += '<?';
|
|||
|
r += this.target;
|
|||
|
if (this.value) {
|
|||
|
r += ' ' + this.value;
|
|||
|
}
|
|||
|
r += '?>';
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLProcessingInstruction;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"lodash-node/modern/objects/create":56}],40:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLNode, XMLRaw, create,
|
|||
|
__hasProp = {}.hasOwnProperty,
|
|||
|
__extends = 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; };
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
XMLNode = require('./XMLNode');
|
|||
|
|
|||
|
module.exports = XMLRaw = (function(_super) {
|
|||
|
__extends(XMLRaw, _super);
|
|||
|
|
|||
|
function XMLRaw(parent, text) {
|
|||
|
XMLRaw.__super__.constructor.call(this, parent);
|
|||
|
if (text == null) {
|
|||
|
throw new Error("Missing raw text");
|
|||
|
}
|
|||
|
this.value = this.stringify.raw(text);
|
|||
|
}
|
|||
|
|
|||
|
XMLRaw.prototype.clone = function() {
|
|||
|
return create(XMLRaw.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLRaw.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += this.value;
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLRaw;
|
|||
|
|
|||
|
})(XMLNode);
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLNode":38,"lodash-node/modern/objects/create":56}],41:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLStringifier,
|
|||
|
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
|||
|
__hasProp = {}.hasOwnProperty;
|
|||
|
|
|||
|
module.exports = XMLStringifier = (function() {
|
|||
|
function XMLStringifier(options) {
|
|||
|
this.assertLegalChar = __bind(this.assertLegalChar, this);
|
|||
|
var key, value, _ref;
|
|||
|
this.allowSurrogateChars = options != null ? options.allowSurrogateChars : void 0;
|
|||
|
_ref = (options != null ? options.stringify : void 0) || {};
|
|||
|
for (key in _ref) {
|
|||
|
if (!__hasProp.call(_ref, key)) continue;
|
|||
|
value = _ref[key];
|
|||
|
this[key] = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
XMLStringifier.prototype.eleName = function(val) {
|
|||
|
val = '' + val || '';
|
|||
|
return this.assertLegalChar(val);
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.eleText = function(val) {
|
|||
|
val = '' + val || '';
|
|||
|
return this.assertLegalChar(this.elEscape(val));
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.cdata = function(val) {
|
|||
|
val = '' + val || '';
|
|||
|
if (val.match(/]]>/)) {
|
|||
|
throw new Error("Invalid CDATA text: " + val);
|
|||
|
}
|
|||
|
return this.assertLegalChar(val);
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.comment = function(val) {
|
|||
|
val = '' + val || '';
|
|||
|
if (val.match(/--/)) {
|
|||
|
throw new Error("Comment text cannot contain double-hypen: " + val);
|
|||
|
}
|
|||
|
return this.assertLegalChar(val);
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.raw = function(val) {
|
|||
|
return '' + val || '';
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.attName = function(val) {
|
|||
|
return '' + val || '';
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.attValue = function(val) {
|
|||
|
val = '' + val || '';
|
|||
|
return this.attEscape(val);
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.insTarget = function(val) {
|
|||
|
return '' + val || '';
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.insValue = function(val) {
|
|||
|
val = '' + val || '';
|
|||
|
if (val.match(/\?>/)) {
|
|||
|
throw new Error("Invalid processing instruction value: " + val);
|
|||
|
}
|
|||
|
return val;
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.xmlVersion = function(val) {
|
|||
|
val = '' + val || '';
|
|||
|
if (!val.match(/1\.[0-9]+/)) {
|
|||
|
throw new Error("Invalid version number: " + val);
|
|||
|
}
|
|||
|
return val;
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.xmlEncoding = function(val) {
|
|||
|
val = '' + val || '';
|
|||
|
if (!val.match(/[A-Za-z](?:[A-Za-z0-9._-]|-)*/)) {
|
|||
|
throw new Error("Invalid encoding: " + options.val);
|
|||
|
}
|
|||
|
return val;
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.xmlStandalone = function(val) {
|
|||
|
if (val) {
|
|||
|
return "yes";
|
|||
|
} else {
|
|||
|
return "no";
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.dtdPubID = function(val) {
|
|||
|
return '' + val || '';
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.dtdSysID = function(val) {
|
|||
|
return '' + val || '';
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.dtdElementValue = function(val) {
|
|||
|
return '' + val || '';
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.dtdAttType = function(val) {
|
|||
|
return '' + val || '';
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.dtdAttDefault = function(val) {
|
|||
|
if (val != null) {
|
|||
|
return '' + val || '';
|
|||
|
} else {
|
|||
|
return val;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.dtdEntityValue = function(val) {
|
|||
|
return '' + val || '';
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.dtdNData = function(val) {
|
|||
|
return '' + val || '';
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.convertAttKey = '@';
|
|||
|
|
|||
|
XMLStringifier.prototype.convertPIKey = '?';
|
|||
|
|
|||
|
XMLStringifier.prototype.convertTextKey = '#text';
|
|||
|
|
|||
|
XMLStringifier.prototype.convertCDataKey = '#cdata';
|
|||
|
|
|||
|
XMLStringifier.prototype.convertCommentKey = '#comment';
|
|||
|
|
|||
|
XMLStringifier.prototype.convertRawKey = '#raw';
|
|||
|
|
|||
|
XMLStringifier.prototype.convertListKey = '#list';
|
|||
|
|
|||
|
XMLStringifier.prototype.assertLegalChar = function(str) {
|
|||
|
var chars, chr;
|
|||
|
if (this.allowSurrogateChars) {
|
|||
|
chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uFFFE-\uFFFF]/;
|
|||
|
} else {
|
|||
|
chars = /[\u0000-\u0008\u000B-\u000C\u000E-\u001F\uD800-\uDFFF\uFFFE-\uFFFF]/;
|
|||
|
}
|
|||
|
chr = str.match(chars);
|
|||
|
if (chr) {
|
|||
|
throw new Error("Invalid character (" + chr + ") in string: " + str + " at index " + chr.index);
|
|||
|
}
|
|||
|
return str;
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.elEscape = function(str) {
|
|||
|
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\r/g, '
');
|
|||
|
};
|
|||
|
|
|||
|
XMLStringifier.prototype.attEscape = function(str) {
|
|||
|
return str.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"').replace(/\t/g, '	').replace(/\n/g, '
').replace(/\r/g, '
');
|
|||
|
};
|
|||
|
|
|||
|
return XMLStringifier;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{}],42:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLNode, XMLText, create,
|
|||
|
__hasProp = {}.hasOwnProperty,
|
|||
|
__extends = 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; };
|
|||
|
|
|||
|
create = require('lodash-node/modern/objects/create');
|
|||
|
|
|||
|
XMLNode = require('./XMLNode');
|
|||
|
|
|||
|
module.exports = XMLText = (function(_super) {
|
|||
|
__extends(XMLText, _super);
|
|||
|
|
|||
|
function XMLText(parent, text) {
|
|||
|
this.parent = parent;
|
|||
|
XMLText.__super__.constructor.call(this, parent);
|
|||
|
if (text == null) {
|
|||
|
throw new Error("Missing element text");
|
|||
|
}
|
|||
|
this.value = this.stringify.eleText(text);
|
|||
|
}
|
|||
|
|
|||
|
XMLText.prototype.clone = function() {
|
|||
|
return create(XMLText.prototype, this);
|
|||
|
};
|
|||
|
|
|||
|
XMLText.prototype.toString = function(options, level) {
|
|||
|
var indent, newline, offset, pretty, r, space, _ref, _ref1, _ref2;
|
|||
|
pretty = (options != null ? options.pretty : void 0) || false;
|
|||
|
indent = (_ref = options != null ? options.indent : void 0) != null ? _ref : ' ';
|
|||
|
offset = (_ref1 = options != null ? options.offset : void 0) != null ? _ref1 : 0;
|
|||
|
newline = (_ref2 = options != null ? options.newline : void 0) != null ? _ref2 : '\n';
|
|||
|
level || (level = 0);
|
|||
|
space = new Array(level + offset + 1).join(indent);
|
|||
|
r = '';
|
|||
|
if (pretty) {
|
|||
|
r += space;
|
|||
|
}
|
|||
|
r += this.value;
|
|||
|
if (pretty) {
|
|||
|
r += newline;
|
|||
|
}
|
|||
|
return r;
|
|||
|
};
|
|||
|
|
|||
|
return XMLText;
|
|||
|
|
|||
|
})(XMLNode);
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLNode":38,"lodash-node/modern/objects/create":56}],43:[function(require,module,exports){
|
|||
|
// Generated by CoffeeScript 1.6.3
|
|||
|
(function() {
|
|||
|
var XMLBuilder, assign;
|
|||
|
|
|||
|
assign = require('lodash-node/modern/objects/assign');
|
|||
|
|
|||
|
XMLBuilder = require('./XMLBuilder');
|
|||
|
|
|||
|
module.exports.create = function(name, xmldec, doctype, options) {
|
|||
|
options = assign({}, xmldec, doctype, options);
|
|||
|
return new XMLBuilder(name, options).root();
|
|||
|
};
|
|||
|
|
|||
|
}).call(this);
|
|||
|
|
|||
|
},{"./XMLBuilder":28,"lodash-node/modern/objects/assign":55}],44:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var createWrapper = require('../internals/createWrapper'),
|
|||
|
slice = require('../internals/slice');
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a function that, when called, invokes `func` with the `this`
|
|||
|
* binding of `thisArg` and prepends any additional `bind` arguments to those
|
|||
|
* provided to the bound function.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @category Functions
|
|||
|
* @param {Function} func The function to bind.
|
|||
|
* @param {*} [thisArg] The `this` binding of `func`.
|
|||
|
* @param {...*} [arg] Arguments to be partially applied.
|
|||
|
* @returns {Function} Returns the new bound function.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var func = function(greeting) {
|
|||
|
* return greeting + ' ' + this.name;
|
|||
|
* };
|
|||
|
*
|
|||
|
* func = _.bind(func, { 'name': 'fred' }, 'hi');
|
|||
|
* func();
|
|||
|
* // => 'hi fred'
|
|||
|
*/
|
|||
|
function bind(func, thisArg) {
|
|||
|
return arguments.length > 2
|
|||
|
? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
|
|||
|
: createWrapper(func, 1, null, null, thisArg);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = bind;
|
|||
|
|
|||
|
},{"../internals/createWrapper":49,"../internals/slice":54}],45:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var baseCreate = require('./baseCreate'),
|
|||
|
isObject = require('../objects/isObject'),
|
|||
|
setBindData = require('./setBindData'),
|
|||
|
slice = require('./slice');
|
|||
|
|
|||
|
/**
|
|||
|
* Used for `Array` method references.
|
|||
|
*
|
|||
|
* Normally `Array.prototype` would suffice, however, using an array literal
|
|||
|
* avoids issues in Narwhal.
|
|||
|
*/
|
|||
|
var arrayRef = [];
|
|||
|
|
|||
|
/** Native method shortcuts */
|
|||
|
var push = arrayRef.push;
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.bind` that creates the bound function and
|
|||
|
* sets its meta data.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} bindData The bind data array.
|
|||
|
* @returns {Function} Returns the new bound function.
|
|||
|
*/
|
|||
|
function baseBind(bindData) {
|
|||
|
var func = bindData[0],
|
|||
|
partialArgs = bindData[2],
|
|||
|
thisArg = bindData[4];
|
|||
|
|
|||
|
function bound() {
|
|||
|
// `Function#bind` spec
|
|||
|
// http://es5.github.io/#x15.3.4.5
|
|||
|
if (partialArgs) {
|
|||
|
// avoid `arguments` object deoptimizations by using `slice` instead
|
|||
|
// of `Array.prototype.slice.call` and not assigning `arguments` to a
|
|||
|
// variable as a ternary expression
|
|||
|
var args = slice(partialArgs);
|
|||
|
push.apply(args, arguments);
|
|||
|
}
|
|||
|
// mimic the constructor's `return` behavior
|
|||
|
// http://es5.github.io/#x13.2.2
|
|||
|
if (this instanceof bound) {
|
|||
|
// ensure `new bound` is an instance of `func`
|
|||
|
var thisBinding = baseCreate(func.prototype),
|
|||
|
result = func.apply(thisBinding, args || arguments);
|
|||
|
return isObject(result) ? result : thisBinding;
|
|||
|
}
|
|||
|
return func.apply(thisArg, args || arguments);
|
|||
|
}
|
|||
|
setBindData(bound, bindData);
|
|||
|
return bound;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = baseBind;
|
|||
|
|
|||
|
},{"../objects/isObject":61,"./baseCreate":46,"./setBindData":52,"./slice":54}],46:[function(require,module,exports){
|
|||
|
(function (global){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var isNative = require('./isNative'),
|
|||
|
isObject = require('../objects/isObject'),
|
|||
|
noop = require('../utilities/noop');
|
|||
|
|
|||
|
/* Native method shortcuts for methods with the same name as other `lodash` methods */
|
|||
|
var nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate;
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.create` without support for assigning
|
|||
|
* properties to the created object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} prototype The object to inherit from.
|
|||
|
* @returns {Object} Returns the new object.
|
|||
|
*/
|
|||
|
function baseCreate(prototype, properties) {
|
|||
|
return isObject(prototype) ? nativeCreate(prototype) : {};
|
|||
|
}
|
|||
|
// fallback for browsers without `Object.create`
|
|||
|
if (!nativeCreate) {
|
|||
|
baseCreate = (function() {
|
|||
|
function Object() {}
|
|||
|
return function(prototype) {
|
|||
|
if (isObject(prototype)) {
|
|||
|
Object.prototype = prototype;
|
|||
|
var result = new Object;
|
|||
|
Object.prototype = null;
|
|||
|
}
|
|||
|
return result || global.Object();
|
|||
|
};
|
|||
|
}());
|
|||
|
}
|
|||
|
|
|||
|
module.exports = baseCreate;
|
|||
|
|
|||
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|||
|
},{"../objects/isObject":61,"../utilities/noop":65,"./isNative":50}],47:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var bind = require('../functions/bind'),
|
|||
|
identity = require('../utilities/identity'),
|
|||
|
setBindData = require('./setBindData'),
|
|||
|
support = require('../support');
|
|||
|
|
|||
|
/** Used to detected named functions */
|
|||
|
var reFuncName = /^\s*function[ \n\r\t]+\w/;
|
|||
|
|
|||
|
/** Used to detect functions containing a `this` reference */
|
|||
|
var reThis = /\bthis\b/;
|
|||
|
|
|||
|
/** Native method shortcuts */
|
|||
|
var fnToString = Function.prototype.toString;
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.createCallback` without support for creating
|
|||
|
* "_.pluck" or "_.where" style callbacks.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} [func=identity] The value to convert to a callback.
|
|||
|
* @param {*} [thisArg] The `this` binding of the created callback.
|
|||
|
* @param {number} [argCount] The number of arguments the callback accepts.
|
|||
|
* @returns {Function} Returns a callback function.
|
|||
|
*/
|
|||
|
function baseCreateCallback(func, thisArg, argCount) {
|
|||
|
if (typeof func != 'function') {
|
|||
|
return identity;
|
|||
|
}
|
|||
|
// exit early for no `thisArg` or already bound by `Function#bind`
|
|||
|
if (typeof thisArg == 'undefined' || !('prototype' in func)) {
|
|||
|
return func;
|
|||
|
}
|
|||
|
var bindData = func.__bindData__;
|
|||
|
if (typeof bindData == 'undefined') {
|
|||
|
if (support.funcNames) {
|
|||
|
bindData = !func.name;
|
|||
|
}
|
|||
|
bindData = bindData || !support.funcDecomp;
|
|||
|
if (!bindData) {
|
|||
|
var source = fnToString.call(func);
|
|||
|
if (!support.funcNames) {
|
|||
|
bindData = !reFuncName.test(source);
|
|||
|
}
|
|||
|
if (!bindData) {
|
|||
|
// checks if `func` references the `this` keyword and stores the result
|
|||
|
bindData = reThis.test(source);
|
|||
|
setBindData(func, bindData);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// exit early if there are no `this` references or `func` is bound
|
|||
|
if (bindData === false || (bindData !== true && bindData[1] & 1)) {
|
|||
|
return func;
|
|||
|
}
|
|||
|
switch (argCount) {
|
|||
|
case 1: return function(value) {
|
|||
|
return func.call(thisArg, value);
|
|||
|
};
|
|||
|
case 2: return function(a, b) {
|
|||
|
return func.call(thisArg, a, b);
|
|||
|
};
|
|||
|
case 3: return function(value, index, collection) {
|
|||
|
return func.call(thisArg, value, index, collection);
|
|||
|
};
|
|||
|
case 4: return function(accumulator, value, index, collection) {
|
|||
|
return func.call(thisArg, accumulator, value, index, collection);
|
|||
|
};
|
|||
|
}
|
|||
|
return bind(func, thisArg);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = baseCreateCallback;
|
|||
|
|
|||
|
},{"../functions/bind":44,"../support":63,"../utilities/identity":64,"./setBindData":52}],48:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var baseCreate = require('./baseCreate'),
|
|||
|
isObject = require('../objects/isObject'),
|
|||
|
setBindData = require('./setBindData'),
|
|||
|
slice = require('./slice');
|
|||
|
|
|||
|
/**
|
|||
|
* Used for `Array` method references.
|
|||
|
*
|
|||
|
* Normally `Array.prototype` would suffice, however, using an array literal
|
|||
|
* avoids issues in Narwhal.
|
|||
|
*/
|
|||
|
var arrayRef = [];
|
|||
|
|
|||
|
/** Native method shortcuts */
|
|||
|
var push = arrayRef.push;
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `createWrapper` that creates the wrapper and
|
|||
|
* sets its meta data.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} bindData The bind data array.
|
|||
|
* @returns {Function} Returns the new function.
|
|||
|
*/
|
|||
|
function baseCreateWrapper(bindData) {
|
|||
|
var func = bindData[0],
|
|||
|
bitmask = bindData[1],
|
|||
|
partialArgs = bindData[2],
|
|||
|
partialRightArgs = bindData[3],
|
|||
|
thisArg = bindData[4],
|
|||
|
arity = bindData[5];
|
|||
|
|
|||
|
var isBind = bitmask & 1,
|
|||
|
isBindKey = bitmask & 2,
|
|||
|
isCurry = bitmask & 4,
|
|||
|
isCurryBound = bitmask & 8,
|
|||
|
key = func;
|
|||
|
|
|||
|
function bound() {
|
|||
|
var thisBinding = isBind ? thisArg : this;
|
|||
|
if (partialArgs) {
|
|||
|
var args = slice(partialArgs);
|
|||
|
push.apply(args, arguments);
|
|||
|
}
|
|||
|
if (partialRightArgs || isCurry) {
|
|||
|
args || (args = slice(arguments));
|
|||
|
if (partialRightArgs) {
|
|||
|
push.apply(args, partialRightArgs);
|
|||
|
}
|
|||
|
if (isCurry && args.length < arity) {
|
|||
|
bitmask |= 16 & ~32;
|
|||
|
return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);
|
|||
|
}
|
|||
|
}
|
|||
|
args || (args = arguments);
|
|||
|
if (isBindKey) {
|
|||
|
func = thisBinding[key];
|
|||
|
}
|
|||
|
if (this instanceof bound) {
|
|||
|
thisBinding = baseCreate(func.prototype);
|
|||
|
var result = func.apply(thisBinding, args);
|
|||
|
return isObject(result) ? result : thisBinding;
|
|||
|
}
|
|||
|
return func.apply(thisBinding, args);
|
|||
|
}
|
|||
|
setBindData(bound, bindData);
|
|||
|
return bound;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = baseCreateWrapper;
|
|||
|
|
|||
|
},{"../objects/isObject":61,"./baseCreate":46,"./setBindData":52,"./slice":54}],49:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var baseBind = require('./baseBind'),
|
|||
|
baseCreateWrapper = require('./baseCreateWrapper'),
|
|||
|
isFunction = require('../objects/isFunction'),
|
|||
|
slice = require('./slice');
|
|||
|
|
|||
|
/**
|
|||
|
* Used for `Array` method references.
|
|||
|
*
|
|||
|
* Normally `Array.prototype` would suffice, however, using an array literal
|
|||
|
* avoids issues in Narwhal.
|
|||
|
*/
|
|||
|
var arrayRef = [];
|
|||
|
|
|||
|
/** Native method shortcuts */
|
|||
|
var push = arrayRef.push,
|
|||
|
unshift = arrayRef.unshift;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a function that, when called, either curries or invokes `func`
|
|||
|
* with an optional `this` binding and partially applied arguments.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function|string} func The function or method name to reference.
|
|||
|
* @param {number} bitmask The bitmask of method flags to compose.
|
|||
|
* The bitmask may be composed of the following flags:
|
|||
|
* 1 - `_.bind`
|
|||
|
* 2 - `_.bindKey`
|
|||
|
* 4 - `_.curry`
|
|||
|
* 8 - `_.curry` (bound)
|
|||
|
* 16 - `_.partial`
|
|||
|
* 32 - `_.partialRight`
|
|||
|
* @param {Array} [partialArgs] An array of arguments to prepend to those
|
|||
|
* provided to the new function.
|
|||
|
* @param {Array} [partialRightArgs] An array of arguments to append to those
|
|||
|
* provided to the new function.
|
|||
|
* @param {*} [thisArg] The `this` binding of `func`.
|
|||
|
* @param {number} [arity] The arity of `func`.
|
|||
|
* @returns {Function} Returns the new function.
|
|||
|
*/
|
|||
|
function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
|
|||
|
var isBind = bitmask & 1,
|
|||
|
isBindKey = bitmask & 2,
|
|||
|
isCurry = bitmask & 4,
|
|||
|
isCurryBound = bitmask & 8,
|
|||
|
isPartial = bitmask & 16,
|
|||
|
isPartialRight = bitmask & 32;
|
|||
|
|
|||
|
if (!isBindKey && !isFunction(func)) {
|
|||
|
throw new TypeError;
|
|||
|
}
|
|||
|
if (isPartial && !partialArgs.length) {
|
|||
|
bitmask &= ~16;
|
|||
|
isPartial = partialArgs = false;
|
|||
|
}
|
|||
|
if (isPartialRight && !partialRightArgs.length) {
|
|||
|
bitmask &= ~32;
|
|||
|
isPartialRight = partialRightArgs = false;
|
|||
|
}
|
|||
|
var bindData = func && func.__bindData__;
|
|||
|
if (bindData && bindData !== true) {
|
|||
|
// clone `bindData`
|
|||
|
bindData = slice(bindData);
|
|||
|
if (bindData[2]) {
|
|||
|
bindData[2] = slice(bindData[2]);
|
|||
|
}
|
|||
|
if (bindData[3]) {
|
|||
|
bindData[3] = slice(bindData[3]);
|
|||
|
}
|
|||
|
// set `thisBinding` is not previously bound
|
|||
|
if (isBind && !(bindData[1] & 1)) {
|
|||
|
bindData[4] = thisArg;
|
|||
|
}
|
|||
|
// set if previously bound but not currently (subsequent curried functions)
|
|||
|
if (!isBind && bindData[1] & 1) {
|
|||
|
bitmask |= 8;
|
|||
|
}
|
|||
|
// set curried arity if not yet set
|
|||
|
if (isCurry && !(bindData[1] & 4)) {
|
|||
|
bindData[5] = arity;
|
|||
|
}
|
|||
|
// append partial left arguments
|
|||
|
if (isPartial) {
|
|||
|
push.apply(bindData[2] || (bindData[2] = []), partialArgs);
|
|||
|
}
|
|||
|
// append partial right arguments
|
|||
|
if (isPartialRight) {
|
|||
|
unshift.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
|
|||
|
}
|
|||
|
// merge flags
|
|||
|
bindData[1] |= bitmask;
|
|||
|
return createWrapper.apply(null, bindData);
|
|||
|
}
|
|||
|
// fast path for `_.bind`
|
|||
|
var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;
|
|||
|
return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = createWrapper;
|
|||
|
|
|||
|
},{"../objects/isFunction":60,"./baseBind":45,"./baseCreateWrapper":48,"./slice":54}],50:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
|
|||
|
/** Used for native method references */
|
|||
|
var objectProto = Object.prototype;
|
|||
|
|
|||
|
/** Used to resolve the internal [[Class]] of values */
|
|||
|
var toString = objectProto.toString;
|
|||
|
|
|||
|
/** Used to detect if a method is native */
|
|||
|
var reNative = RegExp('^' +
|
|||
|
String(toString)
|
|||
|
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
|
|||
|
.replace(/toString| for [^\]]+/g, '.*?') + '$'
|
|||
|
);
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a native function.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if the `value` is a native function, else `false`.
|
|||
|
*/
|
|||
|
function isNative(value) {
|
|||
|
return typeof value == 'function' && reNative.test(value);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = isNative;
|
|||
|
|
|||
|
},{}],51:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
|
|||
|
/** Used to determine if values are of the language type Object */
|
|||
|
var objectTypes = {
|
|||
|
'boolean': false,
|
|||
|
'function': true,
|
|||
|
'object': true,
|
|||
|
'number': false,
|
|||
|
'string': false,
|
|||
|
'undefined': false
|
|||
|
};
|
|||
|
|
|||
|
module.exports = objectTypes;
|
|||
|
|
|||
|
},{}],52:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var isNative = require('./isNative'),
|
|||
|
noop = require('../utilities/noop');
|
|||
|
|
|||
|
/** Used as the property descriptor for `__bindData__` */
|
|||
|
var descriptor = {
|
|||
|
'configurable': false,
|
|||
|
'enumerable': false,
|
|||
|
'value': null,
|
|||
|
'writable': false
|
|||
|
};
|
|||
|
|
|||
|
/** Used to set meta data on functions */
|
|||
|
var defineProperty = (function() {
|
|||
|
// IE 8 only accepts DOM elements
|
|||
|
try {
|
|||
|
var o = {},
|
|||
|
func = isNative(func = Object.defineProperty) && func,
|
|||
|
result = func(o, o, o) && func;
|
|||
|
} catch(e) { }
|
|||
|
return result;
|
|||
|
}());
|
|||
|
|
|||
|
/**
|
|||
|
* Sets `this` binding data on a given function.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to set data on.
|
|||
|
* @param {Array} value The data array to set.
|
|||
|
*/
|
|||
|
var setBindData = !defineProperty ? noop : function(func, value) {
|
|||
|
descriptor.value = value;
|
|||
|
defineProperty(func, '__bindData__', descriptor);
|
|||
|
};
|
|||
|
|
|||
|
module.exports = setBindData;
|
|||
|
|
|||
|
},{"../utilities/noop":65,"./isNative":50}],53:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var objectTypes = require('./objectTypes');
|
|||
|
|
|||
|
/** Used for native method references */
|
|||
|
var objectProto = Object.prototype;
|
|||
|
|
|||
|
/** Native method shortcuts */
|
|||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|||
|
|
|||
|
/**
|
|||
|
* A fallback implementation of `Object.keys` which produces an array of the
|
|||
|
* given object's own enumerable property names.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @type Function
|
|||
|
* @param {Object} object The object to inspect.
|
|||
|
* @returns {Array} Returns an array of property names.
|
|||
|
*/
|
|||
|
var shimKeys = function(object) {
|
|||
|
var index, iterable = object, result = [];
|
|||
|
if (!iterable) return result;
|
|||
|
if (!(objectTypes[typeof object])) return result;
|
|||
|
for (index in iterable) {
|
|||
|
if (hasOwnProperty.call(iterable, index)) {
|
|||
|
result.push(index);
|
|||
|
}
|
|||
|
}
|
|||
|
return result
|
|||
|
};
|
|||
|
|
|||
|
module.exports = shimKeys;
|
|||
|
|
|||
|
},{"./objectTypes":51}],54:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Slices the `collection` from the `start` index up to, but not including,
|
|||
|
* the `end` index.
|
|||
|
*
|
|||
|
* Note: This function is used instead of `Array#slice` to support node lists
|
|||
|
* in IE < 9 and to ensure dense arrays are returned.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array|Object|string} collection The collection to slice.
|
|||
|
* @param {number} start The start index.
|
|||
|
* @param {number} end The end index.
|
|||
|
* @returns {Array} Returns the new array.
|
|||
|
*/
|
|||
|
function slice(array, start, end) {
|
|||
|
start || (start = 0);
|
|||
|
if (typeof end == 'undefined') {
|
|||
|
end = array ? array.length : 0;
|
|||
|
}
|
|||
|
var index = -1,
|
|||
|
length = end - start || 0,
|
|||
|
result = Array(length < 0 ? 0 : length);
|
|||
|
|
|||
|
while (++index < length) {
|
|||
|
result[index] = array[start + index];
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = slice;
|
|||
|
|
|||
|
},{}],55:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var baseCreateCallback = require('../internals/baseCreateCallback'),
|
|||
|
keys = require('./keys'),
|
|||
|
objectTypes = require('../internals/objectTypes');
|
|||
|
|
|||
|
/**
|
|||
|
* Assigns own enumerable properties of source object(s) to the destination
|
|||
|
* object. Subsequent sources will overwrite property assignments of previous
|
|||
|
* sources. If a callback is provided it will be executed to produce the
|
|||
|
* assigned values. The callback is bound to `thisArg` and invoked with two
|
|||
|
* arguments; (objectValue, sourceValue).
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @type Function
|
|||
|
* @alias extend
|
|||
|
* @category Objects
|
|||
|
* @param {Object} object The destination object.
|
|||
|
* @param {...Object} [source] The source objects.
|
|||
|
* @param {Function} [callback] The function to customize assigning values.
|
|||
|
* @param {*} [thisArg] The `this` binding of `callback`.
|
|||
|
* @returns {Object} Returns the destination object.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.assign({ 'name': 'fred' }, { 'employer': 'slate' });
|
|||
|
* // => { 'name': 'fred', 'employer': 'slate' }
|
|||
|
*
|
|||
|
* var defaults = _.partialRight(_.assign, function(a, b) {
|
|||
|
* return typeof a == 'undefined' ? b : a;
|
|||
|
* });
|
|||
|
*
|
|||
|
* var object = { 'name': 'barney' };
|
|||
|
* defaults(object, { 'name': 'fred', 'employer': 'slate' });
|
|||
|
* // => { 'name': 'barney', 'employer': 'slate' }
|
|||
|
*/
|
|||
|
var assign = function(object, source, guard) {
|
|||
|
var index, iterable = object, result = iterable;
|
|||
|
if (!iterable) return result;
|
|||
|
var args = arguments,
|
|||
|
argsIndex = 0,
|
|||
|
argsLength = typeof guard == 'number' ? 2 : args.length;
|
|||
|
if (argsLength > 3 && typeof args[argsLength - 2] == 'function') {
|
|||
|
var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);
|
|||
|
} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {
|
|||
|
callback = args[--argsLength];
|
|||
|
}
|
|||
|
while (++argsIndex < argsLength) {
|
|||
|
iterable = args[argsIndex];
|
|||
|
if (iterable && objectTypes[typeof iterable]) {
|
|||
|
var ownIndex = -1,
|
|||
|
ownProps = objectTypes[typeof iterable] && keys(iterable),
|
|||
|
length = ownProps ? ownProps.length : 0;
|
|||
|
|
|||
|
while (++ownIndex < length) {
|
|||
|
index = ownProps[ownIndex];
|
|||
|
result[index] = callback ? callback(result[index], iterable[index]) : iterable[index];
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return result
|
|||
|
};
|
|||
|
|
|||
|
module.exports = assign;
|
|||
|
|
|||
|
},{"../internals/baseCreateCallback":47,"../internals/objectTypes":51,"./keys":62}],56:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var assign = require('./assign'),
|
|||
|
baseCreate = require('../internals/baseCreate');
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an object that inherits from the given `prototype` object. If a
|
|||
|
* `properties` object is provided its own enumerable properties are assigned
|
|||
|
* to the created object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @category Objects
|
|||
|
* @param {Object} prototype The object to inherit from.
|
|||
|
* @param {Object} [properties] The properties to assign to the object.
|
|||
|
* @returns {Object} Returns the new object.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* function Shape() {
|
|||
|
* this.x = 0;
|
|||
|
* this.y = 0;
|
|||
|
* }
|
|||
|
*
|
|||
|
* function Circle() {
|
|||
|
* Shape.call(this);
|
|||
|
* }
|
|||
|
*
|
|||
|
* Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });
|
|||
|
*
|
|||
|
* var circle = new Circle;
|
|||
|
* circle instanceof Circle;
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* circle instanceof Shape;
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function create(prototype, properties) {
|
|||
|
var result = baseCreate(prototype);
|
|||
|
return properties ? assign(result, properties) : result;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = create;
|
|||
|
|
|||
|
},{"../internals/baseCreate":46,"./assign":55}],57:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var baseCreateCallback = require('../internals/baseCreateCallback'),
|
|||
|
keys = require('./keys'),
|
|||
|
objectTypes = require('../internals/objectTypes');
|
|||
|
|
|||
|
/**
|
|||
|
* Iterates over own enumerable properties of an object, executing the callback
|
|||
|
* for each property. The callback is bound to `thisArg` and invoked with three
|
|||
|
* arguments; (value, key, object). Callbacks may exit iteration early by
|
|||
|
* explicitly returning `false`.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @type Function
|
|||
|
* @category Objects
|
|||
|
* @param {Object} object The object to iterate over.
|
|||
|
* @param {Function} [callback=identity] The function called per iteration.
|
|||
|
* @param {*} [thisArg] The `this` binding of `callback`.
|
|||
|
* @returns {Object} Returns `object`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.forOwn({ '0': 'zero', '1': 'one', 'length': 2 }, function(num, key) {
|
|||
|
* console.log(key);
|
|||
|
* });
|
|||
|
* // => logs '0', '1', and 'length' (property order is not guaranteed across environments)
|
|||
|
*/
|
|||
|
var forOwn = function(collection, callback, thisArg) {
|
|||
|
var index, iterable = collection, result = iterable;
|
|||
|
if (!iterable) return result;
|
|||
|
if (!objectTypes[typeof iterable]) return result;
|
|||
|
callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
|
|||
|
var ownIndex = -1,
|
|||
|
ownProps = objectTypes[typeof iterable] && keys(iterable),
|
|||
|
length = ownProps ? ownProps.length : 0;
|
|||
|
|
|||
|
while (++ownIndex < length) {
|
|||
|
index = ownProps[ownIndex];
|
|||
|
if (callback(iterable[index], index, collection) === false) return result;
|
|||
|
}
|
|||
|
return result
|
|||
|
};
|
|||
|
|
|||
|
module.exports = forOwn;
|
|||
|
|
|||
|
},{"../internals/baseCreateCallback":47,"../internals/objectTypes":51,"./keys":62}],58:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var isNative = require('../internals/isNative');
|
|||
|
|
|||
|
/** `Object#toString` result shortcuts */
|
|||
|
var arrayClass = '[object Array]';
|
|||
|
|
|||
|
/** Used for native method references */
|
|||
|
var objectProto = Object.prototype;
|
|||
|
|
|||
|
/** Used to resolve the internal [[Class]] of values */
|
|||
|
var toString = objectProto.toString;
|
|||
|
|
|||
|
/* Native method shortcuts for methods with the same name as other `lodash` methods */
|
|||
|
var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray;
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is an array.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @type Function
|
|||
|
* @category Objects
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if the `value` is an array, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* (function() { return _.isArray(arguments); })();
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isArray([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
var isArray = nativeIsArray || function(value) {
|
|||
|
return value && typeof value == 'object' && typeof value.length == 'number' &&
|
|||
|
toString.call(value) == arrayClass || false;
|
|||
|
};
|
|||
|
|
|||
|
module.exports = isArray;
|
|||
|
|
|||
|
},{"../internals/isNative":50}],59:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var forOwn = require('./forOwn'),
|
|||
|
isFunction = require('./isFunction');
|
|||
|
|
|||
|
/** `Object#toString` result shortcuts */
|
|||
|
var argsClass = '[object Arguments]',
|
|||
|
arrayClass = '[object Array]',
|
|||
|
objectClass = '[object Object]',
|
|||
|
stringClass = '[object String]';
|
|||
|
|
|||
|
/** Used for native method references */
|
|||
|
var objectProto = Object.prototype;
|
|||
|
|
|||
|
/** Used to resolve the internal [[Class]] of values */
|
|||
|
var toString = objectProto.toString;
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
|
|||
|
* length of `0` and objects with no own enumerable properties are considered
|
|||
|
* "empty".
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @category Objects
|
|||
|
* @param {Array|Object|string} value The value to inspect.
|
|||
|
* @returns {boolean} Returns `true` if the `value` is empty, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isEmpty([1, 2, 3]);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isEmpty({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isEmpty('');
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function isEmpty(value) {
|
|||
|
var result = true;
|
|||
|
if (!value) {
|
|||
|
return result;
|
|||
|
}
|
|||
|
var className = toString.call(value),
|
|||
|
length = value.length;
|
|||
|
|
|||
|
if ((className == arrayClass || className == stringClass || className == argsClass ) ||
|
|||
|
(className == objectClass && typeof length == 'number' && isFunction(value.splice))) {
|
|||
|
return !length;
|
|||
|
}
|
|||
|
forOwn(value, function() {
|
|||
|
return (result = false);
|
|||
|
});
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = isEmpty;
|
|||
|
|
|||
|
},{"./forOwn":57,"./isFunction":60}],60:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a function.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @category Objects
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if the `value` is a function, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isFunction(_);
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function isFunction(value) {
|
|||
|
return typeof value == 'function';
|
|||
|
}
|
|||
|
|
|||
|
module.exports = isFunction;
|
|||
|
|
|||
|
},{}],61:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var objectTypes = require('../internals/objectTypes');
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is the language type of Object.
|
|||
|
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @category Objects
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if the `value` is an object, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObject({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(1);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObject(value) {
|
|||
|
// check if the value is the ECMAScript language type of Object
|
|||
|
// http://es5.github.io/#x8
|
|||
|
// and avoid a V8 bug
|
|||
|
// http://code.google.com/p/v8/issues/detail?id=2291
|
|||
|
return !!(value && objectTypes[typeof value]);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = isObject;
|
|||
|
|
|||
|
},{"../internals/objectTypes":51}],62:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var isNative = require('../internals/isNative'),
|
|||
|
isObject = require('./isObject'),
|
|||
|
shimKeys = require('../internals/shimKeys');
|
|||
|
|
|||
|
/* Native method shortcuts for methods with the same name as other `lodash` methods */
|
|||
|
var nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an array composed of the own enumerable property names of an object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @category Objects
|
|||
|
* @param {Object} object The object to inspect.
|
|||
|
* @returns {Array} Returns an array of property names.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.keys({ 'one': 1, 'two': 2, 'three': 3 });
|
|||
|
* // => ['one', 'two', 'three'] (property order is not guaranteed across environments)
|
|||
|
*/
|
|||
|
var keys = !nativeKeys ? shimKeys : function(object) {
|
|||
|
if (!isObject(object)) {
|
|||
|
return [];
|
|||
|
}
|
|||
|
return nativeKeys(object);
|
|||
|
};
|
|||
|
|
|||
|
module.exports = keys;
|
|||
|
|
|||
|
},{"../internals/isNative":50,"../internals/shimKeys":53,"./isObject":61}],63:[function(require,module,exports){
|
|||
|
(function (global){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
var isNative = require('./internals/isNative');
|
|||
|
|
|||
|
/** Used to detect functions containing a `this` reference */
|
|||
|
var reThis = /\bthis\b/;
|
|||
|
|
|||
|
/**
|
|||
|
* An object used to flag environments features.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @type Object
|
|||
|
*/
|
|||
|
var support = {};
|
|||
|
|
|||
|
/**
|
|||
|
* Detect if functions can be decompiled by `Function#toString`
|
|||
|
* (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).
|
|||
|
*
|
|||
|
* @memberOf _.support
|
|||
|
* @type boolean
|
|||
|
*/
|
|||
|
support.funcDecomp = !isNative(global.WinRTError) && reThis.test(function() { return this; });
|
|||
|
|
|||
|
/**
|
|||
|
* Detect if `Function#name` is supported (all but IE).
|
|||
|
*
|
|||
|
* @memberOf _.support
|
|||
|
* @type boolean
|
|||
|
*/
|
|||
|
support.funcNames = typeof Function.name == 'string';
|
|||
|
|
|||
|
module.exports = support;
|
|||
|
|
|||
|
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|||
|
},{"./internals/isNative":50}],64:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* This method returns the first argument provided to it.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @category Utilities
|
|||
|
* @param {*} value Any value.
|
|||
|
* @returns {*} Returns `value`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'name': 'fred' };
|
|||
|
* _.identity(object) === object;
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function identity(value) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = identity;
|
|||
|
|
|||
|
},{}],65:[function(require,module,exports){
|
|||
|
/**
|
|||
|
* Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/>
|
|||
|
* Build: `lodash modularize modern exports="node" -o ./modern/`
|
|||
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
|||
|
* Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
* Available under MIT license <http://lodash.com/license>
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* A no-operation function.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @category Utilities
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'name': 'fred' };
|
|||
|
* _.noop(object) === undefined;
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function noop() {
|
|||
|
// no operation performed
|
|||
|
}
|
|||
|
|
|||
|
module.exports = noop;
|
|||
|
|
|||
|
},{}],66:[function(require,module,exports){
|
|||
|
var Bismarck, Canvas;
|
|||
|
|
|||
|
Canvas = require('./bismarck/canvas');
|
|||
|
|
|||
|
Bismarck = function(element, options) {
|
|||
|
if (typeof element === 'string') {
|
|||
|
return new Canvas(document.getElementById(element), options);
|
|||
|
} else {
|
|||
|
return new Canvas(element, options);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
Bismarck.debug = false;
|
|||
|
|
|||
|
module.exports = Bismarck;
|
|||
|
|
|||
|
if (typeof window !== "undefined" && window !== null) {
|
|||
|
window.Bismarck = Bismarck;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
},{"./bismarck/canvas":68}],67:[function(require,module,exports){
|
|||
|
var Animate,
|
|||
|
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
|||
|
|
|||
|
Animate = {
|
|||
|
_animationsEnabled: true,
|
|||
|
currentTime: function() {
|
|||
|
return +(new Date);
|
|||
|
},
|
|||
|
moveFromTo: function(object, from, to, distance) {
|
|||
|
var dx, dy, x, y;
|
|||
|
dx = to.x - from.x;
|
|||
|
dy = to.y - from.y;
|
|||
|
x = from.x + (dx * distance);
|
|||
|
y = from.y + (dy * distance);
|
|||
|
return object.moveTo(x, y);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
Animate.Synchronizer = (function() {
|
|||
|
function Synchronizer() {
|
|||
|
this.run = __bind(this.run, this);
|
|||
|
this.animations = [];
|
|||
|
this.recalcs = [];
|
|||
|
this.removers = [];
|
|||
|
this.isRunning = false;
|
|||
|
this.fpsLimit = 30;
|
|||
|
}
|
|||
|
|
|||
|
Synchronizer.prototype.addAnimation = function(recalc, animation) {
|
|||
|
this.animations.push(animation);
|
|||
|
this.recalcs.push(recalc);
|
|||
|
this.removers.push((function(_this) {
|
|||
|
return function() {
|
|||
|
return _this.removeAnimation(animation);
|
|||
|
};
|
|||
|
})(this));
|
|||
|
this.run();
|
|||
|
return (function(_this) {
|
|||
|
return function() {
|
|||
|
return _this.removeAnimation(animation);
|
|||
|
};
|
|||
|
})(this);
|
|||
|
};
|
|||
|
|
|||
|
Synchronizer.prototype.removeAnimation = function(animation) {
|
|||
|
var index;
|
|||
|
index = this.animations.indexOf(animation);
|
|||
|
this.animations.splice(index, 1);
|
|||
|
this.recalcs.splice(index, 1);
|
|||
|
this.removers.splice(index, 1);
|
|||
|
if (this.animations.length === 0) {
|
|||
|
return this.isRunning = false;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
Synchronizer.prototype.run = function() {
|
|||
|
if (!this.isRunning) {
|
|||
|
this.isRunning = true;
|
|||
|
}
|
|||
|
return window.requestAnimationFrame((function(_this) {
|
|||
|
return function() {
|
|||
|
var calc, endTime, i, r, startTime, _i, _j, _len, _ref, _ref1;
|
|||
|
if (_this.animations.length > 0) {
|
|||
|
startTime = Animate.currentTime();
|
|||
|
Animate._animationsDisabled = false;
|
|||
|
for (i = _i = 0, _ref = _this.animations.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
|
|||
|
if (_this.animations[i]) {
|
|||
|
_this.animations[i](startTime, _this.removers[i]);
|
|||
|
}
|
|||
|
}
|
|||
|
Animate._animationsDisabled = true;
|
|||
|
_ref1 = _this.recalcs;
|
|||
|
for (_j = 0, _len = _ref1.length; _j < _len; _j++) {
|
|||
|
r = _ref1[_j];
|
|||
|
r.recalc();
|
|||
|
}
|
|||
|
endTime = Animate.currentTime();
|
|||
|
if (_this.isRunning) {
|
|||
|
calc = Math.max(0, (1 / _this.fpsLimit - ((endTime - startTime) / 1000)) * 1000);
|
|||
|
return setTimeout(_this.run, calc);
|
|||
|
}
|
|||
|
} else {
|
|||
|
return _this.isRunning = false;
|
|||
|
}
|
|||
|
};
|
|||
|
})(this));
|
|||
|
};
|
|||
|
|
|||
|
return Synchronizer;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
Animate.synchronizer = new Animate.Synchronizer();
|
|||
|
|
|||
|
Animate.once = function(recalc, options, code) {
|
|||
|
var endTime, startTime;
|
|||
|
startTime = Animate.currentTime();
|
|||
|
endTime = startTime + options.duration;
|
|||
|
return Animate.synchronizer.addAnimation(recalc, function(currentTime, stop) {
|
|||
|
var index, result;
|
|||
|
index = Math.min(1, (currentTime - startTime) / options.duration);
|
|||
|
result = code(index);
|
|||
|
if (!result || currentTime >= endTime) {
|
|||
|
return stop();
|
|||
|
}
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
Animate.loop = function(recalc, options, code) {
|
|||
|
var startTime;
|
|||
|
startTime = Animate.currentTime();
|
|||
|
return Animate.synchronizer.addAnimation(recalc, function(currentTime, stop) {
|
|||
|
var index, result;
|
|||
|
index = Math.min(1, (currentTime - startTime) % options.duration / options.duration);
|
|||
|
result = code(index);
|
|||
|
if (!result) {
|
|||
|
return stop();
|
|||
|
}
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
module.exports = Animate;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
},{}],68:[function(require,module,exports){
|
|||
|
var Canvas, Drawable, Layout, Resources;
|
|||
|
|
|||
|
Drawable = require('./drawable');
|
|||
|
|
|||
|
Resources = require('./resources');
|
|||
|
|
|||
|
Layout = require('./layout');
|
|||
|
|
|||
|
Canvas = (function() {
|
|||
|
function Canvas(element, options) {
|
|||
|
this.element = element;
|
|||
|
if (options == null) {
|
|||
|
options = {};
|
|||
|
}
|
|||
|
this.snapElement = Snap(this.element);
|
|||
|
if (!this.snapElement.attr('bismarck')) {
|
|||
|
if (options.id) {
|
|||
|
this.snapElement.attr({
|
|||
|
id: options.id,
|
|||
|
bismarck: 'canvas'
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Canvas.prototype.fromLayout = function(xml, callback) {
|
|||
|
return Layout(xml, this, callback);
|
|||
|
};
|
|||
|
|
|||
|
Canvas.prototype.create = function(options) {
|
|||
|
var drawable;
|
|||
|
drawable = new Drawable(this, options);
|
|||
|
drawable.attachTo(this.snapElement);
|
|||
|
return drawable;
|
|||
|
};
|
|||
|
|
|||
|
Canvas.prototype.find = function(id) {
|
|||
|
var drawable;
|
|||
|
drawable = new Drawable(this);
|
|||
|
drawable.useExisting(this.snapElement.select("#" + id));
|
|||
|
return drawable;
|
|||
|
};
|
|||
|
|
|||
|
Canvas.prototype.resources = function() {
|
|||
|
if (this._resources) {
|
|||
|
return this._resources;
|
|||
|
}
|
|||
|
this._resources = new Resources(this);
|
|||
|
this._resources.attachTo(this.snapElement);
|
|||
|
return this._resources;
|
|||
|
};
|
|||
|
|
|||
|
return Canvas;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
module.exports = Canvas;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
},{"./drawable":69,"./layout":70,"./resources":71}],69:[function(require,module,exports){
|
|||
|
var Animate, Drawable,
|
|||
|
__hasProp = {}.hasOwnProperty,
|
|||
|
__slice = [].slice;
|
|||
|
|
|||
|
Animate = require('./animate');
|
|||
|
|
|||
|
Drawable = (function() {
|
|||
|
function Drawable(canvas, options) {
|
|||
|
var defaults, key, value;
|
|||
|
this.canvas = canvas;
|
|||
|
if (options == null) {
|
|||
|
options = {};
|
|||
|
}
|
|||
|
defaults = {
|
|||
|
centerPoint: 'northwest',
|
|||
|
position: {
|
|||
|
x: 0,
|
|||
|
y: 0
|
|||
|
},
|
|||
|
angle: 0,
|
|||
|
scale: 1
|
|||
|
};
|
|||
|
for (key in defaults) {
|
|||
|
if (!__hasProp.call(defaults, key)) continue;
|
|||
|
value = defaults[key];
|
|||
|
switch (key) {
|
|||
|
case 'centerPoint':
|
|||
|
this.setCenterPoint(value || defaults[key]);
|
|||
|
break;
|
|||
|
default:
|
|||
|
this[key] = value || defaults[key];
|
|||
|
}
|
|||
|
}
|
|||
|
for (key in options) {
|
|||
|
if (!__hasProp.call(options, key)) continue;
|
|||
|
value = options[key];
|
|||
|
switch (key) {
|
|||
|
case 'centerPoint':
|
|||
|
this.setCenterPoint(value || defaults[key]);
|
|||
|
break;
|
|||
|
default:
|
|||
|
this[key] = value || defaults[key];
|
|||
|
}
|
|||
|
}
|
|||
|
this._resources = this.canvas.resources();
|
|||
|
this._children = [];
|
|||
|
}
|
|||
|
|
|||
|
Drawable.prototype.resources = function() {
|
|||
|
return this._resources;
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.snapBBox = function() {
|
|||
|
return this._scale.getBBox(true);
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.create = function(options) {
|
|||
|
var drawable;
|
|||
|
drawable = new Drawable(this.canvas, options);
|
|||
|
drawable.attachTo(this._scale);
|
|||
|
drawable.parentDrawable = this;
|
|||
|
this._children.push(drawable);
|
|||
|
return drawable;
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.remove = function() {
|
|||
|
return this._translateRotate.remove();
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.attachTo = function(snapElement) {
|
|||
|
this._translateRotate = snapElement.group().addClass('-translate');
|
|||
|
this._scale = this._translateRotate.group().addClass('-scale');
|
|||
|
this._translateRotate.attr({
|
|||
|
id: this.id,
|
|||
|
bismarck: 'drawable'
|
|||
|
});
|
|||
|
this._currentBBox = this.snapBBox();
|
|||
|
return this.snapElement = this._translateRotate;
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.forceSize = function(w, h) {
|
|||
|
var me;
|
|||
|
if (this._forcedSize) {
|
|||
|
this._forcedSize.remove();
|
|||
|
}
|
|||
|
this._forcedDims = {
|
|||
|
w: w,
|
|||
|
h: h
|
|||
|
};
|
|||
|
this._forcedSize = this._translateRotate.rect(0, 0, w, h).attr({
|
|||
|
fill: 'rgba(0,0,0,0)'
|
|||
|
});
|
|||
|
me = this._forcedSize.node;
|
|||
|
return this._translateRotate.node.insertBefore(me, this._translateRotate.node.childNodes[0]);
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.useExisting = function(_translateRotate) {
|
|||
|
var childNodes, currentNode;
|
|||
|
this._translateRotate = _translateRotate;
|
|||
|
if (!this._translateRotate.attr('bismarck')) {
|
|||
|
throw "Not a Bismarck element!";
|
|||
|
}
|
|||
|
childNodes = this._translateRotate.node.childNodes;
|
|||
|
this._scale = Snap(childNodes[0]);
|
|||
|
if (childNodes[1]) {
|
|||
|
this.centerPointCross = Snap(childNodes[1]);
|
|||
|
}
|
|||
|
currentNode = this._translateRotate.node.parentNode;
|
|||
|
while (currentNode) {
|
|||
|
switch (currentNode.getAttribute('bismarck')) {
|
|||
|
case 'drawable':
|
|||
|
this.parentDrawable = new Drawable(this.canvas, {});
|
|||
|
this.parentDrawable.useExisting(Snap(currentNode));
|
|||
|
currentNode = null;
|
|||
|
break;
|
|||
|
case 'canvas':
|
|||
|
currentNode = null;
|
|||
|
break;
|
|||
|
default:
|
|||
|
if (currentNode.nodeName === 'svg') {
|
|||
|
currentNode = null;
|
|||
|
} else {
|
|||
|
currentNode = currentNode.parentNode;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return angular.extend(this, this._translateRotate.data('settings'));
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.showCenterPoint = function() {
|
|||
|
this.centerPointCross = this._translateRotate.group();
|
|||
|
this.centerPointCross.line(0, -5, 0, 5).attr({
|
|||
|
stroke: 'black'
|
|||
|
});
|
|||
|
this.centerPointCross.line(-5, 0, 5, 0).attr({
|
|||
|
stroke: 'black'
|
|||
|
});
|
|||
|
return this.recalc();
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.moveTo = function(x, y) {
|
|||
|
this.position = {
|
|||
|
x: x,
|
|||
|
y: y
|
|||
|
};
|
|||
|
return this.recalc();
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.rotateTo = function(angle) {
|
|||
|
this.angle = angle;
|
|||
|
return this.recalc();
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.scaleTo = function(scale) {
|
|||
|
this.scale = scale;
|
|||
|
return this.recalc();
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.alignTo = function() {
|
|||
|
var args, how, object;
|
|||
|
object = arguments[0], how = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
|
|||
|
if (how == null) {
|
|||
|
how = 'center';
|
|||
|
}
|
|||
|
switch (how) {
|
|||
|
case 'center':
|
|||
|
return this.moveTo.apply(this, [object.position.x, object.position.y].concat(__slice.call(args)));
|
|||
|
case 'horizontal':
|
|||
|
return this.moveTo.apply(this, [this.position.x, object.position.y].concat(__slice.call(args)));
|
|||
|
case 'vertical':
|
|||
|
return this.moveTo.apply(this, [object.position.x, this.position.y].concat(__slice.call(args)));
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.centerInParent = function() {
|
|||
|
this._centerInParent = true;
|
|||
|
this.setCenterPoint('center');
|
|||
|
return this.recalc(true);
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.recalc = function(down) {
|
|||
|
var child, matrix, offset, parent, upperLeft, _i, _len, _ref, _results;
|
|||
|
if (down == null) {
|
|||
|
down = false;
|
|||
|
}
|
|||
|
if (Animate._animationsEnabled) {
|
|||
|
if (this._centerInParent) {
|
|||
|
parent = this.parentDrawable.getDimensions();
|
|||
|
this.position = {
|
|||
|
x: parent.w / 2,
|
|||
|
y: parent.h / 2
|
|||
|
};
|
|||
|
}
|
|||
|
if (this.oldScale !== this.scale) {
|
|||
|
matrix = new Snap.Matrix();
|
|||
|
matrix.scale(this.scale);
|
|||
|
this._scale.transform(matrix);
|
|||
|
this.oldScale = this.scale;
|
|||
|
}
|
|||
|
offset = this.getOffset();
|
|||
|
upperLeft = this.upperLeft();
|
|||
|
if (this.centerPointCross != null) {
|
|||
|
matrix = new Snap.Matrix();
|
|||
|
matrix.translate(offset.x + upperLeft.x, offset.y + upperLeft.y);
|
|||
|
this.centerPointCross.transform(matrix);
|
|||
|
}
|
|||
|
matrix = new Snap.Matrix();
|
|||
|
matrix.translate(this.position.x, this.position.y);
|
|||
|
matrix.rotate(this.angle, 0, 0);
|
|||
|
if (!this._forcedSize) {
|
|||
|
matrix.translate(-offset.x - upperLeft.x, -offset.y - upperLeft.y);
|
|||
|
}
|
|||
|
this._translateRotate.transform(matrix);
|
|||
|
if (false) {
|
|||
|
this._translateRotate.data('settings', {
|
|||
|
centerPoint: this.centerPoint,
|
|||
|
position: this.position,
|
|||
|
angle: this.angle,
|
|||
|
scale: this.scale,
|
|||
|
_currentBBox: this._currentBBox,
|
|||
|
_centerInParent: this._centerInParent,
|
|||
|
_forcedDims: this._forcedDims,
|
|||
|
_children: this._children
|
|||
|
});
|
|||
|
}
|
|||
|
if (down) {
|
|||
|
_ref = this._children;
|
|||
|
_results = [];
|
|||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|||
|
child = _ref[_i];
|
|||
|
_results.push(child.recalc(true));
|
|||
|
}
|
|||
|
return _results;
|
|||
|
} else {
|
|||
|
if (this.parentDrawable != null) {
|
|||
|
return this.parentDrawable.recalc();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.moveForward = function() {
|
|||
|
var i, l, me, parent, _i, _results;
|
|||
|
me = this._translateRotate.node;
|
|||
|
parent = me.parentNode;
|
|||
|
l = parent.childNodes.length - 1;
|
|||
|
_results = [];
|
|||
|
for (i = _i = 0; 0 <= l ? _i <= l : _i >= l; i = 0 <= l ? ++_i : --_i) {
|
|||
|
if (parent.childNodes[i] === me && i < l) {
|
|||
|
_results.push(parent.insertBefore(parent.childNodes[i + 1], me));
|
|||
|
} else {
|
|||
|
_results.push(void 0);
|
|||
|
}
|
|||
|
}
|
|||
|
return _results;
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.moveBackward = function() {
|
|||
|
var i, me, parent, _i, _ref, _results;
|
|||
|
me = this._translateRotate.node;
|
|||
|
parent = me.parentNode;
|
|||
|
_results = [];
|
|||
|
for (i = _i = 0, _ref = parent.childNodes.length; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
|
|||
|
if (parent.childNodes[i] === me && i > 0) {
|
|||
|
_results.push(parent.insertBefore(me, parent.childNodes[i - 1]));
|
|||
|
} else {
|
|||
|
_results.push(void 0);
|
|||
|
}
|
|||
|
}
|
|||
|
return _results;
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.moveToFront = function() {
|
|||
|
var me;
|
|||
|
me = this._translateRotate.node;
|
|||
|
return me.parent.appendChild(me);
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.moveToBack = function() {
|
|||
|
var me;
|
|||
|
me = this._translateRotate.node;
|
|||
|
return me.parent.insertBefore(me, me.parent.childNodes[0]);
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.on = function() {
|
|||
|
var args, code, event, target, targetSelector;
|
|||
|
event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
|||
|
code = args.pop();
|
|||
|
targetSelector = args.shift();
|
|||
|
target = this._translateRotate;
|
|||
|
if (targetSelector != null) {
|
|||
|
target = target.select(targetSelector);
|
|||
|
}
|
|||
|
return target[event](code);
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.draw = function(code) {
|
|||
|
code(this._scale);
|
|||
|
this.recalc();
|
|||
|
return this._currentBBox = this.snapBBox();
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.scaleAndRotateCoords = function(coords) {
|
|||
|
var cos, newH, newW, pairs, rad2ang, radianAngle, sin;
|
|||
|
pairs = coords.w != null ? ['w', 'h'] : ['x', 'y'];
|
|||
|
coords[pairs[0]] *= this.scale;
|
|||
|
coords[pairs[1]] *= this.scale;
|
|||
|
rad2ang = Math.PI / 180;
|
|||
|
radianAngle = rad2ang * this.angle;
|
|||
|
cos = Math.cos(radianAngle);
|
|||
|
sin = Math.sin(radianAngle);
|
|||
|
newW = coords[pairs[0]] * cos + coords[pairs[1]] * sin;
|
|||
|
newH = coords[pairs[1]] * cos + coords[pairs[0]] * sin;
|
|||
|
coords[pairs[0]] = newW;
|
|||
|
coords[pairs[1]] = newh;
|
|||
|
return coords;
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.getOffset = function() {
|
|||
|
var coordPart, output, source, _i, _len, _ref;
|
|||
|
output = {};
|
|||
|
source = this._children.length > 0 ? this.getDimensions() : this._currentBBox;
|
|||
|
_ref = this.centerPoint;
|
|||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|||
|
coordPart = _ref[_i];
|
|||
|
output[coordPart.which] = coordPart.convert(source[coordPart.dim]);
|
|||
|
}
|
|||
|
return output;
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.upperLeft = function() {
|
|||
|
var child, furthestUpperLeft, offset, _i, _len, _ref;
|
|||
|
if (this._children.length === 0) {
|
|||
|
return {
|
|||
|
x: 0,
|
|||
|
y: 0
|
|||
|
};
|
|||
|
} else {
|
|||
|
furthestUpperLeft = {
|
|||
|
x: null,
|
|||
|
y: null
|
|||
|
};
|
|||
|
_ref = this._children;
|
|||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|||
|
child = _ref[_i];
|
|||
|
offset = child.getOffset();
|
|||
|
offset.x = -offset.x + child.position.x;
|
|||
|
offset.y = -offset.y + child.position.y;
|
|||
|
if (!furthestUpperLeft.x) {
|
|||
|
furthestUpperLeft.x = offset.x;
|
|||
|
furthestUpperLeft.y = offset.y;
|
|||
|
} else {
|
|||
|
furthestUpperLeft.x = Math.min(furthestUpperLeft.x, offset.x);
|
|||
|
furthestUpperLeft.y = Math.min(furthestUpperLeft.y, offset.y);
|
|||
|
}
|
|||
|
}
|
|||
|
return furthestUpperLeft;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.setCenterPoint = function() {
|
|||
|
var args, coordMap, data;
|
|||
|
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
|||
|
if (args.length === 1) {
|
|||
|
args = (function() {
|
|||
|
switch (args[0]) {
|
|||
|
case 'center':
|
|||
|
return ['50%', '50%'];
|
|||
|
case 'northwest':
|
|||
|
return [0, 0];
|
|||
|
}
|
|||
|
})();
|
|||
|
}
|
|||
|
this.coordinates = {};
|
|||
|
data = [
|
|||
|
{
|
|||
|
index: 0,
|
|||
|
which: 'x',
|
|||
|
dim: 'w'
|
|||
|
}, {
|
|||
|
index: 1,
|
|||
|
which: 'y',
|
|||
|
dim: 'h'
|
|||
|
}
|
|||
|
];
|
|||
|
coordMap = function(datum) {
|
|||
|
var percent;
|
|||
|
datum.value = args[datum.index];
|
|||
|
if ((datum.value.substr != null) && datum.value.substr(-1) === '%') {
|
|||
|
percent = Number(datum.value.slice(0, -1)) / 100.0;
|
|||
|
datum.convert = function(value) {
|
|||
|
return value * percent;
|
|||
|
};
|
|||
|
} else {
|
|||
|
datum.convert = function(value) {
|
|||
|
return datum.value;
|
|||
|
};
|
|||
|
}
|
|||
|
return datum;
|
|||
|
};
|
|||
|
return this.centerPoint = data.map(coordMap);
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.getDimensions = function() {
|
|||
|
if (this._forcedDims) {
|
|||
|
return this._forcedDims;
|
|||
|
} else {
|
|||
|
if (this._children.length > 0) {
|
|||
|
return this.getDimensionsWithChildren();
|
|||
|
} else {
|
|||
|
return this._currentBBox;
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.getDimensionsWithChildren = function() {
|
|||
|
var bbox, child, childBBox, childOffset, _i, _len, _ref;
|
|||
|
bbox = {
|
|||
|
sx: null,
|
|||
|
sy: null,
|
|||
|
ex: null,
|
|||
|
ey: null
|
|||
|
};
|
|||
|
_ref = this._children;
|
|||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
|||
|
child = _ref[_i];
|
|||
|
childBBox = child.getDimensions();
|
|||
|
childOffset = child.getOffset();
|
|||
|
childBBox.x = child.position.x - childOffset.x;
|
|||
|
childBBox.y = child.position.y - childOffset.y;
|
|||
|
if (bbox.sx === null) {
|
|||
|
bbox.sx = childBBox.x;
|
|||
|
bbox.sy = childBBox.y;
|
|||
|
bbox.ex = childBBox.x + childBBox.w;
|
|||
|
bbox.ey = childBBox.y + childBBox.h;
|
|||
|
} else {
|
|||
|
bbox.sx = Math.min(bbox.sx, childBBox.x);
|
|||
|
bbox.sy = Math.min(bbox.sy, childBBox.y);
|
|||
|
bbox.ex = Math.max(bbox.ex, childBBox.x + childBBox.w);
|
|||
|
bbox.ey = Math.max(bbox.ey, childBBox.y + childBBox.h);
|
|||
|
}
|
|||
|
}
|
|||
|
return {
|
|||
|
w: bbox.ex - bbox.sx,
|
|||
|
h: bbox.ey - bbox.sy
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
Drawable.prototype.append = function(drawable) {
|
|||
|
return this._translateRotate.append(drawable._scaleRotate);
|
|||
|
};
|
|||
|
|
|||
|
return Drawable;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
module.exports = Drawable;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
},{"./animate":67}],70:[function(require,module,exports){
|
|||
|
var dive, oneOrMore, parseString, svgObjs, xml2js, _,
|
|||
|
__hasProp = {}.hasOwnProperty;
|
|||
|
|
|||
|
xml2js = require('xml2js');
|
|||
|
|
|||
|
parseString = require('xml2js').parseString;
|
|||
|
|
|||
|
_ = require('underscore');
|
|||
|
|
|||
|
svgObjs = {
|
|||
|
rect: function(options, canvas) {
|
|||
|
var rect;
|
|||
|
rect = canvas.rect(options.x, options.y, options.width, options.height);
|
|||
|
rect.attr(_.omit(options, 'x', 'y', 'width', 'height'));
|
|||
|
return rect;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
oneOrMore = function(value, code) {
|
|||
|
var node, _i, _len, _results;
|
|||
|
if (value.push != null) {
|
|||
|
_results = [];
|
|||
|
for (_i = 0, _len = value.length; _i < _len; _i++) {
|
|||
|
node = value[_i];
|
|||
|
_results.push(code(node));
|
|||
|
}
|
|||
|
return _results;
|
|||
|
} else {
|
|||
|
return code(value);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
dive = function(node, drawable, topLevel) {
|
|||
|
var key, value;
|
|||
|
if (topLevel == null) {
|
|||
|
topLevel = null;
|
|||
|
}
|
|||
|
for (key in node) {
|
|||
|
if (!__hasProp.call(node, key)) continue;
|
|||
|
value = node[key];
|
|||
|
switch (key) {
|
|||
|
case 'drawable':
|
|||
|
oneOrMore(value, function(v) {
|
|||
|
var childDrawable;
|
|||
|
childDrawable = drawable.create(v.$);
|
|||
|
topLevel || (topLevel = childDrawable);
|
|||
|
return dive(v, childDrawable, topLevel);
|
|||
|
});
|
|||
|
break;
|
|||
|
case '$':
|
|||
|
break;
|
|||
|
default:
|
|||
|
oneOrMore(value, function(v) {
|
|||
|
drawable.draw(function(svg) {
|
|||
|
return svgObjs[key](v.$, svg);
|
|||
|
});
|
|||
|
return dive(v, drawable, topLevel);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
return topLevel;
|
|||
|
};
|
|||
|
|
|||
|
module.exports = function(xml, canvas, callback) {
|
|||
|
if (callback == null) {
|
|||
|
callback = null;
|
|||
|
}
|
|||
|
return parseString(xml, function(err, result) {
|
|||
|
var diveResult;
|
|||
|
if (err != null) {
|
|||
|
throw err;
|
|||
|
} else {
|
|||
|
diveResult = dive(result, canvas);
|
|||
|
if (callback) {
|
|||
|
return callback(diveResult);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
},{"underscore":22,"xml2js":25}],71:[function(require,module,exports){
|
|||
|
var Resources,
|
|||
|
__slice = [].slice;
|
|||
|
|
|||
|
Resources = (function() {
|
|||
|
function Resources(canvas) {
|
|||
|
this.canvas = canvas;
|
|||
|
this.resources = {};
|
|||
|
this.bboxes = {};
|
|||
|
}
|
|||
|
|
|||
|
Resources.prototype.attachTo = function(snapElement) {
|
|||
|
return this.resourceGroup = snapElement.group().attr({
|
|||
|
display: 'none'
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
Resources.prototype.copyIDsFrom = function() {
|
|||
|
var id, ids, node, snapElement, _i, _len, _results;
|
|||
|
snapElement = arguments[0], ids = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
|||
|
_results = [];
|
|||
|
for (_i = 0, _len = ids.length; _i < _len; _i++) {
|
|||
|
id = ids[_i];
|
|||
|
node = snapElement.select("#" + id);
|
|||
|
node.transform('');
|
|||
|
this.resourceGroup.append(node);
|
|||
|
_results.push(this.resources[id] = node);
|
|||
|
}
|
|||
|
return _results;
|
|||
|
};
|
|||
|
|
|||
|
Resources.prototype.clone = function(id) {
|
|||
|
return this.resources[id].use();
|
|||
|
};
|
|||
|
|
|||
|
Resources.prototype.copy = function(id) {
|
|||
|
return this.resources[id].clone();
|
|||
|
};
|
|||
|
|
|||
|
Resources.prototype.bbox = function(id) {
|
|||
|
var _base;
|
|||
|
return (_base = this.bboxes)[id] || (_base[id] = this.resources[id].getBBox());
|
|||
|
};
|
|||
|
|
|||
|
return Resources;
|
|||
|
|
|||
|
})();
|
|||
|
|
|||
|
module.exports = Resources;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
},{}]},{},[66])
|
|||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2J1ZmZlci9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2xpYi9iNjQuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnVmZmVyL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2J1ZmZlci9ub2RlX21vZHVsZXMvaXMtYXJyYXkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9kdXBsZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaC5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3RyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vd3JpdGFibGUuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvc3RyZWFtLWJyb3dzZXJpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdW5kZXJzY29yZS91bmRlcnNjb3JlLmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9saWIvYm9tLmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9saWIvcHJvY2Vzc29ycy5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbGliL3htbDJqcy5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbm9kZV9tb2R1bGVzL3NheC9saWIvc2F4LmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9ub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MQXR0cmlidXRlLmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9ub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MQnVpbGRlci5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTENEYXRhLmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9ub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MQ29tbWVudC5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERUREF0dExpc3QuanMiLCJub2RlX21vZHVsZXMveG1sMmpzL25vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxEVERFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9ub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRFRERW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9ub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MRFRETm90YXRpb24uanMiLCJub2RlX21vZHVsZXMveG1sMmpzL25vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxEZWNsYXJhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTERvY1R5cGUuanMiLCJub2RlX21vZHVsZXMveG1sMmpzL25vZGVfbW9kdWxlcy94bWxidWlsZGVyL2xpYi9YTUxFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9ub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFByb2Nlc3NpbmdJbnN0cnVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFJhdy5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL1hNTFN0cmluZ2lmaWVyLmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9ub2RlX21vZHVsZXMveG1sYnVpbGRlci9saWIvWE1MVGV4dC5qcyIsIm5vZGVfbW9kdWxlcy94bWwyanMvbm9kZV9tb2R1bGVzL3htbGJ1aWxkZXIvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9ub2RlX21vZHVsZXMveG1sYnVpbGRlci9ub2RlX21vZHVsZXMvbG9kYXNoLW5vZGUvbW9kZXJuL2Z1bmN0aW9ucy9iaW5kLmpzIiwibm9kZV9tb2R1bGVzL3htbDJqcy9ub2RlX21vZHVsZXMveG1sYnVpbGRlci9ub2RlX21vZHVsZXMvbG9kY
|