@innovastudio/contentbox 1.4.70 → 1.4.71

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@innovastudio/contentbox",
3
3
  "type": "module",
4
- "version": "1.4.70",
4
+ "version": "1.4.71",
5
5
  "description": "",
6
6
  "main": "public/contentbox/contentbox.esm.js",
7
7
  "files": [
@@ -46,7 +46,7 @@
46
46
  "webpack-dev-server": "^4.0.0"
47
47
  },
48
48
  "dependencies": {
49
- "@innovastudio/contentbuilder": "^1.3.81",
49
+ "@innovastudio/contentbuilder": "^1.3.84",
50
50
  "js-beautify": "^1.14.0"
51
51
  }
52
52
  }
@@ -28910,6 +28910,79 @@ class HtmlUtil {
28910
28910
  block.getAttribute('data-settings', uniqueID);
28911
28911
  }
28912
28912
  });
28913
+ } //Make absolute (for Export/Download)
28914
+
28915
+
28916
+ if (this.builder.makeAbsolute) {
28917
+ const convertMediaUrl = imgUrl => {
28918
+ // make absolute
28919
+ let img = document.createElement('img');
28920
+ img.src = imgUrl;
28921
+ img.setAttribute('data-absoluteurl', img.src);
28922
+ imgUrl = img.getAttribute('data-absoluteurl');
28923
+ return imgUrl;
28924
+ };
28925
+
28926
+ const convertBgUrl = imgUrl => {
28927
+ // make absolute
28928
+ let img = document.createElement('img');
28929
+ img.src = imgUrl;
28930
+ img.setAttribute('data-absoluteurl', img.src);
28931
+ imgUrl = img.getAttribute('data-absoluteurl'); // Do not use imgUrl directly, change base to [%PATH%] instead
28932
+ // (to prevent auto converting back to relative path)
28933
+
28934
+ let urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
28935
+ return imgUrl.replace(urlBase, '[%PATH%]'); // Example:
28936
+ // url = http://localhost:8080/uploads/image.jpg
28937
+ // urlBase = http://localhost:8080
28938
+ // become: [%PATH%]/uploads/image.jpg
28939
+ };
28940
+
28941
+ const convertMedia = (elm, attrName) => {
28942
+ if (elm.hasAttribute(attrName)) {
28943
+ if (!(elm.parentNode.tagName.toLowerCase() === 'video' || elm.parentNode.tagName.toLowerCase() === 'audio')) return;
28944
+ let imgUrl = elm.getAttribute(attrName);
28945
+ imgUrl = convertMediaUrl(imgUrl);
28946
+ elm.setAttribute(attrName, `${imgUrl}`);
28947
+ }
28948
+ };
28949
+
28950
+ let imgs = tmp.querySelectorAll('img');
28951
+ Array.prototype.forEach.call(imgs, img => {
28952
+ let src = img.src;
28953
+ img.setAttribute('src', src);
28954
+ });
28955
+ let elms = tmp.querySelectorAll('*');
28956
+ elms.forEach(elm => {
28957
+ if (elm.style.backgroundImage) {
28958
+ let s = elm.style.backgroundImage;
28959
+
28960
+ if (s.indexOf('url(') !== -1) {
28961
+ let imgUrl = s.slice(4, -1).replace(/["']/g, '');
28962
+ imgUrl = convertBgUrl(imgUrl);
28963
+ elm.style.backgroundImage = `url(${imgUrl})`;
28964
+ }
28965
+ }
28966
+
28967
+ convertMedia(elm, 'src');
28968
+ convertMedia(elm, 'data-default');
28969
+ convertMedia(elm, 'data-240');
28970
+ convertMedia(elm, 'data-360');
28971
+ convertMedia(elm, 'data-480');
28972
+ convertMedia(elm, 'data-540');
28973
+ convertMedia(elm, 'data-720');
28974
+ convertMedia(elm, 'data-1080');
28975
+ convertMedia(elm, 'data-1440');
28976
+ convertMedia(elm, 'data-2160');
28977
+
28978
+ if (elm.hasAttribute('href')) {
28979
+ if (elm.tagName.toLowerCase() === 'link') {
28980
+ let imgUrl = elm.getAttribute('href');
28981
+ imgUrl = convertMediaUrl(imgUrl);
28982
+ elm.setAttribute('href', `${imgUrl}`);
28983
+ }
28984
+ }
28985
+ });
28913
28986
  } //Cleaning
28914
28987
 
28915
28988
 
@@ -29047,7 +29120,75 @@ class HtmlUtil {
29047
29120
  elms = tmp.querySelectorAll('[data-scroll]');
29048
29121
  dom$h.removeAttributes(elms, 'data-scroll');
29049
29122
  elms = tmp.querySelectorAll('[data-scroll-once]');
29050
- dom$h.removeAttributes(elms, 'data-scroll-once'); // cleaning
29123
+ dom$h.removeAttributes(elms, 'data-scroll-once');
29124
+
29125
+ if (this.builder.shortenOutput) {
29126
+ elms = tmp.querySelectorAll('[data-noedit]');
29127
+ dom$h.removeAttributes(elms, 'data-noedit');
29128
+ elms = tmp.querySelectorAll('[data-module]');
29129
+ dom$h.removeAttributes(elms, 'data-module');
29130
+ elms = tmp.querySelectorAll('[data-module-desc]');
29131
+ dom$h.removeAttributes(elms, 'data-module-desc');
29132
+ elms = tmp.querySelectorAll('[data-dialog-width]');
29133
+ dom$h.removeAttributes(elms, 'data-dialog-width');
29134
+ elms = tmp.querySelectorAll('[data-dialog-height]');
29135
+ dom$h.removeAttributes(elms, 'data-dialog-height');
29136
+ elms = tmp.querySelectorAll('[data-html]');
29137
+ dom$h.removeAttributes(elms, 'data-html');
29138
+ elms = tmp.querySelectorAll('[data-settings]');
29139
+ dom$h.removeAttributes(elms, 'data-settings');
29140
+ elms = tmp.querySelectorAll('[data-html-1]');
29141
+ dom$h.removeAttributes(elms, 'data-html-1');
29142
+ elms = tmp.querySelectorAll('[data-html-2]');
29143
+ dom$h.removeAttributes(elms, 'data-html-2');
29144
+ elms = tmp.querySelectorAll('[data-html-3]');
29145
+ dom$h.removeAttributes(elms, 'data-html-3');
29146
+ elms = tmp.querySelectorAll('[data-html-4]');
29147
+ dom$h.removeAttributes(elms, 'data-html-4');
29148
+ elms = tmp.querySelectorAll('[data-html-5]');
29149
+ dom$h.removeAttributes(elms, 'data-html-5');
29150
+ elms = tmp.querySelectorAll('[data-html-6]');
29151
+ dom$h.removeAttributes(elms, 'data-html-6');
29152
+ elms = tmp.querySelectorAll('[data-html-7]');
29153
+ dom$h.removeAttributes(elms, 'data-html-7');
29154
+ elms = tmp.querySelectorAll('[data-html-8]');
29155
+ dom$h.removeAttributes(elms, 'data-html-8');
29156
+ elms = tmp.querySelectorAll('[data-html-9]');
29157
+ dom$h.removeAttributes(elms, 'data-html-9');
29158
+ elms = tmp.querySelectorAll('[data-html-10]');
29159
+ dom$h.removeAttributes(elms, 'data-html-10');
29160
+ elms = tmp.querySelectorAll('[data-html-12]');
29161
+ dom$h.removeAttributes(elms, 'data-html-12');
29162
+ elms = tmp.querySelectorAll('[data-html-13]');
29163
+ dom$h.removeAttributes(elms, 'data-html-13');
29164
+ elms = tmp.querySelectorAll('[data-html-14]');
29165
+ dom$h.removeAttributes(elms, 'data-html-14');
29166
+ elms = tmp.querySelectorAll('[data-html-15]');
29167
+ dom$h.removeAttributes(elms, 'data-html-15');
29168
+ elms = tmp.querySelectorAll('[data-html-16]');
29169
+ dom$h.removeAttributes(elms, 'data-html-16');
29170
+ elms = tmp.querySelectorAll('[data-html-17]');
29171
+ dom$h.removeAttributes(elms, 'data-html-17');
29172
+ elms = tmp.querySelectorAll('[data-html-18]');
29173
+ dom$h.removeAttributes(elms, 'data-html-18');
29174
+ elms = tmp.querySelectorAll('[data-html-19]');
29175
+ dom$h.removeAttributes(elms, 'data-html-19');
29176
+ elms = tmp.querySelectorAll('[data-html-20]');
29177
+ dom$h.removeAttributes(elms, 'data-html-20');
29178
+ elms = tmp.querySelectorAll('[data-html-21]');
29179
+ dom$h.removeAttributes(elms, 'data-html-21');
29180
+ elms = tmp.querySelectorAll('[data-html-21]');
29181
+ dom$h.removeAttributes(elms, 'data-html-21');
29182
+ elms = tmp.querySelectorAll('[data-html-22]');
29183
+ dom$h.removeAttributes(elms, 'data-html-22');
29184
+ elms = tmp.querySelectorAll('[data-html-23]');
29185
+ dom$h.removeAttributes(elms, 'data-html-23');
29186
+ elms = tmp.querySelectorAll('[data-html-24]');
29187
+ dom$h.removeAttributes(elms, 'data-html-24');
29188
+ elms = tmp.querySelectorAll('[data-html-25]');
29189
+ dom$h.removeAttributes(elms, 'data-html-25');
29190
+ } // cleaning
29191
+
29051
29192
 
29052
29193
  elms = tmp.querySelectorAll('[data-bottom-top],[data-center],[data-center-bottom],[data-100-top],[data-50-top],[data-top],[data-top-bottom],[data-center-top],[data--300-bottom],[data--150-bottom],[data--50-bottom],[data-bottom],[data-100-bottom],[data-150-bottom],[data-400-bottom],' + '[data--400-bottom],[data--200-bottom],[data--100-bottom],[data-50-bottom],[data-200-bottom],[data-300-bottom],' + '[data-in],[data-in-150],[data-in-300],' + '[data-cen--150],[data-cen],[data-cen-150],[data-out--300],[data-out--150],[data-out]' + '[data-t],[data-t-100],[data-t-200],[data-t-300],[data-t-400],' + '[data-t-500],[data-t-600],[data-t-700],[data-t-800],[data-t-900],[data-t-1000],' + '[data-t-1100],[data-t-1200],[data-t-1300],[data-t-1400],[data-t-1500],[data-t-1600],' + '[data-t-1700],[data-t-1800],[data-t-1900],[data-t-2000],[data-t-2100],[data-t-2200],' + '[data-t-2300],[data-t-2400],[data-t-2500],[data-t-2600],[data-t-2700],[data-t-2800]'); // elms = tmp.querySelectorAll('[data-bottom-top],[data-center],[data-center-bottom],[data-100-top],[data-50-top],[data-top],[data-top-bottom],[data-center-top],[data--300-bottom],[data--150-bottom],[data--50-bottom],[data-bottom],[data-100-bottom],[data-150-bottom],[data-400-bottom],' +
29053
29194
  // '[data--400-bottom],[data--200-bottom],[data--100-bottom],[data-50-bottom],[data-200-bottom],[data-300-bottom],' +
@@ -29161,6 +29302,74 @@ class HtmlUtil {
29161
29302
  Array.prototype.forEach.call(emptystyles, emptystyle => {
29162
29303
  emptystyle.removeAttribute('style');
29163
29304
  });
29305
+
29306
+ if (this.builder.shortenOutput) {
29307
+ elms = tmp.querySelectorAll('[data-noedit]');
29308
+ dom$h.removeAttributes(elms, 'data-noedit');
29309
+ elms = tmp.querySelectorAll('[data-module]');
29310
+ dom$h.removeAttributes(elms, 'data-module');
29311
+ elms = tmp.querySelectorAll('[data-module-desc]');
29312
+ dom$h.removeAttributes(elms, 'data-module-desc');
29313
+ elms = tmp.querySelectorAll('[data-dialog-width]');
29314
+ dom$h.removeAttributes(elms, 'data-dialog-width');
29315
+ elms = tmp.querySelectorAll('[data-dialog-height]');
29316
+ dom$h.removeAttributes(elms, 'data-dialog-height');
29317
+ elms = tmp.querySelectorAll('[data-html]');
29318
+ dom$h.removeAttributes(elms, 'data-html');
29319
+ elms = tmp.querySelectorAll('[data-settings]');
29320
+ dom$h.removeAttributes(elms, 'data-settings');
29321
+ elms = tmp.querySelectorAll('[data-html-1]');
29322
+ dom$h.removeAttributes(elms, 'data-html-1');
29323
+ elms = tmp.querySelectorAll('[data-html-2]');
29324
+ dom$h.removeAttributes(elms, 'data-html-2');
29325
+ elms = tmp.querySelectorAll('[data-html-3]');
29326
+ dom$h.removeAttributes(elms, 'data-html-3');
29327
+ elms = tmp.querySelectorAll('[data-html-4]');
29328
+ dom$h.removeAttributes(elms, 'data-html-4');
29329
+ elms = tmp.querySelectorAll('[data-html-5]');
29330
+ dom$h.removeAttributes(elms, 'data-html-5');
29331
+ elms = tmp.querySelectorAll('[data-html-6]');
29332
+ dom$h.removeAttributes(elms, 'data-html-6');
29333
+ elms = tmp.querySelectorAll('[data-html-7]');
29334
+ dom$h.removeAttributes(elms, 'data-html-7');
29335
+ elms = tmp.querySelectorAll('[data-html-8]');
29336
+ dom$h.removeAttributes(elms, 'data-html-8');
29337
+ elms = tmp.querySelectorAll('[data-html-9]');
29338
+ dom$h.removeAttributes(elms, 'data-html-9');
29339
+ elms = tmp.querySelectorAll('[data-html-10]');
29340
+ dom$h.removeAttributes(elms, 'data-html-10');
29341
+ elms = tmp.querySelectorAll('[data-html-12]');
29342
+ dom$h.removeAttributes(elms, 'data-html-12');
29343
+ elms = tmp.querySelectorAll('[data-html-13]');
29344
+ dom$h.removeAttributes(elms, 'data-html-13');
29345
+ elms = tmp.querySelectorAll('[data-html-14]');
29346
+ dom$h.removeAttributes(elms, 'data-html-14');
29347
+ elms = tmp.querySelectorAll('[data-html-15]');
29348
+ dom$h.removeAttributes(elms, 'data-html-15');
29349
+ elms = tmp.querySelectorAll('[data-html-16]');
29350
+ dom$h.removeAttributes(elms, 'data-html-16');
29351
+ elms = tmp.querySelectorAll('[data-html-17]');
29352
+ dom$h.removeAttributes(elms, 'data-html-17');
29353
+ elms = tmp.querySelectorAll('[data-html-18]');
29354
+ dom$h.removeAttributes(elms, 'data-html-18');
29355
+ elms = tmp.querySelectorAll('[data-html-19]');
29356
+ dom$h.removeAttributes(elms, 'data-html-19');
29357
+ elms = tmp.querySelectorAll('[data-html-20]');
29358
+ dom$h.removeAttributes(elms, 'data-html-20');
29359
+ elms = tmp.querySelectorAll('[data-html-21]');
29360
+ dom$h.removeAttributes(elms, 'data-html-21');
29361
+ elms = tmp.querySelectorAll('[data-html-21]');
29362
+ dom$h.removeAttributes(elms, 'data-html-21');
29363
+ elms = tmp.querySelectorAll('[data-html-22]');
29364
+ dom$h.removeAttributes(elms, 'data-html-22');
29365
+ elms = tmp.querySelectorAll('[data-html-23]');
29366
+ dom$h.removeAttributes(elms, 'data-html-23');
29367
+ elms = tmp.querySelectorAll('[data-html-24]');
29368
+ dom$h.removeAttributes(elms, 'data-html-24');
29369
+ elms = tmp.querySelectorAll('[data-html-25]');
29370
+ dom$h.removeAttributes(elms, 'data-html-25');
29371
+ }
29372
+
29164
29373
  html = tmp.innerHTML.trim();
29165
29374
  html = html.replace(/<font/g, '<span').replace(/<\/font/g, '</span');
29166
29375
  } // elm = builderStuff.querySelector('#tmp_content');
@@ -29178,6 +29387,13 @@ class HtmlUtil {
29178
29387
  return html;
29179
29388
  }
29180
29389
 
29390
+ beautify(html) {
29391
+ let beautify = JsBeautify.html;
29392
+ html = beautify(html);
29393
+ html = html.replace(/(\r\n|\r|\n){3,}/g, '$1\n');
29394
+ return html;
29395
+ }
29396
+
29181
29397
  }
29182
29398
 
29183
29399
  class UndoRedo {
@@ -29728,6 +29944,14 @@ const prepareSvgIcons = builder => {
29728
29944
  <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
29729
29945
  <path d="M9.88 9.878a3 3 0 1 0 4.243 4.242m.581 -3.42a3.012 3.012 0 0 0 -1.45 -1.426m-3.877 -3.913a9.469 9.469 0 0 1 2.623 -.361c4 0 7.333 2.333 10 7c-.778 1.362 -1.613 2.524 -2.504 3.489m-2.138 1.859c-1.629 1.101 -3.415 1.652 -5.358 1.652c-4 0 -7.333 -2.333 -10 -7c1.374 -2.404 2.924 -4.189 4.652 -5.354m-3.652 -3.646l18 18"></path>
29730
29946
  </symbol>
29947
+
29948
+ <symbol id="icon-download" viewBox="0 0 24 24" stroke-width="1" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
29949
+ <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
29950
+ <path d="M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2"></path>
29951
+ <path d="M7 11l5 5l5 -5"></path>
29952
+ <path d="M12 4l0 12"></path>
29953
+ </symbol>
29954
+
29731
29955
  </defs>
29732
29956
  </svg>`;
29733
29957
  builder.dom.appendHtml(builder.builderStuff, html);
@@ -36765,7 +36989,7 @@ function getOffset(element) {
36765
36989
  top: box.top + (window.pageYOffset - document.documentElement.clientTop)
36766
36990
  };
36767
36991
  }
36768
- var location = WINDOW.location;
36992
+ var location$1 = WINDOW.location;
36769
36993
  var REGEXP_ORIGINS = /^(\w+:)\/\/([^:/?#]*):?(\d*)/i;
36770
36994
  /**
36771
36995
  * Check if the given URL is a cross origin URL.
@@ -36775,7 +36999,7 @@ var REGEXP_ORIGINS = /^(\w+:)\/\/([^:/?#]*):?(\d*)/i;
36775
36999
 
36776
37000
  function isCrossOriginURL(url) {
36777
37001
  var parts = url.match(REGEXP_ORIGINS);
36778
- return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);
37002
+ return parts !== null && (parts[1] !== location$1.protocol || parts[2] !== location$1.hostname || parts[3] !== location$1.port);
36779
37003
  }
36780
37004
  /**
36781
37005
  * Add timestamp to the given URL.
@@ -67516,10 +67740,12 @@ class Code {
67516
67740
  viewhtml = this.builderStuff.querySelector('.viewhtml');
67517
67741
  }
67518
67742
 
67519
- let textarea = viewhtml.querySelector('textarea'); // Commented, to prevent {id} get formatted.
67520
- // let beautify = JsBeautify.html;
67521
- // html = beautify(html);
67743
+ let textarea = viewhtml.querySelector('textarea'); // Prevent {id} get formatted.
67522
67744
 
67745
+ html = html.replaceAll('{id}', '__id__');
67746
+ let beautify = JsBeautify.html;
67747
+ html = beautify(html);
67748
+ html = html.replaceAll('__id__', '{id}');
67523
67749
  textarea.value = html;
67524
67750
  this.htmlUtil.view('code');
67525
67751
  });
@@ -76381,7 +76607,7 @@ class ElementTextStyles {
76381
76607
  var sTextAlign = elm.style.textAlign;
76382
76608
  this.panelStuff.querySelector('#inpElmTextAlign').value = sTextAlign;
76383
76609
  this.panelStuff.querySelector('#inpElmFontSize').value = '';
76384
- var nFontSize = parseInt(elm.style.fontSize);
76610
+ var nFontSize = parseFloat(elm.style.fontSize);
76385
76611
 
76386
76612
  if (!isNaN(nFontSize)) {
76387
76613
  this.panelStuff.querySelector('#inpElmFontSize').value = nFontSize;
@@ -76441,7 +76667,7 @@ class ElementTextStyles {
76441
76667
  if (!isNaN(elm.style.lineHeight)) {
76442
76668
  this.panelStuff.querySelector('#inpElmLineHeight').value = elm.style.lineHeight;
76443
76669
  } else {
76444
- var nLineHeight = parseInt(elm.style.lineHeight);
76670
+ var nLineHeight = parseFloat(elm.style.lineHeight);
76445
76671
 
76446
76672
  if (!isNaN(nLineHeight)) {
76447
76673
  this.panelStuff.querySelector('#inpElmLineHeight').value = nLineHeight;
@@ -76462,14 +76688,14 @@ class ElementTextStyles {
76462
76688
 
76463
76689
  this.panelStuff.querySelector('#inpElmLineHeightUnit').value = sLineHeightUnit;
76464
76690
  this.panelStuff.querySelector('#inpElmLetterSpacing').value = '';
76465
- var nLetterSpacing = parseInt(elm.style.letterSpacing);
76691
+ var nLetterSpacing = parseFloat(elm.style.letterSpacing);
76466
76692
 
76467
76693
  if (!isNaN(nLetterSpacing)) {
76468
76694
  this.panelStuff.querySelector('#inpElmLetterSpacing').value = nLetterSpacing;
76469
76695
  }
76470
76696
 
76471
76697
  this.panelStuff.querySelector('#inpElmWordSpacing').value = '';
76472
- var nWordSpacing = parseInt(elm.style.wordSpacing);
76698
+ var nWordSpacing = parseFloat(elm.style.wordSpacing);
76473
76699
 
76474
76700
  if (!isNaN(nWordSpacing)) {
76475
76701
  this.panelStuff.querySelector('#inpElmWordSpacing').value = nWordSpacing;
@@ -89103,6 +89329,39 @@ class ContentBuilder {
89103
89329
  </div>
89104
89330
  </div>
89105
89331
  `,
89332
+ pageTemplate: `<!DOCTYPE html>
89333
+ <html lang="en">
89334
+ <head>
89335
+ <meta charset="utf-8">
89336
+ <title>Page</title>
89337
+ <meta name="viewport" content="width=device-width, initial-scale=1">
89338
+ <meta name="description" content="">
89339
+ <link rel="shortcut icon" href="#" />
89340
+
89341
+ <link href="[%PATH%]/assets/minimalist-blocks/content.css" rel="stylesheet" type="text/css" />
89342
+
89343
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.core.css" rel="stylesheet" type="text/css" />
89344
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.theme.css" rel="stylesheet" type="text/css" />
89345
+ <script src="[%PATH%]/assets/scripts/glide/glide.js" type="text/javascript"></script>
89346
+
89347
+ <style>
89348
+ .container {
89349
+ margin: 150px auto 0;
89350
+ max-width: 800px;
89351
+ width: 100%;
89352
+ padding: 0 20px;
89353
+ box-sizing: border-box;
89354
+ }
89355
+ </style>
89356
+ </head>
89357
+ <body>
89358
+
89359
+ <div class="container">
89360
+ [%CONTENT%]
89361
+ </div>
89362
+
89363
+ </body>
89364
+ </html>`,
89106
89365
 
89107
89366
  /*
89108
89367
  onZoomStart: () => {
@@ -90614,7 +90873,11 @@ class ContentBuilder {
90614
90873
 
90615
90874
  const builders = this.doc.querySelectorAll(this.opts.container);
90616
90875
  Array.prototype.forEach.call(builders, builder => {
90617
- builder.innerHTML = htmlutil.readHtml(builder, true);
90876
+ // builder.innerHTML = htmlutil.readHtml(builder, true);
90877
+ let html = htmlutil.readHtml(builder, false);
90878
+ let range = this.doc.createRange();
90879
+ builder.innerHTML = '';
90880
+ builder.appendChild(range.createContextualFragment(html)); // Use createContextualFragment so that embedded javascript code (code block) will be executed
90618
90881
  });
90619
90882
  Array.prototype.forEach.call(builders, builder => {
90620
90883
  builder.removeAttribute('data-sort');
@@ -90941,6 +91204,52 @@ class ContentBuilder {
90941
91204
 
90942
91205
  saveForUndo(checkLater) {
90943
91206
  this.uo.saveForUndo(checkLater);
91207
+ }
91208
+
91209
+ download(options = {}) {
91210
+ this.export(options, true);
91211
+ }
91212
+
91213
+ export(options = {}, shortenOutput = false) {
91214
+ let pageTemplate = this.pageTemplate;
91215
+ let output = ''; // [%CONTENT%]
91216
+
91217
+ this.makeAbsolute = true; //To make absolute (for Export/Download)
91218
+
91219
+ this.shortenOutput = shortenOutput;
91220
+ let html = this.html();
91221
+ this.makeAbsolute = false;
91222
+ this.shortenOutput = false;
91223
+ output = pageTemplate.replace('[%CONTENT%]', html); // Custom
91224
+
91225
+ if (options.replace) {
91226
+ options.replace.forEach(rule => {
91227
+ output = output.replaceAll(`${rule[0]}`, rule[1]);
91228
+ });
91229
+ } // [%PATH%]
91230
+
91231
+
91232
+ if (options.path) {
91233
+ output = output.replaceAll('[%PATH%]', options.path);
91234
+ } else {
91235
+ let urlBase;
91236
+ urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
91237
+ output = output.replaceAll('[%PATH%]', urlBase);
91238
+ } // Beautify
91239
+
91240
+
91241
+ output = this.beautify(output);
91242
+ const a = document.createElement('a');
91243
+ a.href = window.URL.createObjectURL(new Blob([output], {
91244
+ type: 'text/plain'
91245
+ }));
91246
+ a.download = 'page.html';
91247
+ a.click();
91248
+ }
91249
+
91250
+ beautify(html) {
91251
+ const htmlutil = new HtmlUtil(this);
91252
+ return htmlutil.beautify(html);
90944
91253
  } // Module related
90945
91254
 
90946
91255
 
@@ -101477,6 +101786,59 @@ class ContentBox {
101477
101786
  </div>
101478
101787
  </div>
101479
101788
  `,
101789
+ pageTemplate: `
101790
+ <!DOCTYPE html>
101791
+ <html lang="en">
101792
+ <head>
101793
+ <meta charset="utf-8">
101794
+ <title>Page</title>
101795
+ <meta name="viewport" content="width=device-width, initial-scale=1">
101796
+ <meta name="description" content="">
101797
+ <link rel="shortcut icon" href="#" />
101798
+
101799
+ <link href="[%PATH%]/assets/minimalist-blocks/content.css" rel="stylesheet" type="text/css" />
101800
+ <link href="[%PATH%]/box/box-flex.css" rel="stylesheet" type="text/css" />
101801
+
101802
+ [%MAINCSS%]
101803
+ [%SECTIONCSS%]
101804
+ </head>
101805
+ <body style="touch-action: pan-y">
101806
+
101807
+ <main id="main">
101808
+ <div class="is-wrapper">
101809
+ [%CONTENT%]
101810
+ </div>
101811
+ </main>
101812
+
101813
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.core.css" rel="stylesheet" type="text/css" />
101814
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.theme.css" rel="stylesheet" type="text/css" />
101815
+ <script src="[%PATH%]/assets/scripts/glide/glide.js" type="text/javascript"></script>
101816
+
101817
+ <link href="[%PATH%]/assets/scripts/navbar/navbar.css" rel="stylesheet" type="text/css" />
101818
+ <script src="[%PATH%]/assets/scripts/navbar/navbar.min.js" type="text/javascript"></script>
101819
+
101820
+ <script src="[%PATH%]/box/box-flex.js" type="text/javascript"></script>
101821
+
101822
+ <!-- Optional: if you want to add smooth scrolling -->
101823
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/smoothscroll/1.4.10/SmoothScroll.min.js" type="text/javascript"></script>
101824
+ <script>
101825
+ SmoothScroll({
101826
+ frameRate: 150,
101827
+ animationTime: 800,
101828
+ stepSize: 120,
101829
+ pulseAlgorithm: 1,
101830
+ pulseScale: 4,
101831
+ pulseNormalize: 1,
101832
+ accelerationDelta: 300,
101833
+ accelerationMax: 2,
101834
+ keyboardSupport: 1,
101835
+ arrowScroll: 50,
101836
+ fixedBackground: 0
101837
+ });
101838
+ </script>
101839
+ </body>
101840
+ </html>
101841
+ `,
101480
101842
  contentStyleWithSample: false,
101481
101843
  contentSizes: [300, 320, 340, 360, 380, 400, 420, 440, 460, 480, 500, 520, 540, 560, 580, 600, 620, 640, 660, 680, 700, 720, 740, 760, 780, 800, 820, 840, 860, 880, 900, 920, 940, 960, 970, 980, 1000, 1020, 1040, 1050, 1060, 1080, 1100, 1120, 1140, 1160, 1180, 1200, 1220, 1240, 1260, 1280, 1300, 1320, 1340, 1360, 1380, 1400, 1420, 1440, 1460, 1480, 1500, 1520, 1540, 1560, 1580, 1600, 1620, 1640, 1660, 1680, 1700, 1720, 1740, 1760, 1780, 1800, 1820, 1840, 1860, 1880, 1900, 1920, 1940, 1960, 1980, 2000, 2020, 2040, 2060, 2080, 2100, 2120, 2140, 2160, 2180, 2200, 2220, 2240, 2260, 2280, 2300, 2320, 2340, 2360, 2380, 2400, 2420, 2440, 2460, 2480, 2500, 2520, 2540, 2560, 2580, 2600, 2620, 2640, 2660, 2680, 2700],
101482
101844
  contentStyles: {
@@ -106032,7 +106394,7 @@ class ContentBox {
106032
106394
  this.editbox.boxImage(url, err);
106033
106395
  }
106034
106396
 
106035
- mainCss() {
106397
+ mainCss(absolute) {
106036
106398
  let links = this.doc.getElementsByTagName('link');
106037
106399
  let arrLinks = [];
106038
106400
 
@@ -106040,7 +106402,17 @@ class ContentBox {
106040
106402
  let src = links[i].href.toLowerCase();
106041
106403
 
106042
106404
  if (src.indexOf('basetype-') != -1) {
106043
- arrLinks.push(links[i].outerHTML);
106405
+ if (absolute) {
106406
+ // make absolute
106407
+ const link = links[i].cloneNode();
106408
+ let imgUrl = link.href;
106409
+ let urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
106410
+ imgUrl = imgUrl.replace(urlBase, '[%PATH%]');
106411
+ link.href = imgUrl;
106412
+ arrLinks.push(link.outerHTML);
106413
+ } else {
106414
+ arrLinks.push(links[i].outerHTML);
106415
+ }
106044
106416
  }
106045
106417
  } // arrLinks = [...new Set(arrLinks)]; // remove duplicates not needed, always single css
106046
106418
 
@@ -106064,7 +106436,7 @@ class ContentBox {
106064
106436
  return arrLinks;
106065
106437
  }
106066
106438
 
106067
- sectionCss() {
106439
+ sectionCss(absolute) {
106068
106440
  let links = this.doc.getElementsByTagName('link');
106069
106441
  let arrLinks = [];
106070
106442
 
@@ -106072,7 +106444,17 @@ class ContentBox {
106072
106444
  let src = links[i].href.toLowerCase();
106073
106445
 
106074
106446
  if (src.indexOf('basetype-') != -1) ; else if (src.indexOf('type-') != -1) {
106075
- arrLinks.push(links[i].outerHTML);
106447
+ if (absolute) {
106448
+ // make absolute
106449
+ const link = links[i].cloneNode();
106450
+ let imgUrl = link.href;
106451
+ let urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
106452
+ imgUrl = imgUrl.replace(urlBase, '[%PATH%]');
106453
+ link.href = imgUrl;
106454
+ arrLinks.push(link.outerHTML);
106455
+ } else {
106456
+ arrLinks.push(links[i].outerHTML);
106457
+ }
106076
106458
  }
106077
106459
  }
106078
106460
 
@@ -106100,10 +106482,56 @@ class ContentBox {
106100
106482
 
106101
106483
  html(bForView) {
106102
106484
  this.cleanupUnused();
106103
- var html = this.editor.readHtml(this.wrapperEl, bForView, true);
106485
+ const html = this.editor.readHtml(this.wrapperEl, bForView, true);
106104
106486
  return html;
106105
106487
  }
106106
106488
 
106489
+ download(options = {}) {
106490
+ this.export(options, true);
106491
+ }
106492
+
106493
+ export(options = {}, shortenOutput = false) {
106494
+ let pageTemplate = this.pageTemplate;
106495
+ let output = ''; // [%CONTENT%]
106496
+
106497
+ this.cleanupUnused();
106498
+ this.editor.makeAbsolute = true;
106499
+ this.editor.shortenOutput = shortenOutput;
106500
+ let html = this.editor.readHtml(this.wrapperEl, false, true);
106501
+ this.editor.makeAbsolute = false;
106502
+ this.editor.shortenOutput = false;
106503
+ output = pageTemplate.replace('[%CONTENT%]', html); // [%MAINCSS%] & [%SECTIONCSS%]
106504
+
106505
+ let mainCss = this.mainCss(true);
106506
+ let sectionCss = this.sectionCss(true);
106507
+ output = output.replaceAll('[%MAINCSS%]', mainCss);
106508
+ output = output.replaceAll('[%SECTIONCSS%]', sectionCss); // Custom
106509
+
106510
+ if (options.replace) {
106511
+ options.replace.forEach(rule => {
106512
+ output = output.replaceAll(`${rule[0]}`, rule[1]);
106513
+ });
106514
+ } // [%PATH%]
106515
+
106516
+
106517
+ if (options.path) {
106518
+ output = output.replaceAll('[%PATH%]', options.path);
106519
+ } else {
106520
+ let urlBase;
106521
+ urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
106522
+ output = output.replaceAll('[%PATH%]', urlBase);
106523
+ } // Beautify
106524
+
106525
+
106526
+ output = this.editor.beautify(output);
106527
+ const a = document.createElement('a');
106528
+ a.href = window.URL.createObjectURL(new Blob([output], {
106529
+ type: 'text/plain'
106530
+ }));
106531
+ a.download = 'page.html';
106532
+ a.click();
106533
+ }
106534
+
106107
106535
  viewZoom() {
106108
106536
  this.editor.viewZoom();
106109
106537
  }