@innovastudio/contentbox 1.4.70 → 1.4.72

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.72",
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.85",
50
50
  "js-beautify": "^1.14.0"
51
51
  }
52
52
  }
@@ -484,6 +484,7 @@ const prepareSvgIcons$1 = builder => {
484
484
  <circle cx="12" cy="17" r="1"></circle>
485
485
  </symbol>
486
486
 
487
+
487
488
  </defs>
488
489
  </svg>`;
489
490
  const builderStuff = builder.builderStuff;
@@ -28910,6 +28911,79 @@ class HtmlUtil {
28910
28911
  block.getAttribute('data-settings', uniqueID);
28911
28912
  }
28912
28913
  });
28914
+ } //Make absolute (for Export/Download)
28915
+
28916
+
28917
+ if (this.builder.makeAbsolute) {
28918
+ const convertMediaUrl = imgUrl => {
28919
+ // make absolute
28920
+ let img = document.createElement('img');
28921
+ img.src = imgUrl;
28922
+ img.setAttribute('data-absoluteurl', img.src);
28923
+ imgUrl = img.getAttribute('data-absoluteurl');
28924
+ return imgUrl;
28925
+ };
28926
+
28927
+ const convertBgUrl = imgUrl => {
28928
+ // make absolute
28929
+ let img = document.createElement('img');
28930
+ img.src = imgUrl;
28931
+ img.setAttribute('data-absoluteurl', img.src);
28932
+ imgUrl = img.getAttribute('data-absoluteurl'); // Do not use imgUrl directly, change base to [%PATH%] instead
28933
+ // (to prevent auto converting back to relative path)
28934
+
28935
+ let urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
28936
+ return imgUrl.replace(urlBase, '[%PATH%]'); // Example:
28937
+ // url = http://localhost:8080/uploads/image.jpg
28938
+ // urlBase = http://localhost:8080
28939
+ // become: [%PATH%]/uploads/image.jpg
28940
+ };
28941
+
28942
+ const convertMedia = (elm, attrName) => {
28943
+ if (elm.hasAttribute(attrName)) {
28944
+ if (!(elm.parentNode.tagName.toLowerCase() === 'video' || elm.parentNode.tagName.toLowerCase() === 'audio')) return;
28945
+ let imgUrl = elm.getAttribute(attrName);
28946
+ imgUrl = convertMediaUrl(imgUrl);
28947
+ elm.setAttribute(attrName, `${imgUrl}`);
28948
+ }
28949
+ };
28950
+
28951
+ let imgs = tmp.querySelectorAll('img');
28952
+ Array.prototype.forEach.call(imgs, img => {
28953
+ let src = img.src;
28954
+ img.setAttribute('src', src);
28955
+ });
28956
+ let elms = tmp.querySelectorAll('*');
28957
+ elms.forEach(elm => {
28958
+ if (elm.style.backgroundImage) {
28959
+ let s = elm.style.backgroundImage;
28960
+
28961
+ if (s.indexOf('url(') !== -1) {
28962
+ let imgUrl = s.slice(4, -1).replace(/["']/g, '');
28963
+ imgUrl = convertBgUrl(imgUrl);
28964
+ elm.style.backgroundImage = `url(${imgUrl})`;
28965
+ }
28966
+ }
28967
+
28968
+ convertMedia(elm, 'src');
28969
+ convertMedia(elm, 'data-default');
28970
+ convertMedia(elm, 'data-240');
28971
+ convertMedia(elm, 'data-360');
28972
+ convertMedia(elm, 'data-480');
28973
+ convertMedia(elm, 'data-540');
28974
+ convertMedia(elm, 'data-720');
28975
+ convertMedia(elm, 'data-1080');
28976
+ convertMedia(elm, 'data-1440');
28977
+ convertMedia(elm, 'data-2160');
28978
+
28979
+ if (elm.hasAttribute('href')) {
28980
+ if (elm.tagName.toLowerCase() === 'link') {
28981
+ let imgUrl = elm.getAttribute('href');
28982
+ imgUrl = convertMediaUrl(imgUrl);
28983
+ elm.setAttribute('href', `${imgUrl}`);
28984
+ }
28985
+ }
28986
+ });
28913
28987
  } //Cleaning
28914
28988
 
28915
28989
 
@@ -29047,7 +29121,75 @@ class HtmlUtil {
29047
29121
  elms = tmp.querySelectorAll('[data-scroll]');
29048
29122
  dom$h.removeAttributes(elms, 'data-scroll');
29049
29123
  elms = tmp.querySelectorAll('[data-scroll-once]');
29050
- dom$h.removeAttributes(elms, 'data-scroll-once'); // cleaning
29124
+ dom$h.removeAttributes(elms, 'data-scroll-once');
29125
+
29126
+ if (this.builder.shortenOutput) {
29127
+ elms = tmp.querySelectorAll('[data-noedit]');
29128
+ dom$h.removeAttributes(elms, 'data-noedit');
29129
+ elms = tmp.querySelectorAll('[data-module]');
29130
+ dom$h.removeAttributes(elms, 'data-module');
29131
+ elms = tmp.querySelectorAll('[data-module-desc]');
29132
+ dom$h.removeAttributes(elms, 'data-module-desc');
29133
+ elms = tmp.querySelectorAll('[data-dialog-width]');
29134
+ dom$h.removeAttributes(elms, 'data-dialog-width');
29135
+ elms = tmp.querySelectorAll('[data-dialog-height]');
29136
+ dom$h.removeAttributes(elms, 'data-dialog-height');
29137
+ elms = tmp.querySelectorAll('[data-html]');
29138
+ dom$h.removeAttributes(elms, 'data-html');
29139
+ elms = tmp.querySelectorAll('[data-settings]');
29140
+ dom$h.removeAttributes(elms, 'data-settings');
29141
+ elms = tmp.querySelectorAll('[data-html-1]');
29142
+ dom$h.removeAttributes(elms, 'data-html-1');
29143
+ elms = tmp.querySelectorAll('[data-html-2]');
29144
+ dom$h.removeAttributes(elms, 'data-html-2');
29145
+ elms = tmp.querySelectorAll('[data-html-3]');
29146
+ dom$h.removeAttributes(elms, 'data-html-3');
29147
+ elms = tmp.querySelectorAll('[data-html-4]');
29148
+ dom$h.removeAttributes(elms, 'data-html-4');
29149
+ elms = tmp.querySelectorAll('[data-html-5]');
29150
+ dom$h.removeAttributes(elms, 'data-html-5');
29151
+ elms = tmp.querySelectorAll('[data-html-6]');
29152
+ dom$h.removeAttributes(elms, 'data-html-6');
29153
+ elms = tmp.querySelectorAll('[data-html-7]');
29154
+ dom$h.removeAttributes(elms, 'data-html-7');
29155
+ elms = tmp.querySelectorAll('[data-html-8]');
29156
+ dom$h.removeAttributes(elms, 'data-html-8');
29157
+ elms = tmp.querySelectorAll('[data-html-9]');
29158
+ dom$h.removeAttributes(elms, 'data-html-9');
29159
+ elms = tmp.querySelectorAll('[data-html-10]');
29160
+ dom$h.removeAttributes(elms, 'data-html-10');
29161
+ elms = tmp.querySelectorAll('[data-html-12]');
29162
+ dom$h.removeAttributes(elms, 'data-html-12');
29163
+ elms = tmp.querySelectorAll('[data-html-13]');
29164
+ dom$h.removeAttributes(elms, 'data-html-13');
29165
+ elms = tmp.querySelectorAll('[data-html-14]');
29166
+ dom$h.removeAttributes(elms, 'data-html-14');
29167
+ elms = tmp.querySelectorAll('[data-html-15]');
29168
+ dom$h.removeAttributes(elms, 'data-html-15');
29169
+ elms = tmp.querySelectorAll('[data-html-16]');
29170
+ dom$h.removeAttributes(elms, 'data-html-16');
29171
+ elms = tmp.querySelectorAll('[data-html-17]');
29172
+ dom$h.removeAttributes(elms, 'data-html-17');
29173
+ elms = tmp.querySelectorAll('[data-html-18]');
29174
+ dom$h.removeAttributes(elms, 'data-html-18');
29175
+ elms = tmp.querySelectorAll('[data-html-19]');
29176
+ dom$h.removeAttributes(elms, 'data-html-19');
29177
+ elms = tmp.querySelectorAll('[data-html-20]');
29178
+ dom$h.removeAttributes(elms, 'data-html-20');
29179
+ elms = tmp.querySelectorAll('[data-html-21]');
29180
+ dom$h.removeAttributes(elms, 'data-html-21');
29181
+ elms = tmp.querySelectorAll('[data-html-21]');
29182
+ dom$h.removeAttributes(elms, 'data-html-21');
29183
+ elms = tmp.querySelectorAll('[data-html-22]');
29184
+ dom$h.removeAttributes(elms, 'data-html-22');
29185
+ elms = tmp.querySelectorAll('[data-html-23]');
29186
+ dom$h.removeAttributes(elms, 'data-html-23');
29187
+ elms = tmp.querySelectorAll('[data-html-24]');
29188
+ dom$h.removeAttributes(elms, 'data-html-24');
29189
+ elms = tmp.querySelectorAll('[data-html-25]');
29190
+ dom$h.removeAttributes(elms, 'data-html-25');
29191
+ } // cleaning
29192
+
29051
29193
 
29052
29194
  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
29195
  // '[data--400-bottom],[data--200-bottom],[data--100-bottom],[data-50-bottom],[data-200-bottom],[data-300-bottom],' +
@@ -29161,6 +29303,74 @@ class HtmlUtil {
29161
29303
  Array.prototype.forEach.call(emptystyles, emptystyle => {
29162
29304
  emptystyle.removeAttribute('style');
29163
29305
  });
29306
+
29307
+ if (this.builder.shortenOutput) {
29308
+ elms = tmp.querySelectorAll('[data-noedit]');
29309
+ dom$h.removeAttributes(elms, 'data-noedit');
29310
+ elms = tmp.querySelectorAll('[data-module]');
29311
+ dom$h.removeAttributes(elms, 'data-module');
29312
+ elms = tmp.querySelectorAll('[data-module-desc]');
29313
+ dom$h.removeAttributes(elms, 'data-module-desc');
29314
+ elms = tmp.querySelectorAll('[data-dialog-width]');
29315
+ dom$h.removeAttributes(elms, 'data-dialog-width');
29316
+ elms = tmp.querySelectorAll('[data-dialog-height]');
29317
+ dom$h.removeAttributes(elms, 'data-dialog-height');
29318
+ elms = tmp.querySelectorAll('[data-html]');
29319
+ dom$h.removeAttributes(elms, 'data-html');
29320
+ elms = tmp.querySelectorAll('[data-settings]');
29321
+ dom$h.removeAttributes(elms, 'data-settings');
29322
+ elms = tmp.querySelectorAll('[data-html-1]');
29323
+ dom$h.removeAttributes(elms, 'data-html-1');
29324
+ elms = tmp.querySelectorAll('[data-html-2]');
29325
+ dom$h.removeAttributes(elms, 'data-html-2');
29326
+ elms = tmp.querySelectorAll('[data-html-3]');
29327
+ dom$h.removeAttributes(elms, 'data-html-3');
29328
+ elms = tmp.querySelectorAll('[data-html-4]');
29329
+ dom$h.removeAttributes(elms, 'data-html-4');
29330
+ elms = tmp.querySelectorAll('[data-html-5]');
29331
+ dom$h.removeAttributes(elms, 'data-html-5');
29332
+ elms = tmp.querySelectorAll('[data-html-6]');
29333
+ dom$h.removeAttributes(elms, 'data-html-6');
29334
+ elms = tmp.querySelectorAll('[data-html-7]');
29335
+ dom$h.removeAttributes(elms, 'data-html-7');
29336
+ elms = tmp.querySelectorAll('[data-html-8]');
29337
+ dom$h.removeAttributes(elms, 'data-html-8');
29338
+ elms = tmp.querySelectorAll('[data-html-9]');
29339
+ dom$h.removeAttributes(elms, 'data-html-9');
29340
+ elms = tmp.querySelectorAll('[data-html-10]');
29341
+ dom$h.removeAttributes(elms, 'data-html-10');
29342
+ elms = tmp.querySelectorAll('[data-html-12]');
29343
+ dom$h.removeAttributes(elms, 'data-html-12');
29344
+ elms = tmp.querySelectorAll('[data-html-13]');
29345
+ dom$h.removeAttributes(elms, 'data-html-13');
29346
+ elms = tmp.querySelectorAll('[data-html-14]');
29347
+ dom$h.removeAttributes(elms, 'data-html-14');
29348
+ elms = tmp.querySelectorAll('[data-html-15]');
29349
+ dom$h.removeAttributes(elms, 'data-html-15');
29350
+ elms = tmp.querySelectorAll('[data-html-16]');
29351
+ dom$h.removeAttributes(elms, 'data-html-16');
29352
+ elms = tmp.querySelectorAll('[data-html-17]');
29353
+ dom$h.removeAttributes(elms, 'data-html-17');
29354
+ elms = tmp.querySelectorAll('[data-html-18]');
29355
+ dom$h.removeAttributes(elms, 'data-html-18');
29356
+ elms = tmp.querySelectorAll('[data-html-19]');
29357
+ dom$h.removeAttributes(elms, 'data-html-19');
29358
+ elms = tmp.querySelectorAll('[data-html-20]');
29359
+ dom$h.removeAttributes(elms, 'data-html-20');
29360
+ elms = tmp.querySelectorAll('[data-html-21]');
29361
+ dom$h.removeAttributes(elms, 'data-html-21');
29362
+ elms = tmp.querySelectorAll('[data-html-21]');
29363
+ dom$h.removeAttributes(elms, 'data-html-21');
29364
+ elms = tmp.querySelectorAll('[data-html-22]');
29365
+ dom$h.removeAttributes(elms, 'data-html-22');
29366
+ elms = tmp.querySelectorAll('[data-html-23]');
29367
+ dom$h.removeAttributes(elms, 'data-html-23');
29368
+ elms = tmp.querySelectorAll('[data-html-24]');
29369
+ dom$h.removeAttributes(elms, 'data-html-24');
29370
+ elms = tmp.querySelectorAll('[data-html-25]');
29371
+ dom$h.removeAttributes(elms, 'data-html-25');
29372
+ }
29373
+
29164
29374
  html = tmp.innerHTML.trim();
29165
29375
  html = html.replace(/<font/g, '<span').replace(/<\/font/g, '</span');
29166
29376
  } // elm = builderStuff.querySelector('#tmp_content');
@@ -29178,6 +29388,13 @@ class HtmlUtil {
29178
29388
  return html;
29179
29389
  }
29180
29390
 
29391
+ beautify(html) {
29392
+ let beautify = JsBeautify.html;
29393
+ html = beautify(html);
29394
+ html = html.replace(/(\r\n|\r|\n){3,}/g, '$1\n');
29395
+ return html;
29396
+ }
29397
+
29181
29398
  }
29182
29399
 
29183
29400
  class UndoRedo {
@@ -29728,6 +29945,14 @@ const prepareSvgIcons = builder => {
29728
29945
  <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
29729
29946
  <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
29947
  </symbol>
29948
+
29949
+ <symbol id="icon-download" viewBox="0 0 24 24" stroke-width="1" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
29950
+ <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
29951
+ <path d="M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2"></path>
29952
+ <path d="M7 11l5 5l5 -5"></path>
29953
+ <path d="M12 4l0 12"></path>
29954
+ </symbol>
29955
+
29731
29956
  </defs>
29732
29957
  </svg>`;
29733
29958
  builder.dom.appendHtml(builder.builderStuff, html);
@@ -36765,7 +36990,7 @@ function getOffset(element) {
36765
36990
  top: box.top + (window.pageYOffset - document.documentElement.clientTop)
36766
36991
  };
36767
36992
  }
36768
- var location = WINDOW.location;
36993
+ var location$1 = WINDOW.location;
36769
36994
  var REGEXP_ORIGINS = /^(\w+:)\/\/([^:/?#]*):?(\d*)/i;
36770
36995
  /**
36771
36996
  * Check if the given URL is a cross origin URL.
@@ -36775,7 +37000,7 @@ var REGEXP_ORIGINS = /^(\w+:)\/\/([^:/?#]*):?(\d*)/i;
36775
37000
 
36776
37001
  function isCrossOriginURL(url) {
36777
37002
  var parts = url.match(REGEXP_ORIGINS);
36778
- return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);
37003
+ return parts !== null && (parts[1] !== location$1.protocol || parts[2] !== location$1.hostname || parts[3] !== location$1.port);
36779
37004
  }
36780
37005
  /**
36781
37006
  * Add timestamp to the given URL.
@@ -66196,7 +66421,7 @@ class Hyperlink {
66196
66421
  <input id="inpCreateLinkText" class="input-text" type="text" style="width:100%;"/>
66197
66422
 
66198
66423
  <label for="inpCreateLinkTitle" style="margin-top:14px;display:block">${util.out('Title')}:</label>
66199
- <input id="inpCreateLinkTitle" class="input-title" type="text" style="width:100%;border-top: none;"/>
66424
+ <input id="inpCreateLinkTitle" class="input-title" type="text" style="width:100%;"/>
66200
66425
 
66201
66426
  <div style="text-align:right;margin-top:14px;">
66202
66427
  <button title="${util.out('Cancel')}" class="input-cancel classic-secondary">${util.out('Cancel')}</button>
@@ -67516,10 +67741,12 @@ class Code {
67516
67741
  viewhtml = this.builderStuff.querySelector('.viewhtml');
67517
67742
  }
67518
67743
 
67519
- let textarea = viewhtml.querySelector('textarea'); // Commented, to prevent {id} get formatted.
67520
- // let beautify = JsBeautify.html;
67521
- // html = beautify(html);
67744
+ let textarea = viewhtml.querySelector('textarea'); // Prevent {id} get formatted.
67522
67745
 
67746
+ html = html.replaceAll('{id}', '__id__');
67747
+ let beautify = JsBeautify.html;
67748
+ html = beautify(html);
67749
+ html = html.replaceAll('__id__', '{id}');
67523
67750
  textarea.value = html;
67524
67751
  this.htmlUtil.view('code');
67525
67752
  });
@@ -69062,7 +69289,6 @@ class RowTool {
69062
69289
  const dom = this.builder.dom;
69063
69290
  this.dom = dom;
69064
69291
  this.grid = new Grid(builder);
69065
- const htmlutil = new HtmlUtil(builder);
69066
69292
  let rowMore = builderStuff.querySelector('.rowmore');
69067
69293
  let htmlbutton = '';
69068
69294
  if (builder.opts.rowHtmlEditor) htmlbutton = `<button type="button" title="${util.out('HTML')}" class="row-html">
@@ -69111,6 +69337,7 @@ class RowTool {
69111
69337
  }
69112
69338
 
69113
69339
  if (!row) return;
69340
+ const htmlutil = new HtmlUtil(builder);
69114
69341
  htmlutil.view('row');
69115
69342
  });
69116
69343
  }
@@ -76381,7 +76608,7 @@ class ElementTextStyles {
76381
76608
  var sTextAlign = elm.style.textAlign;
76382
76609
  this.panelStuff.querySelector('#inpElmTextAlign').value = sTextAlign;
76383
76610
  this.panelStuff.querySelector('#inpElmFontSize').value = '';
76384
- var nFontSize = parseInt(elm.style.fontSize);
76611
+ var nFontSize = parseFloat(elm.style.fontSize);
76385
76612
 
76386
76613
  if (!isNaN(nFontSize)) {
76387
76614
  this.panelStuff.querySelector('#inpElmFontSize').value = nFontSize;
@@ -76441,7 +76668,7 @@ class ElementTextStyles {
76441
76668
  if (!isNaN(elm.style.lineHeight)) {
76442
76669
  this.panelStuff.querySelector('#inpElmLineHeight').value = elm.style.lineHeight;
76443
76670
  } else {
76444
- var nLineHeight = parseInt(elm.style.lineHeight);
76671
+ var nLineHeight = parseFloat(elm.style.lineHeight);
76445
76672
 
76446
76673
  if (!isNaN(nLineHeight)) {
76447
76674
  this.panelStuff.querySelector('#inpElmLineHeight').value = nLineHeight;
@@ -76462,14 +76689,14 @@ class ElementTextStyles {
76462
76689
 
76463
76690
  this.panelStuff.querySelector('#inpElmLineHeightUnit').value = sLineHeightUnit;
76464
76691
  this.panelStuff.querySelector('#inpElmLetterSpacing').value = '';
76465
- var nLetterSpacing = parseInt(elm.style.letterSpacing);
76692
+ var nLetterSpacing = parseFloat(elm.style.letterSpacing);
76466
76693
 
76467
76694
  if (!isNaN(nLetterSpacing)) {
76468
76695
  this.panelStuff.querySelector('#inpElmLetterSpacing').value = nLetterSpacing;
76469
76696
  }
76470
76697
 
76471
76698
  this.panelStuff.querySelector('#inpElmWordSpacing').value = '';
76472
- var nWordSpacing = parseInt(elm.style.wordSpacing);
76699
+ var nWordSpacing = parseFloat(elm.style.wordSpacing);
76473
76700
 
76474
76701
  if (!isNaN(nWordSpacing)) {
76475
76702
  this.panelStuff.querySelector('#inpElmWordSpacing').value = nWordSpacing;
@@ -89103,6 +89330,39 @@ class ContentBuilder {
89103
89330
  </div>
89104
89331
  </div>
89105
89332
  `,
89333
+ pageTemplate: `<!DOCTYPE html>
89334
+ <html lang="en">
89335
+ <head>
89336
+ <meta charset="utf-8">
89337
+ <title>Page</title>
89338
+ <meta name="viewport" content="width=device-width, initial-scale=1">
89339
+ <meta name="description" content="">
89340
+ <link rel="shortcut icon" href="#" />
89341
+
89342
+ <link href="[%PATH%]/assets/minimalist-blocks/content.css" rel="stylesheet" type="text/css" />
89343
+
89344
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.core.css" rel="stylesheet" type="text/css" />
89345
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.theme.css" rel="stylesheet" type="text/css" />
89346
+ <script src="[%PATH%]/assets/scripts/glide/glide.js" type="text/javascript"></script>
89347
+
89348
+ <style>
89349
+ .container {
89350
+ margin: 150px auto 0;
89351
+ max-width: 800px;
89352
+ width: 100%;
89353
+ padding: 0 20px;
89354
+ box-sizing: border-box;
89355
+ }
89356
+ </style>
89357
+ </head>
89358
+ <body>
89359
+
89360
+ <div class="container">
89361
+ [%CONTENT%]
89362
+ </div>
89363
+
89364
+ </body>
89365
+ </html>`,
89106
89366
 
89107
89367
  /*
89108
89368
  onZoomStart: () => {
@@ -89685,6 +89945,7 @@ class ContentBuilder {
89685
89945
 
89686
89946
  this.colTool = new ColumnTool(this); // Render Column Tool
89687
89947
 
89948
+ this._rowTool = new RowTool(this);
89688
89949
  this.mediaPicker = new MediaPicker(this); // Extend the onChange function
89689
89950
 
89690
89951
  var oldget = this.opts.onChange;
@@ -90207,8 +90468,8 @@ class ContentBuilder {
90207
90468
  // Render Row tool
90208
90469
 
90209
90470
 
90210
- this.rowtool = new RowTool(this);
90211
- this.rowtool.render(row); // Render Row Add tool
90471
+ this._rowTool.render(row); // Render Row Add tool
90472
+
90212
90473
 
90213
90474
  const rowaddtool = new RowAddTool(this);
90214
90475
  rowaddtool.render(row); // Apply behavior on each column
@@ -90614,7 +90875,11 @@ class ContentBuilder {
90614
90875
 
90615
90876
  const builders = this.doc.querySelectorAll(this.opts.container);
90616
90877
  Array.prototype.forEach.call(builders, builder => {
90617
- builder.innerHTML = htmlutil.readHtml(builder, true);
90878
+ // builder.innerHTML = htmlutil.readHtml(builder, true);
90879
+ let html = htmlutil.readHtml(builder, false);
90880
+ let range = this.doc.createRange();
90881
+ builder.innerHTML = '';
90882
+ builder.appendChild(range.createContextualFragment(html)); // Use createContextualFragment so that embedded javascript code (code block) will be executed
90618
90883
  });
90619
90884
  Array.prototype.forEach.call(builders, builder => {
90620
90885
  builder.removeAttribute('data-sort');
@@ -90941,6 +91206,52 @@ class ContentBuilder {
90941
91206
 
90942
91207
  saveForUndo(checkLater) {
90943
91208
  this.uo.saveForUndo(checkLater);
91209
+ }
91210
+
91211
+ download(options = {}) {
91212
+ this.export(options, true);
91213
+ }
91214
+
91215
+ export(options = {}, shortenOutput = false) {
91216
+ let pageTemplate = this.pageTemplate;
91217
+ let output = ''; // [%CONTENT%]
91218
+
91219
+ this.makeAbsolute = true; //To make absolute (for Export/Download)
91220
+
91221
+ this.shortenOutput = shortenOutput;
91222
+ let html = this.html();
91223
+ this.makeAbsolute = false;
91224
+ this.shortenOutput = false;
91225
+ output = pageTemplate.replace('[%CONTENT%]', html); // Custom
91226
+
91227
+ if (options.replace) {
91228
+ options.replace.forEach(rule => {
91229
+ output = output.replaceAll(`${rule[0]}`, rule[1]);
91230
+ });
91231
+ } // [%PATH%]
91232
+
91233
+
91234
+ if (options.path) {
91235
+ output = output.replaceAll('[%PATH%]', options.path);
91236
+ } else {
91237
+ let urlBase;
91238
+ urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
91239
+ output = output.replaceAll('[%PATH%]', urlBase);
91240
+ } // Beautify
91241
+
91242
+
91243
+ output = this.beautify(output);
91244
+ const a = document.createElement('a');
91245
+ a.href = window.URL.createObjectURL(new Blob([output], {
91246
+ type: 'text/plain'
91247
+ }));
91248
+ a.download = 'page.html';
91249
+ a.click();
91250
+ }
91251
+
91252
+ beautify(html) {
91253
+ const htmlutil = new HtmlUtil(this);
91254
+ return htmlutil.beautify(html);
90944
91255
  } // Module related
90945
91256
 
90946
91257
 
@@ -91772,8 +92083,7 @@ class ContentBuilder {
91772
92083
 
91773
92084
  this.element.click(col, e);
91774
92085
  this.colTool.click(col);
91775
- this.elmTool.click(col, e); //this.rowtool.click(col);
91776
-
92086
+ this.elmTool.click(col, e);
91777
92087
  this.rte.click(col, e); // Grid Editor Status
91778
92088
  // On/off lock button
91779
92089
 
@@ -101477,6 +101787,59 @@ class ContentBox {
101477
101787
  </div>
101478
101788
  </div>
101479
101789
  `,
101790
+ pageTemplate: `
101791
+ <!DOCTYPE html>
101792
+ <html lang="en">
101793
+ <head>
101794
+ <meta charset="utf-8">
101795
+ <title>Page</title>
101796
+ <meta name="viewport" content="width=device-width, initial-scale=1">
101797
+ <meta name="description" content="">
101798
+ <link rel="shortcut icon" href="#" />
101799
+
101800
+ <link href="[%PATH%]/assets/minimalist-blocks/content.css" rel="stylesheet" type="text/css" />
101801
+ <link href="[%PATH%]/box/box-flex.css" rel="stylesheet" type="text/css" />
101802
+
101803
+ [%MAINCSS%]
101804
+ [%SECTIONCSS%]
101805
+ </head>
101806
+ <body style="touch-action: pan-y">
101807
+
101808
+ <main id="main">
101809
+ <div class="is-wrapper">
101810
+ [%CONTENT%]
101811
+ </div>
101812
+ </main>
101813
+
101814
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.core.css" rel="stylesheet" type="text/css" />
101815
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.theme.css" rel="stylesheet" type="text/css" />
101816
+ <script src="[%PATH%]/assets/scripts/glide/glide.js" type="text/javascript"></script>
101817
+
101818
+ <link href="[%PATH%]/assets/scripts/navbar/navbar.css" rel="stylesheet" type="text/css" />
101819
+ <script src="[%PATH%]/assets/scripts/navbar/navbar.min.js" type="text/javascript"></script>
101820
+
101821
+ <script src="[%PATH%]/box/box-flex.js" type="text/javascript"></script>
101822
+
101823
+ <!-- Optional: if you want to add smooth scrolling -->
101824
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/smoothscroll/1.4.10/SmoothScroll.min.js" type="text/javascript"></script>
101825
+ <script>
101826
+ SmoothScroll({
101827
+ frameRate: 150,
101828
+ animationTime: 800,
101829
+ stepSize: 120,
101830
+ pulseAlgorithm: 1,
101831
+ pulseScale: 4,
101832
+ pulseNormalize: 1,
101833
+ accelerationDelta: 300,
101834
+ accelerationMax: 2,
101835
+ keyboardSupport: 1,
101836
+ arrowScroll: 50,
101837
+ fixedBackground: 0
101838
+ });
101839
+ </script>
101840
+ </body>
101841
+ </html>
101842
+ `,
101480
101843
  contentStyleWithSample: false,
101481
101844
  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
101845
  contentStyles: {
@@ -106032,7 +106395,7 @@ class ContentBox {
106032
106395
  this.editbox.boxImage(url, err);
106033
106396
  }
106034
106397
 
106035
- mainCss() {
106398
+ mainCss(absolute) {
106036
106399
  let links = this.doc.getElementsByTagName('link');
106037
106400
  let arrLinks = [];
106038
106401
 
@@ -106040,7 +106403,17 @@ class ContentBox {
106040
106403
  let src = links[i].href.toLowerCase();
106041
106404
 
106042
106405
  if (src.indexOf('basetype-') != -1) {
106043
- arrLinks.push(links[i].outerHTML);
106406
+ if (absolute) {
106407
+ // make absolute
106408
+ const link = links[i].cloneNode();
106409
+ let imgUrl = link.href;
106410
+ let urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
106411
+ imgUrl = imgUrl.replace(urlBase, '[%PATH%]');
106412
+ link.href = imgUrl;
106413
+ arrLinks.push(link.outerHTML);
106414
+ } else {
106415
+ arrLinks.push(links[i].outerHTML);
106416
+ }
106044
106417
  }
106045
106418
  } // arrLinks = [...new Set(arrLinks)]; // remove duplicates not needed, always single css
106046
106419
 
@@ -106064,7 +106437,7 @@ class ContentBox {
106064
106437
  return arrLinks;
106065
106438
  }
106066
106439
 
106067
- sectionCss() {
106440
+ sectionCss(absolute) {
106068
106441
  let links = this.doc.getElementsByTagName('link');
106069
106442
  let arrLinks = [];
106070
106443
 
@@ -106072,7 +106445,17 @@ class ContentBox {
106072
106445
  let src = links[i].href.toLowerCase();
106073
106446
 
106074
106447
  if (src.indexOf('basetype-') != -1) ; else if (src.indexOf('type-') != -1) {
106075
- arrLinks.push(links[i].outerHTML);
106448
+ if (absolute) {
106449
+ // make absolute
106450
+ const link = links[i].cloneNode();
106451
+ let imgUrl = link.href;
106452
+ let urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
106453
+ imgUrl = imgUrl.replace(urlBase, '[%PATH%]');
106454
+ link.href = imgUrl;
106455
+ arrLinks.push(link.outerHTML);
106456
+ } else {
106457
+ arrLinks.push(links[i].outerHTML);
106458
+ }
106076
106459
  }
106077
106460
  }
106078
106461
 
@@ -106100,10 +106483,56 @@ class ContentBox {
106100
106483
 
106101
106484
  html(bForView) {
106102
106485
  this.cleanupUnused();
106103
- var html = this.editor.readHtml(this.wrapperEl, bForView, true);
106486
+ const html = this.editor.readHtml(this.wrapperEl, bForView, true);
106104
106487
  return html;
106105
106488
  }
106106
106489
 
106490
+ download(options = {}) {
106491
+ this.export(options, true);
106492
+ }
106493
+
106494
+ export(options = {}, shortenOutput = false) {
106495
+ let pageTemplate = this.pageTemplate;
106496
+ let output = ''; // [%CONTENT%]
106497
+
106498
+ this.cleanupUnused();
106499
+ this.editor.makeAbsolute = true;
106500
+ this.editor.shortenOutput = shortenOutput;
106501
+ let html = this.editor.readHtml(this.wrapperEl, false, true);
106502
+ this.editor.makeAbsolute = false;
106503
+ this.editor.shortenOutput = false;
106504
+ output = pageTemplate.replace('[%CONTENT%]', html); // [%MAINCSS%] & [%SECTIONCSS%]
106505
+
106506
+ let mainCss = this.mainCss(true);
106507
+ let sectionCss = this.sectionCss(true);
106508
+ output = output.replaceAll('[%MAINCSS%]', mainCss);
106509
+ output = output.replaceAll('[%SECTIONCSS%]', sectionCss); // Custom
106510
+
106511
+ if (options.replace) {
106512
+ options.replace.forEach(rule => {
106513
+ output = output.replaceAll(`${rule[0]}`, rule[1]);
106514
+ });
106515
+ } // [%PATH%]
106516
+
106517
+
106518
+ if (options.path) {
106519
+ output = output.replaceAll('[%PATH%]', options.path);
106520
+ } else {
106521
+ let urlBase;
106522
+ urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
106523
+ output = output.replaceAll('[%PATH%]', urlBase);
106524
+ } // Beautify
106525
+
106526
+
106527
+ output = this.editor.beautify(output);
106528
+ const a = document.createElement('a');
106529
+ a.href = window.URL.createObjectURL(new Blob([output], {
106530
+ type: 'text/plain'
106531
+ }));
106532
+ a.download = 'page.html';
106533
+ a.click();
106534
+ }
106535
+
106107
106536
  viewZoom() {
106108
106537
  this.editor.viewZoom();
106109
106538
  }