mapshaper 0.7.21 → 0.7.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/mapshaper.js CHANGED
@@ -34267,7 +34267,8 @@ ${svg}
34267
34267
 
34268
34268
  var EOF; // undefined is used as an EOF marker
34269
34269
 
34270
- var RESERVE = 4096; // RESERVE is the number of bytes to keep in read buffer
34270
+ // Default number of bytes to keep in the read buffer.
34271
+ var RESERVE_DEFAULT = 4096;
34271
34272
  var BUFLEN = 1e7; // buffer chunk size
34272
34273
  var MAX_STRLEN = 5e6; // max byte len of a value string (object keys are shorter)
34273
34274
 
@@ -34300,12 +34301,10 @@ ${svg}
34300
34301
  function parseGeoJSON(reader, cb) {
34301
34302
  var src = ByteReader(reader, 0);
34302
34303
  var isObject = seekObjectStart(src);
34303
- var type;
34304
34304
  if (!isObject) {
34305
34305
  stop$1('File is not GeoJSON');
34306
34306
  }
34307
- type = readTopLevelType(src);
34308
- var obj = readObject(src, cb, type);
34307
+ var obj = readObject(src, cb);
34309
34308
  if (obj.type == 'FeatureCollection' || obj.type == 'GeometryCollection') {
34310
34309
  return obj;
34311
34310
  }
@@ -34354,8 +34353,9 @@ ${svg}
34354
34353
 
34355
34354
  function seekObjectStart(src) {
34356
34355
  var c = src.getChar();
34356
+ var reserve = src.getReserve();
34357
34357
  var i = 0;
34358
- while (c != EOF && i < RESERVE) {
34358
+ while (c != EOF && i < reserve) {
34359
34359
  i++;
34360
34360
  if (c == LBRACE) {
34361
34361
  src.back();
@@ -34386,17 +34386,6 @@ ${svg}
34386
34386
  return arr;
34387
34387
  }
34388
34388
 
34389
- function skipArray(src) {
34390
- var c;
34391
- eatChar(src, LBRACK);
34392
- c = scanForSyntaxChar(src, RBRACK);
34393
- while (c != RBRACK) {
34394
- src.refresh();
34395
- skipValue(src);
34396
- c = scanForAorB(src, COMMA, RBRACK);
34397
- }
34398
- }
34399
-
34400
34389
  function readCollectionArray(src, cb) {
34401
34390
  var c;
34402
34391
  eatChar(src, LBRACK);
@@ -34485,18 +34474,6 @@ ${svg}
34485
34474
  return val;
34486
34475
  }
34487
34476
 
34488
- function skipValue(src) {
34489
- var c = src.peek();
34490
- if (isFirstNumChar(c)) readNumber(src);
34491
- else if (c == LBRACK) skipArray(src);
34492
- else if (c == DQUOTE) readString(src);
34493
- else if (c == LBRACE) skipObject(src);
34494
- else if (c == 110) readNull(src); // "n" -> null
34495
- else if (c == 116) readTrue(src); // "t" -> true
34496
- else if (c == 102) readFalse(src); // "f" -> false
34497
- else unexpectedCharAt(c, src.index());
34498
- }
34499
-
34500
34477
  function readTrue(src) {
34501
34478
  eatChars(src, 'true');
34502
34479
  return true;
@@ -34523,7 +34500,7 @@ ${svg}
34523
34500
 
34524
34501
  // cb: optional callback for returning GeoJSON features or geometries
34525
34502
  //
34526
- function readObject(src, cb, type) {
34503
+ function readObject(src, cb) {
34527
34504
  var o = {};
34528
34505
  var key, c;
34529
34506
  eatChar(src, LBRACE);
@@ -34534,8 +34511,7 @@ ${svg}
34534
34511
  skipWS(src);
34535
34512
  eatChar(src, 58); // ":"
34536
34513
  skipWS(src);
34537
- if ((type == 'FeatureCollection' && key == 'features' ||
34538
- type == 'GeometryCollection' && key == 'geometries') &&
34514
+ if ((key == 'features' || key == 'geometries') &&
34539
34515
  src.peek() == LBRACK && cb) {
34540
34516
  readCollectionArray(src, cb);
34541
34517
  o[key] = null;
@@ -34549,53 +34525,11 @@ ${svg}
34549
34525
  return o;
34550
34526
  }
34551
34527
 
34552
- function skipObject(src) {
34553
- var c;
34554
- eatChar(src, LBRACE);
34555
- c = scanForSyntaxChar(src, RBRACE);
34556
- while (c != RBRACE) {
34557
- src.refresh();
34558
- readKeywordString(src);
34559
- skipWS(src);
34560
- eatChar(src, 58); // ":"
34561
- skipWS(src);
34562
- skipValue(src);
34563
- c = scanForAorB(src, COMMA, RBRACE);
34564
- }
34565
- }
34566
-
34567
- function readTopLevelType(src) {
34568
- var i = src.index();
34569
- var type, key, c;
34570
- eatChar(src, LBRACE);
34571
- c = scanForSyntaxChar(src, RBRACE);
34572
- while (c != RBRACE) {
34573
- src.refresh();
34574
- key = readKeywordString(src);
34575
- skipWS(src);
34576
- eatChar(src, 58); // ":"
34577
- skipWS(src);
34578
- if (key == 'type' && src.peek() == DQUOTE) {
34579
- type = readKeywordString(src);
34580
- break;
34581
- }
34582
- skipValue(src);
34583
- c = scanForAorB(src, COMMA, RBRACE);
34584
- }
34585
- src.index(i);
34586
- return type;
34587
- }
34588
-
34589
- function growReserve() {
34590
- RESERVE *= 2;
34591
- return RESERVE <= MAX_STRLEN;
34592
- }
34593
-
34594
34528
  // Uses caching to speed up parsing of repeated strings.
34595
34529
  // The caching scheme used here can give a 20% overall speed improvement
34596
34530
  // when parsing files consisting mostly of attribute data (e.g. typical Point features)
34597
34531
  function readKeywordString(src) {
34598
- var MAXLEN = 2000; // must be less than RESERVE
34532
+ var MAXLEN = 2000; // must be less than RESERVE_DEFAULT
34599
34533
  var i = src.index();
34600
34534
  var cache = src.cache;
34601
34535
  var escapeNext = false;
@@ -34653,7 +34587,7 @@ ${svg}
34653
34587
  // Fallback for reading long strings, escaped strings, non-ascii strings, etc.
34654
34588
  function readString_slow(src) {
34655
34589
  src.refresh();
34656
- var LIMIT = RESERVE - 2;
34590
+ var LIMIT = src.getReserve() - 2;
34657
34591
  var i = src.index();
34658
34592
  var n = 0;
34659
34593
  var escapeNext = false;
@@ -34665,7 +34599,7 @@ ${svg}
34665
34599
  if (n > LIMIT) {
34666
34600
  // we've exceeded the number of reserved bytes
34667
34601
  // expand the limit and try reading this string again
34668
- if (c == EOF || !growReserve()) {
34602
+ if (c == EOF || !src.growReserve()) {
34669
34603
  stringOverflow(i, c);
34670
34604
  }
34671
34605
  src.index(i);
@@ -34783,9 +34717,10 @@ ${svg}
34783
34717
  function ByteReader(reader, start) {
34784
34718
  var fileLen = reader.size();
34785
34719
  var bufOffs = start;
34720
+ var reserve = RESERVE_DEFAULT; // per-instance reserve; may grow (see growReserve)
34786
34721
  var buf = reader.readSync(bufOffs, BUFLEN);
34787
34722
  var i = 0;
34788
- var obj = { peek, getChar, advance, back, toString, index, refresh };
34723
+ var obj = { peek, getChar, advance, back, toString, index, refresh, getReserve, growReserve };
34789
34724
  obj.cache = []; // kludgy place to put the key cache
34790
34725
  refresh();
34791
34726
  return obj;
@@ -34793,14 +34728,14 @@ ${svg}
34793
34728
  // This function should be called to make sure that the buffer has enough
34794
34729
  // bytes remaining to read any reasonable JSON content.
34795
34730
  function refresh() {
34796
- // if RESERVE bytes are still available in the buffer, no update is required
34797
- if (buf.length - i >= RESERVE) return;
34731
+ // if reserve bytes are still available in the buffer, no update is required
34732
+ if (buf.length - i >= reserve) return;
34798
34733
 
34799
34734
  // CHANGE: now using undefined as an EOF marker, so a bounds check is unneeded
34800
34735
  // // if we're close to the end of the file, start checking for overflow
34801
34736
  // // (we don't do this all the time because the bounds check on every read
34802
34737
  // // causes a significant slowdown, as much as 20%)
34803
- // if (fileLen - (bufOffs + i) < RESERVE) {
34738
+ // if (fileLen - (bufOffs + i) < reserve) {
34804
34739
  // obj.peek = safePeek;
34805
34740
  // obj.getChar = safeGetChar;
34806
34741
  // }
@@ -34808,11 +34743,18 @@ ${svg}
34808
34743
  // if buffer reaches the end of the file, no update is required
34809
34744
  if (bufOffs + buf.length >= fileLen) return;
34810
34745
 
34811
- // fewer than RESERVE bytes are unread in buffer -- update the buffer
34746
+ // fewer than reserve bytes are unread in buffer -- update the buffer
34812
34747
  bufOffs += i;
34813
34748
  i = 0;
34814
34749
  buf = reader.readSync(bufOffs, BUFLEN);
34815
34750
  }
34751
+ function getReserve() {
34752
+ return reserve;
34753
+ }
34754
+ function growReserve() {
34755
+ reserve *= 2;
34756
+ return reserve <= MAX_STRLEN;
34757
+ }
34816
34758
  function peek() {
34817
34759
  return buf[i];
34818
34760
  }
@@ -34827,6 +34769,9 @@ ${svg}
34827
34769
  }
34828
34770
  function index(idx) {
34829
34771
  if (idx >= 0 === false) return i + bufOffs;
34772
+ if (idx < bufOffs || idx > bufOffs + buf.length) {
34773
+ error('JSON parser seek out of buffer range');
34774
+ }
34830
34775
  i = idx - bufOffs;
34831
34776
  }
34832
34777
  function toString(idx, n) {
@@ -58369,7 +58314,7 @@ ${svg}
58369
58314
  return name == 'rectangle' || name == 'rectangles' || name == 'filter' && opts.cleanup;
58370
58315
  }
58371
58316
 
58372
- var version = "0.7.21";
58317
+ var version = "0.7.22";
58373
58318
 
58374
58319
  // Parse command line args into commands and run them
58375
58320
  // Function takes an optional Node-style callback. A Promise is returned if no callback is given.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mapshaper",
3
- "version": "0.7.21",
3
+ "version": "0.7.22",
4
4
  "description": "A tool for editing geospatial data for mapping and GIS.",
5
5
  "keywords": [
6
6
  "shapefile",
package/www/mapshaper.js CHANGED
@@ -34267,7 +34267,8 @@ ${svg}
34267
34267
 
34268
34268
  var EOF; // undefined is used as an EOF marker
34269
34269
 
34270
- var RESERVE = 4096; // RESERVE is the number of bytes to keep in read buffer
34270
+ // Default number of bytes to keep in the read buffer.
34271
+ var RESERVE_DEFAULT = 4096;
34271
34272
  var BUFLEN = 1e7; // buffer chunk size
34272
34273
  var MAX_STRLEN = 5e6; // max byte len of a value string (object keys are shorter)
34273
34274
 
@@ -34300,12 +34301,10 @@ ${svg}
34300
34301
  function parseGeoJSON(reader, cb) {
34301
34302
  var src = ByteReader(reader, 0);
34302
34303
  var isObject = seekObjectStart(src);
34303
- var type;
34304
34304
  if (!isObject) {
34305
34305
  stop$1('File is not GeoJSON');
34306
34306
  }
34307
- type = readTopLevelType(src);
34308
- var obj = readObject(src, cb, type);
34307
+ var obj = readObject(src, cb);
34309
34308
  if (obj.type == 'FeatureCollection' || obj.type == 'GeometryCollection') {
34310
34309
  return obj;
34311
34310
  }
@@ -34354,8 +34353,9 @@ ${svg}
34354
34353
 
34355
34354
  function seekObjectStart(src) {
34356
34355
  var c = src.getChar();
34356
+ var reserve = src.getReserve();
34357
34357
  var i = 0;
34358
- while (c != EOF && i < RESERVE) {
34358
+ while (c != EOF && i < reserve) {
34359
34359
  i++;
34360
34360
  if (c == LBRACE) {
34361
34361
  src.back();
@@ -34386,17 +34386,6 @@ ${svg}
34386
34386
  return arr;
34387
34387
  }
34388
34388
 
34389
- function skipArray(src) {
34390
- var c;
34391
- eatChar(src, LBRACK);
34392
- c = scanForSyntaxChar(src, RBRACK);
34393
- while (c != RBRACK) {
34394
- src.refresh();
34395
- skipValue(src);
34396
- c = scanForAorB(src, COMMA, RBRACK);
34397
- }
34398
- }
34399
-
34400
34389
  function readCollectionArray(src, cb) {
34401
34390
  var c;
34402
34391
  eatChar(src, LBRACK);
@@ -34485,18 +34474,6 @@ ${svg}
34485
34474
  return val;
34486
34475
  }
34487
34476
 
34488
- function skipValue(src) {
34489
- var c = src.peek();
34490
- if (isFirstNumChar(c)) readNumber(src);
34491
- else if (c == LBRACK) skipArray(src);
34492
- else if (c == DQUOTE) readString(src);
34493
- else if (c == LBRACE) skipObject(src);
34494
- else if (c == 110) readNull(src); // "n" -> null
34495
- else if (c == 116) readTrue(src); // "t" -> true
34496
- else if (c == 102) readFalse(src); // "f" -> false
34497
- else unexpectedCharAt(c, src.index());
34498
- }
34499
-
34500
34477
  function readTrue(src) {
34501
34478
  eatChars(src, 'true');
34502
34479
  return true;
@@ -34523,7 +34500,7 @@ ${svg}
34523
34500
 
34524
34501
  // cb: optional callback for returning GeoJSON features or geometries
34525
34502
  //
34526
- function readObject(src, cb, type) {
34503
+ function readObject(src, cb) {
34527
34504
  var o = {};
34528
34505
  var key, c;
34529
34506
  eatChar(src, LBRACE);
@@ -34534,8 +34511,7 @@ ${svg}
34534
34511
  skipWS(src);
34535
34512
  eatChar(src, 58); // ":"
34536
34513
  skipWS(src);
34537
- if ((type == 'FeatureCollection' && key == 'features' ||
34538
- type == 'GeometryCollection' && key == 'geometries') &&
34514
+ if ((key == 'features' || key == 'geometries') &&
34539
34515
  src.peek() == LBRACK && cb) {
34540
34516
  readCollectionArray(src, cb);
34541
34517
  o[key] = null;
@@ -34549,53 +34525,11 @@ ${svg}
34549
34525
  return o;
34550
34526
  }
34551
34527
 
34552
- function skipObject(src) {
34553
- var c;
34554
- eatChar(src, LBRACE);
34555
- c = scanForSyntaxChar(src, RBRACE);
34556
- while (c != RBRACE) {
34557
- src.refresh();
34558
- readKeywordString(src);
34559
- skipWS(src);
34560
- eatChar(src, 58); // ":"
34561
- skipWS(src);
34562
- skipValue(src);
34563
- c = scanForAorB(src, COMMA, RBRACE);
34564
- }
34565
- }
34566
-
34567
- function readTopLevelType(src) {
34568
- var i = src.index();
34569
- var type, key, c;
34570
- eatChar(src, LBRACE);
34571
- c = scanForSyntaxChar(src, RBRACE);
34572
- while (c != RBRACE) {
34573
- src.refresh();
34574
- key = readKeywordString(src);
34575
- skipWS(src);
34576
- eatChar(src, 58); // ":"
34577
- skipWS(src);
34578
- if (key == 'type' && src.peek() == DQUOTE) {
34579
- type = readKeywordString(src);
34580
- break;
34581
- }
34582
- skipValue(src);
34583
- c = scanForAorB(src, COMMA, RBRACE);
34584
- }
34585
- src.index(i);
34586
- return type;
34587
- }
34588
-
34589
- function growReserve() {
34590
- RESERVE *= 2;
34591
- return RESERVE <= MAX_STRLEN;
34592
- }
34593
-
34594
34528
  // Uses caching to speed up parsing of repeated strings.
34595
34529
  // The caching scheme used here can give a 20% overall speed improvement
34596
34530
  // when parsing files consisting mostly of attribute data (e.g. typical Point features)
34597
34531
  function readKeywordString(src) {
34598
- var MAXLEN = 2000; // must be less than RESERVE
34532
+ var MAXLEN = 2000; // must be less than RESERVE_DEFAULT
34599
34533
  var i = src.index();
34600
34534
  var cache = src.cache;
34601
34535
  var escapeNext = false;
@@ -34653,7 +34587,7 @@ ${svg}
34653
34587
  // Fallback for reading long strings, escaped strings, non-ascii strings, etc.
34654
34588
  function readString_slow(src) {
34655
34589
  src.refresh();
34656
- var LIMIT = RESERVE - 2;
34590
+ var LIMIT = src.getReserve() - 2;
34657
34591
  var i = src.index();
34658
34592
  var n = 0;
34659
34593
  var escapeNext = false;
@@ -34665,7 +34599,7 @@ ${svg}
34665
34599
  if (n > LIMIT) {
34666
34600
  // we've exceeded the number of reserved bytes
34667
34601
  // expand the limit and try reading this string again
34668
- if (c == EOF || !growReserve()) {
34602
+ if (c == EOF || !src.growReserve()) {
34669
34603
  stringOverflow(i, c);
34670
34604
  }
34671
34605
  src.index(i);
@@ -34783,9 +34717,10 @@ ${svg}
34783
34717
  function ByteReader(reader, start) {
34784
34718
  var fileLen = reader.size();
34785
34719
  var bufOffs = start;
34720
+ var reserve = RESERVE_DEFAULT; // per-instance reserve; may grow (see growReserve)
34786
34721
  var buf = reader.readSync(bufOffs, BUFLEN);
34787
34722
  var i = 0;
34788
- var obj = { peek, getChar, advance, back, toString, index, refresh };
34723
+ var obj = { peek, getChar, advance, back, toString, index, refresh, getReserve, growReserve };
34789
34724
  obj.cache = []; // kludgy place to put the key cache
34790
34725
  refresh();
34791
34726
  return obj;
@@ -34793,14 +34728,14 @@ ${svg}
34793
34728
  // This function should be called to make sure that the buffer has enough
34794
34729
  // bytes remaining to read any reasonable JSON content.
34795
34730
  function refresh() {
34796
- // if RESERVE bytes are still available in the buffer, no update is required
34797
- if (buf.length - i >= RESERVE) return;
34731
+ // if reserve bytes are still available in the buffer, no update is required
34732
+ if (buf.length - i >= reserve) return;
34798
34733
 
34799
34734
  // CHANGE: now using undefined as an EOF marker, so a bounds check is unneeded
34800
34735
  // // if we're close to the end of the file, start checking for overflow
34801
34736
  // // (we don't do this all the time because the bounds check on every read
34802
34737
  // // causes a significant slowdown, as much as 20%)
34803
- // if (fileLen - (bufOffs + i) < RESERVE) {
34738
+ // if (fileLen - (bufOffs + i) < reserve) {
34804
34739
  // obj.peek = safePeek;
34805
34740
  // obj.getChar = safeGetChar;
34806
34741
  // }
@@ -34808,11 +34743,18 @@ ${svg}
34808
34743
  // if buffer reaches the end of the file, no update is required
34809
34744
  if (bufOffs + buf.length >= fileLen) return;
34810
34745
 
34811
- // fewer than RESERVE bytes are unread in buffer -- update the buffer
34746
+ // fewer than reserve bytes are unread in buffer -- update the buffer
34812
34747
  bufOffs += i;
34813
34748
  i = 0;
34814
34749
  buf = reader.readSync(bufOffs, BUFLEN);
34815
34750
  }
34751
+ function getReserve() {
34752
+ return reserve;
34753
+ }
34754
+ function growReserve() {
34755
+ reserve *= 2;
34756
+ return reserve <= MAX_STRLEN;
34757
+ }
34816
34758
  function peek() {
34817
34759
  return buf[i];
34818
34760
  }
@@ -34827,6 +34769,9 @@ ${svg}
34827
34769
  }
34828
34770
  function index(idx) {
34829
34771
  if (idx >= 0 === false) return i + bufOffs;
34772
+ if (idx < bufOffs || idx > bufOffs + buf.length) {
34773
+ error('JSON parser seek out of buffer range');
34774
+ }
34830
34775
  i = idx - bufOffs;
34831
34776
  }
34832
34777
  function toString(idx, n) {
@@ -58369,7 +58314,7 @@ ${svg}
58369
58314
  return name == 'rectangle' || name == 'rectangles' || name == 'filter' && opts.cleanup;
58370
58315
  }
58371
58316
 
58372
- var version = "0.7.21";
58317
+ var version = "0.7.22";
58373
58318
 
58374
58319
  // Parse command line args into commands and run them
58375
58320
  // Function takes an optional Node-style callback. A Promise is returned if no callback is given.