@innovastudio/contentbuilder 1.3.81 → 1.3.83

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/contentbuilder",
3
3
  "type": "module",
4
- "version": "1.3.81",
4
+ "version": "1.3.83",
5
5
  "description": "",
6
6
  "main": "public/contentbuilder/contentbuilder.esm.js",
7
7
  "files": [
@@ -15048,6 +15048,79 @@ class HtmlUtil {
15048
15048
  block.getAttribute('data-settings', uniqueID);
15049
15049
  }
15050
15050
  });
15051
+ } //Make absolute (for Export/Download)
15052
+
15053
+
15054
+ if (this.builder.makeAbsolute) {
15055
+ const convertMediaUrl = imgUrl => {
15056
+ // make absolute
15057
+ let img = document.createElement('img');
15058
+ img.src = imgUrl;
15059
+ img.setAttribute('data-absoluteurl', img.src);
15060
+ imgUrl = img.getAttribute('data-absoluteurl');
15061
+ return imgUrl;
15062
+ };
15063
+
15064
+ const convertBgUrl = imgUrl => {
15065
+ // make absolute
15066
+ let img = document.createElement('img');
15067
+ img.src = imgUrl;
15068
+ img.setAttribute('data-absoluteurl', img.src);
15069
+ imgUrl = img.getAttribute('data-absoluteurl'); // Do not use imgUrl directly, change base to [%PATH%] instead
15070
+ // (to prevent auto converting back to relative path)
15071
+
15072
+ let urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
15073
+ return imgUrl.replace(urlBase, '[%PATH%]'); // Example:
15074
+ // url = http://localhost:8080/uploads/image.jpg
15075
+ // urlBase = http://localhost:8080
15076
+ // become: [%PATH%]/uploads/image.jpg
15077
+ };
15078
+
15079
+ const convertMedia = (elm, attrName) => {
15080
+ if (elm.hasAttribute(attrName)) {
15081
+ if (!(elm.parentNode.tagName.toLowerCase() === 'video' || elm.parentNode.tagName.toLowerCase() === 'audio')) return;
15082
+ let imgUrl = elm.getAttribute(attrName);
15083
+ imgUrl = convertMediaUrl(imgUrl);
15084
+ elm.setAttribute(attrName, `${imgUrl}`);
15085
+ }
15086
+ };
15087
+
15088
+ let imgs = tmp.querySelectorAll('img');
15089
+ Array.prototype.forEach.call(imgs, img => {
15090
+ let src = img.src;
15091
+ img.setAttribute('src', src);
15092
+ });
15093
+ let elms = tmp.querySelectorAll('*');
15094
+ elms.forEach(elm => {
15095
+ if (elm.style.backgroundImage) {
15096
+ let s = elm.style.backgroundImage;
15097
+
15098
+ if (s.indexOf('url(') !== -1) {
15099
+ let imgUrl = s.slice(4, -1).replace(/["']/g, '');
15100
+ imgUrl = convertBgUrl(imgUrl);
15101
+ elm.style.backgroundImage = `url(${imgUrl})`;
15102
+ }
15103
+ }
15104
+
15105
+ convertMedia(elm, 'src');
15106
+ convertMedia(elm, 'data-default');
15107
+ convertMedia(elm, 'data-240');
15108
+ convertMedia(elm, 'data-360');
15109
+ convertMedia(elm, 'data-480');
15110
+ convertMedia(elm, 'data-540');
15111
+ convertMedia(elm, 'data-720');
15112
+ convertMedia(elm, 'data-1080');
15113
+ convertMedia(elm, 'data-1440');
15114
+ convertMedia(elm, 'data-2160');
15115
+
15116
+ if (elm.hasAttribute('href')) {
15117
+ if (elm.tagName.toLowerCase() === 'link') {
15118
+ let imgUrl = elm.getAttribute('href');
15119
+ imgUrl = convertMediaUrl(imgUrl);
15120
+ elm.setAttribute('href', `${imgUrl}`);
15121
+ }
15122
+ }
15123
+ });
15051
15124
  } //Cleaning
15052
15125
 
15053
15126
 
@@ -15185,7 +15258,75 @@ class HtmlUtil {
15185
15258
  elms = tmp.querySelectorAll('[data-scroll]');
15186
15259
  dom$h.removeAttributes(elms, 'data-scroll');
15187
15260
  elms = tmp.querySelectorAll('[data-scroll-once]');
15188
- dom$h.removeAttributes(elms, 'data-scroll-once'); // cleaning
15261
+ dom$h.removeAttributes(elms, 'data-scroll-once');
15262
+
15263
+ if (this.builder.shortenOutput) {
15264
+ elms = tmp.querySelectorAll('[data-noedit]');
15265
+ dom$h.removeAttributes(elms, 'data-noedit');
15266
+ elms = tmp.querySelectorAll('[data-module]');
15267
+ dom$h.removeAttributes(elms, 'data-module');
15268
+ elms = tmp.querySelectorAll('[data-module-desc]');
15269
+ dom$h.removeAttributes(elms, 'data-module-desc');
15270
+ elms = tmp.querySelectorAll('[data-dialog-width]');
15271
+ dom$h.removeAttributes(elms, 'data-dialog-width');
15272
+ elms = tmp.querySelectorAll('[data-dialog-height]');
15273
+ dom$h.removeAttributes(elms, 'data-dialog-height');
15274
+ elms = tmp.querySelectorAll('[data-html]');
15275
+ dom$h.removeAttributes(elms, 'data-html');
15276
+ elms = tmp.querySelectorAll('[data-settings]');
15277
+ dom$h.removeAttributes(elms, 'data-settings');
15278
+ elms = tmp.querySelectorAll('[data-html-1]');
15279
+ dom$h.removeAttributes(elms, 'data-html-1');
15280
+ elms = tmp.querySelectorAll('[data-html-2]');
15281
+ dom$h.removeAttributes(elms, 'data-html-2');
15282
+ elms = tmp.querySelectorAll('[data-html-3]');
15283
+ dom$h.removeAttributes(elms, 'data-html-3');
15284
+ elms = tmp.querySelectorAll('[data-html-4]');
15285
+ dom$h.removeAttributes(elms, 'data-html-4');
15286
+ elms = tmp.querySelectorAll('[data-html-5]');
15287
+ dom$h.removeAttributes(elms, 'data-html-5');
15288
+ elms = tmp.querySelectorAll('[data-html-6]');
15289
+ dom$h.removeAttributes(elms, 'data-html-6');
15290
+ elms = tmp.querySelectorAll('[data-html-7]');
15291
+ dom$h.removeAttributes(elms, 'data-html-7');
15292
+ elms = tmp.querySelectorAll('[data-html-8]');
15293
+ dom$h.removeAttributes(elms, 'data-html-8');
15294
+ elms = tmp.querySelectorAll('[data-html-9]');
15295
+ dom$h.removeAttributes(elms, 'data-html-9');
15296
+ elms = tmp.querySelectorAll('[data-html-10]');
15297
+ dom$h.removeAttributes(elms, 'data-html-10');
15298
+ elms = tmp.querySelectorAll('[data-html-12]');
15299
+ dom$h.removeAttributes(elms, 'data-html-12');
15300
+ elms = tmp.querySelectorAll('[data-html-13]');
15301
+ dom$h.removeAttributes(elms, 'data-html-13');
15302
+ elms = tmp.querySelectorAll('[data-html-14]');
15303
+ dom$h.removeAttributes(elms, 'data-html-14');
15304
+ elms = tmp.querySelectorAll('[data-html-15]');
15305
+ dom$h.removeAttributes(elms, 'data-html-15');
15306
+ elms = tmp.querySelectorAll('[data-html-16]');
15307
+ dom$h.removeAttributes(elms, 'data-html-16');
15308
+ elms = tmp.querySelectorAll('[data-html-17]');
15309
+ dom$h.removeAttributes(elms, 'data-html-17');
15310
+ elms = tmp.querySelectorAll('[data-html-18]');
15311
+ dom$h.removeAttributes(elms, 'data-html-18');
15312
+ elms = tmp.querySelectorAll('[data-html-19]');
15313
+ dom$h.removeAttributes(elms, 'data-html-19');
15314
+ elms = tmp.querySelectorAll('[data-html-20]');
15315
+ dom$h.removeAttributes(elms, 'data-html-20');
15316
+ elms = tmp.querySelectorAll('[data-html-21]');
15317
+ dom$h.removeAttributes(elms, 'data-html-21');
15318
+ elms = tmp.querySelectorAll('[data-html-21]');
15319
+ dom$h.removeAttributes(elms, 'data-html-21');
15320
+ elms = tmp.querySelectorAll('[data-html-22]');
15321
+ dom$h.removeAttributes(elms, 'data-html-22');
15322
+ elms = tmp.querySelectorAll('[data-html-23]');
15323
+ dom$h.removeAttributes(elms, 'data-html-23');
15324
+ elms = tmp.querySelectorAll('[data-html-24]');
15325
+ dom$h.removeAttributes(elms, 'data-html-24');
15326
+ elms = tmp.querySelectorAll('[data-html-25]');
15327
+ dom$h.removeAttributes(elms, 'data-html-25');
15328
+ } // cleaning
15329
+
15189
15330
 
15190
15331
  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],' +
15191
15332
  // '[data--400-bottom],[data--200-bottom],[data--100-bottom],[data-50-bottom],[data-200-bottom],[data-300-bottom],' +
@@ -15299,6 +15440,74 @@ class HtmlUtil {
15299
15440
  Array.prototype.forEach.call(emptystyles, emptystyle => {
15300
15441
  emptystyle.removeAttribute('style');
15301
15442
  });
15443
+
15444
+ if (this.builder.shortenOutput) {
15445
+ elms = tmp.querySelectorAll('[data-noedit]');
15446
+ dom$h.removeAttributes(elms, 'data-noedit');
15447
+ elms = tmp.querySelectorAll('[data-module]');
15448
+ dom$h.removeAttributes(elms, 'data-module');
15449
+ elms = tmp.querySelectorAll('[data-module-desc]');
15450
+ dom$h.removeAttributes(elms, 'data-module-desc');
15451
+ elms = tmp.querySelectorAll('[data-dialog-width]');
15452
+ dom$h.removeAttributes(elms, 'data-dialog-width');
15453
+ elms = tmp.querySelectorAll('[data-dialog-height]');
15454
+ dom$h.removeAttributes(elms, 'data-dialog-height');
15455
+ elms = tmp.querySelectorAll('[data-html]');
15456
+ dom$h.removeAttributes(elms, 'data-html');
15457
+ elms = tmp.querySelectorAll('[data-settings]');
15458
+ dom$h.removeAttributes(elms, 'data-settings');
15459
+ elms = tmp.querySelectorAll('[data-html-1]');
15460
+ dom$h.removeAttributes(elms, 'data-html-1');
15461
+ elms = tmp.querySelectorAll('[data-html-2]');
15462
+ dom$h.removeAttributes(elms, 'data-html-2');
15463
+ elms = tmp.querySelectorAll('[data-html-3]');
15464
+ dom$h.removeAttributes(elms, 'data-html-3');
15465
+ elms = tmp.querySelectorAll('[data-html-4]');
15466
+ dom$h.removeAttributes(elms, 'data-html-4');
15467
+ elms = tmp.querySelectorAll('[data-html-5]');
15468
+ dom$h.removeAttributes(elms, 'data-html-5');
15469
+ elms = tmp.querySelectorAll('[data-html-6]');
15470
+ dom$h.removeAttributes(elms, 'data-html-6');
15471
+ elms = tmp.querySelectorAll('[data-html-7]');
15472
+ dom$h.removeAttributes(elms, 'data-html-7');
15473
+ elms = tmp.querySelectorAll('[data-html-8]');
15474
+ dom$h.removeAttributes(elms, 'data-html-8');
15475
+ elms = tmp.querySelectorAll('[data-html-9]');
15476
+ dom$h.removeAttributes(elms, 'data-html-9');
15477
+ elms = tmp.querySelectorAll('[data-html-10]');
15478
+ dom$h.removeAttributes(elms, 'data-html-10');
15479
+ elms = tmp.querySelectorAll('[data-html-12]');
15480
+ dom$h.removeAttributes(elms, 'data-html-12');
15481
+ elms = tmp.querySelectorAll('[data-html-13]');
15482
+ dom$h.removeAttributes(elms, 'data-html-13');
15483
+ elms = tmp.querySelectorAll('[data-html-14]');
15484
+ dom$h.removeAttributes(elms, 'data-html-14');
15485
+ elms = tmp.querySelectorAll('[data-html-15]');
15486
+ dom$h.removeAttributes(elms, 'data-html-15');
15487
+ elms = tmp.querySelectorAll('[data-html-16]');
15488
+ dom$h.removeAttributes(elms, 'data-html-16');
15489
+ elms = tmp.querySelectorAll('[data-html-17]');
15490
+ dom$h.removeAttributes(elms, 'data-html-17');
15491
+ elms = tmp.querySelectorAll('[data-html-18]');
15492
+ dom$h.removeAttributes(elms, 'data-html-18');
15493
+ elms = tmp.querySelectorAll('[data-html-19]');
15494
+ dom$h.removeAttributes(elms, 'data-html-19');
15495
+ elms = tmp.querySelectorAll('[data-html-20]');
15496
+ dom$h.removeAttributes(elms, 'data-html-20');
15497
+ elms = tmp.querySelectorAll('[data-html-21]');
15498
+ dom$h.removeAttributes(elms, 'data-html-21');
15499
+ elms = tmp.querySelectorAll('[data-html-21]');
15500
+ dom$h.removeAttributes(elms, 'data-html-21');
15501
+ elms = tmp.querySelectorAll('[data-html-22]');
15502
+ dom$h.removeAttributes(elms, 'data-html-22');
15503
+ elms = tmp.querySelectorAll('[data-html-23]');
15504
+ dom$h.removeAttributes(elms, 'data-html-23');
15505
+ elms = tmp.querySelectorAll('[data-html-24]');
15506
+ dom$h.removeAttributes(elms, 'data-html-24');
15507
+ elms = tmp.querySelectorAll('[data-html-25]');
15508
+ dom$h.removeAttributes(elms, 'data-html-25');
15509
+ }
15510
+
15302
15511
  html = tmp.innerHTML.trim();
15303
15512
  html = html.replace(/<font/g, '<span').replace(/<\/font/g, '</span');
15304
15513
  } // elm = builderStuff.querySelector('#tmp_content');
@@ -15316,6 +15525,13 @@ class HtmlUtil {
15316
15525
  return html;
15317
15526
  }
15318
15527
 
15528
+ beautify(html) {
15529
+ let beautify = JsBeautify.html;
15530
+ html = beautify(html);
15531
+ html = html.replace(/(\r\n|\r|\n){3,}/g, '$1\n');
15532
+ return html;
15533
+ }
15534
+
15319
15535
  }
15320
15536
 
15321
15537
  class UndoRedo {
@@ -15866,6 +16082,14 @@ const prepareSvgIcons = builder => {
15866
16082
  <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
15867
16083
  <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>
15868
16084
  </symbol>
16085
+
16086
+ <symbol id="icon-download" viewBox="0 0 24 24" stroke-width="1" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
16087
+ <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
16088
+ <path d="M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2"></path>
16089
+ <path d="M7 11l5 5l5 -5"></path>
16090
+ <path d="M12 4l0 12"></path>
16091
+ </symbol>
16092
+
15869
16093
  </defs>
15870
16094
  </svg>`;
15871
16095
  builder.dom.appendHtml(builder.builderStuff, html);
@@ -22903,7 +23127,7 @@ function getOffset(element) {
22903
23127
  top: box.top + (window.pageYOffset - document.documentElement.clientTop)
22904
23128
  };
22905
23129
  }
22906
- var location = WINDOW.location;
23130
+ var location$1 = WINDOW.location;
22907
23131
  var REGEXP_ORIGINS = /^(\w+:)\/\/([^:/?#]*):?(\d*)/i;
22908
23132
  /**
22909
23133
  * Check if the given URL is a cross origin URL.
@@ -22913,7 +23137,7 @@ var REGEXP_ORIGINS = /^(\w+:)\/\/([^:/?#]*):?(\d*)/i;
22913
23137
 
22914
23138
  function isCrossOriginURL(url) {
22915
23139
  var parts = url.match(REGEXP_ORIGINS);
22916
- return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port);
23140
+ return parts !== null && (parts[1] !== location$1.protocol || parts[2] !== location$1.hostname || parts[3] !== location$1.port);
22917
23141
  }
22918
23142
  /**
22919
23143
  * Add timestamp to the given URL.
@@ -53654,10 +53878,12 @@ class Code {
53654
53878
  viewhtml = this.builderStuff.querySelector('.viewhtml');
53655
53879
  }
53656
53880
 
53657
- let textarea = viewhtml.querySelector('textarea'); // Commented, to prevent {id} get formatted.
53658
- // let beautify = JsBeautify.html;
53659
- // html = beautify(html);
53881
+ let textarea = viewhtml.querySelector('textarea'); // Prevent {id} get formatted.
53660
53882
 
53883
+ html = html.replaceAll('{id}', '__id__');
53884
+ let beautify = JsBeautify.html;
53885
+ html = beautify(html);
53886
+ html = html.replaceAll('__id__', '{id}');
53661
53887
  textarea.value = html;
53662
53888
  this.htmlUtil.view('code');
53663
53889
  });
@@ -62519,7 +62745,7 @@ class ElementTextStyles {
62519
62745
  var sTextAlign = elm.style.textAlign;
62520
62746
  this.panelStuff.querySelector('#inpElmTextAlign').value = sTextAlign;
62521
62747
  this.panelStuff.querySelector('#inpElmFontSize').value = '';
62522
- var nFontSize = parseInt(elm.style.fontSize);
62748
+ var nFontSize = parseFloat(elm.style.fontSize);
62523
62749
 
62524
62750
  if (!isNaN(nFontSize)) {
62525
62751
  this.panelStuff.querySelector('#inpElmFontSize').value = nFontSize;
@@ -62579,7 +62805,7 @@ class ElementTextStyles {
62579
62805
  if (!isNaN(elm.style.lineHeight)) {
62580
62806
  this.panelStuff.querySelector('#inpElmLineHeight').value = elm.style.lineHeight;
62581
62807
  } else {
62582
- var nLineHeight = parseInt(elm.style.lineHeight);
62808
+ var nLineHeight = parseFloat(elm.style.lineHeight);
62583
62809
 
62584
62810
  if (!isNaN(nLineHeight)) {
62585
62811
  this.panelStuff.querySelector('#inpElmLineHeight').value = nLineHeight;
@@ -62600,14 +62826,14 @@ class ElementTextStyles {
62600
62826
 
62601
62827
  this.panelStuff.querySelector('#inpElmLineHeightUnit').value = sLineHeightUnit;
62602
62828
  this.panelStuff.querySelector('#inpElmLetterSpacing').value = '';
62603
- var nLetterSpacing = parseInt(elm.style.letterSpacing);
62829
+ var nLetterSpacing = parseFloat(elm.style.letterSpacing);
62604
62830
 
62605
62831
  if (!isNaN(nLetterSpacing)) {
62606
62832
  this.panelStuff.querySelector('#inpElmLetterSpacing').value = nLetterSpacing;
62607
62833
  }
62608
62834
 
62609
62835
  this.panelStuff.querySelector('#inpElmWordSpacing').value = '';
62610
- var nWordSpacing = parseInt(elm.style.wordSpacing);
62836
+ var nWordSpacing = parseFloat(elm.style.wordSpacing);
62611
62837
 
62612
62838
  if (!isNaN(nWordSpacing)) {
62613
62839
  this.panelStuff.querySelector('#inpElmWordSpacing').value = nWordSpacing;
@@ -75241,6 +75467,39 @@ class ContentBuilder {
75241
75467
  </div>
75242
75468
  </div>
75243
75469
  `,
75470
+ pageTemplate: `<!DOCTYPE html>
75471
+ <html lang="en">
75472
+ <head>
75473
+ <meta charset="utf-8">
75474
+ <title>Page</title>
75475
+ <meta name="viewport" content="width=device-width, initial-scale=1">
75476
+ <meta name="description" content="">
75477
+ <link rel="shortcut icon" href="#" />
75478
+
75479
+ <link href="[%PATH%]/assets/minimalist-blocks/content.css" rel="stylesheet" type="text/css" />
75480
+
75481
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.core.css" rel="stylesheet" type="text/css" />
75482
+ <link href="[%PATH%]/assets/scripts/glide/css/glide.theme.css" rel="stylesheet" type="text/css" />
75483
+ <script src="[%PATH%]/assets/scripts/glide/glide.js" type="text/javascript"></script>
75484
+
75485
+ <style>
75486
+ .container {
75487
+ margin: 150px auto 0;
75488
+ max-width: 800px;
75489
+ width: 100%;
75490
+ padding: 0 20px;
75491
+ box-sizing: border-box;
75492
+ }
75493
+ </style>
75494
+ </head>
75495
+ <body>
75496
+
75497
+ <div class="container">
75498
+ [%CONTENT%]
75499
+ </div>
75500
+
75501
+ </body>
75502
+ </html>`,
75244
75503
 
75245
75504
  /*
75246
75505
  onZoomStart: () => {
@@ -76752,7 +77011,11 @@ class ContentBuilder {
76752
77011
 
76753
77012
  const builders = this.doc.querySelectorAll(this.opts.container);
76754
77013
  Array.prototype.forEach.call(builders, builder => {
76755
- builder.innerHTML = htmlutil.readHtml(builder, true);
77014
+ // builder.innerHTML = htmlutil.readHtml(builder, true);
77015
+ let html = htmlutil.readHtml(builder, false);
77016
+ let range = this.doc.createRange();
77017
+ builder.innerHTML = '';
77018
+ builder.appendChild(range.createContextualFragment(html)); // Use createContextualFragment so that embedded javascript code (code block) will be executed
76756
77019
  });
76757
77020
  Array.prototype.forEach.call(builders, builder => {
76758
77021
  builder.removeAttribute('data-sort');
@@ -77079,6 +77342,52 @@ class ContentBuilder {
77079
77342
 
77080
77343
  saveForUndo(checkLater) {
77081
77344
  this.uo.saveForUndo(checkLater);
77345
+ }
77346
+
77347
+ download(options = {}) {
77348
+ this.export(options, true);
77349
+ }
77350
+
77351
+ export(options = {}, shortenOutput = false) {
77352
+ let pageTemplate = this.pageTemplate;
77353
+ let output = ''; // [%CONTENT%]
77354
+
77355
+ this.makeAbsolute = true; //To make absolute (for Export/Download)
77356
+
77357
+ this.shortenOutput = shortenOutput;
77358
+ let html = this.html();
77359
+ this.makeAbsolute = false;
77360
+ output = pageTemplate.replace('[%CONTENT%]', html);
77361
+ this.shortenOutput = false; // Custom
77362
+
77363
+ if (options.replace) {
77364
+ options.replace.forEach(rule => {
77365
+ output = output.replaceAll(`${rule[0]}`, rule[1]);
77366
+ });
77367
+ } // [%PATH%]
77368
+
77369
+
77370
+ if (options.path) {
77371
+ output = output.replaceAll('[%PATH%]', options.path);
77372
+ } else {
77373
+ let urlBase;
77374
+ urlBase = location.href.substring(0, location.href.lastIndexOf('/'));
77375
+ output = output.replaceAll('[%PATH%]', urlBase);
77376
+ } // Beautify
77377
+
77378
+
77379
+ output = this.beautify(output);
77380
+ const a = document.createElement('a');
77381
+ a.href = window.URL.createObjectURL(new Blob([output], {
77382
+ type: 'text/plain'
77383
+ }));
77384
+ a.download = 'page.html';
77385
+ a.click();
77386
+ }
77387
+
77388
+ beautify(html) {
77389
+ const htmlutil = new HtmlUtil(this);
77390
+ return htmlutil.beautify(html);
77082
77391
  } // Module related
77083
77392
 
77084
77393