mapshaper 0.6.21 → 0.6.23

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
@@ -1,6 +1,6 @@
1
1
  (function () {
2
2
 
3
- var VERSION = "0.6.21";
3
+ var VERSION = "0.6.23";
4
4
 
5
5
 
6
6
  var utils = /*#__PURE__*/Object.freeze({
@@ -1183,17 +1183,19 @@
1183
1183
  return str.replace(',', '.');
1184
1184
  }
1185
1185
 
1186
- function trimQuotes(raw) {
1187
- var len = raw.length, first, last;
1186
+ function trimQuotes(str) {
1187
+ var len = str.length, first, last;
1188
1188
  if (len >= 2) {
1189
- first = raw.charAt(0);
1190
- last = raw.charAt(len-1);
1191
- if (first == '"' && last == '"' && !raw.includes('","') ||
1192
- first == "'" && last == "'" && !raw.includes("','")) {
1193
- return raw.substr(1, len-2);
1189
+ first = str.charAt(0);
1190
+ last = str.charAt(len-1);
1191
+ if (first == '"' && last == '"' && !str.includes('","') ||
1192
+ first == "'" && last == "'" && !str.includes("','")) {
1193
+ str = str.substr(1, len-2);
1194
+ // remove string escapes
1195
+ str = str.replace(first == '"' ? /\\(?=")/g : /\\(?=')/g, '');
1194
1196
  }
1195
1197
  }
1196
- return raw;
1198
+ return str;
1197
1199
  }
1198
1200
 
1199
1201
  var LOGGING = false;
@@ -22338,9 +22340,9 @@ ${svg}
22338
22340
  var assignmentRxp = /^([a-z0-9_+-]+)=(?!=)(.*)$/i; // exclude ==
22339
22341
 
22340
22342
  function splitShellTokens(str) {
22341
- var BAREWORD = '([^\'"\\s])+';
22342
- var DOUBLE_QUOTE = '"((\\\\"|[^"])*?)"';
22343
- var SINGLE_QUOTE = '\'((\\\\\'|[^\'])*?)\'';
22343
+ var BAREWORD = `([^'"\\s])+`;
22344
+ var DOUBLE_QUOTE = `"((\\\\"|[^"])*?)"`;
22345
+ var SINGLE_QUOTE = `'((\\\\'|[^'])*?)'`;
22344
22346
  var rxp = new RegExp('(' + BAREWORD + '|' + SINGLE_QUOTE + '|' + DOUBLE_QUOTE + ')*', 'g');
22345
22347
  var matches = str.match(rxp) || [];
22346
22348
  var chunks = matches.filter(function(chunk) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mapshaper",
3
- "version": "0.6.21",
3
+ "version": "0.6.23",
4
4
  "description": "A tool for editing vector datasets for mapping and GIS.",
5
5
  "keywords": [
6
6
  "shapefile",
package/www/index.html CHANGED
@@ -102,7 +102,7 @@
102
102
  <img class="pin-btn pinned" src="images/eye2.png">
103
103
  </div>
104
104
  <div class="layer-list"></div>
105
- <h3>Files</h3>
105
+ <h4>Sources</h4>
106
106
  <div class="file-list"></div>
107
107
  <div>
108
108
  <div id="add-file-btn" class="dialog-btn btn">Add a file</div>
@@ -159,6 +159,8 @@
159
159
  "precision=0.001"</div></div></div></div>
160
160
  <!-- <div class="cancel-btn btn dialog-btn">Cancel</div> -->
161
161
  <div class="save-btn btn dialog-btn">Export</div>
162
+ <span id="save-preference"><input type="checkbox"/>choose directory</span>
163
+
162
164
  </div>
163
165
  </div>
164
166
 
@@ -807,6 +807,19 @@
807
807
  return !!(mapshaper.manifest && mapshaper.manifest.allow_saving) && typeof fetch == 'function';
808
808
  };
809
809
 
810
+ GUI.setSavedValue = function(name, val) {
811
+ try {
812
+ window.localStorage.setItem(name, JSON.stringify(val));
813
+ } catch(e) {}
814
+ };
815
+
816
+ GUI.getSavedValue = function(name) {
817
+ try {
818
+ return JSON.parse(window.localStorage.getItem(name));
819
+ } catch(e) {}
820
+ return null;
821
+ };
822
+
810
823
  GUI.getUrlVars = function() {
811
824
  var q = window.location.search.substring(1);
812
825
  return q.split('&').reduce(function(memo, chunk) {
@@ -1232,8 +1245,9 @@
1232
1245
  }
1233
1246
 
1234
1247
  async function saveBlobToLocalFile(filename, blob, done) {
1248
+ var chooseDir = GUI.getSavedValue('choose-save-dir');
1235
1249
  done = done || function() {};
1236
- if (window.showSaveFilePicker) {
1250
+ if (chooseDir) {
1237
1251
  saveBlobToSelectedFile(filename, blob, done);
1238
1252
  } else {
1239
1253
  saveBlobToDownloadsFolder(filename, blob, done);
@@ -1241,7 +1255,7 @@
1241
1255
  }
1242
1256
 
1243
1257
  function showSaveDialog(filename, blob, done) {
1244
- showPopupAlert(`Save ${filename} to:`)
1258
+ var alert = showPopupAlert(`Save ${filename} to:`)
1245
1259
  .button('selected folder', function() {
1246
1260
  saveBlobToSelectedFile(filename, blob, done);
1247
1261
  })
@@ -1251,6 +1265,7 @@
1251
1265
  .onCancel(done);
1252
1266
  }
1253
1267
 
1268
+
1254
1269
  async function saveBlobToSelectedFile(filename, blob, done) {
1255
1270
  // see: https://developer.chrome.com/articles/file-system-access/
1256
1271
  // note: saving multiple files to a directory using showDirectoryPicker()
@@ -1946,6 +1961,7 @@
1946
1961
  async function receiveFiles(files) {
1947
1962
  var names = getFileNames(files);
1948
1963
  var expanded = [];
1964
+ if (files.length === 0) return;
1949
1965
  try {
1950
1966
  expanded = await expandFiles(files);
1951
1967
  } catch(e) {
@@ -3655,10 +3671,14 @@
3655
3671
  internal.writeFiles = function() {
3656
3672
  error$1(unsupportedMsg);
3657
3673
  };
3658
- } else {
3659
- new SimpleButton(menu.findChild('.save-btn').addClass('default-btn')).on('click', onExportClick);
3660
- gui.addMode('export', turnOn, turnOff, exportBtn);
3661
- gui.keyboard.onMenuSubmit(menu, onExportClick);
3674
+ return;
3675
+ }
3676
+
3677
+ new SimpleButton(menu.findChild('.save-btn').addClass('default-btn')).on('click', onExportClick);
3678
+ gui.addMode('export', turnOn, turnOff, exportBtn);
3679
+ gui.keyboard.onMenuSubmit(menu, onExportClick);
3680
+ if (window.showSaveFilePicker) {
3681
+ menu.findChild('#save-preference').css('display', 'inline-block');
3662
3682
  }
3663
3683
 
3664
3684
  function turnOn() {
@@ -3682,6 +3702,8 @@
3682
3702
 
3683
3703
  function onExportClick() {
3684
3704
  var layers = getSelectedLayers();
3705
+ var chooseDir = menu.findChild('#save-preference input').node().checked;
3706
+ GUI.setSavedValue('choose-save-dir', chooseDir);
3685
3707
  if (layers.length === 0) {
3686
3708
  return gui.alert('No layers were selected');
3687
3709
  }
@@ -6213,17 +6235,19 @@
6213
6235
  return str.replace(',', '.');
6214
6236
  }
6215
6237
 
6216
- function trimQuotes(raw) {
6217
- var len = raw.length, first, last;
6238
+ function trimQuotes(str) {
6239
+ var len = str.length, first, last;
6218
6240
  if (len >= 2) {
6219
- first = raw.charAt(0);
6220
- last = raw.charAt(len-1);
6221
- if (first == '"' && last == '"' && !raw.includes('","') ||
6222
- first == "'" && last == "'" && !raw.includes("','")) {
6223
- return raw.substr(1, len-2);
6241
+ first = str.charAt(0);
6242
+ last = str.charAt(len-1);
6243
+ if (first == '"' && last == '"' && !str.includes('","') ||
6244
+ first == "'" && last == "'" && !str.includes("','")) {
6245
+ str = str.substr(1, len-2);
6246
+ // remove string escapes
6247
+ str = str.replace(first == '"' ? /\\(?=")/g : /\\(?=')/g, '');
6224
6248
  }
6225
6249
  }
6226
- return raw;
6250
+ return str;
6227
6251
  }
6228
6252
 
6229
6253
  function absArcId(arcId) {
@@ -8694,7 +8718,6 @@
8694
8718
  function active(e) {
8695
8719
  return e.id > -1 && gui.interaction.getMode() == 'add-points';
8696
8720
  }
8697
-
8698
8721
  }
8699
8722
 
8700
8723
  function Pencil(gui, mouse, hit) {
@@ -8717,10 +8740,7 @@
8717
8740
  }
8718
8741
 
8719
8742
  function initDrawing(gui, ext, mouse, hit) {
8720
-
8721
8743
  initPointDrawing(gui, new Pencil(gui, mouse, hit));
8722
-
8723
-
8724
8744
  }
8725
8745
 
8726
8746
  var darkStroke = "#334",
package/www/mapshaper.js CHANGED
@@ -1,6 +1,6 @@
1
1
  (function () {
2
2
 
3
- var VERSION = "0.6.21";
3
+ var VERSION = "0.6.23";
4
4
 
5
5
 
6
6
  var utils = /*#__PURE__*/Object.freeze({
@@ -1183,17 +1183,19 @@
1183
1183
  return str.replace(',', '.');
1184
1184
  }
1185
1185
 
1186
- function trimQuotes(raw) {
1187
- var len = raw.length, first, last;
1186
+ function trimQuotes(str) {
1187
+ var len = str.length, first, last;
1188
1188
  if (len >= 2) {
1189
- first = raw.charAt(0);
1190
- last = raw.charAt(len-1);
1191
- if (first == '"' && last == '"' && !raw.includes('","') ||
1192
- first == "'" && last == "'" && !raw.includes("','")) {
1193
- return raw.substr(1, len-2);
1189
+ first = str.charAt(0);
1190
+ last = str.charAt(len-1);
1191
+ if (first == '"' && last == '"' && !str.includes('","') ||
1192
+ first == "'" && last == "'" && !str.includes("','")) {
1193
+ str = str.substr(1, len-2);
1194
+ // remove string escapes
1195
+ str = str.replace(first == '"' ? /\\(?=")/g : /\\(?=')/g, '');
1194
1196
  }
1195
1197
  }
1196
- return raw;
1198
+ return str;
1197
1199
  }
1198
1200
 
1199
1201
  var LOGGING = false;
@@ -22338,9 +22340,9 @@ ${svg}
22338
22340
  var assignmentRxp = /^([a-z0-9_+-]+)=(?!=)(.*)$/i; // exclude ==
22339
22341
 
22340
22342
  function splitShellTokens(str) {
22341
- var BAREWORD = '([^\'"\\s])+';
22342
- var DOUBLE_QUOTE = '"((\\\\"|[^"])*?)"';
22343
- var SINGLE_QUOTE = '\'((\\\\\'|[^\'])*?)\'';
22343
+ var BAREWORD = `([^'"\\s])+`;
22344
+ var DOUBLE_QUOTE = `"((\\\\"|[^"])*?)"`;
22345
+ var SINGLE_QUOTE = `'((\\\\'|[^'])*?)'`;
22344
22346
  var rxp = new RegExp('(' + BAREWORD + '|' + SINGLE_QUOTE + '|' + DOUBLE_QUOTE + ')*', 'g');
22345
22347
  var matches = str.match(rxp) || [];
22346
22348
  var chunks = matches.filter(function(chunk) {
package/www/page.css CHANGED
@@ -292,9 +292,6 @@ div.error-box {
292
292
  font-size: 16px;
293
293
  }
294
294
 
295
- div.error-box > div {
296
-
297
- }
298
295
 
299
296
  /* --- Splash screen -------------- */
300
297
 
@@ -516,22 +513,26 @@ body.dragover #import-options-drop-area .drop-area {
516
513
  }
517
514
 
518
515
  .info-box h4 {
519
- font-size: 1em;
516
+ font-size: 1.085em;
520
517
  font-weight: normal;
521
- margin: 0 0 1px 0;
518
+ margin: 0 0 2px 0;
522
519
  }
523
520
 
524
521
  .info-box p {
525
522
  white-space: pre-line;
526
523
  margin: 0 0 7px 0;
524
+ line-height: 1.2;
525
+ font-size: 90%;
527
526
  }
528
527
 
529
528
  .option-menu {
530
529
  padding: 0 0 9px 0;
531
530
  }
532
531
 
533
- .option-menu input[type="radio"],
534
- .option-menu input[type="checkbox"]
532
+ /*.option-menu input[type="radio"],
533
+ .option-menu input[type="checkbox"] */
534
+ .info-box input[type="radio"],
535
+ .info-box input[type="checkbox"]
535
536
  {
536
537
  position: relative;
537
538
  top: 1px;
@@ -539,16 +540,16 @@ body.dragover #import-options-drop-area .drop-area {
539
540
  height: 12px;
540
541
  }
541
542
 
542
- .option-menu .tip-button {
543
+ .info-box .tip-button {
543
544
  margin-left: 12px;
544
545
  margin-top: 3px;
545
546
  }
546
547
 
547
- .option-menu input[type="checkbox"] {
548
+ .info-box input[type="checkbox"] {
548
549
  margin: 3px 5px 0 1px;
549
550
  }
550
551
 
551
- .option-menu input.radio {
552
+ .info-box input.radio {
552
553
  margin: 0 5px 0 0;
553
554
  }
554
555
 
@@ -1079,10 +1080,7 @@ img.close-btn:hover,
1079
1080
  height: 100%;
1080
1081
  }
1081
1082
 
1082
- .info-box p {
1083
- line-height: 1.2;
1084
- font-size: 90%;
1085
- }
1083
+
1086
1084
 
1087
1085
  .basemap-styles {
1088
1086
  margin: 0 -2px;
@@ -1212,6 +1210,13 @@ div.basemap-style-btn.active img {
1212
1210
  top: 23px;
1213
1211
  }
1214
1212
 
1213
+ #save-preference {
1214
+ display: none;
1215
+ position: relative;
1216
+ top: 1px;
1217
+ left: 5px;
1218
+ }
1219
+
1215
1220
  .nav-sub-menu {
1216
1221
  position: absolute;
1217
1222
  z-index: -1;