geojson2svg
Advanced tools
Comparing version 0.0.4 to 0.0.5
!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var o;"undefined"!=typeof window?o=window:"undefined"!=typeof global?o=global:"undefined"!=typeof self&&(o=self),o.geojson2svg=e()}}(function(){var define,module,exports;return (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);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.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(_dereq_,module,exports){ | ||
(function (Buffer){ | ||
"use strict"; | ||
function objectToString(o) { | ||
return Object.prototype.toString.call(o); | ||
} | ||
var util = { | ||
isArray: function (ar) { | ||
return Array.isArray(ar) || (typeof ar === 'object' && objectToString(ar) === '[object Array]'); | ||
}, | ||
isDate: function (d) { | ||
return typeof d === 'object' && objectToString(d) === '[object Date]'; | ||
}, | ||
isRegExp: function (re) { | ||
return typeof re === 'object' && objectToString(re) === '[object RegExp]'; | ||
}, | ||
getRegExpFlags: function (re) { | ||
var flags = ''; | ||
re.global && (flags += 'g'); | ||
re.ignoreCase && (flags += 'i'); | ||
re.multiline && (flags += 'm'); | ||
return flags; | ||
} | ||
}; | ||
if (typeof module === 'object') | ||
module.exports = clone; | ||
/** | ||
* Clones (copies) an Object using deep copying. | ||
* | ||
* This function supports circular references by default, but if you are certain | ||
* there are no circular references in your object, you can save some CPU time | ||
* by calling clone(obj, false). | ||
* | ||
* Caution: if `circular` is false and `parent` contains circular references, | ||
* your program may enter an infinite loop and crash. | ||
* | ||
* @param `parent` - the object to be cloned | ||
* @param `circular` - set to true if the object to be cloned may contain | ||
* circular references. (optional - true by default) | ||
*/ | ||
function clone(parent, circular) { | ||
if (typeof circular == 'undefined') | ||
circular = true; | ||
var useBuffer = typeof Buffer != 'undefined'; | ||
var circularParent = {}; | ||
var circularResolved = {}; | ||
var circularReplace = []; | ||
function _clone(parent, context, child, cIndex) { | ||
var i; // Use local context within this function | ||
// Deep clone all properties of parent into child | ||
if (typeof parent == 'object') { | ||
if (parent == null) | ||
return parent; | ||
// Check for circular references | ||
for(i in circularParent) | ||
if (circularParent[i] === parent) { | ||
// We found a circular reference | ||
circularReplace.push({'resolveTo': i, 'child': child, 'i': cIndex}); | ||
return null; //Just return null for now... | ||
// we will resolve circular references later | ||
} | ||
// Add to list of all parent objects | ||
circularParent[context] = parent; | ||
// Now continue cloning... | ||
if (util.isArray(parent)) { | ||
child = []; | ||
for(i in parent) | ||
child[i] = _clone(parent[i], context + '[' + i + ']', child, i); | ||
} | ||
else if (util.isDate(parent)) | ||
child = new Date(parent.getTime()); | ||
else if (util.isRegExp(parent)) { | ||
child = new RegExp(parent.source, util.getRegExpFlags(parent)); | ||
if (parent.lastIndex) child.lastIndex = parent.lastIndex; | ||
} else if (useBuffer && Buffer.isBuffer(parent)) | ||
{ | ||
child = new Buffer(parent.length); | ||
parent.copy(child); | ||
} | ||
else { | ||
child = {}; | ||
// Also copy prototype over to new cloned object | ||
child.__proto__ = parent.__proto__; | ||
for(i in parent) | ||
child[i] = _clone(parent[i], context + '[' + i + ']', child, i); | ||
} | ||
// Add to list of all cloned objects | ||
circularResolved[context] = child; | ||
} | ||
else | ||
child = parent; //Just a simple shallow copy will do | ||
return child; | ||
} | ||
var i; | ||
if (circular) { | ||
var cloned = _clone(parent, '*'); | ||
// Now this object has been cloned. Let's check to see if there are any | ||
// circular references for it | ||
for(i in circularReplace) { | ||
var c = circularReplace[i]; | ||
if (c && c.child && c.i in c.child) { | ||
c.child[c.i] = circularResolved[c.resolveTo]; | ||
} | ||
} | ||
return cloned; | ||
} else { | ||
// Deep clone all properties of parent into child | ||
var child; | ||
if (typeof parent == 'object') { | ||
if (parent == null) | ||
return parent; | ||
if (parent.constructor.name === 'Array') { | ||
child = []; | ||
for(i in parent) | ||
child[i] = clone(parent[i], circular); | ||
} | ||
else if (util.isDate(parent)) | ||
child = new Date(parent.getTime() ); | ||
else if (util.isRegExp(parent)) { | ||
child = new RegExp(parent.source, util.getRegExpFlags(parent)); | ||
if (parent.lastIndex) child.lastIndex = parent.lastIndex; | ||
} else { | ||
child = {}; | ||
child.__proto__ = parent.__proto__; | ||
for(i in parent) | ||
child[i] = clone(parent[i], circular); | ||
} | ||
} | ||
else | ||
child = parent; // Just a simple shallow clone will do | ||
return child; | ||
} | ||
} | ||
/** | ||
* Simple flat clone using prototype, accepts only objects, usefull for property | ||
* override on FLAT configuration object (no nested props). | ||
* | ||
* USE WITH CAUTION! This may not behave as you wish if you do not know how this | ||
* works. | ||
*/ | ||
clone.clonePrototype = function(parent) { | ||
if (parent === null) | ||
return null; | ||
var c = function () {}; | ||
c.prototype = parent; | ||
return new c(); | ||
}; | ||
}).call(this,_dereq_("buffer").Buffer) | ||
},{"buffer":7}],2:[function(_dereq_,module,exports){ | ||
/*! | ||
@@ -85,3 +248,3 @@ * Node.JS module "Deep Extend" | ||
},{}],2:[function(_dereq_,module,exports){ | ||
},{}],3:[function(_dereq_,module,exports){ | ||
//index.js | ||
@@ -137,3 +300,3 @@ (function() { | ||
},{}],3:[function(_dereq_,module,exports){ | ||
},{}],4:[function(_dereq_,module,exports){ | ||
//converter.js | ||
@@ -170,3 +333,3 @@ var multi = _dereq_('multigeojson'); | ||
}); | ||
if(!explode) return [paths.join(' ')] | ||
if(!explode) return [paths.join(' ')]; | ||
return paths; | ||
@@ -185,3 +348,3 @@ | ||
}); | ||
if(!explode) return [paths.join(' ')] | ||
if(!explode) return [paths.join(' ')]; | ||
return paths; | ||
@@ -221,12 +384,13 @@ } | ||
},{"multigeojson":2}],4:[function(_dereq_,module,exports){ | ||
},{"multigeojson":3}],5:[function(_dereq_,module,exports){ | ||
var extend = _dereq_('deep-extend'), | ||
clone = _dereq_('clone'), | ||
converter = _dereq_('./converter.js'); | ||
//g2svg as geojson2svg (shorthand) | ||
var g2svg = function(viewportSize,opt) { | ||
var g2svg = function(viewportSize,options) { | ||
if(!viewportSize) return; | ||
this.viewportSize = viewportSize; | ||
var opt = opt || {}; | ||
this.mapExtent = opt.mapExtent | ||
this.options = options || {}; | ||
this.mapExtent = this.options.mapExtent | ||
|| {'left':-180,'bottom':-90,'right':180,'top':90}; | ||
@@ -241,3 +405,3 @@ this.res = this.calResolution(this.mapExtent,this.viewportSize); | ||
g2svg.prototype.convert = function(geojson,options) { | ||
var options = options || {}; | ||
var opt = extend(clone(this.options), options || {}); | ||
var multiGeometries = ['MultiPoint','MultiLineString','MultiPolygon']; | ||
@@ -249,23 +413,22 @@ var geometries = ['Point', 'LineString', 'Polygon']; | ||
svgElements = svgElements.concat( | ||
this.convertFeature(geojson.features[i],options)); | ||
this.convertFeature(geojson.features[i],opt)); | ||
} | ||
} else if (geojson.type == 'Feature') { | ||
svgElements = this.convertFeature(geojson,options); | ||
svgElements = this.convertFeature(geojson,opt); | ||
} else if (geojson.type == 'GeomtryCollection') { | ||
for(var i=0; i< geojson.geometries.length; i++) { | ||
svgElements = svgElements.concat( | ||
this.convertGeometry(geojson.geometries[i],options)); | ||
this.convertGeometry(geojson.geometries[i],opt)); | ||
} | ||
} else if (converter[geojson.type]) { | ||
svgElements = this.convertGeometry(geojson,options); | ||
svgElements = this.convertGeometry(geojson,opt); | ||
} else { | ||
return; | ||
} | ||
if(options.callback) options.callback.call(this,svgElements); | ||
if(opt.callback) opt.callback.call(this,svgElements); | ||
return svgElements; | ||
}; | ||
g2svg.prototype.convertFeature = function(feature,options) { | ||
if(!feature.geometry) return; | ||
var opt = {}; | ||
extend(opt,options); | ||
if(!feature && !feature.geometry) return; | ||
var opt = extend(clone(this.options), options || {}); | ||
opt.attributes = opt.attributes || {}; | ||
@@ -275,5 +438,5 @@ opt.attributes.id = opt.attributes.id || feature.id || null; | ||
}; | ||
g2svg.prototype.convertGeometry = function(geom,opt) { | ||
g2svg.prototype.convertGeometry = function(geom,options) { | ||
if(converter[geom.type]) { | ||
var opt = opt || {}; | ||
var opt = extend(clone(this.options), options || {}); | ||
//var explode = opt.hasOwnProperty('explode') ? opt.explode : false; | ||
@@ -335,3 +498,3 @@ var paths = converter[geom.type].call(this,geom, | ||
},{"./converter.js":3,"deep-extend":1}],5:[function(_dereq_,module,exports){ | ||
},{"./converter.js":4,"clone":1,"deep-extend":2}],6:[function(_dereq_,module,exports){ | ||
var g2svg = _dereq_('./instance.js'); | ||
@@ -345,7 +508,1329 @@ var geojson2svg = function(viewportSize,options) { | ||
},{"./instance.js":4}]},{},[5]) | ||
},{"./instance.js":5}],7:[function(_dereq_,module,exports){ | ||
/** | ||
* The buffer module from node.js, for the browser. | ||
* | ||
* Author: Feross Aboukhadijeh <feross@feross.org> <http://feross.org> | ||
* License: MIT | ||
* | ||
* `npm install buffer` | ||
*/ | ||
(5) | ||
var base64 = _dereq_('base64-js') | ||
var ieee754 = _dereq_('ieee754') | ||
exports.Buffer = Buffer | ||
exports.SlowBuffer = Buffer | ||
exports.INSPECT_MAX_BYTES = 50 | ||
Buffer.poolSize = 8192 | ||
/** | ||
* If `Buffer._useTypedArrays`: | ||
* === true Use Uint8Array implementation (fastest) | ||
* === false Use Object implementation (compatible down to IE6) | ||
*/ | ||
Buffer._useTypedArrays = (function () { | ||
// Detect if browser supports Typed Arrays. Supported browsers are IE 10+, Firefox 4+, | ||
// Chrome 7+, Safari 5.1+, Opera 11.6+, iOS 4.2+. If the browser does not support adding | ||
// properties to `Uint8Array` instances, then that's the same as no `Uint8Array` support | ||
// because we need to be able to add all the node Buffer API methods. This is an issue | ||
// in Firefox 4-29. Now fixed: https://bugzilla.mozilla.org/show_bug.cgi?id=695438 | ||
try { | ||
var buf = new ArrayBuffer(0) | ||
var arr = new Uint8Array(buf) | ||
arr.foo = function () { return 42 } | ||
return 42 === arr.foo() && | ||
typeof arr.subarray === 'function' // Chrome 9-10 lack `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 | ||
// Workaround: node's base64 implementation allows for non-padded strings | ||
// while base64-js does not. | ||
if (encoding === 'base64' && type === 'string') { | ||
subject = stringtrim(subject) | ||
while (subject.length % 4 !== 0) { | ||
subject = subject + '=' | ||
} | ||
} | ||
// Find the length | ||
var length | ||
if (type === 'number') | ||
length = coerce(subject) | ||
else if (type === 'string') | ||
length = Buffer.byteLength(subject, encoding) | ||
else if (type === 'object') | ||
length = coerce(subject.length) // assume that object is array-like | ||
else | ||
throw new Error('First argument needs to be a number, array or string.') | ||
var buf | ||
if (Buffer._useTypedArrays) { | ||
// 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._useTypedArrays && 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 | ||
for (i = 0; i < length; i++) { | ||
if (Buffer.isBuffer(subject)) | ||
buf[i] = subject.readUInt8(i) | ||
else | ||
buf[i] = subject[i] | ||
} | ||
} else if (type === 'string') { | ||
buf.write(subject, 0, encoding) | ||
} else if (type === 'number' && !Buffer._useTypedArrays && !noZero) { | ||
for (i = 0; i < length; i++) { | ||
buf[i] = 0 | ||
} | ||
} | ||
return buf | ||
} | ||
// STATIC METHODS | ||
// ============== | ||
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.isBuffer = function (b) { | ||
return !!(b !== null && b !== undefined && b._isBuffer) | ||
} | ||
Buffer.byteLength = function (str, encoding) { | ||
var ret | ||
str = str + '' | ||
switch (encoding || 'utf8') { | ||
case 'hex': | ||
ret = str.length / 2 | ||
break | ||
case 'utf8': | ||
case 'utf-8': | ||
ret = utf8ToBytes(str).length | ||
break | ||
case 'ascii': | ||
case 'binary': | ||
case 'raw': | ||
ret = str.length | ||
break | ||
case 'base64': | ||
ret = base64ToBytes(str).length | ||
break | ||
case 'ucs2': | ||
case 'ucs-2': | ||
case 'utf16le': | ||
case 'utf-16le': | ||
ret = str.length * 2 | ||
break | ||
default: | ||
throw new Error('Unknown encoding') | ||
} | ||
return ret | ||
} | ||
Buffer.concat = function (list, totalLength) { | ||
assert(isArray(list), 'Usage: Buffer.concat(list, [totalLength])\n' + | ||
'list should be an Array.') | ||
if (list.length === 0) { | ||
return new Buffer(0) | ||
} else if (list.length === 1) { | ||
return list[0] | ||
} | ||
var i | ||
if (typeof totalLength !== 'number') { | ||
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 INSTANCE METHODS | ||
// ======================= | ||
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 | ||
assert(strLen % 2 === 0, '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) | ||
assert(!isNaN(byte), 'Invalid hex string') | ||
buf[offset + i] = byte | ||
} | ||
Buffer._charsWritten = i * 2 | ||
return i | ||
} | ||
function _utf8Write (buf, string, offset, length) { | ||
var charsWritten = Buffer._charsWritten = | ||
blitBuffer(utf8ToBytes(string), buf, offset, length) | ||
return charsWritten | ||
} | ||
function _asciiWrite (buf, string, offset, length) { | ||
var charsWritten = Buffer._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 = Buffer._charsWritten = | ||
blitBuffer(base64ToBytes(string), buf, offset, length) | ||
return charsWritten | ||
} | ||
function _utf16leWrite (buf, string, offset, length) { | ||
var charsWritten = Buffer._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 Error('Unknown encoding') | ||
} | ||
return ret | ||
} | ||
Buffer.prototype.toString = function (encoding, start, end) { | ||
var self = this | ||
encoding = String(encoding || 'utf8').toLowerCase() | ||
start = Number(start) || 0 | ||
end = (end !== undefined) | ||
? Number(end) | ||
: end = self.length | ||
// Fastpath empty strings | ||
if (end === start) | ||
return '' | ||
var ret | ||
switch (encoding) { | ||
case 'hex': | ||
ret = _hexSlice(self, start, end) | ||
break | ||
case 'utf8': | ||
case 'utf-8': | ||
ret = _utf8Slice(self, start, end) | ||
break | ||
case 'ascii': | ||
ret = _asciiSlice(self, start, end) | ||
break | ||
case 'binary': | ||
ret = _binarySlice(self, start, end) | ||
break | ||
case 'base64': | ||
ret = _base64Slice(self, start, end) | ||
break | ||
case 'ucs2': | ||
case 'ucs-2': | ||
case 'utf16le': | ||
case 'utf-16le': | ||
ret = _utf16leSlice(self, start, end) | ||
break | ||
default: | ||
throw new Error('Unknown encoding') | ||
} | ||
return ret | ||
} | ||
Buffer.prototype.toJSON = function () { | ||
return { | ||
type: 'Buffer', | ||
data: Array.prototype.slice.call(this._arr || this, 0) | ||
} | ||
} | ||
// 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 | ||
assert(end >= start, 'sourceEnd < sourceStart') | ||
assert(target_start >= 0 && target_start < target.length, | ||
'targetStart out of bounds') | ||
assert(start >= 0 && start < source.length, 'sourceStart out of bounds') | ||
assert(end >= 0 && end <= source.length, '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._useTypedArrays) { | ||
for (var i = 0; i < len; i++) | ||
target[i + target_start] = this[i + start] | ||
} else { | ||
target._set(this.subarray(start, start + len), target_start) | ||
} | ||
} | ||
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 = clamp(start, len, 0) | ||
end = clamp(end, len, len) | ||
if (Buffer._useTypedArrays) { | ||
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 | ||
} | ||
} | ||
// `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) | ||
} | ||
Buffer.prototype.readUInt8 = function (offset, noAssert) { | ||
if (!noAssert) { | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset < this.length, 'Trying to read beyond buffer length') | ||
} | ||
if (offset >= this.length) | ||
return | ||
return this[offset] | ||
} | ||
function _readUInt16 (buf, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 1 < buf.length, 'Trying to read beyond buffer length') | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
var val | ||
if (littleEndian) { | ||
val = buf[offset] | ||
if (offset + 1 < len) | ||
val |= buf[offset + 1] << 8 | ||
} else { | ||
val = buf[offset] << 8 | ||
if (offset + 1 < len) | ||
val |= buf[offset + 1] | ||
} | ||
return val | ||
} | ||
Buffer.prototype.readUInt16LE = function (offset, noAssert) { | ||
return _readUInt16(this, offset, true, noAssert) | ||
} | ||
Buffer.prototype.readUInt16BE = function (offset, noAssert) { | ||
return _readUInt16(this, offset, false, noAssert) | ||
} | ||
function _readUInt32 (buf, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 3 < buf.length, 'Trying to read beyond buffer length') | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
var val | ||
if (littleEndian) { | ||
if (offset + 2 < len) | ||
val = buf[offset + 2] << 16 | ||
if (offset + 1 < len) | ||
val |= buf[offset + 1] << 8 | ||
val |= buf[offset] | ||
if (offset + 3 < len) | ||
val = val + (buf[offset + 3] << 24 >>> 0) | ||
} else { | ||
if (offset + 1 < len) | ||
val = buf[offset + 1] << 16 | ||
if (offset + 2 < len) | ||
val |= buf[offset + 2] << 8 | ||
if (offset + 3 < len) | ||
val |= buf[offset + 3] | ||
val = val + (buf[offset] << 24 >>> 0) | ||
} | ||
return val | ||
} | ||
Buffer.prototype.readUInt32LE = function (offset, noAssert) { | ||
return _readUInt32(this, offset, true, noAssert) | ||
} | ||
Buffer.prototype.readUInt32BE = function (offset, noAssert) { | ||
return _readUInt32(this, offset, false, noAssert) | ||
} | ||
Buffer.prototype.readInt8 = function (offset, noAssert) { | ||
if (!noAssert) { | ||
assert(offset !== undefined && offset !== null, | ||
'missing offset') | ||
assert(offset < this.length, 'Trying to read beyond buffer length') | ||
} | ||
if (offset >= this.length) | ||
return | ||
var neg = this[offset] & 0x80 | ||
if (neg) | ||
return (0xff - this[offset] + 1) * -1 | ||
else | ||
return this[offset] | ||
} | ||
function _readInt16 (buf, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 1 < buf.length, 'Trying to read beyond buffer length') | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
var val = _readUInt16(buf, offset, littleEndian, true) | ||
var neg = val & 0x8000 | ||
if (neg) | ||
return (0xffff - val + 1) * -1 | ||
else | ||
return val | ||
} | ||
Buffer.prototype.readInt16LE = function (offset, noAssert) { | ||
return _readInt16(this, offset, true, noAssert) | ||
} | ||
Buffer.prototype.readInt16BE = function (offset, noAssert) { | ||
return _readInt16(this, offset, false, noAssert) | ||
} | ||
function _readInt32 (buf, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 3 < buf.length, 'Trying to read beyond buffer length') | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
var val = _readUInt32(buf, offset, littleEndian, true) | ||
var neg = val & 0x80000000 | ||
if (neg) | ||
return (0xffffffff - val + 1) * -1 | ||
else | ||
return val | ||
} | ||
Buffer.prototype.readInt32LE = function (offset, noAssert) { | ||
return _readInt32(this, offset, true, noAssert) | ||
} | ||
Buffer.prototype.readInt32BE = function (offset, noAssert) { | ||
return _readInt32(this, offset, false, noAssert) | ||
} | ||
function _readFloat (buf, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset + 3 < buf.length, 'Trying to read beyond buffer length') | ||
} | ||
return ieee754.read(buf, offset, littleEndian, 23, 4) | ||
} | ||
Buffer.prototype.readFloatLE = function (offset, noAssert) { | ||
return _readFloat(this, offset, true, noAssert) | ||
} | ||
Buffer.prototype.readFloatBE = function (offset, noAssert) { | ||
return _readFloat(this, offset, false, noAssert) | ||
} | ||
function _readDouble (buf, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset + 7 < buf.length, 'Trying to read beyond buffer length') | ||
} | ||
return ieee754.read(buf, offset, littleEndian, 52, 8) | ||
} | ||
Buffer.prototype.readDoubleLE = function (offset, noAssert) { | ||
return _readDouble(this, offset, true, noAssert) | ||
} | ||
Buffer.prototype.readDoubleBE = function (offset, noAssert) { | ||
return _readDouble(this, offset, false, noAssert) | ||
} | ||
Buffer.prototype.writeUInt8 = function (value, offset, noAssert) { | ||
if (!noAssert) { | ||
assert(value !== undefined && value !== null, 'missing value') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset < this.length, 'trying to write beyond buffer length') | ||
verifuint(value, 0xff) | ||
} | ||
if (offset >= this.length) return | ||
this[offset] = value | ||
} | ||
function _writeUInt16 (buf, value, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(value !== undefined && value !== null, 'missing value') | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 1 < buf.length, 'trying to write beyond buffer length') | ||
verifuint(value, 0xffff) | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
for (var i = 0, j = Math.min(len - 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) { | ||
_writeUInt16(this, value, offset, true, noAssert) | ||
} | ||
Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) { | ||
_writeUInt16(this, value, offset, false, noAssert) | ||
} | ||
function _writeUInt32 (buf, value, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(value !== undefined && value !== null, 'missing value') | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 3 < buf.length, 'trying to write beyond buffer length') | ||
verifuint(value, 0xffffffff) | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
for (var i = 0, j = Math.min(len - offset, 4); i < j; i++) { | ||
buf[offset + i] = | ||
(value >>> (littleEndian ? i : 3 - i) * 8) & 0xff | ||
} | ||
} | ||
Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) { | ||
_writeUInt32(this, value, offset, true, noAssert) | ||
} | ||
Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) { | ||
_writeUInt32(this, value, offset, false, noAssert) | ||
} | ||
Buffer.prototype.writeInt8 = function (value, offset, noAssert) { | ||
if (!noAssert) { | ||
assert(value !== undefined && value !== null, 'missing value') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset < this.length, 'Trying to write beyond buffer length') | ||
verifsint(value, 0x7f, -0x80) | ||
} | ||
if (offset >= this.length) | ||
return | ||
if (value >= 0) | ||
this.writeUInt8(value, offset, noAssert) | ||
else | ||
this.writeUInt8(0xff + value + 1, offset, noAssert) | ||
} | ||
function _writeInt16 (buf, value, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(value !== undefined && value !== null, 'missing value') | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 1 < buf.length, 'Trying to write beyond buffer length') | ||
verifsint(value, 0x7fff, -0x8000) | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
if (value >= 0) | ||
_writeUInt16(buf, value, offset, littleEndian, noAssert) | ||
else | ||
_writeUInt16(buf, 0xffff + value + 1, offset, littleEndian, noAssert) | ||
} | ||
Buffer.prototype.writeInt16LE = function (value, offset, noAssert) { | ||
_writeInt16(this, value, offset, true, noAssert) | ||
} | ||
Buffer.prototype.writeInt16BE = function (value, offset, noAssert) { | ||
_writeInt16(this, value, offset, false, noAssert) | ||
} | ||
function _writeInt32 (buf, value, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(value !== undefined && value !== null, 'missing value') | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 3 < buf.length, 'Trying to write beyond buffer length') | ||
verifsint(value, 0x7fffffff, -0x80000000) | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
if (value >= 0) | ||
_writeUInt32(buf, value, offset, littleEndian, noAssert) | ||
else | ||
_writeUInt32(buf, 0xffffffff + value + 1, offset, littleEndian, noAssert) | ||
} | ||
Buffer.prototype.writeInt32LE = function (value, offset, noAssert) { | ||
_writeInt32(this, value, offset, true, noAssert) | ||
} | ||
Buffer.prototype.writeInt32BE = function (value, offset, noAssert) { | ||
_writeInt32(this, value, offset, false, noAssert) | ||
} | ||
function _writeFloat (buf, value, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(value !== undefined && value !== null, 'missing value') | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 3 < buf.length, 'Trying to write beyond buffer length') | ||
verifIEEE754(value, 3.4028234663852886e+38, -3.4028234663852886e+38) | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
ieee754.write(buf, value, offset, littleEndian, 23, 4) | ||
} | ||
Buffer.prototype.writeFloatLE = function (value, offset, noAssert) { | ||
_writeFloat(this, value, offset, true, noAssert) | ||
} | ||
Buffer.prototype.writeFloatBE = function (value, offset, noAssert) { | ||
_writeFloat(this, value, offset, false, noAssert) | ||
} | ||
function _writeDouble (buf, value, offset, littleEndian, noAssert) { | ||
if (!noAssert) { | ||
assert(value !== undefined && value !== null, 'missing value') | ||
assert(typeof littleEndian === 'boolean', 'missing or invalid endian') | ||
assert(offset !== undefined && offset !== null, 'missing offset') | ||
assert(offset + 7 < buf.length, | ||
'Trying to write beyond buffer length') | ||
verifIEEE754(value, 1.7976931348623157E+308, -1.7976931348623157E+308) | ||
} | ||
var len = buf.length | ||
if (offset >= len) | ||
return | ||
ieee754.write(buf, value, offset, littleEndian, 52, 8) | ||
} | ||
Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) { | ||
_writeDouble(this, value, offset, true, noAssert) | ||
} | ||
Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) { | ||
_writeDouble(this, value, offset, false, noAssert) | ||
} | ||
// 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 (typeof value === 'string') { | ||
value = value.charCodeAt(0) | ||
} | ||
assert(typeof value === 'number' && !isNaN(value), 'value is not a number') | ||
assert(end >= start, 'end < start') | ||
// Fill 0 bytes; we're done | ||
if (end === start) return | ||
if (this.length === 0) return | ||
assert(start >= 0 && start < this.length, 'start out of bounds') | ||
assert(end >= 0 && end <= this.length, 'end out of bounds') | ||
for (var i = start; i < end; i++) { | ||
this[i] = value | ||
} | ||
} | ||
Buffer.prototype.inspect = function () { | ||
var out = [] | ||
var len = this.length | ||
for (var i = 0; i < len; i++) { | ||
out[i] = toHex(this[i]) | ||
if (i === exports.INSPECT_MAX_BYTES) { | ||
out[i + 1] = '...' | ||
break | ||
} | ||
} | ||
return '<Buffer ' + out.join(' ') + '>' | ||
} | ||
/** | ||
* 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._useTypedArrays) { | ||
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 Error('Buffer.toArrayBuffer not supported in this browser') | ||
} | ||
} | ||
// HELPER FUNCTIONS | ||
// ================ | ||
function stringtrim (str) { | ||
if (str.trim) return str.trim() | ||
return str.replace(/^\s+|\s+$/g, '') | ||
} | ||
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.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 | ||
} | ||
// slice(start, end) | ||
function clamp (index, len, defaultValue) { | ||
if (typeof index !== 'number') return defaultValue | ||
index = ~~index; // Coerce to integer. | ||
if (index >= len) return len | ||
if (index >= 0) return index | ||
index += len | ||
if (index >= 0) return index | ||
return 0 | ||
} | ||
function coerce (length) { | ||
// Coerce length to a number (possibly NaN), round up | ||
// in case it's fractional (e.g. 123.456) then do a | ||
// double negate to coerce a NaN to 0. Easy, right? | ||
length = ~~Math.ceil(+length) | ||
return length < 0 ? 0 : length | ||
} | ||
function isArray (subject) { | ||
return (Array.isArray || function (subject) { | ||
return Object.prototype.toString.call(subject) === '[object Array]' | ||
})(subject) | ||
} | ||
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(str.charCodeAt(i)) | ||
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) { | ||
var pos | ||
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 | ||
} | ||
} | ||
/* | ||
* We have to make sure that the value is a valid integer. This means that it | ||
* is non-negative. It has no fractional component and that it does not | ||
* exceed the maximum allowed value. | ||
*/ | ||
function verifuint (value, max) { | ||
assert(typeof value === 'number', 'cannot write a non-number as a number') | ||
assert(value >= 0, 'specified a negative value for writing an unsigned value') | ||
assert(value <= max, 'value is larger than maximum value for type') | ||
assert(Math.floor(value) === value, 'value has a fractional component') | ||
} | ||
function verifsint (value, max, min) { | ||
assert(typeof value === 'number', 'cannot write a non-number as a number') | ||
assert(value <= max, 'value larger than maximum allowed value') | ||
assert(value >= min, 'value smaller than minimum allowed value') | ||
assert(Math.floor(value) === value, 'value has a fractional component') | ||
} | ||
function verifIEEE754 (value, max, min) { | ||
assert(typeof value === 'number', 'cannot write a non-number as a number') | ||
assert(value <= max, 'value larger than maximum allowed value') | ||
assert(value >= min, 'value smaller than minimum allowed value') | ||
} | ||
function assert (test, message) { | ||
if (!test) throw new Error(message || 'Failed assertion') | ||
} | ||
},{"base64-js":8,"ieee754":9}],8:[function(_dereq_,module,exports){ | ||
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | ||
;(function (exports) { | ||
'use strict'; | ||
var Arr = (typeof Uint8Array !== 'undefined') | ||
? Uint8Array | ||
: Array | ||
var ZERO = '0'.charCodeAt(0) | ||
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 | ||
} | ||
module.exports.toByteArray = b64ToByteArray | ||
module.exports.fromByteArray = uint8ToBase64 | ||
}()) | ||
},{}],9:[function(_dereq_,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; | ||
}; | ||
},{}]},{},[6]) | ||
(6) | ||
}); | ||
//# sourceMappingURL=geojson2svg.js.map |
@@ -31,3 +31,2 @@ //code from https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started | ||
if (httpRequest.status === 200) { | ||
console.log(httpRequest.responseText.type); | ||
handler.call(this,httpRequest.responseText); | ||
@@ -34,0 +33,0 @@ } else { |
{ | ||
"name": "geojson2svg", | ||
"version": "0.0.4", | ||
"version": "0.0.5", | ||
"description": "Converts geojson to svg/path string given svg viewport size and maps extent.", | ||
@@ -31,3 +31,6 @@ "main": "src/main.js", | ||
"jsdom": "~0.10.5" | ||
}, | ||
"scripts": { | ||
"test": "mocha" | ||
} | ||
} |
@@ -1,4 +0,81 @@ | ||
Converts geojson to svg/path string given svg viewport size and maps extent. | ||
# geojson2svg | ||
Converts geojson to svg or path data string given svg viewport size and maps extent. | ||
License | ||
## Installation | ||
Using in node.js or with browserify | ||
``` | ||
npm install geojson2svg | ||
``` | ||
For including in html page standard way, download file dist/geojson2svg.js | ||
```html | ||
<script type="text/javascipt" src="path/to/geojson2svg.js"></script> | ||
``` | ||
This create a global variable 'geojson2svg' | ||
## Usage | ||
Using in node.js or with browserify | ||
```javascript | ||
var geojson2svg = require('geojson2svg'); | ||
var converter = geojson2svg(viewportSize,options); | ||
var svgString = converter.convert(geojson,options); | ||
``` | ||
Using in browser standard way | ||
``` | ||
var converter = geojson2svg(viewportSize,options); | ||
var svgString = converter.convert(geojson,options); | ||
``` | ||
**viewportSize** is object containing width and height in pixels - {width: 200, height: 100} | ||
**mapExtent** is critical option default is ```{left: -180, bottom: -90, right: 180, top: 90}``` geographic extent, if set as default that means your data is in geographic coordinate system and output svg string would be without any projection used. For the projected data specify map extent(mapExtent) in the projected coordinate system e.g. for Spherical Mercator that is used by Google Maps, use extent as ```{left: -20037508.34,bottom: -20037508.34, right: 20037508.34, top: 20037508.34}```. | ||
In case the geojsons are in geographic coordinates and you want to project the data, use [reproject](https://github.com/perliedman/reproject) or [proj4js](https://github.com/proj4js/proj4js). | ||
**convert** function returns array of svg/path data string | ||
### Examples | ||
Converts geojson LineString to svg element string: | ||
``` | ||
var converter = geojson2svg({width: 200, height: 100}, | ||
{ | ||
mapExtent: {left: -180, bottom: -90, right: 180, top: 90}, | ||
output: 'svg' | ||
} | ||
); | ||
var svgString = converter.convert( | ||
{type:'LineString',coordinates:[[10,10],[15,20],[30,10]]} | ||
); | ||
//svgString: ['<path d="M105.55555555555556,44.44444444444444 108.33333333333333,38.888888888888886 116.66666666666666,44.44444444444444" />'] | ||
``` | ||
Converts geojson Polygon to svg path data 'd' string: | ||
``` | ||
var converter = geojson2svg({width: 200, height: 100}, | ||
{ | ||
output: 'path' //default is path | ||
} | ||
); | ||
var pathData = converter.convert( | ||
{ | ||
"type": "Polygon", | ||
"coordinates": [ | ||
[[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] | ||
] | ||
} | ||
); | ||
// pathData: ['M116.66666666666666,44.44444444444444 122.22222222222221,27.77777777777778 111.11111111111111,27.77777777777778 105.55555555555556,38.888888888888886 116.66666666666666,44.44444444444444Z'] | ||
``` | ||
### Options | ||
* **mapExtent:** {"left": coordinate, "bottom": coordinate, "right": coordinate, "top": coordinate}. Coordinates should be in same projection as of geojson | ||
* **output:** 'svg'|'path' default is 'path' | ||
path - path 'd' value is returned 'M0,0 20,10 106,40' a linestring | ||
svg - svg element string is returned like '<path d="M0,0 20,10 106,40"/>' | ||
* **explode:** true|false default is false. Should multigeojson be exploded to many svg elements or not. | ||
* **attributes:** json object containing attribute(key) and values(value) for all svg elements. These attributes would be added for output:'svg' option like attributes: {"class": "mapstyle"} returned string would be '<path class="mapstyle" d="M0,0 20,10 106,40"/>' | ||
* **pointAsCircle:** true|false default is false, for point geojson return cirlce element for output:'svg' like '<cirlce cx="30" cy="40" r="1" />'; when output:'path' out string is '30,40' | ||
* **r:** radius of point svg element | ||
* **callback:** function, accept function that will be called on every geojson conversion with output string as one input variable e.g ```parseSVG(svg) { //do some thing}``` | ||
**Options for each geojson:** | ||
**output, exlpode, attributes, pointAsCircle, r** if passed in **convert** function along with each geojson overrides the main options | ||
##License | ||
This project is licensed under the terms of the MIT license. |
@@ -32,3 +32,3 @@ //converter.js | ||
}); | ||
if(!explode) return [paths.join(' ')] | ||
if(!explode) return [paths.join(' ')]; | ||
return paths; | ||
@@ -47,3 +47,3 @@ | ||
}); | ||
if(!explode) return [paths.join(' ')] | ||
if(!explode) return [paths.join(' ')]; | ||
return paths; | ||
@@ -50,0 +50,0 @@ } |
var extend = require('deep-extend'), | ||
clone = require('clone'), | ||
converter = require('./converter.js'); | ||
//g2svg as geojson2svg (shorthand) | ||
var g2svg = function(viewportSize,opt) { | ||
var g2svg = function(viewportSize,options) { | ||
if(!viewportSize) return; | ||
this.viewportSize = viewportSize; | ||
var opt = opt || {}; | ||
this.mapExtent = opt.mapExtent | ||
this.options = options || {}; | ||
this.mapExtent = this.options.mapExtent | ||
|| {'left':-180,'bottom':-90,'right':180,'top':90}; | ||
@@ -19,3 +20,3 @@ this.res = this.calResolution(this.mapExtent,this.viewportSize); | ||
g2svg.prototype.convert = function(geojson,options) { | ||
var options = options || {}; | ||
var opt = extend(clone(this.options), options || {}); | ||
var multiGeometries = ['MultiPoint','MultiLineString','MultiPolygon']; | ||
@@ -27,23 +28,22 @@ var geometries = ['Point', 'LineString', 'Polygon']; | ||
svgElements = svgElements.concat( | ||
this.convertFeature(geojson.features[i],options)); | ||
this.convertFeature(geojson.features[i],opt)); | ||
} | ||
} else if (geojson.type == 'Feature') { | ||
svgElements = this.convertFeature(geojson,options); | ||
svgElements = this.convertFeature(geojson,opt); | ||
} else if (geojson.type == 'GeomtryCollection') { | ||
for(var i=0; i< geojson.geometries.length; i++) { | ||
svgElements = svgElements.concat( | ||
this.convertGeometry(geojson.geometries[i],options)); | ||
this.convertGeometry(geojson.geometries[i],opt)); | ||
} | ||
} else if (converter[geojson.type]) { | ||
svgElements = this.convertGeometry(geojson,options); | ||
svgElements = this.convertGeometry(geojson,opt); | ||
} else { | ||
return; | ||
} | ||
if(options.callback) options.callback.call(this,svgElements); | ||
if(opt.callback) opt.callback.call(this,svgElements); | ||
return svgElements; | ||
}; | ||
g2svg.prototype.convertFeature = function(feature,options) { | ||
if(!feature.geometry) return; | ||
var opt = {}; | ||
extend(opt,options); | ||
if(!feature && !feature.geometry) return; | ||
var opt = extend(clone(this.options), options || {}); | ||
opt.attributes = opt.attributes || {}; | ||
@@ -53,5 +53,5 @@ opt.attributes.id = opt.attributes.id || feature.id || null; | ||
}; | ||
g2svg.prototype.convertGeometry = function(geom,opt) { | ||
g2svg.prototype.convertGeometry = function(geom,options) { | ||
if(converter[geom.type]) { | ||
var opt = opt || {}; | ||
var opt = extend(clone(this.options), options || {}); | ||
//var explode = opt.hasOwnProperty('explode') ? opt.explode : false; | ||
@@ -58,0 +58,0 @@ var paths = converter[geom.type].call(this,geom, |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Native code
Supply chain riskContains native code (e.g., compiled binaries or shared libraries). Including native code can obscure malicious behavior.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1565117
25
8018
82
1