@formfeed/mcp 0.3.5 → 0.3.7
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/README.md +4 -3
- package/THIRD_PARTY_LICENSES.md +0 -28
- package/bin/formfeed-mcp.mjs +674 -2033
- package/package.json +1 -1
package/bin/formfeed-mcp.mjs
CHANGED
|
@@ -1531,7 +1531,7 @@ var require_segments = __commonJS({
|
|
|
1531
1531
|
return nodes;
|
|
1532
1532
|
}
|
|
1533
1533
|
function buildGraph(nodes, version) {
|
|
1534
|
-
const
|
|
1534
|
+
const table = {};
|
|
1535
1535
|
const graph = { start: {} };
|
|
1536
1536
|
let prevNodeIds = ["start"];
|
|
1537
1537
|
for (let i = 0; i < nodes.length; i++) {
|
|
@@ -1541,15 +1541,15 @@ var require_segments = __commonJS({
|
|
|
1541
1541
|
const node = nodeGroup[j2];
|
|
1542
1542
|
const key = "" + i + j2;
|
|
1543
1543
|
currentNodeIds.push(key);
|
|
1544
|
-
|
|
1544
|
+
table[key] = { node, lastCount: 0 };
|
|
1545
1545
|
graph[key] = {};
|
|
1546
1546
|
for (let n = 0; n < prevNodeIds.length; n++) {
|
|
1547
1547
|
const prevNodeId = prevNodeIds[n];
|
|
1548
|
-
if (
|
|
1549
|
-
graph[prevNodeId][key] = getSegmentBitsLength(
|
|
1550
|
-
|
|
1548
|
+
if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {
|
|
1549
|
+
graph[prevNodeId][key] = getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) - getSegmentBitsLength(table[prevNodeId].lastCount, node.mode);
|
|
1550
|
+
table[prevNodeId].lastCount += node.length;
|
|
1551
1551
|
} else {
|
|
1552
|
-
if (
|
|
1552
|
+
if (table[prevNodeId]) table[prevNodeId].lastCount = node.length;
|
|
1553
1553
|
graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) + 4 + Mode.getCharCountIndicator(node.mode, version);
|
|
1554
1554
|
}
|
|
1555
1555
|
}
|
|
@@ -1559,7 +1559,7 @@ var require_segments = __commonJS({
|
|
|
1559
1559
|
for (let n = 0; n < prevNodeIds.length; n++) {
|
|
1560
1560
|
graph[prevNodeIds[n]].end = 0;
|
|
1561
1561
|
}
|
|
1562
|
-
return { map: graph, table
|
|
1562
|
+
return { map: graph, table };
|
|
1563
1563
|
}
|
|
1564
1564
|
function buildSingleSegment(data, modesHint) {
|
|
1565
1565
|
let mode;
|
|
@@ -1673,22 +1673,22 @@ var require_qrcode = __commonJS({
|
|
|
1673
1673
|
}
|
|
1674
1674
|
function setupVersionInfo(matrix, version) {
|
|
1675
1675
|
const size = matrix.size;
|
|
1676
|
-
const
|
|
1676
|
+
const bits = Version.getEncodedBits(version);
|
|
1677
1677
|
let row, col, mod;
|
|
1678
1678
|
for (let i = 0; i < 18; i++) {
|
|
1679
1679
|
row = Math.floor(i / 3);
|
|
1680
1680
|
col = i % 3 + size - 8 - 3;
|
|
1681
|
-
mod = (
|
|
1681
|
+
mod = (bits >> i & 1) === 1;
|
|
1682
1682
|
matrix.set(row, col, mod, true);
|
|
1683
1683
|
matrix.set(col, row, mod, true);
|
|
1684
1684
|
}
|
|
1685
1685
|
}
|
|
1686
1686
|
function setupFormatInfo(matrix, errorCorrectionLevel, maskPattern) {
|
|
1687
1687
|
const size = matrix.size;
|
|
1688
|
-
const
|
|
1688
|
+
const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern);
|
|
1689
1689
|
let i, mod;
|
|
1690
1690
|
for (i = 0; i < 15; i++) {
|
|
1691
|
-
mod = (
|
|
1691
|
+
mod = (bits >> i & 1) === 1;
|
|
1692
1692
|
if (i < 6) {
|
|
1693
1693
|
matrix.set(i, 8, mod, true);
|
|
1694
1694
|
} else if (i < 8) {
|
|
@@ -2747,17 +2747,17 @@ var require_bitmapper = __commonJS({
|
|
|
2747
2747
|
}
|
|
2748
2748
|
return rawPos;
|
|
2749
2749
|
}
|
|
2750
|
-
function mapImageCustomBit(image, pxData, getPxPos, bpp,
|
|
2750
|
+
function mapImageCustomBit(image, pxData, getPxPos, bpp, bits, maxBit) {
|
|
2751
2751
|
let imageWidth = image.width;
|
|
2752
2752
|
let imageHeight = image.height;
|
|
2753
2753
|
let imagePass = image.index;
|
|
2754
2754
|
for (let y2 = 0; y2 < imageHeight; y2++) {
|
|
2755
2755
|
for (let x2 = 0; x2 < imageWidth; x2++) {
|
|
2756
|
-
let pixelData =
|
|
2756
|
+
let pixelData = bits.get(bpp);
|
|
2757
2757
|
let pxPos = getPxPos(x2, y2, imagePass);
|
|
2758
2758
|
pixelBppCustomMapper[bpp](pxData, pixelData, pxPos, maxBit);
|
|
2759
2759
|
}
|
|
2760
|
-
|
|
2760
|
+
bits.resetAfterLine();
|
|
2761
2761
|
}
|
|
2762
2762
|
}
|
|
2763
2763
|
exports.dataToBitMap = function(data, bitmapInfo) {
|
|
@@ -2766,9 +2766,9 @@ var require_bitmapper = __commonJS({
|
|
|
2766
2766
|
let depth = bitmapInfo.depth;
|
|
2767
2767
|
let bpp = bitmapInfo.bpp;
|
|
2768
2768
|
let interlace = bitmapInfo.interlace;
|
|
2769
|
-
let
|
|
2769
|
+
let bits;
|
|
2770
2770
|
if (depth !== 8) {
|
|
2771
|
-
|
|
2771
|
+
bits = bitRetriever(data, depth);
|
|
2772
2772
|
}
|
|
2773
2773
|
let pxData;
|
|
2774
2774
|
if (depth <= 8) {
|
|
@@ -2808,7 +2808,7 @@ var require_bitmapper = __commonJS({
|
|
|
2808
2808
|
pxData,
|
|
2809
2809
|
getPxPos,
|
|
2810
2810
|
bpp,
|
|
2811
|
-
|
|
2811
|
+
bits,
|
|
2812
2812
|
maxBit
|
|
2813
2813
|
);
|
|
2814
2814
|
}
|
|
@@ -2818,7 +2818,7 @@ var require_bitmapper = __commonJS({
|
|
|
2818
2818
|
throw new Error("extra data found");
|
|
2819
2819
|
}
|
|
2820
2820
|
} else {
|
|
2821
|
-
|
|
2821
|
+
bits.end();
|
|
2822
2822
|
}
|
|
2823
2823
|
return pxData;
|
|
2824
2824
|
};
|
|
@@ -2936,8 +2936,8 @@ var require_parser_async = __commonJS({
|
|
|
2936
2936
|
this._parser.start();
|
|
2937
2937
|
};
|
|
2938
2938
|
util.inherits(ParserAsync, ChunkStream);
|
|
2939
|
-
ParserAsync.prototype._handleError = function(
|
|
2940
|
-
this.emit("error",
|
|
2939
|
+
ParserAsync.prototype._handleError = function(err) {
|
|
2940
|
+
this.emit("error", err);
|
|
2941
2941
|
this.writable = false;
|
|
2942
2942
|
this.destroy();
|
|
2943
2943
|
if (this._inflate && this._inflate.destroy) {
|
|
@@ -2964,11 +2964,11 @@ var require_parser_async = __commonJS({
|
|
|
2964
2964
|
this._inflate = zlib.createInflate({ chunkSize });
|
|
2965
2965
|
let leftToInflate = imageSize;
|
|
2966
2966
|
let emitError = this.emit.bind(this, "error");
|
|
2967
|
-
this._inflate.on("error", function(
|
|
2967
|
+
this._inflate.on("error", function(err) {
|
|
2968
2968
|
if (!leftToInflate) {
|
|
2969
2969
|
return;
|
|
2970
2970
|
}
|
|
2971
|
-
emitError(
|
|
2971
|
+
emitError(err);
|
|
2972
2972
|
});
|
|
2973
2973
|
this._filter.on("complete", this._complete.bind(this));
|
|
2974
2974
|
let filterWrite = this._filter.write.bind(this._filter);
|
|
@@ -3474,9 +3474,9 @@ var require_sync_inflate = __commonJS({
|
|
|
3474
3474
|
var zlib = __require("zlib");
|
|
3475
3475
|
var util = __require("util");
|
|
3476
3476
|
var kMaxLength = __require("buffer").kMaxLength;
|
|
3477
|
-
function
|
|
3478
|
-
if (!(this instanceof
|
|
3479
|
-
return new
|
|
3477
|
+
function Inflate(opts) {
|
|
3478
|
+
if (!(this instanceof Inflate)) {
|
|
3479
|
+
return new Inflate(opts);
|
|
3480
3480
|
}
|
|
3481
3481
|
if (opts && opts.chunkSize < zlib.Z_MIN_CHUNK) {
|
|
3482
3482
|
opts.chunkSize = zlib.Z_MIN_CHUNK;
|
|
@@ -3489,7 +3489,7 @@ var require_sync_inflate = __commonJS({
|
|
|
3489
3489
|
}
|
|
3490
3490
|
}
|
|
3491
3491
|
function createInflate(opts) {
|
|
3492
|
-
return new
|
|
3492
|
+
return new Inflate(opts);
|
|
3493
3493
|
}
|
|
3494
3494
|
function _close(engine, callback) {
|
|
3495
3495
|
if (callback) {
|
|
@@ -3501,7 +3501,7 @@ var require_sync_inflate = __commonJS({
|
|
|
3501
3501
|
engine._handle.close();
|
|
3502
3502
|
engine._handle = null;
|
|
3503
3503
|
}
|
|
3504
|
-
|
|
3504
|
+
Inflate.prototype._processChunk = function(chunk, flushFlag, asyncCb) {
|
|
3505
3505
|
if (typeof asyncCb === "function") {
|
|
3506
3506
|
return zlib.Inflate._processChunk.call(this, chunk, flushFlag, asyncCb);
|
|
3507
3507
|
}
|
|
@@ -3513,8 +3513,8 @@ var require_sync_inflate = __commonJS({
|
|
|
3513
3513
|
let buffers = [];
|
|
3514
3514
|
let nread = 0;
|
|
3515
3515
|
let error;
|
|
3516
|
-
this.on("error", function(
|
|
3517
|
-
error =
|
|
3516
|
+
this.on("error", function(err) {
|
|
3517
|
+
error = err;
|
|
3518
3518
|
});
|
|
3519
3519
|
function handleChunk(availInAfter, availOutAfter) {
|
|
3520
3520
|
if (self2._hadError) {
|
|
@@ -3579,7 +3579,7 @@ var require_sync_inflate = __commonJS({
|
|
|
3579
3579
|
_close(this);
|
|
3580
3580
|
return buf;
|
|
3581
3581
|
};
|
|
3582
|
-
util.inherits(
|
|
3582
|
+
util.inherits(Inflate, zlib.Inflate);
|
|
3583
3583
|
function zlibBufferSync(engine, buffer) {
|
|
3584
3584
|
if (typeof buffer === "string") {
|
|
3585
3585
|
buffer = Buffer.from(buffer);
|
|
@@ -3594,10 +3594,10 @@ var require_sync_inflate = __commonJS({
|
|
|
3594
3594
|
return engine._processChunk(buffer, flushFlag);
|
|
3595
3595
|
}
|
|
3596
3596
|
function inflateSync(buffer, opts) {
|
|
3597
|
-
return zlibBufferSync(new
|
|
3597
|
+
return zlibBufferSync(new Inflate(opts), buffer);
|
|
3598
3598
|
}
|
|
3599
3599
|
module.exports = exports = inflateSync;
|
|
3600
|
-
exports.Inflate =
|
|
3600
|
+
exports.Inflate = Inflate;
|
|
3601
3601
|
exports.createInflate = createInflate;
|
|
3602
3602
|
exports.inflateSync = inflateSync;
|
|
3603
3603
|
}
|
|
@@ -3686,9 +3686,9 @@ var require_parser_sync = __commonJS({
|
|
|
3686
3686
|
"To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0"
|
|
3687
3687
|
);
|
|
3688
3688
|
}
|
|
3689
|
-
let
|
|
3689
|
+
let err;
|
|
3690
3690
|
function handleError(_err_) {
|
|
3691
|
-
|
|
3691
|
+
err = _err_;
|
|
3692
3692
|
}
|
|
3693
3693
|
let metaData;
|
|
3694
3694
|
function handleMetaData(_metaData_) {
|
|
@@ -3724,8 +3724,8 @@ var require_parser_sync = __commonJS({
|
|
|
3724
3724
|
});
|
|
3725
3725
|
parser.start();
|
|
3726
3726
|
reader.process();
|
|
3727
|
-
if (
|
|
3728
|
-
throw
|
|
3727
|
+
if (err) {
|
|
3728
|
+
throw err;
|
|
3729
3729
|
}
|
|
3730
3730
|
let inflateData = Buffer.concat(inflateDataList);
|
|
3731
3731
|
inflateDataList.length = 0;
|
|
@@ -3876,9 +3876,9 @@ var require_png = __commonJS({
|
|
|
3876
3876
|
this.data = parsedData;
|
|
3877
3877
|
callback(null, this);
|
|
3878
3878
|
}.bind(this);
|
|
3879
|
-
onError = function(
|
|
3879
|
+
onError = function(err) {
|
|
3880
3880
|
this.removeListener("parsed", onParsed);
|
|
3881
|
-
callback(
|
|
3881
|
+
callback(err, null);
|
|
3882
3882
|
}.bind(this);
|
|
3883
3883
|
this.once("parsed", onParsed);
|
|
3884
3884
|
this.once("error", onError);
|
|
@@ -4056,8 +4056,8 @@ var require_png2 = __commonJS({
|
|
|
4056
4056
|
cb = options;
|
|
4057
4057
|
options = void 0;
|
|
4058
4058
|
}
|
|
4059
|
-
exports.renderToBuffer(qrData, options, function(
|
|
4060
|
-
if (
|
|
4059
|
+
exports.renderToBuffer(qrData, options, function(err, output) {
|
|
4060
|
+
if (err) cb(err);
|
|
4061
4061
|
let url = "data:image/png;base64,";
|
|
4062
4062
|
url += output.toString("base64");
|
|
4063
4063
|
cb(null, url);
|
|
@@ -4535,8 +4535,8 @@ var require_server = __commonJS({
|
|
|
4535
4535
|
return new Promise(function(resolve2, reject) {
|
|
4536
4536
|
try {
|
|
4537
4537
|
const data = QRCode.create(text2, params.opts);
|
|
4538
|
-
return renderFunc(data, params.opts, function(
|
|
4539
|
-
return
|
|
4538
|
+
return renderFunc(data, params.opts, function(err, data2) {
|
|
4539
|
+
return err ? reject(err) : resolve2(data2);
|
|
4540
4540
|
});
|
|
4541
4541
|
} catch (e) {
|
|
4542
4542
|
reject(e);
|
|
@@ -6037,7 +6037,7 @@ var require_parser2 = __commonJS({
|
|
|
6037
6037
|
throw new Error(str2);
|
|
6038
6038
|
},
|
|
6039
6039
|
parse: function parse(input) {
|
|
6040
|
-
var self2 = this, stack = [0], vstack = [null], lstack = [],
|
|
6040
|
+
var self2 = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
|
|
6041
6041
|
this.lexer.setInput(input);
|
|
6042
6042
|
this.lexer.yy = this.yy;
|
|
6043
6043
|
this.yy.lexer = this.lexer;
|
|
@@ -6069,13 +6069,13 @@ var require_parser2 = __commonJS({
|
|
|
6069
6069
|
if (symbol === null || typeof symbol == "undefined") {
|
|
6070
6070
|
symbol = lex();
|
|
6071
6071
|
}
|
|
6072
|
-
action =
|
|
6072
|
+
action = table[state] && table[state][symbol];
|
|
6073
6073
|
}
|
|
6074
6074
|
if (typeof action === "undefined" || !action.length || !action[0]) {
|
|
6075
6075
|
var errStr = "";
|
|
6076
6076
|
if (!recovering) {
|
|
6077
6077
|
expected = [];
|
|
6078
|
-
for (p in
|
|
6078
|
+
for (p in table[state]) if (this.terminals_[p] && p > 2) {
|
|
6079
6079
|
expected.push("'" + this.terminals_[p] + "'");
|
|
6080
6080
|
}
|
|
6081
6081
|
if (this.lexer.showPosition) {
|
|
@@ -6126,7 +6126,7 @@ var require_parser2 = __commonJS({
|
|
|
6126
6126
|
stack.push(this.productions_[action[1]][0]);
|
|
6127
6127
|
vstack.push(yyval.$);
|
|
6128
6128
|
lstack.push(yyval._$);
|
|
6129
|
-
newState =
|
|
6129
|
+
newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
|
|
6130
6130
|
stack.push(newState);
|
|
6131
6131
|
break;
|
|
6132
6132
|
case 3:
|
|
@@ -9236,7 +9236,7 @@ var require_code_gen = __commonJS({
|
|
|
9236
9236
|
SourceMap = require_source_map();
|
|
9237
9237
|
SourceNode = SourceMap.SourceNode;
|
|
9238
9238
|
}
|
|
9239
|
-
} catch (
|
|
9239
|
+
} catch (err) {
|
|
9240
9240
|
}
|
|
9241
9241
|
var SourceMap;
|
|
9242
9242
|
if (!SourceNode) {
|
|
@@ -10586,42 +10586,42 @@ var require_nunjucks = __commonJS({
|
|
|
10586
10586
|
function lookupEscape(ch) {
|
|
10587
10587
|
return escapeMap[ch];
|
|
10588
10588
|
}
|
|
10589
|
-
function _prettifyError(path, withInternals,
|
|
10590
|
-
if (!
|
|
10591
|
-
|
|
10589
|
+
function _prettifyError(path, withInternals, err) {
|
|
10590
|
+
if (!err.Update) {
|
|
10591
|
+
err = new exports2.TemplateError(err);
|
|
10592
10592
|
}
|
|
10593
|
-
|
|
10593
|
+
err.Update(path);
|
|
10594
10594
|
if (!withInternals) {
|
|
10595
|
-
var old =
|
|
10596
|
-
|
|
10597
|
-
|
|
10595
|
+
var old = err;
|
|
10596
|
+
err = new Error(old.message);
|
|
10597
|
+
err.name = old.name;
|
|
10598
10598
|
}
|
|
10599
|
-
return
|
|
10599
|
+
return err;
|
|
10600
10600
|
}
|
|
10601
10601
|
exports2._prettifyError = _prettifyError;
|
|
10602
10602
|
function TemplateError(message2, lineno, colno) {
|
|
10603
|
-
var
|
|
10603
|
+
var err;
|
|
10604
10604
|
var cause;
|
|
10605
10605
|
if (message2 instanceof Error) {
|
|
10606
10606
|
cause = message2;
|
|
10607
10607
|
message2 = cause.name + ": " + cause.message;
|
|
10608
10608
|
}
|
|
10609
10609
|
if (Object.setPrototypeOf) {
|
|
10610
|
-
|
|
10611
|
-
Object.setPrototypeOf(
|
|
10610
|
+
err = new Error(message2);
|
|
10611
|
+
Object.setPrototypeOf(err, TemplateError.prototype);
|
|
10612
10612
|
} else {
|
|
10613
|
-
|
|
10614
|
-
Object.defineProperty(
|
|
10613
|
+
err = this;
|
|
10614
|
+
Object.defineProperty(err, "message", {
|
|
10615
10615
|
enumerable: false,
|
|
10616
10616
|
writable: true,
|
|
10617
10617
|
value: message2
|
|
10618
10618
|
});
|
|
10619
10619
|
}
|
|
10620
|
-
Object.defineProperty(
|
|
10620
|
+
Object.defineProperty(err, "name", {
|
|
10621
10621
|
value: "Template render error"
|
|
10622
10622
|
});
|
|
10623
10623
|
if (Error.captureStackTrace) {
|
|
10624
|
-
Error.captureStackTrace(
|
|
10624
|
+
Error.captureStackTrace(err, this.constructor);
|
|
10625
10625
|
}
|
|
10626
10626
|
var getStack;
|
|
10627
10627
|
if (cause) {
|
|
@@ -10640,18 +10640,18 @@ var require_nunjucks = __commonJS({
|
|
|
10640
10640
|
return stack;
|
|
10641
10641
|
};
|
|
10642
10642
|
}
|
|
10643
|
-
Object.defineProperty(
|
|
10643
|
+
Object.defineProperty(err, "stack", {
|
|
10644
10644
|
get: function get2() {
|
|
10645
|
-
return getStack.call(
|
|
10645
|
+
return getStack.call(err);
|
|
10646
10646
|
}
|
|
10647
10647
|
});
|
|
10648
|
-
Object.defineProperty(
|
|
10648
|
+
Object.defineProperty(err, "cause", {
|
|
10649
10649
|
value: cause
|
|
10650
10650
|
});
|
|
10651
|
-
|
|
10652
|
-
|
|
10653
|
-
|
|
10654
|
-
|
|
10651
|
+
err.lineno = lineno;
|
|
10652
|
+
err.colno = colno;
|
|
10653
|
+
err.firstUpdate = true;
|
|
10654
|
+
err.Update = function Update(path) {
|
|
10655
10655
|
var msg = "(" + (path || "unknown path") + ")";
|
|
10656
10656
|
if (this.firstUpdate) {
|
|
10657
10657
|
if (this.lineno && this.colno) {
|
|
@@ -10668,7 +10668,7 @@ var require_nunjucks = __commonJS({
|
|
|
10668
10668
|
this.firstUpdate = false;
|
|
10669
10669
|
return this;
|
|
10670
10670
|
};
|
|
10671
|
-
return
|
|
10671
|
+
return err;
|
|
10672
10672
|
}
|
|
10673
10673
|
if (Object.setPrototypeOf) {
|
|
10674
10674
|
Object.setPrototypeOf(TemplateError.prototype, Error.prototype);
|
|
@@ -11819,8 +11819,8 @@ var require_nunjucks = __commonJS({
|
|
|
11819
11819
|
this._scopeClosers = _scopeClosers;
|
|
11820
11820
|
};
|
|
11821
11821
|
_proto._makeCallback = function _makeCallback(res) {
|
|
11822
|
-
var
|
|
11823
|
-
return "function(" +
|
|
11822
|
+
var err = this._tmpid();
|
|
11823
|
+
return "function(" + err + (res ? "," + res : "") + ") {\nif(" + err + ") { cb(" + err + "); return; }";
|
|
11824
11824
|
};
|
|
11825
11825
|
_proto._tmpid = function _tmpid() {
|
|
11826
11826
|
this.lastId++;
|
|
@@ -12704,9 +12704,9 @@ var require_nunjucks = __commonJS({
|
|
|
12704
12704
|
var globalRuntime = __webpack_require__(2);
|
|
12705
12705
|
var handleError = globalRuntime.handleError, Frame = globalRuntime.Frame;
|
|
12706
12706
|
var expressApp = __webpack_require__(22);
|
|
12707
|
-
function callbackAsap(cb,
|
|
12707
|
+
function callbackAsap(cb, err, res) {
|
|
12708
12708
|
asap(function() {
|
|
12709
|
-
cb(
|
|
12709
|
+
cb(err, res);
|
|
12710
12710
|
});
|
|
12711
12711
|
}
|
|
12712
12712
|
var noopTmplSrc = {
|
|
@@ -12883,16 +12883,16 @@ var require_nunjucks = __commonJS({
|
|
|
12883
12883
|
}
|
|
12884
12884
|
}
|
|
12885
12885
|
var syncResult;
|
|
12886
|
-
var createTemplate = function createTemplate2(
|
|
12887
|
-
if (!info && !
|
|
12888
|
-
|
|
12886
|
+
var createTemplate = function createTemplate2(err, info) {
|
|
12887
|
+
if (!info && !err && !ignoreMissing) {
|
|
12888
|
+
err = new Error("template not found: " + name);
|
|
12889
12889
|
}
|
|
12890
|
-
if (
|
|
12890
|
+
if (err) {
|
|
12891
12891
|
if (cb) {
|
|
12892
|
-
cb(
|
|
12892
|
+
cb(err);
|
|
12893
12893
|
return;
|
|
12894
12894
|
} else {
|
|
12895
|
-
throw
|
|
12895
|
+
throw err;
|
|
12896
12896
|
}
|
|
12897
12897
|
}
|
|
12898
12898
|
var newTmpl;
|
|
@@ -12911,9 +12911,9 @@ var require_nunjucks = __commonJS({
|
|
|
12911
12911
|
}
|
|
12912
12912
|
};
|
|
12913
12913
|
lib.asyncIter(this.loaders, function(loader2, i2, next, done) {
|
|
12914
|
-
function handle(
|
|
12915
|
-
if (
|
|
12916
|
-
done(
|
|
12914
|
+
function handle(err, src) {
|
|
12915
|
+
if (err) {
|
|
12916
|
+
done(err);
|
|
12917
12917
|
} else if (src) {
|
|
12918
12918
|
src.loader = loader2;
|
|
12919
12919
|
done(null, src);
|
|
@@ -12939,11 +12939,11 @@ var require_nunjucks = __commonJS({
|
|
|
12939
12939
|
ctx = null;
|
|
12940
12940
|
}
|
|
12941
12941
|
var syncResult = null;
|
|
12942
|
-
this.getTemplate(name, function(
|
|
12943
|
-
if (
|
|
12944
|
-
callbackAsap(cb,
|
|
12945
|
-
} else if (
|
|
12946
|
-
throw
|
|
12942
|
+
this.getTemplate(name, function(err, tmpl) {
|
|
12943
|
+
if (err && cb) {
|
|
12944
|
+
callbackAsap(cb, err);
|
|
12945
|
+
} else if (err) {
|
|
12946
|
+
throw err;
|
|
12947
12947
|
} else {
|
|
12948
12948
|
syncResult = tmpl.render(ctx, cb);
|
|
12949
12949
|
}
|
|
@@ -13054,8 +13054,8 @@ var require_nunjucks = __commonJS({
|
|
|
13054
13054
|
if (eagerCompile) {
|
|
13055
13055
|
try {
|
|
13056
13056
|
this._compile();
|
|
13057
|
-
} catch (
|
|
13058
|
-
throw lib._prettifyError(this.path, this.env.opts.dev,
|
|
13057
|
+
} catch (err) {
|
|
13058
|
+
throw lib._prettifyError(this.path, this.env.opts.dev, err);
|
|
13059
13059
|
}
|
|
13060
13060
|
} else {
|
|
13061
13061
|
this.compiled = false;
|
|
@@ -13074,11 +13074,11 @@ var require_nunjucks = __commonJS({
|
|
|
13074
13074
|
try {
|
|
13075
13075
|
this.compile();
|
|
13076
13076
|
} catch (e) {
|
|
13077
|
-
var
|
|
13077
|
+
var err = lib._prettifyError(this.path, this.env.opts.dev, e);
|
|
13078
13078
|
if (cb) {
|
|
13079
|
-
return callbackAsap(cb,
|
|
13079
|
+
return callbackAsap(cb, err);
|
|
13080
13080
|
} else {
|
|
13081
|
-
throw
|
|
13081
|
+
throw err;
|
|
13082
13082
|
}
|
|
13083
13083
|
}
|
|
13084
13084
|
var context = new Context(ctx || {}, this.blocks, this.env);
|
|
@@ -13086,23 +13086,23 @@ var require_nunjucks = __commonJS({
|
|
|
13086
13086
|
frame.topLevel = true;
|
|
13087
13087
|
var syncResult = null;
|
|
13088
13088
|
var didError = false;
|
|
13089
|
-
this.rootRenderFunc(this.env, context, frame, globalRuntime, function(
|
|
13089
|
+
this.rootRenderFunc(this.env, context, frame, globalRuntime, function(err2, res) {
|
|
13090
13090
|
if (didError && cb && typeof res !== "undefined") {
|
|
13091
13091
|
return;
|
|
13092
13092
|
}
|
|
13093
|
-
if (
|
|
13094
|
-
|
|
13093
|
+
if (err2) {
|
|
13094
|
+
err2 = lib._prettifyError(_this6.path, _this6.env.opts.dev, err2);
|
|
13095
13095
|
didError = true;
|
|
13096
13096
|
}
|
|
13097
13097
|
if (cb) {
|
|
13098
13098
|
if (forceAsync) {
|
|
13099
|
-
callbackAsap(cb,
|
|
13099
|
+
callbackAsap(cb, err2, res);
|
|
13100
13100
|
} else {
|
|
13101
|
-
cb(
|
|
13101
|
+
cb(err2, res);
|
|
13102
13102
|
}
|
|
13103
13103
|
} else {
|
|
13104
|
-
if (
|
|
13105
|
-
throw
|
|
13104
|
+
if (err2) {
|
|
13105
|
+
throw err2;
|
|
13106
13106
|
}
|
|
13107
13107
|
syncResult = res;
|
|
13108
13108
|
}
|
|
@@ -13130,9 +13130,9 @@ var require_nunjucks = __commonJS({
|
|
|
13130
13130
|
var frame = parentFrame ? parentFrame.push() : new Frame();
|
|
13131
13131
|
frame.topLevel = true;
|
|
13132
13132
|
var context = new Context(ctx || {}, this.blocks, this.env);
|
|
13133
|
-
this.rootRenderFunc(this.env, context, frame, globalRuntime, function(
|
|
13134
|
-
if (
|
|
13135
|
-
cb(
|
|
13133
|
+
this.rootRenderFunc(this.env, context, frame, globalRuntime, function(err) {
|
|
13134
|
+
if (err) {
|
|
13135
|
+
cb(err, null);
|
|
13136
13136
|
} else {
|
|
13137
13137
|
cb(null, context.getExported());
|
|
13138
13138
|
}
|
|
@@ -14553,14 +14553,14 @@ var require_nunjucks = __commonJS({
|
|
|
14553
14553
|
var _this2 = this;
|
|
14554
14554
|
var useCache = this.useCache;
|
|
14555
14555
|
var result;
|
|
14556
|
-
this.fetch(this.baseURL + "/" + name, function(
|
|
14557
|
-
if (
|
|
14556
|
+
this.fetch(this.baseURL + "/" + name, function(err, src) {
|
|
14557
|
+
if (err) {
|
|
14558
14558
|
if (cb) {
|
|
14559
|
-
cb(
|
|
14560
|
-
} else if (
|
|
14559
|
+
cb(err.content);
|
|
14560
|
+
} else if (err.status === 404) {
|
|
14561
14561
|
result = null;
|
|
14562
14562
|
} else {
|
|
14563
|
-
throw
|
|
14563
|
+
throw err.content;
|
|
14564
14564
|
}
|
|
14565
14565
|
} else {
|
|
14566
14566
|
result = {
|
|
@@ -14856,15 +14856,15 @@ var require_nunjucks = __commonJS({
|
|
|
14856
14856
|
callback = callback || function() {
|
|
14857
14857
|
};
|
|
14858
14858
|
if (!_isArray(tasks)) {
|
|
14859
|
-
var
|
|
14860
|
-
return callback(
|
|
14859
|
+
var err = new Error("First argument to waterfall must be an array of functions");
|
|
14860
|
+
return callback(err);
|
|
14861
14861
|
}
|
|
14862
14862
|
if (!tasks.length) {
|
|
14863
14863
|
return callback();
|
|
14864
14864
|
}
|
|
14865
14865
|
var wrapIterator = function(iterator) {
|
|
14866
|
-
return function(
|
|
14867
|
-
if (
|
|
14866
|
+
return function(err2) {
|
|
14867
|
+
if (err2) {
|
|
14868
14868
|
callback.apply(null, arguments);
|
|
14869
14869
|
callback = function() {
|
|
14870
14870
|
};
|
|
@@ -14986,9 +14986,9 @@ var require_nunjucks = __commonJS({
|
|
|
14986
14986
|
if (er instanceof Error) {
|
|
14987
14987
|
throw er;
|
|
14988
14988
|
}
|
|
14989
|
-
var
|
|
14990
|
-
|
|
14991
|
-
throw
|
|
14989
|
+
var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : ""));
|
|
14990
|
+
err.context = er;
|
|
14991
|
+
throw err;
|
|
14992
14992
|
}
|
|
14993
14993
|
var handler = events[type];
|
|
14994
14994
|
if (handler === void 0)
|
|
@@ -15221,9 +15221,9 @@ var require_nunjucks = __commonJS({
|
|
|
15221
15221
|
}
|
|
15222
15222
|
function once(emitter, name) {
|
|
15223
15223
|
return new Promise(function(resolve2, reject) {
|
|
15224
|
-
function errorListener(
|
|
15224
|
+
function errorListener(err) {
|
|
15225
15225
|
emitter.removeListener(name, resolver);
|
|
15226
|
-
reject(
|
|
15226
|
+
reject(err);
|
|
15227
15227
|
}
|
|
15228
15228
|
function resolver() {
|
|
15229
15229
|
if (typeof emitter.removeListener === "function") {
|
|
@@ -16227,8 +16227,8 @@ var require_nunjucks = __commonJS({
|
|
|
16227
16227
|
name = name.replace(/\\/g, "/");
|
|
16228
16228
|
try {
|
|
16229
16229
|
template = compiler.compile(str2, asyncFilters, extensions, name, env.opts);
|
|
16230
|
-
} catch (
|
|
16231
|
-
throw _prettifyError(name, false,
|
|
16230
|
+
} catch (err) {
|
|
16231
|
+
throw _prettifyError(name, false, err);
|
|
16232
16232
|
}
|
|
16233
16233
|
return {
|
|
16234
16234
|
name,
|
|
@@ -16603,8 +16603,8 @@ var require_liquid_node = __commonJS({
|
|
|
16603
16603
|
function promisify(fn) {
|
|
16604
16604
|
return function(...args2) {
|
|
16605
16605
|
return new Promise((resolve3, reject2) => {
|
|
16606
|
-
fn(...args2, (
|
|
16607
|
-
|
|
16606
|
+
fn(...args2, (err, result) => {
|
|
16607
|
+
err ? reject2(err) : resolve3(result);
|
|
16608
16608
|
});
|
|
16609
16609
|
});
|
|
16610
16610
|
};
|
|
@@ -16769,11 +16769,11 @@ var require_liquid_node = __commonJS({
|
|
|
16769
16769
|
}
|
|
16770
16770
|
var TRAIT = "__liquidClass__";
|
|
16771
16771
|
var LiquidError = class extends Error {
|
|
16772
|
-
constructor(
|
|
16773
|
-
super(typeof
|
|
16772
|
+
constructor(err, token) {
|
|
16773
|
+
super(typeof err === "string" ? err : err.message);
|
|
16774
16774
|
this.context = "";
|
|
16775
|
-
if (typeof
|
|
16776
|
-
Object.defineProperty(this, "originalError", { value:
|
|
16775
|
+
if (typeof err !== "string")
|
|
16776
|
+
Object.defineProperty(this, "originalError", { value: err, enumerable: false });
|
|
16777
16777
|
Object.defineProperty(this, "token", { value: token, enumerable: false });
|
|
16778
16778
|
Object.defineProperty(this, TRAIT, { value: "LiquidError", enumerable: false });
|
|
16779
16779
|
}
|
|
@@ -16796,18 +16796,18 @@ var require_liquid_node = __commonJS({
|
|
|
16796
16796
|
}
|
|
16797
16797
|
};
|
|
16798
16798
|
var ParseError = class extends LiquidError {
|
|
16799
|
-
constructor(
|
|
16800
|
-
super(
|
|
16799
|
+
constructor(err, token) {
|
|
16800
|
+
super(err, token);
|
|
16801
16801
|
this.name = "ParseError";
|
|
16802
|
-
this.message =
|
|
16802
|
+
this.message = err.message;
|
|
16803
16803
|
super.update();
|
|
16804
16804
|
}
|
|
16805
16805
|
};
|
|
16806
16806
|
var RenderError2 = class extends LiquidError {
|
|
16807
|
-
constructor(
|
|
16808
|
-
super(
|
|
16807
|
+
constructor(err, tpl) {
|
|
16808
|
+
super(err, tpl.token);
|
|
16809
16809
|
this.name = "RenderError";
|
|
16810
|
-
this.message =
|
|
16810
|
+
this.message = err.message;
|
|
16811
16811
|
super.update();
|
|
16812
16812
|
}
|
|
16813
16813
|
static is(obj) {
|
|
@@ -16828,10 +16828,10 @@ var require_liquid_node = __commonJS({
|
|
|
16828
16828
|
}
|
|
16829
16829
|
};
|
|
16830
16830
|
var UndefinedVariableError = class extends LiquidError {
|
|
16831
|
-
constructor(
|
|
16832
|
-
super(
|
|
16831
|
+
constructor(err, token) {
|
|
16832
|
+
super(err, token);
|
|
16833
16833
|
this.name = "UndefinedVariableError";
|
|
16834
|
-
this.message =
|
|
16834
|
+
this.message = err.message;
|
|
16835
16835
|
super.update();
|
|
16836
16836
|
}
|
|
16837
16837
|
};
|
|
@@ -17007,8 +17007,8 @@ var require_liquid_node = __commonJS({
|
|
|
17007
17007
|
write(html) {
|
|
17008
17008
|
this.stream.write(stringify(html));
|
|
17009
17009
|
}
|
|
17010
|
-
error(
|
|
17011
|
-
this.stream.emit("error",
|
|
17010
|
+
error(err) {
|
|
17011
|
+
this.stream.emit("error", err);
|
|
17012
17012
|
}
|
|
17013
17013
|
end() {
|
|
17014
17014
|
this.stream.end();
|
|
@@ -17098,9 +17098,9 @@ var require_liquid_node = __commonJS({
|
|
|
17098
17098
|
value = toPromise(value);
|
|
17099
17099
|
if (isPromise(value))
|
|
17100
17100
|
value = await value;
|
|
17101
|
-
} catch (
|
|
17101
|
+
} catch (err) {
|
|
17102
17102
|
next = "throw";
|
|
17103
|
-
value =
|
|
17103
|
+
value = err;
|
|
17104
17104
|
}
|
|
17105
17105
|
} while (!done);
|
|
17106
17106
|
return value;
|
|
@@ -17119,9 +17119,9 @@ var require_liquid_node = __commonJS({
|
|
|
17119
17119
|
if (isIterator(value)) {
|
|
17120
17120
|
try {
|
|
17121
17121
|
value = toValueSync(value);
|
|
17122
|
-
} catch (
|
|
17122
|
+
} catch (err) {
|
|
17123
17123
|
next = "throw";
|
|
17124
|
-
value =
|
|
17124
|
+
value = err;
|
|
17125
17125
|
}
|
|
17126
17126
|
}
|
|
17127
17127
|
} while (!done);
|
|
@@ -17689,7 +17689,7 @@ var require_liquid_node = __commonJS({
|
|
|
17689
17689
|
var Render = class {
|
|
17690
17690
|
renderTemplatesToNodeStream(templates, ctx) {
|
|
17691
17691
|
const emitter = new StreamedEmitter();
|
|
17692
|
-
Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter))).then(() => emitter.end(), (
|
|
17692
|
+
Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter))).then(() => emitter.end(), (err) => emitter.error(err));
|
|
17693
17693
|
return emitter.stream;
|
|
17694
17694
|
}
|
|
17695
17695
|
*renderTemplates(templates, ctx, emitter) {
|
|
@@ -17706,11 +17706,11 @@ var require_liquid_node = __commonJS({
|
|
|
17706
17706
|
if (ctx.breakCalled || ctx.continueCalled)
|
|
17707
17707
|
break;
|
|
17708
17708
|
} catch (e) {
|
|
17709
|
-
const
|
|
17709
|
+
const err = LiquidError.is(e) ? e : new RenderError2(e, tpl);
|
|
17710
17710
|
if (ctx.opts.catchAllErrors)
|
|
17711
|
-
errors.push(
|
|
17711
|
+
errors.push(err);
|
|
17712
17712
|
else
|
|
17713
|
-
throw
|
|
17713
|
+
throw err;
|
|
17714
17714
|
}
|
|
17715
17715
|
}
|
|
17716
17716
|
if (errors.length) {
|
|
@@ -17973,7 +17973,7 @@ var require_liquid_node = __commonJS({
|
|
|
17973
17973
|
try {
|
|
17974
17974
|
await statAsync(filepath);
|
|
17975
17975
|
return true;
|
|
17976
|
-
} catch (
|
|
17976
|
+
} catch (err) {
|
|
17977
17977
|
return false;
|
|
17978
17978
|
}
|
|
17979
17979
|
}
|
|
@@ -17984,7 +17984,7 @@ var require_liquid_node = __commonJS({
|
|
|
17984
17984
|
try {
|
|
17985
17985
|
fs$1.statSync(filepath);
|
|
17986
17986
|
return true;
|
|
17987
|
-
} catch (
|
|
17987
|
+
} catch (err) {
|
|
17988
17988
|
return false;
|
|
17989
17989
|
}
|
|
17990
17990
|
}
|
|
@@ -19281,10 +19281,10 @@ var require_liquid_node = __commonJS({
|
|
|
19281
19281
|
return fs2.dirname(path2);
|
|
19282
19282
|
}
|
|
19283
19283
|
lookupError(file, roots) {
|
|
19284
|
-
const
|
|
19285
|
-
|
|
19286
|
-
|
|
19287
|
-
return
|
|
19284
|
+
const err = new Error("ENOENT");
|
|
19285
|
+
err.message = `ENOENT: Failed to lookup "${file}" in "${roots}"`;
|
|
19286
|
+
err.code = "ENOENT";
|
|
19287
|
+
return err;
|
|
19288
19288
|
}
|
|
19289
19289
|
};
|
|
19290
19290
|
var Parser = class {
|
|
@@ -19313,11 +19313,11 @@ var require_liquid_node = __commonJS({
|
|
|
19313
19313
|
while (token = tokens.shift()) {
|
|
19314
19314
|
try {
|
|
19315
19315
|
templates.push(this.parseToken(token, tokens));
|
|
19316
|
-
} catch (
|
|
19316
|
+
} catch (err) {
|
|
19317
19317
|
if (this.liquid.options.catchAllErrors)
|
|
19318
|
-
errors.push(
|
|
19318
|
+
errors.push(err);
|
|
19319
19319
|
else
|
|
19320
|
-
throw
|
|
19320
|
+
throw err;
|
|
19321
19321
|
}
|
|
19322
19322
|
}
|
|
19323
19323
|
if (errors.length)
|
|
@@ -19355,9 +19355,9 @@ var require_liquid_node = __commonJS({
|
|
|
19355
19355
|
cache.write(key, taskOrTpl);
|
|
19356
19356
|
try {
|
|
19357
19357
|
return yield taskOrTpl;
|
|
19358
|
-
} catch (
|
|
19358
|
+
} catch (err) {
|
|
19359
19359
|
cache.remove(key);
|
|
19360
|
-
throw
|
|
19360
|
+
throw err;
|
|
19361
19361
|
}
|
|
19362
19362
|
}
|
|
19363
19363
|
*_parseFile(file, sync, type = exports.LookupType.Root, currentFile) {
|
|
@@ -19724,14 +19724,14 @@ var require_liquid_node = __commonJS({
|
|
|
19724
19724
|
this.context.memoryLimit.use(array.length);
|
|
19725
19725
|
return Array.prototype.filter.call(array, (x2) => !isNil(toValue(x2)));
|
|
19726
19726
|
}
|
|
19727
|
-
function
|
|
19727
|
+
function concat(v2, arg = []) {
|
|
19728
19728
|
const lhs = toArray(v2);
|
|
19729
19729
|
const rhs = toArray(arg);
|
|
19730
19730
|
this.context.memoryLimit.use(lhs.length + rhs.length);
|
|
19731
19731
|
return Array.prototype.concat.call(lhs, rhs);
|
|
19732
19732
|
}
|
|
19733
19733
|
function push(v2, arg) {
|
|
19734
|
-
return
|
|
19734
|
+
return concat.call(this, v2, [arg]);
|
|
19735
19735
|
}
|
|
19736
19736
|
function unshift(v2, arg) {
|
|
19737
19737
|
const array = toArray(v2);
|
|
@@ -19914,7 +19914,7 @@ var require_liquid_node = __commonJS({
|
|
|
19914
19914
|
map,
|
|
19915
19915
|
sum,
|
|
19916
19916
|
compact,
|
|
19917
|
-
concat
|
|
19917
|
+
concat,
|
|
19918
19918
|
push,
|
|
19919
19919
|
unshift,
|
|
19920
19920
|
pop,
|
|
@@ -22098,10 +22098,10 @@ function bwipp_processoptions() {
|
|
|
22098
22098
|
}
|
|
22099
22099
|
function bwipp_fifocache() {
|
|
22100
22100
|
var limit = $k[--$j];
|
|
22101
|
-
var
|
|
22101
|
+
var max = $k[--$j];
|
|
22102
22102
|
var dict = {
|
|
22103
22103
|
limit,
|
|
22104
|
-
max
|
|
22104
|
+
max,
|
|
22105
22105
|
cache: /* @__PURE__ */ new Map(),
|
|
22106
22106
|
fifo: [],
|
|
22107
22107
|
state: {
|
|
@@ -22130,7 +22130,7 @@ function bwipp_fifocache_fetch() {
|
|
|
22130
22130
|
return;
|
|
22131
22131
|
}
|
|
22132
22132
|
var fifo = self2.fifo;
|
|
22133
|
-
var
|
|
22133
|
+
var max = self2.max;
|
|
22134
22134
|
var limit = self2.limit;
|
|
22135
22135
|
genfn();
|
|
22136
22136
|
var result = $k[$j - 1];
|
|
@@ -22139,7 +22139,7 @@ function bwipp_fifocache_fetch() {
|
|
|
22139
22139
|
var state = self2.state;
|
|
22140
22140
|
if (card < limit) {
|
|
22141
22141
|
for (; ; ) {
|
|
22142
|
-
if (state.total + card <= limit && state.cnt <
|
|
22142
|
+
if (state.total + card <= limit && state.cnt < max) {
|
|
22143
22143
|
break;
|
|
22144
22144
|
}
|
|
22145
22145
|
var oldkey = fifo[state.head];
|
|
@@ -22147,11 +22147,11 @@ function bwipp_fifocache_fetch() {
|
|
|
22147
22147
|
cardfn();
|
|
22148
22148
|
state.total = state.total - $k[--$j];
|
|
22149
22149
|
cache.delete(oldkey);
|
|
22150
|
-
state.head = (state.head + 1) %
|
|
22150
|
+
state.head = (state.head + 1) % max;
|
|
22151
22151
|
state.cnt--;
|
|
22152
22152
|
}
|
|
22153
22153
|
cache.set(key, result);
|
|
22154
|
-
fifo[(state.head + state.cnt) %
|
|
22154
|
+
fifo[(state.head + state.cnt) % max] = key;
|
|
22155
22155
|
state.cnt++;
|
|
22156
22156
|
state.total = state.total + card;
|
|
22157
22157
|
}
|
|
@@ -28008,10 +28008,10 @@ function bwipp_rsecbinary() {
|
|
|
28008
28008
|
if ($_.rsprod() === true) {
|
|
28009
28009
|
break;
|
|
28010
28010
|
}
|
|
28011
|
-
var
|
|
28011
|
+
var _b = $k[--$j];
|
|
28012
28012
|
var _c = $k[--$j];
|
|
28013
28013
|
var _d = $k[--$j];
|
|
28014
|
-
$put(_d, _c,
|
|
28014
|
+
$put(_d, _c, _b);
|
|
28015
28015
|
$j--;
|
|
28016
28016
|
}
|
|
28017
28017
|
$_ = $__;
|
|
@@ -29699,8 +29699,8 @@ function bwipp_isbn() {
|
|
|
29699
29699
|
$k[$j++] = "ISBN-13 penultimate character must be a dash";
|
|
29700
29700
|
bwipp_raiseerror();
|
|
29701
29701
|
}
|
|
29702
|
-
var
|
|
29703
|
-
if (
|
|
29702
|
+
var _a = $get($_.barcode, 16);
|
|
29703
|
+
if (_a < 48 || _a > 57) {
|
|
29704
29704
|
$k[$j++] = "bwipp.isbn13character17#8115";
|
|
29705
29705
|
$k[$j++] = "ISBN-13 final character must be a digit";
|
|
29706
29706
|
bwipp_raiseerror();
|
|
@@ -30013,8 +30013,8 @@ function bwipp_ismn() {
|
|
|
30013
30013
|
$k[$j++] = "ISMN-13 penultimate character must be a dash";
|
|
30014
30014
|
bwipp_raiseerror();
|
|
30015
30015
|
}
|
|
30016
|
-
var
|
|
30017
|
-
if (
|
|
30016
|
+
var _a = $get($_.barcode, 16);
|
|
30017
|
+
if (_a < 48 || _a > 57) {
|
|
30018
30018
|
$k[$j++] = "bwipp.ismn13character17#8438";
|
|
30019
30019
|
$k[$j++] = "ISMN-13 final character must be a digit";
|
|
30020
30020
|
bwipp_raiseerror();
|
|
@@ -32338,10 +32338,10 @@ function bwipp_code32() {
|
|
|
32338
32338
|
}
|
|
32339
32339
|
$puti($_.barcode, 6 - $_.val.length, $_.val);
|
|
32340
32340
|
for (var _Z = 0; _Z <= 5; _Z += 1) {
|
|
32341
|
-
var
|
|
32341
|
+
var _b = $get($_.barcode, _Z);
|
|
32342
32342
|
$k[$j++] = _Z;
|
|
32343
|
-
$k[$j++] =
|
|
32344
|
-
$k[$j++] =
|
|
32343
|
+
$k[$j++] = _b;
|
|
32344
|
+
$k[$j++] = _b;
|
|
32345
32345
|
for (var _c = 0, _d = "AEIO".length; _c < _d; _c++) {
|
|
32346
32346
|
var _e2 = $get("AEIO", _c);
|
|
32347
32347
|
var _f = $k[--$j];
|
|
@@ -32917,10 +32917,10 @@ function bwipp_itf14() {
|
|
|
32917
32917
|
bwipp_raiseerror();
|
|
32918
32918
|
}
|
|
32919
32919
|
} else {
|
|
32920
|
-
var
|
|
32921
|
-
$puti(
|
|
32922
|
-
$put(
|
|
32923
|
-
$_.barcode =
|
|
32920
|
+
var _b = $s(14);
|
|
32921
|
+
$puti(_b, 0, $_.barcode);
|
|
32922
|
+
$put(_b, 13, $_.checksum + 48);
|
|
32923
|
+
$_.barcode = _b;
|
|
32924
32924
|
var _g = $_.hasspace ? 2 : 1;
|
|
32925
32925
|
var _h = $s($_.text.length + _g);
|
|
32926
32926
|
$puti(_h, _h.length - 2, " ");
|
|
@@ -33175,12 +33175,12 @@ function bwipp_databaromni() {
|
|
|
33175
33175
|
for (var _S = 0; _S <= 12; _S += 1) {
|
|
33176
33176
|
$_.i = _S;
|
|
33177
33177
|
var _W = $get($_.barcode, $_.i + 4);
|
|
33178
|
-
var
|
|
33178
|
+
var _a = $_.checksum;
|
|
33179
33179
|
var _Z = _W - 48;
|
|
33180
33180
|
if ($_.i % 2 == 0) {
|
|
33181
33181
|
_Z = _Z * 3;
|
|
33182
33182
|
}
|
|
33183
|
-
$_.checksum = $f(
|
|
33183
|
+
$_.checksum = $f(_a + _Z);
|
|
33184
33184
|
}
|
|
33185
33185
|
$_.checksum = (10 - $_.checksum % 10) % 10;
|
|
33186
33186
|
if ($_.barcode.length == 18) {
|
|
@@ -34471,8 +34471,8 @@ function bwipp_databarexpanded() {
|
|
|
34471
34471
|
$k[$j++] = Infinity;
|
|
34472
34472
|
for (var _X = 48; _X <= 57; _X += 1) {
|
|
34473
34473
|
var _Z = $strcpy($s(5), "00000");
|
|
34474
|
-
var
|
|
34475
|
-
$puti(_Z, 5 -
|
|
34474
|
+
var _b = $cvrs($s(5), _X - 43, 2);
|
|
34475
|
+
$puti(_Z, 5 - _b.length, _b);
|
|
34476
34476
|
$k[$j++] = _X;
|
|
34477
34477
|
$k[$j++] = _Z;
|
|
34478
34478
|
}
|
|
@@ -36076,8 +36076,8 @@ function bwipp_gs1northamericancoupon() {
|
|
|
36076
36076
|
$puti($_.coupontext, $_.gcp.length, "-");
|
|
36077
36077
|
$puti($_.coupontext, $_.gcp.length + 1, $_.cod);
|
|
36078
36078
|
if ($_.includetext) {
|
|
36079
|
-
var
|
|
36080
|
-
$put($_.options, "text1",
|
|
36079
|
+
var _b = $eq($_.text1, "unset") ? $_.coupontext : $_.text1;
|
|
36080
|
+
$put($_.options, "text1", _b);
|
|
36081
36081
|
var _h = $_.options;
|
|
36082
36082
|
var _g = "text1font";
|
|
36083
36083
|
var _f = $eq($_.text1font, "unset") ? "OCR-B" : $_.text1font;
|
|
@@ -37060,8 +37060,8 @@ function bwipp_rationalizedCodabar() {
|
|
|
37060
37060
|
bwipp_raiseerror();
|
|
37061
37061
|
}
|
|
37062
37062
|
}
|
|
37063
|
-
for (var
|
|
37064
|
-
if (!$has($_.bodyvals, $geti($_.barcode,
|
|
37063
|
+
for (var _a = 1, _Z = $_.barcode.length - 2; _a <= _Z; _a += 1) {
|
|
37064
|
+
if (!$has($_.bodyvals, $geti($_.barcode, _a, 1))) {
|
|
37065
37065
|
$k[$j++] = "bwipp.rationalizedCodabarBadCharacter#15513";
|
|
37066
37066
|
$k[$j++] = "Codabar body must contain only digits and symbols - $ : / . +";
|
|
37067
37067
|
bwipp_raiseerror();
|
|
@@ -38014,9 +38014,9 @@ function bwipp_auspost() {
|
|
|
38014
38014
|
$j--;
|
|
38015
38015
|
$_.rstable = $_.rstable;
|
|
38016
38016
|
$_.rspoly = $a([1, 0, 0, 0, 0]);
|
|
38017
|
-
for (var
|
|
38018
|
-
$k[$j++] = $bs(1,
|
|
38019
|
-
for (var _c =
|
|
38017
|
+
for (var _b = 1; _b <= 4; _b += 1) {
|
|
38018
|
+
$k[$j++] = $bs(1, _b);
|
|
38019
|
+
for (var _c = _b; _c >= 1; _c -= 1) {
|
|
38020
38020
|
var _d = $_.rspoly;
|
|
38021
38021
|
var _e2 = $get(_d, _c - 1);
|
|
38022
38022
|
var _g = $get($_.rspoly, _c);
|
|
@@ -38683,10 +38683,10 @@ function bwipp_msi() {
|
|
|
38683
38683
|
});
|
|
38684
38684
|
var _Y = $k[--$j];
|
|
38685
38685
|
$j--;
|
|
38686
|
-
var
|
|
38686
|
+
var _b = $k[--$j];
|
|
38687
38687
|
var _d = $s($_.code.length + 1);
|
|
38688
38688
|
$puti(_d, 0, $_.code);
|
|
38689
|
-
$put(_d, $_.code.length, (10 - $f(
|
|
38689
|
+
$put(_d, $_.code.length, (10 - $f(_b + _Y) % 10) % 10 + 48);
|
|
38690
38690
|
$k[$j++] = _d;
|
|
38691
38691
|
};
|
|
38692
38692
|
$_.mod11 = function() {
|
|
@@ -39095,10 +39095,10 @@ function bwipp_telepen() {
|
|
|
39095
39095
|
$k[$j++] = -1;
|
|
39096
39096
|
} else {
|
|
39097
39097
|
var _Y = $get($_.np, 0);
|
|
39098
|
-
var
|
|
39098
|
+
var _b = $get($_.np, 1) - 48;
|
|
39099
39099
|
$k[$j++] = _Y - 48;
|
|
39100
|
-
$k[$j++] =
|
|
39101
|
-
if (
|
|
39100
|
+
$k[$j++] = _b;
|
|
39101
|
+
if (_b != 40) {
|
|
39102
39102
|
var _c = $k[--$j];
|
|
39103
39103
|
var _d = $k[--$j];
|
|
39104
39104
|
$k[$j++] = $f(_c + _d * 10) + 10;
|
|
@@ -42102,11 +42102,11 @@ function bwipp_flattermarken() {
|
|
|
42102
42102
|
_X[_U] = $_.height;
|
|
42103
42103
|
}
|
|
42104
42104
|
_X = $a(_X);
|
|
42105
|
-
var
|
|
42106
|
-
for (var _Z = 0,
|
|
42107
|
-
|
|
42105
|
+
var _b = [];
|
|
42106
|
+
for (var _Z = 0, _a = ~~(($_.sbs.length + 1) / 2); _Z < _a; _Z++) {
|
|
42107
|
+
_b[_Z] = 0;
|
|
42108
42108
|
}
|
|
42109
|
-
|
|
42109
|
+
_b = $a(_b);
|
|
42110
42110
|
var _g = $a([$a([$_.barcode, 0, 0, $_.text1font, $_.text1size])]);
|
|
42111
42111
|
$k[$j++] = "ren";
|
|
42112
42112
|
$k[$j++] = "renlinear";
|
|
@@ -42115,7 +42115,7 @@ function bwipp_flattermarken() {
|
|
|
42115
42115
|
$k[$j++] = "bhs";
|
|
42116
42116
|
$k[$j++] = _X;
|
|
42117
42117
|
$k[$j++] = "bbs";
|
|
42118
|
-
$k[$j++] =
|
|
42118
|
+
$k[$j++] = _b;
|
|
42119
42119
|
$k[$j++] = "txt";
|
|
42120
42120
|
$k[$j++] = _g;
|
|
42121
42121
|
$k[$j++] = "text1xalign";
|
|
@@ -42352,11 +42352,11 @@ function bwipp_symbol() {
|
|
|
42352
42352
|
$k[$j++] = 1;
|
|
42353
42353
|
}
|
|
42354
42354
|
$k[$j++] = 1;
|
|
42355
|
-
var
|
|
42356
|
-
$_.symbol_zebrasbs =
|
|
42355
|
+
var _a = $a();
|
|
42356
|
+
$_.symbol_zebrasbs = _a;
|
|
42357
42357
|
var _d = [];
|
|
42358
|
-
for (var
|
|
42359
|
-
_d[
|
|
42358
|
+
for (var _b = 0, _c = ~~($_.symbol_zebrasbs.length / 2) + 1; _b < _c; _b++) {
|
|
42359
|
+
_d[_b] = 1;
|
|
42360
42360
|
}
|
|
42361
42361
|
_d = $a(_d);
|
|
42362
42362
|
$_.symbol_zebrabhs = _d;
|
|
@@ -58477,11 +58477,11 @@ function bwipp_ultracode() {
|
|
|
58477
58477
|
$k[$j++] = 0;
|
|
58478
58478
|
}
|
|
58479
58479
|
$_.coeffs = $a();
|
|
58480
|
-
for (var
|
|
58480
|
+
for (var _b = 1, _a = $_.k; _b <= _a; _b += 1) {
|
|
58481
58481
|
var _c = $_.coeffs;
|
|
58482
|
-
$put(_c,
|
|
58483
|
-
$k[$j++] = $get($_.rsalog,
|
|
58484
|
-
for (var _g =
|
|
58482
|
+
$put(_c, _b, $get(_c, _b - 1));
|
|
58483
|
+
$k[$j++] = $get($_.rsalog, _b);
|
|
58484
|
+
for (var _g = _b - 1; _g >= 1; _g -= 1) {
|
|
58485
58485
|
var _h = $_.coeffs;
|
|
58486
58486
|
var _i = $get(_h, _g);
|
|
58487
58487
|
var _j = $k[$j - 1];
|
|
@@ -59038,9 +59038,9 @@ function bwipp_gs1_cc() {
|
|
|
59038
59038
|
$put(_Y, 1, 94);
|
|
59039
59039
|
}
|
|
59040
59040
|
var _Z = $k[--$j];
|
|
59041
|
-
var
|
|
59041
|
+
var _a = $k[--$j];
|
|
59042
59042
|
var _c = $strcpy($s(7), "0000000");
|
|
59043
|
-
var _e2 = $cvrs($s(7),
|
|
59043
|
+
var _e2 = $cvrs($s(7), _a + 8, 2);
|
|
59044
59044
|
$puti(_c, 7 - _e2.length, _e2);
|
|
59045
59045
|
$k[$j++] = _Z;
|
|
59046
59046
|
$k[$j++] = _c;
|
|
@@ -62376,8 +62376,8 @@ function bwipp_databarstackedcomposite() {
|
|
|
62376
62376
|
$_.sepfinder = function() {
|
|
62377
62377
|
var _W = $k[--$j];
|
|
62378
62378
|
$_.fp = _W;
|
|
62379
|
-
for (var
|
|
62380
|
-
$_.i =
|
|
62379
|
+
for (var _a = $_.fp, _Z = $_.fp + 12; _a <= _Z; _a += 1) {
|
|
62380
|
+
$_.i = _a;
|
|
62381
62381
|
if ($get($_.bot, $_.i) == 0) {
|
|
62382
62382
|
if ($get($_.bot, $_.i - 1) == 1) {
|
|
62383
62383
|
$k[$j++] = 1;
|
|
@@ -62661,8 +62661,8 @@ function bwipp_databarstackedomnicomposite() {
|
|
|
62661
62661
|
$_.sepfinder = function() {
|
|
62662
62662
|
var _W = $k[--$j];
|
|
62663
62663
|
$_.fp = _W;
|
|
62664
|
-
for (var
|
|
62665
|
-
$_.i =
|
|
62664
|
+
for (var _a = $_.fp, _Z = $_.fp + 12; _a <= _Z; _a += 1) {
|
|
62665
|
+
$_.i = _a;
|
|
62666
62666
|
if ($get($_.bot, $_.i) == 0) {
|
|
62667
62667
|
if ($get($_.bot, $_.i - 1) == 1) {
|
|
62668
62668
|
$k[$j++] = 1;
|
|
@@ -63248,9 +63248,9 @@ function bwipp_databarlimitedcomposite() {
|
|
|
63248
63248
|
}
|
|
63249
63249
|
$_.linpixs = $a();
|
|
63250
63250
|
$k[$j++] = Infinity;
|
|
63251
|
-
var
|
|
63252
|
-
for (var
|
|
63253
|
-
$k[$j++] = 1 - $get(
|
|
63251
|
+
var _a = $_.linpixs;
|
|
63252
|
+
for (var _b = 0, _c = _a.length; _b < _c; _b++) {
|
|
63253
|
+
$k[$j++] = 1 - $get(_a, _b);
|
|
63254
63254
|
}
|
|
63255
63255
|
$_.sep = $a();
|
|
63256
63256
|
$puti($_.sep, 0, $_.databarlimitedcomposite_sepleft);
|
|
@@ -64895,8 +64895,8 @@ function bwipp_gs1qrcode() {
|
|
|
64895
64895
|
$puti($_.barcode, $_.j, "^FNC1");
|
|
64896
64896
|
$_.j = $_.j + 5;
|
|
64897
64897
|
} else {
|
|
64898
|
-
var
|
|
64899
|
-
$put($_.barcode, $_.j,
|
|
64898
|
+
var _b = $k[--$j];
|
|
64899
|
+
$put($_.barcode, $_.j, _b);
|
|
64900
64900
|
$_.j = $_.j + 1;
|
|
64901
64901
|
}
|
|
64902
64902
|
});
|
|
@@ -65026,8 +65026,8 @@ function bwipp_gs1dotcode() {
|
|
|
65026
65026
|
$puti($_.barcode, $_.j, "^FNC1");
|
|
65027
65027
|
$_.j = $_.j + 5;
|
|
65028
65028
|
} else {
|
|
65029
|
-
var
|
|
65030
|
-
$put($_.barcode, $_.j,
|
|
65029
|
+
var _b = $k[--$j];
|
|
65030
|
+
$put($_.barcode, $_.j, _b);
|
|
65031
65031
|
$_.j = $_.j + 1;
|
|
65032
65032
|
}
|
|
65033
65033
|
});
|
|
@@ -67263,9 +67263,9 @@ function bwipp_validatetext() {
|
|
|
67263
67263
|
} else {
|
|
67264
67264
|
$j--;
|
|
67265
67265
|
}
|
|
67266
|
-
var
|
|
67267
|
-
$k[$j++] =
|
|
67268
|
-
if ($ne(
|
|
67266
|
+
var _b = $get($_.td, "yalign");
|
|
67267
|
+
$k[$j++] = _b;
|
|
67268
|
+
if ($ne(_b, "unset")) {
|
|
67269
67269
|
var _c = $k[--$j];
|
|
67270
67270
|
if (!$has($_.validatetext_yalignopts, _c)) {
|
|
67271
67271
|
$k[$j++] = "yalign";
|
|
@@ -67717,7 +67717,7 @@ var BWIPJS = (function() {
|
|
|
67717
67717
|
var round = Math.round;
|
|
67718
67718
|
var ceil = Math.ceil;
|
|
67719
67719
|
var min = Math.min;
|
|
67720
|
-
var
|
|
67720
|
+
var max = Math.max;
|
|
67721
67721
|
function BWIPJS2(drawing) {
|
|
67722
67722
|
if (this.constructor !== BWIPJS2) {
|
|
67723
67723
|
return new BWIPJS2(drawing);
|
|
@@ -68134,9 +68134,9 @@ var BWIPJS = (function() {
|
|
|
68134
68134
|
var pts2 = a2.poly;
|
|
68135
68135
|
self2.transform(pts2);
|
|
68136
68136
|
var x02 = min(pts2[0][0], pts2[2][0]);
|
|
68137
|
-
var x12 =
|
|
68137
|
+
var x12 = max(pts2[0][0], pts2[2][0]);
|
|
68138
68138
|
var y02 = min(pts2[0][1], pts2[2][1]);
|
|
68139
|
-
var y12 =
|
|
68139
|
+
var y12 = max(pts2[0][1], pts2[2][1]);
|
|
68140
68140
|
self2.drawing.polygon([
|
|
68141
68141
|
[x02 - bigw2, y02 - bigh2],
|
|
68142
68142
|
[x02 - bigw2, y12 + bigh2 + 1],
|
|
@@ -70627,9 +70627,148 @@ function toUint8Array(data) {
|
|
|
70627
70627
|
FontLib.loadFont("OCR-A", 100, 100, "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");
|
|
70628
70628
|
FontLib.loadFont("OCR-B", 96, 100, "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");
|
|
70629
70629
|
|
|
70630
|
-
// packages/engine/src/lib/
|
|
70630
|
+
// packages/engine/src/lib/values.ts
|
|
70631
|
+
function toNumber(value) {
|
|
70632
|
+
if (typeof value === "number") return value;
|
|
70633
|
+
if (typeof value === "string") {
|
|
70634
|
+
const n = Number(value.replace(/\s/g, "").replace(",", "."));
|
|
70635
|
+
return Number.isFinite(n) ? n : NaN;
|
|
70636
|
+
}
|
|
70637
|
+
if (typeof value === "bigint") return Number(value);
|
|
70638
|
+
return NaN;
|
|
70639
|
+
}
|
|
70640
|
+
|
|
70641
|
+
// packages/engine/src/lib/codes/epc.ts
|
|
70642
|
+
function epcPayload(input) {
|
|
70643
|
+
const amount = input.amount === void 0 || input.amount === "" ? "" : `EUR${toNumber(input.amount).toFixed(2)}`;
|
|
70644
|
+
return [
|
|
70645
|
+
"BCD",
|
|
70646
|
+
"002",
|
|
70647
|
+
"1",
|
|
70648
|
+
"SCT",
|
|
70649
|
+
(input.bic ?? "").replace(/\s/g, ""),
|
|
70650
|
+
String(input.name ?? "").slice(0, 70),
|
|
70651
|
+
String(input.iban ?? "").replace(/\s/g, ""),
|
|
70652
|
+
amount,
|
|
70653
|
+
(input.purpose ?? "").slice(0, 4),
|
|
70654
|
+
(input.reference ?? "").slice(0, 35),
|
|
70655
|
+
input.reference ? "" : (input.text ?? "").slice(0, 140),
|
|
70656
|
+
""
|
|
70657
|
+
].join("\n");
|
|
70658
|
+
}
|
|
70659
|
+
|
|
70660
|
+
// packages/engine/src/lib/codes/qr.ts
|
|
70631
70661
|
var import_qrcode = __toESM(require_lib());
|
|
70632
70662
|
var import_svg_tag = __toESM(require_svg_tag());
|
|
70663
|
+
function qrSvg(value, options = {}) {
|
|
70664
|
+
const qr = (0, import_qrcode.create)(value, { errorCorrectionLevel: options.ecc ?? "M" });
|
|
70665
|
+
return (0, import_svg_tag.render)(qr, {
|
|
70666
|
+
width: options.size ?? 160,
|
|
70667
|
+
margin: options.margin ?? 1,
|
|
70668
|
+
color: {
|
|
70669
|
+
dark: (options.color ?? "#000000").replace(/^(#?)/, "#").slice(0, 9),
|
|
70670
|
+
light: (options.background ?? "#ffffff").replace(/^(#?)/, "#")
|
|
70671
|
+
}
|
|
70672
|
+
});
|
|
70673
|
+
}
|
|
70674
|
+
var svgDataUri = (svg) => `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;
|
|
70675
|
+
|
|
70676
|
+
// packages/engine/src/lib/helpers/codes.ts
|
|
70677
|
+
var barcodeTypes = {
|
|
70678
|
+
code128: "code128",
|
|
70679
|
+
ean13: "ean13",
|
|
70680
|
+
ean8: "ean8",
|
|
70681
|
+
upc: "upca",
|
|
70682
|
+
upca: "upca",
|
|
70683
|
+
itf14: "itf14",
|
|
70684
|
+
code39: "code39",
|
|
70685
|
+
qrcode: "qrcode",
|
|
70686
|
+
datamatrix: "datamatrix",
|
|
70687
|
+
pdf417: "pdf417"
|
|
70688
|
+
};
|
|
70689
|
+
var codeHelpers = [
|
|
70690
|
+
{
|
|
70691
|
+
name: "qrcode",
|
|
70692
|
+
aliases: ["qr"],
|
|
70693
|
+
doc: {
|
|
70694
|
+
signature: "qrcode(value, { size = 160, ecc = 'M', margin = 1, color, background })",
|
|
70695
|
+
description: "QR code as an SVG data URI for an <img> src.",
|
|
70696
|
+
examples: {
|
|
70697
|
+
jinja2: '<img src="{{ qrcode(order.url, { size: 120 }) }}">',
|
|
70698
|
+
liquid: '<img src="{{ order.url | qrcode: size: 120 }}">',
|
|
70699
|
+
handlebars: '<img src="{{qrcode order.url size=120}}">'
|
|
70700
|
+
},
|
|
70701
|
+
category: "code"
|
|
70702
|
+
},
|
|
70703
|
+
fn: (ctx, value, options) => {
|
|
70704
|
+
const o = options ?? {};
|
|
70705
|
+
const svg = qrSvg(String(value ?? ""), o);
|
|
70706
|
+
if (ctx.drawing) return ctx.drawing({ kind: "svg", svg, width: o.size, height: o.size, alt: "QR code" });
|
|
70707
|
+
return svgDataUri(svg);
|
|
70708
|
+
}
|
|
70709
|
+
},
|
|
70710
|
+
{
|
|
70711
|
+
name: "barcode",
|
|
70712
|
+
doc: {
|
|
70713
|
+
signature: "barcode(value, { type = 'code128', height = 12, width, text = true, scale = 2 })",
|
|
70714
|
+
description: "Barcode (code128, ean13, ean8, upc, itf14, code39, datamatrix, pdf417) as an SVG data URI.",
|
|
70715
|
+
examples: {
|
|
70716
|
+
jinja2: `<img src="{{ barcode(item.sku, { type: 'code128' }) }}">`,
|
|
70717
|
+
liquid: `<img src="{{ item.sku | barcode: type: 'code128' }}">`,
|
|
70718
|
+
handlebars: `<img src="{{barcode item.sku type='code128'}}">`
|
|
70719
|
+
},
|
|
70720
|
+
category: "code"
|
|
70721
|
+
},
|
|
70722
|
+
fn: (ctx, value, options) => {
|
|
70723
|
+
const o = options ?? {};
|
|
70724
|
+
const bcid = barcodeTypes[String(o.type ?? "code128").toLowerCase()] ?? "code128";
|
|
70725
|
+
const svg = ToSVG({
|
|
70726
|
+
bcid,
|
|
70727
|
+
text: String(value ?? ""),
|
|
70728
|
+
height: o.height ?? 12,
|
|
70729
|
+
...o.width === void 0 ? {} : { width: o.width },
|
|
70730
|
+
scale: o.scale ?? 2,
|
|
70731
|
+
includetext: o.text !== false,
|
|
70732
|
+
textxalign: "center"
|
|
70733
|
+
});
|
|
70734
|
+
if (ctx.drawing) return ctx.drawing({ kind: "svg", svg, alt: `Barcode ${String(value ?? "")}` });
|
|
70735
|
+
return svgDataUri(svg);
|
|
70736
|
+
}
|
|
70737
|
+
},
|
|
70738
|
+
{
|
|
70739
|
+
name: "epcQr",
|
|
70740
|
+
aliases: ["epc_qr", "girocode"],
|
|
70741
|
+
doc: {
|
|
70742
|
+
signature: "epcQr({ name, iban, bic?, amount?, reference?, text? }, { size })",
|
|
70743
|
+
description: "SEPA credit transfer QR code (EPC069-12 / GiroCode) that banking apps scan to prefill a payment.",
|
|
70744
|
+
examples: {
|
|
70745
|
+
jinja2: '<img src="{{ epcQr({ name: company.name, iban: company.iban, amount: invoice.total, reference: invoice.number }) }}">',
|
|
70746
|
+
liquid: '<img src="{{ company.iban | epcQr: name: company.name, amount: invoice.total, reference: invoice.number }}">',
|
|
70747
|
+
handlebars: '<img src="{{epcQr name=company.name iban=company.iban amount=invoice.total reference=invoice.number}}">'
|
|
70748
|
+
},
|
|
70749
|
+
category: "code"
|
|
70750
|
+
},
|
|
70751
|
+
// Payment fields and QR options may arrive together: Jinja2 passes two objects, Handlebars one
|
|
70752
|
+
// hash (`{{epcQr name=… iban=… size=200}}`), and Liquid, which cannot build an object literal,
|
|
70753
|
+
// keyword arguments (`{{ company.iban | epcQr: name: company.name, amount: invoice.total }}`,
|
|
70754
|
+
// where a string input is the IBAN). They are merged and split by field name.
|
|
70755
|
+
fn: (ctx, input, options) => {
|
|
70756
|
+
const fields = {
|
|
70757
|
+
...input && typeof input === "object" ? input : typeof input === "string" && input ? { iban: input } : {},
|
|
70758
|
+
...options ?? {}
|
|
70759
|
+
};
|
|
70760
|
+
const payment = {};
|
|
70761
|
+
const qr = {};
|
|
70762
|
+
for (const [key, value] of Object.entries(fields))
|
|
70763
|
+
(EPC_FIELDS.has(key) ? payment : qr)[key] = value;
|
|
70764
|
+
const o = { ecc: "M", ...qr };
|
|
70765
|
+
const svg = qrSvg(epcPayload(payment), o);
|
|
70766
|
+
if (ctx.drawing) return ctx.drawing({ kind: "svg", svg, width: o.size, height: o.size, alt: "GiroCode" });
|
|
70767
|
+
return svgDataUri(svg);
|
|
70768
|
+
}
|
|
70769
|
+
}
|
|
70770
|
+
];
|
|
70771
|
+
var EPC_FIELDS = /* @__PURE__ */ new Set(["name", "iban", "bic", "amount", "reference", "text", "purpose"]);
|
|
70633
70772
|
|
|
70634
70773
|
// node_modules/.pnpm/@date-fns+tz@1.5.0/node_modules/@date-fns/tz/constants/index.js
|
|
70635
70774
|
var constructFromSymbol = Symbol.for("constructDateFrom");
|
|
@@ -76335,11 +76474,11 @@ function parseNumericString(str2) {
|
|
|
76335
76474
|
}
|
|
76336
76475
|
|
|
76337
76476
|
// node_modules/.pnpm/n2words@6.1.2/node_modules/n2words/src/utils/check-max.js
|
|
76338
|
-
function checkMax(value,
|
|
76339
|
-
if (
|
|
76340
|
-
if (value <
|
|
76341
|
-
const exponent =
|
|
76342
|
-
const largest =
|
|
76477
|
+
function checkMax(value, max, fraction) {
|
|
76478
|
+
if (max === null) return;
|
|
76479
|
+
if (value < max && !(fraction && BigInt(fraction) >= max)) return;
|
|
76480
|
+
const exponent = max.toString().length - 1;
|
|
76481
|
+
const largest = max === 10n ** BigInt(exponent) ? `10^${exponent} - 1` : `${max - 1n}`;
|
|
76343
76482
|
throw new RangeError(`Number too large to convert: the largest supported value is ${largest}`);
|
|
76344
76483
|
}
|
|
76345
76484
|
|
|
@@ -77456,7 +77595,6 @@ var currencyValues6 = { currency: (
|
|
|
77456
77595
|
) };
|
|
77457
77596
|
|
|
77458
77597
|
// packages/engine/src/lib/helpers/office.ts
|
|
77459
|
-
var officeUnsupportedHelpers = /* @__PURE__ */ new Set(["chart", "markdown"]);
|
|
77460
77598
|
function officeUnsupported(name) {
|
|
77461
77599
|
return `${name}() is not supported in office templates`;
|
|
77462
77600
|
}
|
|
@@ -77475,15 +77613,6 @@ var dateLocales = {
|
|
|
77475
77613
|
function dateLocale(locale) {
|
|
77476
77614
|
return dateLocales[locale] ?? dateLocales[locale.split("-")[0] ?? ""] ?? enGB;
|
|
77477
77615
|
}
|
|
77478
|
-
function toNumber(value) {
|
|
77479
|
-
if (typeof value === "number") return value;
|
|
77480
|
-
if (typeof value === "string") {
|
|
77481
|
-
const n = Number(value.replace(/\s/g, "").replace(",", "."));
|
|
77482
|
-
return Number.isFinite(n) ? n : NaN;
|
|
77483
|
-
}
|
|
77484
|
-
if (typeof value === "bigint") return Number(value);
|
|
77485
|
-
return NaN;
|
|
77486
|
-
}
|
|
77487
77616
|
function toDate2(value, tz) {
|
|
77488
77617
|
if (value === "now" || value === void 0 || value === null || value === "")
|
|
77489
77618
|
return new TZDate(Date.now(), tz);
|
|
@@ -77506,6 +77635,10 @@ function escapeHtml(value) {
|
|
|
77506
77635
|
var isNamedArgs = (v2) => !!v2 && typeof v2 === "object" && !Array.isArray(v2) && !(v2 instanceof Date);
|
|
77507
77636
|
var str = (v2) => v2 === void 0 || v2 === null ? "" : String(v2);
|
|
77508
77637
|
var opt = (v2, fallback) => v2 === void 0 || v2 === null || v2 === "" ? fallback : v2;
|
|
77638
|
+
function requireFinite(helper, value) {
|
|
77639
|
+
if (typeof value === "number" && !Number.isFinite(value))
|
|
77640
|
+
throw new Error(`${helper}: got ${value}, the result of a calculation with a value that is missing or not a number`);
|
|
77641
|
+
}
|
|
77509
77642
|
var wordsByLang = {
|
|
77510
77643
|
de: toCardinal,
|
|
77511
77644
|
en: toCardinal2,
|
|
@@ -77521,11 +77654,16 @@ var formatHelpers = [
|
|
|
77521
77654
|
deprecatedAlias: { currency_format: "money" },
|
|
77522
77655
|
doc: {
|
|
77523
77656
|
signature: "money(value, currency?, locale?)",
|
|
77524
|
-
description: "Formats a number as currency with Intl.NumberFormat. Defaults come from the template settings.",
|
|
77525
|
-
|
|
77657
|
+
description: "Formats a number as currency with Intl.NumberFormat. Defaults come from the template settings. Text that is not a number is printed as it is; a calculation that came out as NaN stops the render.",
|
|
77658
|
+
examples: {
|
|
77659
|
+
jinja2: "{{ line.total | money('EUR') }} \u2192 1.234,50 \u20AC",
|
|
77660
|
+
liquid: "{{ line.total | money: 'EUR' }} \u2192 1.234,50 \u20AC",
|
|
77661
|
+
handlebars: "{{money line.total 'EUR'}} \u2192 1.234,50 \u20AC"
|
|
77662
|
+
},
|
|
77526
77663
|
category: "format"
|
|
77527
77664
|
},
|
|
77528
77665
|
fn: (ctx, value, currency, locale) => {
|
|
77666
|
+
requireFinite("money", value);
|
|
77529
77667
|
const n = toNumber(value);
|
|
77530
77668
|
if (Number.isNaN(n)) return str(value);
|
|
77531
77669
|
return new Intl.NumberFormat(opt(locale, ctx.locale), {
|
|
@@ -77539,10 +77677,15 @@ var formatHelpers = [
|
|
|
77539
77677
|
doc: {
|
|
77540
77678
|
signature: "number(value, decimals?, locale?)",
|
|
77541
77679
|
description: "Formats a number with grouping. With decimals, exactly that many (rounded half away from zero); without, the decimals the number has, at most three, so 1234.5 \u2192 1.234,5 and 2.34567 \u2192 2,346. Use number(0) for whole numbers.",
|
|
77542
|
-
|
|
77680
|
+
examples: {
|
|
77681
|
+
jinja2: "{{ qty | number(2) }} \u2192 1.234,00",
|
|
77682
|
+
liquid: "{{ qty | number: 2 }} \u2192 1.234,00",
|
|
77683
|
+
handlebars: "{{number qty 2}} \u2192 1.234,00"
|
|
77684
|
+
},
|
|
77543
77685
|
category: "format"
|
|
77544
77686
|
},
|
|
77545
77687
|
fn: (ctx, value, decimals, locale) => {
|
|
77688
|
+
requireFinite("number", value);
|
|
77546
77689
|
const n = toNumber(value);
|
|
77547
77690
|
if (Number.isNaN(n)) return str(value);
|
|
77548
77691
|
const d = decimals === void 0 || decimals === null ? void 0 : Number(decimals);
|
|
@@ -77557,7 +77700,11 @@ var formatHelpers = [
|
|
|
77557
77700
|
doc: {
|
|
77558
77701
|
signature: "date(value, format?, tz?, locale?)",
|
|
77559
77702
|
description: "Formats a date with date-fns tokens (e.g. 'dd.MM.yyyy', 'PPP'). Accepts ISO strings, epoch numbers and 'now'.",
|
|
77560
|
-
|
|
77703
|
+
examples: {
|
|
77704
|
+
jinja2: "{{ invoice.date | date('dd.MM.yyyy') }}",
|
|
77705
|
+
liquid: "{{ invoice.date | date: 'dd.MM.yyyy' }}",
|
|
77706
|
+
handlebars: "{{date invoice.date 'dd.MM.yyyy'}}"
|
|
77707
|
+
},
|
|
77561
77708
|
category: "format"
|
|
77562
77709
|
},
|
|
77563
77710
|
fn: (ctx, value, format2, tz, locale) => {
|
|
@@ -77574,7 +77721,11 @@ var formatHelpers = [
|
|
|
77574
77721
|
doc: {
|
|
77575
77722
|
signature: "dateAdd(value, amount, unit)",
|
|
77576
77723
|
description: "Adds days, weeks, months or years to a date; returns an ISO string for further formatting.",
|
|
77577
|
-
|
|
77724
|
+
examples: {
|
|
77725
|
+
jinja2: "{{ invoice.date | dateAdd(14, 'days') | date('PP') }}",
|
|
77726
|
+
liquid: "{{ invoice.date | dateAdd: 14, 'days' | date: 'PP' }}",
|
|
77727
|
+
handlebars: "{{date (dateAdd invoice.date 14 'days') 'PP'}}"
|
|
77728
|
+
},
|
|
77578
77729
|
category: "format"
|
|
77579
77730
|
},
|
|
77580
77731
|
fn: (ctx, value, amount, unit) => {
|
|
@@ -77591,7 +77742,11 @@ var formatHelpers = [
|
|
|
77591
77742
|
doc: {
|
|
77592
77743
|
signature: "add(a, b)",
|
|
77593
77744
|
description: "a + b (Handlebars has no arithmetic of its own).",
|
|
77594
|
-
|
|
77745
|
+
examples: {
|
|
77746
|
+
jinja2: "{{ line.qty | add(1) }}",
|
|
77747
|
+
liquid: "{{ line.qty | add: 1 }}",
|
|
77748
|
+
handlebars: "{{#each invoice.lines}}{{add @index 1}}{{/each}}"
|
|
77749
|
+
},
|
|
77595
77750
|
category: "format"
|
|
77596
77751
|
},
|
|
77597
77752
|
fn: (_ctx, a, b2) => toNumber(a) + toNumber(b2)
|
|
@@ -77602,7 +77757,11 @@ var formatHelpers = [
|
|
|
77602
77757
|
doc: {
|
|
77603
77758
|
signature: "subtract(a, b)",
|
|
77604
77759
|
description: "a minus b.",
|
|
77605
|
-
|
|
77760
|
+
examples: {
|
|
77761
|
+
jinja2: "{{ total | subtract(discount) }}",
|
|
77762
|
+
liquid: "{{ total | subtract: discount }}",
|
|
77763
|
+
handlebars: "{{subtract total discount}}"
|
|
77764
|
+
},
|
|
77606
77765
|
category: "format"
|
|
77607
77766
|
},
|
|
77608
77767
|
fn: (_ctx, a, b2) => toNumber(a) - toNumber(b2)
|
|
@@ -77613,7 +77772,11 @@ var formatHelpers = [
|
|
|
77613
77772
|
doc: {
|
|
77614
77773
|
signature: "multiply(a, b)",
|
|
77615
77774
|
description: "a times b.",
|
|
77616
|
-
|
|
77775
|
+
examples: {
|
|
77776
|
+
jinja2: "{{ line.qty | multiply(line.price) | money }}",
|
|
77777
|
+
liquid: "{{ line.qty | multiply: line.price | money }}",
|
|
77778
|
+
handlebars: "{{money (multiply line.qty line.price)}}"
|
|
77779
|
+
},
|
|
77617
77780
|
category: "format"
|
|
77618
77781
|
},
|
|
77619
77782
|
fn: (_ctx, a, b2) => toNumber(a) * toNumber(b2)
|
|
@@ -77624,7 +77787,11 @@ var formatHelpers = [
|
|
|
77624
77787
|
doc: {
|
|
77625
77788
|
signature: "divide(a, b)",
|
|
77626
77789
|
description: "a divided by b; empty when b is 0.",
|
|
77627
|
-
|
|
77790
|
+
examples: {
|
|
77791
|
+
jinja2: "{{ total | divide(count) }}",
|
|
77792
|
+
liquid: "{{ total | divide: count }}",
|
|
77793
|
+
handlebars: "{{divide total count}}"
|
|
77794
|
+
},
|
|
77628
77795
|
category: "format"
|
|
77629
77796
|
},
|
|
77630
77797
|
fn: (_ctx, a, b2) => toNumber(b2) === 0 ? "" : toNumber(a) / toNumber(b2)
|
|
@@ -77634,7 +77801,11 @@ var formatHelpers = [
|
|
|
77634
77801
|
doc: {
|
|
77635
77802
|
signature: "round(value, decimals = 0, method = 'common')",
|
|
77636
77803
|
description: "Rounds to the given decimals, as Jinja2's round does: 'common' rounds half away from zero, 'floor' always down and 'ceil' always up.",
|
|
77637
|
-
|
|
77804
|
+
examples: {
|
|
77805
|
+
jinja2: "{{ 2.345 | round(2) }} gives 2.35, {{ 2.349 | round(2, 'floor') }} gives 2.34",
|
|
77806
|
+
liquid: "{{ 2.345 | round: 2 }} gives 2.35, {{ 2.349 | round: 2, 'floor' }} gives 2.34",
|
|
77807
|
+
handlebars: "{{round 2.345 2}} gives 2.35, {{round 2.349 2 'floor'}} gives 2.34"
|
|
77808
|
+
},
|
|
77638
77809
|
category: "format"
|
|
77639
77810
|
},
|
|
77640
77811
|
// `round(2, method='floor')` (Jinja2) and `round: 2, method: 'floor'` (Liquid) arrive as a
|
|
@@ -77660,7 +77831,11 @@ var formatHelpers = [
|
|
|
77660
77831
|
doc: {
|
|
77661
77832
|
signature: "upper(value)",
|
|
77662
77833
|
description: "Upper-cases a string.",
|
|
77663
|
-
|
|
77834
|
+
examples: {
|
|
77835
|
+
jinja2: "{{ name | upper }}",
|
|
77836
|
+
liquid: "{{ name | upper }}",
|
|
77837
|
+
handlebars: "{{upper name}}"
|
|
77838
|
+
},
|
|
77664
77839
|
category: "text"
|
|
77665
77840
|
},
|
|
77666
77841
|
fn: (_ctx, value) => str(value).toUpperCase()
|
|
@@ -77671,7 +77846,11 @@ var formatHelpers = [
|
|
|
77671
77846
|
doc: {
|
|
77672
77847
|
signature: "lower(value)",
|
|
77673
77848
|
description: "Lower-cases a string.",
|
|
77674
|
-
|
|
77849
|
+
examples: {
|
|
77850
|
+
jinja2: "{{ name | lower }}",
|
|
77851
|
+
liquid: "{{ name | lower }}",
|
|
77852
|
+
handlebars: "{{lower name}}"
|
|
77853
|
+
},
|
|
77675
77854
|
category: "text"
|
|
77676
77855
|
},
|
|
77677
77856
|
fn: (_ctx, value) => str(value).toLowerCase()
|
|
@@ -77682,7 +77861,11 @@ var formatHelpers = [
|
|
|
77682
77861
|
doc: {
|
|
77683
77862
|
signature: "title(value)",
|
|
77684
77863
|
description: "Capitalises every word.",
|
|
77685
|
-
|
|
77864
|
+
examples: {
|
|
77865
|
+
jinja2: "{{ 'hello world' | title }} \u2192 Hello World",
|
|
77866
|
+
liquid: "{{ 'hello world' | title }} \u2192 Hello World",
|
|
77867
|
+
handlebars: "{{title 'hello world'}} \u2192 Hello World"
|
|
77868
|
+
},
|
|
77686
77869
|
category: "text"
|
|
77687
77870
|
},
|
|
77688
77871
|
fn: (_ctx, value) => str(value).replace(
|
|
@@ -77695,14 +77878,18 @@ var formatHelpers = [
|
|
|
77695
77878
|
doc: {
|
|
77696
77879
|
signature: "truncate(value, length = 255, suffix = '\u2026')",
|
|
77697
77880
|
description: "Cuts a string to `length` characters and appends the suffix when cut.",
|
|
77698
|
-
|
|
77881
|
+
examples: {
|
|
77882
|
+
jinja2: "{{ description | truncate(40) }}",
|
|
77883
|
+
liquid: "{{ description | truncate: 40 }}",
|
|
77884
|
+
handlebars: "{{truncate description 40}}"
|
|
77885
|
+
},
|
|
77699
77886
|
category: "text"
|
|
77700
77887
|
},
|
|
77701
77888
|
fn: (_ctx, value, length, suffix) => {
|
|
77702
77889
|
const s = str(value);
|
|
77703
|
-
const
|
|
77890
|
+
const max = opt(Number(length), 255);
|
|
77704
77891
|
const end = opt(suffix, "\u2026");
|
|
77705
|
-
return s.length <=
|
|
77892
|
+
return s.length <= max ? s : s.slice(0, Math.max(0, max - end.length)) + end;
|
|
77706
77893
|
}
|
|
77707
77894
|
},
|
|
77708
77895
|
{
|
|
@@ -77710,7 +77897,11 @@ var formatHelpers = [
|
|
|
77710
77897
|
doc: {
|
|
77711
77898
|
signature: "replace(value, search, replacement)",
|
|
77712
77899
|
description: "Replaces every occurrence of `search`.",
|
|
77713
|
-
|
|
77900
|
+
examples: {
|
|
77901
|
+
jinja2: "{{ iban | replace(' ', '') }}",
|
|
77902
|
+
liquid: "{{ iban | replace: ' ', '' }}",
|
|
77903
|
+
handlebars: "{{replace iban ' ' ''}}"
|
|
77904
|
+
},
|
|
77714
77905
|
category: "text"
|
|
77715
77906
|
},
|
|
77716
77907
|
fn: (_ctx, value, search, replacement) => str(value).split(str(search)).join(str(replacement))
|
|
@@ -77720,7 +77911,11 @@ var formatHelpers = [
|
|
|
77720
77911
|
doc: {
|
|
77721
77912
|
signature: "split(value, separator = ',')",
|
|
77722
77913
|
description: "Splits a string into a list.",
|
|
77723
|
-
|
|
77914
|
+
examples: {
|
|
77915
|
+
jinja2: "{% for tag in keywords | split(',') %}{{ tag }}{% endfor %}",
|
|
77916
|
+
liquid: "{% assign tags = keywords | split: ',' %}{% for tag in tags %}{{ tag }}{% endfor %}",
|
|
77917
|
+
handlebars: "{{#each (split keywords ',')}}{{this}}{{/each}}"
|
|
77918
|
+
},
|
|
77724
77919
|
category: "text"
|
|
77725
77920
|
},
|
|
77726
77921
|
fn: (_ctx, value, separator) => str(value).split(str(opt(separator, ",")))
|
|
@@ -77730,7 +77925,11 @@ var formatHelpers = [
|
|
|
77730
77925
|
doc: {
|
|
77731
77926
|
signature: "join(list, separator = ', ')",
|
|
77732
77927
|
description: "Joins a list into a string.",
|
|
77733
|
-
|
|
77928
|
+
examples: {
|
|
77929
|
+
jinja2: "{{ tags | join(' \xB7 ') }}",
|
|
77930
|
+
liquid: "{{ tags | join: ' \xB7 ' }}",
|
|
77931
|
+
handlebars: "{{join tags ' \xB7 '}}"
|
|
77932
|
+
},
|
|
77734
77933
|
category: "collection"
|
|
77735
77934
|
},
|
|
77736
77935
|
fn: (_ctx, value, separator) => Array.isArray(value) ? value.map(str).join(str(opt(separator, ", "))) : str(value)
|
|
@@ -77741,7 +77940,11 @@ var formatHelpers = [
|
|
|
77741
77940
|
doc: {
|
|
77742
77941
|
signature: "default(value, fallback)",
|
|
77743
77942
|
description: "Returns the fallback when the value is empty, null or undefined.",
|
|
77744
|
-
|
|
77943
|
+
examples: {
|
|
77944
|
+
jinja2: "{{ customer.vat | default('\u2014') }}",
|
|
77945
|
+
liquid: "{{ customer.vat | default: '\u2014' }}",
|
|
77946
|
+
handlebars: "{{default customer.vat '\u2014'}}"
|
|
77947
|
+
},
|
|
77745
77948
|
category: "text"
|
|
77746
77949
|
},
|
|
77747
77950
|
fn: (_ctx, value, fallback) => value === void 0 || value === null || value === "" ? fallback : value
|
|
@@ -77752,7 +77955,11 @@ var formatHelpers = [
|
|
|
77752
77955
|
doc: {
|
|
77753
77956
|
signature: "nl2br(value)",
|
|
77754
77957
|
description: "Escapes the text and turns line breaks into <br>.",
|
|
77755
|
-
|
|
77958
|
+
examples: {
|
|
77959
|
+
jinja2: "{{ address | nl2br }}",
|
|
77960
|
+
liquid: "{{ address | nl2br }}",
|
|
77961
|
+
handlebars: "{{nl2br address}}"
|
|
77962
|
+
},
|
|
77756
77963
|
category: "text"
|
|
77757
77964
|
},
|
|
77758
77965
|
// office templates turn line breaks into breaks themselves, and escape the text once
|
|
@@ -77764,7 +77971,11 @@ var formatHelpers = [
|
|
|
77764
77971
|
doc: {
|
|
77765
77972
|
signature: "markdown(value)",
|
|
77766
77973
|
description: "Renders Markdown to HTML (no sanitiser: template data is trusted by the author).",
|
|
77767
|
-
|
|
77974
|
+
examples: {
|
|
77975
|
+
jinja2: "{{ notes | markdown }}",
|
|
77976
|
+
liquid: "{{ notes | markdown }}",
|
|
77977
|
+
handlebars: "{{markdown notes}}"
|
|
77978
|
+
},
|
|
77768
77979
|
category: "text"
|
|
77769
77980
|
},
|
|
77770
77981
|
fn: (ctx, value) => {
|
|
@@ -77783,7 +77994,11 @@ var formatHelpers = [
|
|
|
77783
77994
|
doc: {
|
|
77784
77995
|
signature: "safe(value)",
|
|
77785
77996
|
description: "Marks a string as HTML so the engine does not escape it.",
|
|
77786
|
-
|
|
77997
|
+
examples: {
|
|
77998
|
+
jinja2: "{{ html_snippet | safe }}",
|
|
77999
|
+
liquid: "{{ html_snippet | safe }}",
|
|
78000
|
+
handlebars: "{{safe html_snippet}}"
|
|
78001
|
+
},
|
|
77787
78002
|
category: "text"
|
|
77788
78003
|
},
|
|
77789
78004
|
fn: (_ctx, value) => str(value)
|
|
@@ -77794,7 +78009,11 @@ var formatHelpers = [
|
|
|
77794
78009
|
doc: {
|
|
77795
78010
|
signature: "json(value, indent = 2)",
|
|
77796
78011
|
description: "Serialises a value as JSON; handy while building a template.",
|
|
77797
|
-
|
|
78012
|
+
examples: {
|
|
78013
|
+
jinja2: "<pre>{{ invoice | json }}</pre>",
|
|
78014
|
+
liquid: "<pre>{{ invoice | json }}</pre>",
|
|
78015
|
+
handlebars: "<pre>{{json invoice}}</pre>"
|
|
78016
|
+
},
|
|
77798
78017
|
category: "debug"
|
|
77799
78018
|
},
|
|
77800
78019
|
fn: (_ctx, value, indent) => JSON.stringify(value, null, opt(Number(indent), 2))
|
|
@@ -77805,10 +78024,15 @@ var formatHelpers = [
|
|
|
77805
78024
|
doc: {
|
|
77806
78025
|
signature: "numToWords(value, locale?)",
|
|
77807
78026
|
description: "Spells a number out in words (de, en, fr, es, it, nl).",
|
|
77808
|
-
|
|
78027
|
+
examples: {
|
|
78028
|
+
jinja2: "{{ total | numToWords('de') }} \u2192 zweihundertdreiundvierzig",
|
|
78029
|
+
liquid: "{{ total | numToWords: 'de' }} \u2192 zweihundertdreiundvierzig",
|
|
78030
|
+
handlebars: "{{numToWords total 'de'}} \u2192 zweihundertdreiundvierzig"
|
|
78031
|
+
},
|
|
77809
78032
|
category: "format"
|
|
77810
78033
|
},
|
|
77811
78034
|
fn: (ctx, value, locale) => {
|
|
78035
|
+
requireFinite("numToWords", value);
|
|
77812
78036
|
const n = toNumber(value);
|
|
77813
78037
|
if (Number.isNaN(n)) return str(value);
|
|
77814
78038
|
const lang = str(opt(locale, ctx.locale)).split("-")[0] ?? "en";
|
|
@@ -77821,7 +78045,11 @@ var formatHelpers = [
|
|
|
77821
78045
|
doc: {
|
|
77822
78046
|
signature: "t(key, params?)",
|
|
77823
78047
|
description: "Looks a key up in the template's i18n dictionary for the request locale; `{name}` placeholders come from params.",
|
|
77824
|
-
|
|
78048
|
+
examples: {
|
|
78049
|
+
jinja2: "{{ t('invoice.title', { number: invoice.number }) }}",
|
|
78050
|
+
liquid: "{{ 'invoice.title' | t: number: invoice.number }}",
|
|
78051
|
+
handlebars: "{{t 'invoice.title' number=invoice.number}}"
|
|
78052
|
+
},
|
|
77825
78053
|
category: "text"
|
|
77826
78054
|
},
|
|
77827
78055
|
fn: (ctx, key, params) => {
|
|
@@ -77837,7 +78065,11 @@ var formatHelpers = [
|
|
|
77837
78065
|
doc: {
|
|
77838
78066
|
signature: "asset(name)",
|
|
77839
78067
|
description: "URL of a file in the workspace library (logo, background) on the CDN. Upload it on the Files page or with `POST /files` and use the name it has there; relative image paths resolve against the same library.",
|
|
77840
|
-
|
|
78068
|
+
examples: {
|
|
78069
|
+
jinja2: `<img src="{{ asset('logo.png') }}">`,
|
|
78070
|
+
liquid: `<img src="{{ 'logo.png' | asset }}">`,
|
|
78071
|
+
handlebars: `<img src="{{asset 'logo.png'}}">`
|
|
78072
|
+
},
|
|
77841
78073
|
category: "document"
|
|
77842
78074
|
},
|
|
77843
78075
|
fn: (ctx, name) => `${(ctx.assetBaseUrl ?? "").replace(/\/$/, "")}/${str(name).replace(/^\//, "")}`
|
|
@@ -77849,128 +78081,17 @@ var formatHelpers = [
|
|
|
77849
78081
|
doc: {
|
|
77850
78082
|
signature: "pageBreak()",
|
|
77851
78083
|
description: "Starts a new page in PDF output.",
|
|
77852
|
-
|
|
78084
|
+
examples: {
|
|
78085
|
+
jinja2: "{{ pageBreak() }}",
|
|
78086
|
+
liquid: "{{ '' | pageBreak }}",
|
|
78087
|
+
handlebars: "{{pageBreak}}"
|
|
78088
|
+
},
|
|
77853
78089
|
category: "document"
|
|
77854
78090
|
},
|
|
77855
78091
|
fn: (ctx) => ctx.drawing ? ctx.drawing({ kind: "page-break" }) : '<div class="page-break" style="break-after:page"></div>'
|
|
77856
78092
|
}
|
|
77857
78093
|
];
|
|
77858
78094
|
|
|
77859
|
-
// packages/engine/src/lib/helpers/codes.ts
|
|
77860
|
-
var svgDataUri = (svg) => `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;
|
|
77861
|
-
var barcodeTypes = {
|
|
77862
|
-
code128: "code128",
|
|
77863
|
-
ean13: "ean13",
|
|
77864
|
-
ean8: "ean8",
|
|
77865
|
-
upc: "upca",
|
|
77866
|
-
upca: "upca",
|
|
77867
|
-
itf14: "itf14",
|
|
77868
|
-
code39: "code39",
|
|
77869
|
-
qrcode: "qrcode",
|
|
77870
|
-
datamatrix: "datamatrix",
|
|
77871
|
-
pdf417: "pdf417"
|
|
77872
|
-
};
|
|
77873
|
-
function qrSvg(value, options = {}) {
|
|
77874
|
-
const qr = (0, import_qrcode.create)(value, { errorCorrectionLevel: options.ecc ?? "M" });
|
|
77875
|
-
const svg = (0, import_svg_tag.render)(qr, {
|
|
77876
|
-
width: options.size ?? 160,
|
|
77877
|
-
margin: options.margin ?? 1,
|
|
77878
|
-
color: {
|
|
77879
|
-
dark: (options.color ?? "#000000").replace(/^(#?)/, "#").slice(0, 9),
|
|
77880
|
-
light: (options.background ?? "#ffffff").replace(/^(#?)/, "#")
|
|
77881
|
-
}
|
|
77882
|
-
});
|
|
77883
|
-
return svg;
|
|
77884
|
-
}
|
|
77885
|
-
function epcPayload(input) {
|
|
77886
|
-
const amount = input.amount === void 0 || input.amount === "" ? "" : `EUR${toNumber(input.amount).toFixed(2)}`;
|
|
77887
|
-
return [
|
|
77888
|
-
"BCD",
|
|
77889
|
-
"002",
|
|
77890
|
-
"1",
|
|
77891
|
-
"SCT",
|
|
77892
|
-
(input.bic ?? "").replace(/\s/g, ""),
|
|
77893
|
-
String(input.name ?? "").slice(0, 70),
|
|
77894
|
-
String(input.iban ?? "").replace(/\s/g, ""),
|
|
77895
|
-
amount,
|
|
77896
|
-
(input.purpose ?? "").slice(0, 4),
|
|
77897
|
-
(input.reference ?? "").slice(0, 35),
|
|
77898
|
-
input.reference ? "" : (input.text ?? "").slice(0, 140),
|
|
77899
|
-
""
|
|
77900
|
-
].join("\n");
|
|
77901
|
-
}
|
|
77902
|
-
var codeHelpers = [
|
|
77903
|
-
{
|
|
77904
|
-
name: "qrcode",
|
|
77905
|
-
aliases: ["qr"],
|
|
77906
|
-
doc: {
|
|
77907
|
-
signature: "qrcode(value, { size = 160, ecc = 'M', margin = 1, color, background })",
|
|
77908
|
-
description: "QR code as an SVG data URI for an <img> src.",
|
|
77909
|
-
example: '<img src="{{ qrcode(order.url, { size: 120 }) }}">',
|
|
77910
|
-
category: "code"
|
|
77911
|
-
},
|
|
77912
|
-
fn: (ctx, value, options) => {
|
|
77913
|
-
const o = options ?? {};
|
|
77914
|
-
const svg = qrSvg(String(value ?? ""), o);
|
|
77915
|
-
if (ctx.drawing) return ctx.drawing({ kind: "svg", svg, width: o.size, height: o.size, alt: "QR code" });
|
|
77916
|
-
return svgDataUri(svg);
|
|
77917
|
-
}
|
|
77918
|
-
},
|
|
77919
|
-
{
|
|
77920
|
-
name: "barcode",
|
|
77921
|
-
doc: {
|
|
77922
|
-
signature: "barcode(value, { type = 'code128', height = 12, width, text = true, scale = 2 })",
|
|
77923
|
-
description: "Barcode (code128, ean13, ean8, upc, itf14, code39, datamatrix, pdf417) as an SVG data URI.",
|
|
77924
|
-
example: `<img src="{{ barcode(item.sku, { type: 'code128' }) }}">`,
|
|
77925
|
-
category: "code"
|
|
77926
|
-
},
|
|
77927
|
-
fn: (ctx, value, options) => {
|
|
77928
|
-
const o = options ?? {};
|
|
77929
|
-
const bcid = barcodeTypes[String(o.type ?? "code128").toLowerCase()] ?? "code128";
|
|
77930
|
-
const svg = ToSVG({
|
|
77931
|
-
bcid,
|
|
77932
|
-
text: String(value ?? ""),
|
|
77933
|
-
height: o.height ?? 12,
|
|
77934
|
-
...o.width === void 0 ? {} : { width: o.width },
|
|
77935
|
-
scale: o.scale ?? 2,
|
|
77936
|
-
includetext: o.text !== false,
|
|
77937
|
-
textxalign: "center"
|
|
77938
|
-
});
|
|
77939
|
-
if (ctx.drawing) return ctx.drawing({ kind: "svg", svg, alt: `Barcode ${String(value ?? "")}` });
|
|
77940
|
-
return svgDataUri(svg);
|
|
77941
|
-
}
|
|
77942
|
-
},
|
|
77943
|
-
{
|
|
77944
|
-
name: "epcQr",
|
|
77945
|
-
aliases: ["epc_qr", "girocode"],
|
|
77946
|
-
doc: {
|
|
77947
|
-
signature: "epcQr({ name, iban, bic?, amount?, reference?, text? }, { size })",
|
|
77948
|
-
description: "SEPA credit transfer QR code (EPC069-12 / GiroCode) that banking apps scan to prefill a payment.",
|
|
77949
|
-
example: '<img src="{{ epcQr({ name: company.name, iban: company.iban, amount: invoice.total, reference: invoice.number }) }}">',
|
|
77950
|
-
category: "code"
|
|
77951
|
-
},
|
|
77952
|
-
// Payment fields and QR options may arrive together: Jinja2 passes two objects, Handlebars one
|
|
77953
|
-
// hash (`{{epcQr name=… iban=… size=200}}`), and Liquid, which cannot build an object literal,
|
|
77954
|
-
// keyword arguments (`{{ company.iban | epcQr: name: company.name, amount: invoice.total }}`,
|
|
77955
|
-
// where a string input is the IBAN). They are merged and split by field name.
|
|
77956
|
-
fn: (ctx, input, options) => {
|
|
77957
|
-
const fields = {
|
|
77958
|
-
...input && typeof input === "object" ? input : typeof input === "string" && input ? { iban: input } : {},
|
|
77959
|
-
...options ?? {}
|
|
77960
|
-
};
|
|
77961
|
-
const payment = {};
|
|
77962
|
-
const qr = {};
|
|
77963
|
-
for (const [key, value] of Object.entries(fields))
|
|
77964
|
-
(EPC_FIELDS.has(key) ? payment : qr)[key] = value;
|
|
77965
|
-
const o = { ecc: "M", ...qr };
|
|
77966
|
-
const svg = qrSvg(epcPayload(payment), o);
|
|
77967
|
-
if (ctx.drawing) return ctx.drawing({ kind: "svg", svg, width: o.size, height: o.size, alt: "GiroCode" });
|
|
77968
|
-
return svgDataUri(svg);
|
|
77969
|
-
}
|
|
77970
|
-
}
|
|
77971
|
-
];
|
|
77972
|
-
var EPC_FIELDS = /* @__PURE__ */ new Set(["name", "iban", "bic", "amount", "reference", "text", "purpose"]);
|
|
77973
|
-
|
|
77974
78095
|
// packages/engine/src/lib/helpers/collections.ts
|
|
77975
78096
|
var list = (v2) => Array.isArray(v2) ? v2 : v2 === void 0 || v2 === null ? [] : [v2];
|
|
77976
78097
|
var get = (item, path) => String(path ?? "").split(".").filter(Boolean).reduce(
|
|
@@ -77984,7 +78105,11 @@ var collectionHelpers = [
|
|
|
77984
78105
|
doc: {
|
|
77985
78106
|
signature: "sum(list, path?)",
|
|
77986
78107
|
description: "Sum of the items, or of `path` inside each item.",
|
|
77987
|
-
|
|
78108
|
+
examples: {
|
|
78109
|
+
jinja2: "{{ invoice.lines | sum('total') | money }}",
|
|
78110
|
+
liquid: "{{ invoice.lines | sum: 'total' | money }}",
|
|
78111
|
+
handlebars: "{{money (sum invoice.lines 'total')}}"
|
|
78112
|
+
},
|
|
77988
78113
|
category: "collection"
|
|
77989
78114
|
},
|
|
77990
78115
|
fn: (_ctx, value, path) => numbers(value, path).reduce((a, b2) => a + b2, 0)
|
|
@@ -77994,7 +78119,11 @@ var collectionHelpers = [
|
|
|
77994
78119
|
doc: {
|
|
77995
78120
|
signature: "avg(list, path?)",
|
|
77996
78121
|
description: "Average of the items or of `path` inside each item.",
|
|
77997
|
-
|
|
78122
|
+
examples: {
|
|
78123
|
+
jinja2: "{{ scores | avg | number(1) }}",
|
|
78124
|
+
liquid: "{{ scores | avg | number: 1 }}",
|
|
78125
|
+
handlebars: "{{number (avg scores) 1}}"
|
|
78126
|
+
},
|
|
77998
78127
|
category: "collection"
|
|
77999
78128
|
},
|
|
78000
78129
|
fn: (_ctx, value, path) => {
|
|
@@ -78007,7 +78136,11 @@ var collectionHelpers = [
|
|
|
78007
78136
|
doc: {
|
|
78008
78137
|
signature: "min(list, path?)",
|
|
78009
78138
|
description: "Smallest number.",
|
|
78010
|
-
|
|
78139
|
+
examples: {
|
|
78140
|
+
jinja2: "{{ prices | min }}",
|
|
78141
|
+
liquid: "{{ prices | min }}",
|
|
78142
|
+
handlebars: "{{min prices}}"
|
|
78143
|
+
},
|
|
78011
78144
|
category: "collection"
|
|
78012
78145
|
},
|
|
78013
78146
|
fn: (_ctx, value, path) => Math.min(...numbers(value, path))
|
|
@@ -78017,7 +78150,11 @@ var collectionHelpers = [
|
|
|
78017
78150
|
doc: {
|
|
78018
78151
|
signature: "max(list, path?)",
|
|
78019
78152
|
description: "Largest number.",
|
|
78020
|
-
|
|
78153
|
+
examples: {
|
|
78154
|
+
jinja2: "{{ prices | max }}",
|
|
78155
|
+
liquid: "{{ prices | max }}",
|
|
78156
|
+
handlebars: "{{max prices}}"
|
|
78157
|
+
},
|
|
78021
78158
|
category: "collection"
|
|
78022
78159
|
},
|
|
78023
78160
|
fn: (_ctx, value, path) => Math.max(...numbers(value, path))
|
|
@@ -78028,7 +78165,11 @@ var collectionHelpers = [
|
|
|
78028
78165
|
doc: {
|
|
78029
78166
|
signature: "groupBy(list, path)",
|
|
78030
78167
|
description: "Groups items by a field; returns a list of `{ key, items }`.",
|
|
78031
|
-
|
|
78168
|
+
examples: {
|
|
78169
|
+
jinja2: "{% for group in lines | groupBy('category') %}{{ group.key }}{% endfor %}",
|
|
78170
|
+
liquid: "{% assign groups = lines | groupBy: 'category' %}{% for group in groups %}{{ group.key }}{% endfor %}",
|
|
78171
|
+
handlebars: "{{#each (groupBy lines 'category')}}{{key}}{{/each}}"
|
|
78172
|
+
},
|
|
78032
78173
|
category: "collection"
|
|
78033
78174
|
},
|
|
78034
78175
|
fn: (_ctx, value, path) => {
|
|
@@ -78046,7 +78187,11 @@ var collectionHelpers = [
|
|
|
78046
78187
|
doc: {
|
|
78047
78188
|
signature: "sortBy(list, path?, direction = 'asc')",
|
|
78048
78189
|
description: "Sorts items by a field (numbers numerically, strings by locale).",
|
|
78049
|
-
|
|
78190
|
+
examples: {
|
|
78191
|
+
jinja2: "{% for l in lines | sortBy('position') %}{{ l.sku }}{% endfor %}",
|
|
78192
|
+
liquid: "{% assign sorted = lines | sortBy: 'position' %}{% for l in sorted %}{{ l.sku }}{% endfor %}",
|
|
78193
|
+
handlebars: "{{#each (sortBy lines 'position')}}{{sku}}{{/each}}"
|
|
78194
|
+
},
|
|
78050
78195
|
category: "collection"
|
|
78051
78196
|
},
|
|
78052
78197
|
fn: (ctx, value, path, direction) => {
|
|
@@ -78067,7 +78212,11 @@ var collectionHelpers = [
|
|
|
78067
78212
|
doc: {
|
|
78068
78213
|
signature: "where(list, path, value?)",
|
|
78069
78214
|
description: "Keeps items whose field equals `value` (or is truthy when omitted).",
|
|
78070
|
-
|
|
78215
|
+
examples: {
|
|
78216
|
+
jinja2: "{% for l in lines | where('taxable', true) %}{{ l.sku }}{% endfor %}",
|
|
78217
|
+
liquid: "{% assign taxable = lines | where: 'taxable', true %}{% for l in taxable %}{{ l.sku }}{% endfor %}",
|
|
78218
|
+
handlebars: "{{#each (where lines 'taxable' true)}}{{sku}}{{/each}}"
|
|
78219
|
+
},
|
|
78071
78220
|
category: "collection"
|
|
78072
78221
|
},
|
|
78073
78222
|
fn: (_ctx, value, path, expected) => list(value).filter((item) => {
|
|
@@ -78081,7 +78230,11 @@ var collectionHelpers = [
|
|
|
78081
78230
|
doc: {
|
|
78082
78231
|
signature: "pluck(list, path)",
|
|
78083
78232
|
description: "Extracts one field from every item.",
|
|
78084
|
-
|
|
78233
|
+
examples: {
|
|
78234
|
+
jinja2: "{{ lines | pluck('sku') | join(', ') }}",
|
|
78235
|
+
liquid: "{{ lines | pluck: 'sku' | join: ', ' }}",
|
|
78236
|
+
handlebars: "{{join (pluck lines 'sku') ', '}}"
|
|
78237
|
+
},
|
|
78085
78238
|
category: "collection"
|
|
78086
78239
|
},
|
|
78087
78240
|
fn: (_ctx, value, path) => list(value).map((item) => get(item, path))
|
|
@@ -78092,7 +78245,11 @@ var collectionHelpers = [
|
|
|
78092
78245
|
doc: {
|
|
78093
78246
|
signature: "chunk(list, size)",
|
|
78094
78247
|
description: "Splits a list into lists of `size` items (rows of labels, columns).",
|
|
78095
|
-
|
|
78248
|
+
examples: {
|
|
78249
|
+
jinja2: "{% for row in labels | chunk(3) %}{{ row | join(', ') }}{% endfor %}",
|
|
78250
|
+
liquid: "{% assign rows = labels | chunk: 3 %}{% for row in rows %}{{ row | join: ', ' }}{% endfor %}",
|
|
78251
|
+
handlebars: "{{#each (chunk labels 3)}}{{join this ', '}}{{/each}}"
|
|
78252
|
+
},
|
|
78096
78253
|
category: "collection"
|
|
78097
78254
|
},
|
|
78098
78255
|
fn: (_ctx, value, size) => {
|
|
@@ -78108,7 +78265,11 @@ var collectionHelpers = [
|
|
|
78108
78265
|
doc: {
|
|
78109
78266
|
signature: "range(start, end?, step = 1)",
|
|
78110
78267
|
description: "List of numbers from start to end (exclusive).",
|
|
78111
|
-
|
|
78268
|
+
examples: {
|
|
78269
|
+
jinja2: "{% for i in range(1, 4) %}{{ i }}{% endfor %}",
|
|
78270
|
+
liquid: "{% assign nums = 1 | range: 4 %}{% for i in nums %}{{ i }}{% endfor %}",
|
|
78271
|
+
handlebars: "{{#each (range 1 4)}}{{this}}{{/each}}"
|
|
78272
|
+
},
|
|
78112
78273
|
category: "collection"
|
|
78113
78274
|
},
|
|
78114
78275
|
fn: (_ctx, start, end, step) => {
|
|
@@ -78126,7 +78287,11 @@ var collectionHelpers = [
|
|
|
78126
78287
|
doc: {
|
|
78127
78288
|
signature: "first(list)",
|
|
78128
78289
|
description: "First item.",
|
|
78129
|
-
|
|
78290
|
+
examples: {
|
|
78291
|
+
jinja2: "{{ tags | first }}",
|
|
78292
|
+
liquid: "{{ tags | first }}",
|
|
78293
|
+
handlebars: "{{first tags}}"
|
|
78294
|
+
},
|
|
78130
78295
|
category: "collection"
|
|
78131
78296
|
},
|
|
78132
78297
|
fn: (_ctx, value) => list(value)[0]
|
|
@@ -78136,7 +78301,11 @@ var collectionHelpers = [
|
|
|
78136
78301
|
doc: {
|
|
78137
78302
|
signature: "last(list)",
|
|
78138
78303
|
description: "Last item.",
|
|
78139
|
-
|
|
78304
|
+
examples: {
|
|
78305
|
+
jinja2: "{{ tags | last }}",
|
|
78306
|
+
liquid: "{{ tags | last }}",
|
|
78307
|
+
handlebars: "{{last tags}}"
|
|
78308
|
+
},
|
|
78140
78309
|
category: "collection"
|
|
78141
78310
|
},
|
|
78142
78311
|
fn: (_ctx, value) => list(value).at(-1)
|
|
@@ -78147,7 +78316,11 @@ var collectionHelpers = [
|
|
|
78147
78316
|
doc: {
|
|
78148
78317
|
signature: "length(value)",
|
|
78149
78318
|
description: "Number of items in a list, keys in an object or characters in a string.",
|
|
78150
|
-
|
|
78319
|
+
examples: {
|
|
78320
|
+
jinja2: "{{ lines | length }}",
|
|
78321
|
+
liquid: "{{ lines | length }}",
|
|
78322
|
+
handlebars: "{{length lines}}"
|
|
78323
|
+
},
|
|
78151
78324
|
category: "collection"
|
|
78152
78325
|
},
|
|
78153
78326
|
fn: (_ctx, value) => Array.isArray(value) || typeof value === "string" ? value.length : value && typeof value === "object" ? Object.keys(value).length : 0
|
|
@@ -78223,7 +78396,11 @@ var documentHelpers = [
|
|
|
78223
78396
|
doc: {
|
|
78224
78397
|
signature: "chart({ type, labels, values, label, color } | { type, labels, series } | { type, data, options }, { width, height })",
|
|
78225
78398
|
description: "Draws a Chart.js chart (bar, line, pie, doughnut, radar, \u2026) from plain data, `labels` with `values` or several `series` of `{ label, values, color }`, or from a full Chart.js `data` and `options`; animations are disabled so PDF and preview match.",
|
|
78226
|
-
|
|
78399
|
+
examples: {
|
|
78400
|
+
jinja2: "{{ chart({ type: 'line', labels: sales.labels, values: sales.quarters, width: 480 }) }}",
|
|
78401
|
+
liquid: "{{ '' | chart: type: 'line', labels: sales.labels, values: sales.quarters, width: 480 }}",
|
|
78402
|
+
handlebars: "{{chart type='line' labels=sales.labels values=sales.quarters width=480}}"
|
|
78403
|
+
},
|
|
78227
78404
|
category: "document"
|
|
78228
78405
|
},
|
|
78229
78406
|
fn: (ctx, spec, extra) => {
|
|
@@ -78237,7 +78414,11 @@ var documentHelpers = [
|
|
|
78237
78414
|
doc: {
|
|
78238
78415
|
signature: "image(url, { width, height, fit, alt })",
|
|
78239
78416
|
description: "Places an image with fixed size and crop mode (`cover`, `contain`, `fill`); the render-worker fetches it through its cache and blocks private hosts.",
|
|
78240
|
-
|
|
78417
|
+
examples: {
|
|
78418
|
+
jinja2: "{{ image(product.photo, { width: 120, height: 80, fit: 'cover' }) }}",
|
|
78419
|
+
liquid: "{{ product.photo | image: width: 120, height: 80, fit: 'cover' }}",
|
|
78420
|
+
handlebars: "{{image product.photo width=120 height=80 fit='cover'}}"
|
|
78421
|
+
},
|
|
78241
78422
|
category: "document"
|
|
78242
78423
|
},
|
|
78243
78424
|
fn: (ctx, url, options) => {
|
|
@@ -78263,7 +78444,12 @@ var comparison = (name, test, description) => ({
|
|
|
78263
78444
|
doc: {
|
|
78264
78445
|
signature: `${name}(a, b)`,
|
|
78265
78446
|
description,
|
|
78266
|
-
|
|
78447
|
+
examples: {
|
|
78448
|
+
jinja2: `{% if ${name}(invoice.total, 1000) %}\u2026{% endif %}`,
|
|
78449
|
+
// Liquid takes no filter in a condition, so the comparison is assigned first
|
|
78450
|
+
liquid: `{% assign hit = invoice.total | ${name}: 1000 %}{% if hit %}\u2026{% endif %}`,
|
|
78451
|
+
handlebars: `{{#if (${name} invoice.total 1000)}}\u2026{{/if}}`
|
|
78452
|
+
},
|
|
78267
78453
|
category: "logic"
|
|
78268
78454
|
},
|
|
78269
78455
|
fn: (_ctx, a, b2) => test(a, b2)
|
|
@@ -78280,7 +78466,12 @@ var logicHelpers = [
|
|
|
78280
78466
|
doc: {
|
|
78281
78467
|
signature: "and(a, b, \u2026)",
|
|
78282
78468
|
description: "True when every value is true; an empty list counts as false.",
|
|
78283
|
-
|
|
78469
|
+
examples: {
|
|
78470
|
+
jinja2: "{% if and(customer.vatId, eq(country, 'DE')) %}\u2026{% endif %}",
|
|
78471
|
+
// nesting one comparison in another needs its own assignment in Liquid
|
|
78472
|
+
liquid: "{% assign german = country | eq: 'DE' %}{% assign both = customer.vatId | and: german %}{% if both %}\u2026{% endif %}",
|
|
78473
|
+
handlebars: "{{#if (and customer.vatId (eq country 'DE'))}}\u2026{{/if}}"
|
|
78474
|
+
},
|
|
78284
78475
|
category: "logic"
|
|
78285
78476
|
},
|
|
78286
78477
|
fn: (_ctx, ...values) => values.length > 0 && values.every(truthy)
|
|
@@ -78290,7 +78481,11 @@ var logicHelpers = [
|
|
|
78290
78481
|
doc: {
|
|
78291
78482
|
signature: "or(a, b, \u2026)",
|
|
78292
78483
|
description: "True when any value is true.",
|
|
78293
|
-
|
|
78484
|
+
examples: {
|
|
78485
|
+
jinja2: "{% if or(invoice.paid, invoice.credited) %}\u2026{% endif %}",
|
|
78486
|
+
liquid: "{% assign any = invoice.paid | or: invoice.credited %}{% if any %}\u2026{% endif %}",
|
|
78487
|
+
handlebars: "{{#if (or invoice.paid invoice.credited)}}\u2026{{/if}}"
|
|
78488
|
+
},
|
|
78294
78489
|
category: "logic"
|
|
78295
78490
|
},
|
|
78296
78491
|
fn: (_ctx, ...values) => values.some(truthy)
|
|
@@ -78300,7 +78495,11 @@ var logicHelpers = [
|
|
|
78300
78495
|
doc: {
|
|
78301
78496
|
signature: "not(value)",
|
|
78302
78497
|
description: "The opposite truth value.",
|
|
78303
|
-
|
|
78498
|
+
examples: {
|
|
78499
|
+
jinja2: "{% if invoice.paid | not %}\u2026{% endif %}",
|
|
78500
|
+
liquid: "{% assign unpaid = invoice.paid | not %}{% if unpaid %}\u2026{% endif %}",
|
|
78501
|
+
handlebars: "{{#if (not invoice.paid)}}\u2026{{/if}}"
|
|
78502
|
+
},
|
|
78304
78503
|
category: "logic"
|
|
78305
78504
|
},
|
|
78306
78505
|
fn: (_ctx, value) => !truthy(value)
|
|
@@ -78488,6 +78687,7 @@ function scanBlocks(source, spec) {
|
|
|
78488
78687
|
severity: "error",
|
|
78489
78688
|
code: "unexpected-end-tag",
|
|
78490
78689
|
message: `Unexpected {% ${keyword} %} without an open block`,
|
|
78690
|
+
args: { keyword },
|
|
78491
78691
|
range
|
|
78492
78692
|
});
|
|
78493
78693
|
} else if (top.keyword !== expected) {
|
|
@@ -78495,6 +78695,7 @@ function scanBlocks(source, spec) {
|
|
|
78495
78695
|
severity: "error",
|
|
78496
78696
|
code: "mismatched-end-tag",
|
|
78497
78697
|
message: `Expected {% end${top.keyword} %} to close the {% ${top.keyword} %} at line ${top.block.open.start.line}, found {% ${keyword} %}`,
|
|
78698
|
+
args: { open: top.keyword, line: top.block.open.start.line, found: keyword },
|
|
78498
78699
|
range
|
|
78499
78700
|
});
|
|
78500
78701
|
const idx = stack.map((s) => s.keyword).lastIndexOf(expected);
|
|
@@ -78511,6 +78712,7 @@ function scanBlocks(source, spec) {
|
|
|
78511
78712
|
severity: "error",
|
|
78512
78713
|
code: "unexpected-tag",
|
|
78513
78714
|
message: `{% ${keyword} %} outside of a block`,
|
|
78715
|
+
args: { keyword },
|
|
78514
78716
|
range
|
|
78515
78717
|
});
|
|
78516
78718
|
}
|
|
@@ -78520,6 +78722,7 @@ function scanBlocks(source, spec) {
|
|
|
78520
78722
|
severity: "error",
|
|
78521
78723
|
code: "unclosed-block",
|
|
78522
78724
|
message: `{% ${open.keyword} %} is never closed; add {% end${open.keyword} %}`,
|
|
78725
|
+
args: { keyword: open.keyword },
|
|
78523
78726
|
range: open.block.open
|
|
78524
78727
|
});
|
|
78525
78728
|
}
|
|
@@ -78574,6 +78777,7 @@ function missingPathDiagnostics(variables, sampleData, loopSources, builtinRoots
|
|
|
78574
78777
|
severity: "warning",
|
|
78575
78778
|
code: "unknown-variable",
|
|
78576
78779
|
message: `"${v2.path.join(".")}" is not present in the sample data`,
|
|
78780
|
+
args: { name: v2.path.join(".") },
|
|
78577
78781
|
range: v2.range
|
|
78578
78782
|
});
|
|
78579
78783
|
}
|
|
@@ -78633,11 +78837,11 @@ var validationContext = {
|
|
|
78633
78837
|
limits: { ms: 2e3, outputBytes: 20 * 1024 * 1024, includeDepth: 8 }
|
|
78634
78838
|
};
|
|
78635
78839
|
function toSyntaxError(e) {
|
|
78636
|
-
const
|
|
78637
|
-
const message2 = String(
|
|
78840
|
+
const err = e;
|
|
78841
|
+
const message2 = String(err.message ?? e);
|
|
78638
78842
|
const m2 = /Parse error on line (\d+)/.exec(message2);
|
|
78639
|
-
const line =
|
|
78640
|
-
const column = typeof
|
|
78843
|
+
const line = err.lineNumber ?? (m2 ? Number(m2[1]) : 1);
|
|
78844
|
+
const column = typeof err.column === "number" ? err.column + 1 : 1;
|
|
78641
78845
|
return new EngineSyntaxError(
|
|
78642
78846
|
"handlebars",
|
|
78643
78847
|
message2.split("\n")[0] ?? message2,
|
|
@@ -78808,12 +79012,12 @@ function analyzeHandlebars(source, opts = {}) {
|
|
|
78808
79012
|
try {
|
|
78809
79013
|
walk(import_handlebars.default.parse(source), w);
|
|
78810
79014
|
} catch (e) {
|
|
78811
|
-
const
|
|
79015
|
+
const err = toSyntaxError(e);
|
|
78812
79016
|
diagnostics.push({
|
|
78813
79017
|
severity: "error",
|
|
78814
79018
|
code: "syntax-error",
|
|
78815
|
-
message:
|
|
78816
|
-
range: rangeAt(
|
|
79019
|
+
message: err.message,
|
|
79020
|
+
range: rangeAt(err.line, err.column, 1)
|
|
78817
79021
|
});
|
|
78818
79022
|
}
|
|
78819
79023
|
const registry = helpers;
|
|
@@ -78824,6 +79028,7 @@ function analyzeHandlebars(source, opts = {}) {
|
|
|
78824
79028
|
severity: "warning",
|
|
78825
79029
|
code: "deprecated-filter",
|
|
78826
79030
|
message: `"${f2.name}" is a compatibility alias; use "${preferred}"`,
|
|
79031
|
+
args: { name: f2.name, preferred },
|
|
78827
79032
|
range: f2.range,
|
|
78828
79033
|
fix: { title: `Rename to ${preferred}`, replacement: preferred }
|
|
78829
79034
|
});
|
|
@@ -78839,6 +79044,7 @@ function analyzeHandlebars(source, opts = {}) {
|
|
|
78839
79044
|
severity: "error",
|
|
78840
79045
|
code: "unknown-filter",
|
|
78841
79046
|
message: `Unknown helper "${f2.name}"`,
|
|
79047
|
+
args: { name: f2.name, kind: "helper" },
|
|
78842
79048
|
range: f2.range
|
|
78843
79049
|
});
|
|
78844
79050
|
}
|
|
@@ -78916,12 +79122,12 @@ var HandlebarsCompiled = class {
|
|
|
78916
79122
|
return enforceLimits(out, started, ctx.limits);
|
|
78917
79123
|
} catch (e) {
|
|
78918
79124
|
if (e instanceof Error && e.name === "RenderLimitError") throw e;
|
|
78919
|
-
const
|
|
79125
|
+
const err = e;
|
|
78920
79126
|
throw new RenderError(
|
|
78921
79127
|
"handlebars",
|
|
78922
|
-
String(
|
|
78923
|
-
|
|
78924
|
-
|
|
79128
|
+
String(err.message ?? e),
|
|
79129
|
+
err.lineNumber,
|
|
79130
|
+
err.column === void 0 ? void 0 : err.column + 1
|
|
78925
79131
|
);
|
|
78926
79132
|
}
|
|
78927
79133
|
}
|
|
@@ -79176,7 +79382,7 @@ var stringMethods = {
|
|
|
79176
79382
|
}
|
|
79177
79383
|
return out;
|
|
79178
79384
|
},
|
|
79179
|
-
split: (s, sep,
|
|
79385
|
+
split: (s, sep, max) => sep === void 0 || sep === null ? s.trim().split(/\s+/) : s.split(String(sep), max === void 0 ? void 0 : Number(max) + 1),
|
|
79180
79386
|
join: (s, list2) => Array.isArray(list2) ? list2.join(s) : String(list2),
|
|
79181
79387
|
format: (s, ...args2) => {
|
|
79182
79388
|
const named = keywordArgs(args2);
|
|
@@ -79406,13 +79612,13 @@ var validationContext2 = {
|
|
|
79406
79612
|
i18n: {}
|
|
79407
79613
|
};
|
|
79408
79614
|
function toSyntaxError2(e, fallbackLine = 1) {
|
|
79409
|
-
const
|
|
79410
|
-
const message2 = String(
|
|
79615
|
+
const err = e;
|
|
79616
|
+
const message2 = String(err.message ?? e).replace(/^\(.*?\)\s*/, "").replace(/^\[Line \d+, Column \d+\]\s*/, "").trim();
|
|
79411
79617
|
const fromMessage = /\[Line (\d+), Column (\d+)\]/.exec(
|
|
79412
|
-
String(
|
|
79618
|
+
String(err.message ?? "")
|
|
79413
79619
|
);
|
|
79414
|
-
const line = typeof
|
|
79415
|
-
const column = typeof
|
|
79620
|
+
const line = typeof err.lineno === "number" ? err.lineno + 1 : fromMessage ? Number(fromMessage[1]) : fallbackLine;
|
|
79621
|
+
const column = typeof err.colno === "number" ? err.colno + 1 : fromMessage ? Number(fromMessage[2]) : 1;
|
|
79416
79622
|
return new EngineSyntaxError("jinja2", message2, line, column);
|
|
79417
79623
|
}
|
|
79418
79624
|
function nodeRange(node, length = 1) {
|
|
@@ -79615,13 +79821,13 @@ function analyzeJinja2(source, opts = {}) {
|
|
|
79615
79821
|
const root = import_nunjucks.default.parser.parse(source, [], {});
|
|
79616
79822
|
walk2(root, w);
|
|
79617
79823
|
} catch (e) {
|
|
79618
|
-
const
|
|
79824
|
+
const err = toSyntaxError2(e);
|
|
79619
79825
|
if (!diagnostics.some((d) => d.severity === "error")) {
|
|
79620
79826
|
diagnostics.push({
|
|
79621
79827
|
severity: "error",
|
|
79622
79828
|
code: "syntax-error",
|
|
79623
|
-
message:
|
|
79624
|
-
range: rangeAt(
|
|
79829
|
+
message: err.message,
|
|
79830
|
+
range: rangeAt(err.line, err.column, 1)
|
|
79625
79831
|
});
|
|
79626
79832
|
}
|
|
79627
79833
|
}
|
|
@@ -79633,6 +79839,7 @@ function analyzeJinja2(source, opts = {}) {
|
|
|
79633
79839
|
severity: "warning",
|
|
79634
79840
|
code: "deprecated-filter",
|
|
79635
79841
|
message: `"${f2.name}" is an apitemplate.io compatibility alias; use "${preferred}"`,
|
|
79842
|
+
args: { name: f2.name, preferred },
|
|
79636
79843
|
range: f2.range,
|
|
79637
79844
|
fix: { title: `Rename to ${preferred}`, replacement: preferred }
|
|
79638
79845
|
});
|
|
@@ -79648,6 +79855,7 @@ function analyzeJinja2(source, opts = {}) {
|
|
|
79648
79855
|
severity: "error",
|
|
79649
79856
|
code: "unknown-filter",
|
|
79650
79857
|
message: `Unknown filter or helper "${f2.name}"`,
|
|
79858
|
+
args: { name: f2.name, kind: "filter-or-helper" },
|
|
79651
79859
|
range: f2.range
|
|
79652
79860
|
});
|
|
79653
79861
|
}
|
|
@@ -79690,13 +79898,13 @@ var Jinja2Template = class {
|
|
|
79690
79898
|
try {
|
|
79691
79899
|
tpl.render(
|
|
79692
79900
|
data ?? {},
|
|
79693
|
-
(
|
|
79694
|
-
if (
|
|
79695
|
-
const e =
|
|
79901
|
+
(err, res) => {
|
|
79902
|
+
if (err) {
|
|
79903
|
+
const e = err;
|
|
79696
79904
|
reject(
|
|
79697
79905
|
new RenderError(
|
|
79698
79906
|
"jinja2",
|
|
79699
|
-
String(e.message ??
|
|
79907
|
+
String(e.message ?? err).replace(/^\(.*?\)\s*/, ""),
|
|
79700
79908
|
e.lineno === void 0 ? void 0 : e.lineno + 1,
|
|
79701
79909
|
e.colno === void 0 ? void 0 : e.colno + 1
|
|
79702
79910
|
)
|
|
@@ -79905,12 +80113,12 @@ var validationContext3 = {
|
|
|
79905
80113
|
limits: { ms: 2e3, outputBytes: 20 * 1024 * 1024, includeDepth: 8 }
|
|
79906
80114
|
};
|
|
79907
80115
|
function toSyntaxError3(e) {
|
|
79908
|
-
const
|
|
79909
|
-
let line =
|
|
79910
|
-
let column =
|
|
79911
|
-
const pos =
|
|
80116
|
+
const err = e;
|
|
80117
|
+
let line = err.line ?? 1;
|
|
80118
|
+
let column = err.col ?? 1;
|
|
80119
|
+
const pos = err.token?.getPosition?.();
|
|
79912
80120
|
if (pos) [line, column] = pos;
|
|
79913
|
-
const message2 = String(
|
|
80121
|
+
const message2 = String(err.message ?? e).replace(/,\s*line:\d+,\s*col:\d+/, "").trim();
|
|
79914
80122
|
return new EngineSyntaxError("liquid", message2, line, column);
|
|
79915
80123
|
}
|
|
79916
80124
|
var identifier = /(?<![\w."'])([A-Za-z_][\w]*)((?:\.[A-Za-z_]\w*|\[\d+\])*)/g;
|
|
@@ -79942,15 +80150,15 @@ function analyzeLiquid(source, opts = {}) {
|
|
|
79942
80150
|
try {
|
|
79943
80151
|
new import_liquidjs.Liquid({ strictFilters: false, fs: partialFs(() => "") }).parse(source);
|
|
79944
80152
|
} catch (e) {
|
|
79945
|
-
const
|
|
80153
|
+
const err = toSyntaxError3(e);
|
|
79946
80154
|
if (!diagnostics.some((d) => d.severity === "error")) {
|
|
79947
80155
|
diagnostics.push({
|
|
79948
80156
|
severity: "error",
|
|
79949
80157
|
code: "syntax-error",
|
|
79950
|
-
message:
|
|
80158
|
+
message: err.message,
|
|
79951
80159
|
range: {
|
|
79952
|
-
start: { line:
|
|
79953
|
-
end: { line:
|
|
80160
|
+
start: { line: err.line, column: err.column },
|
|
80161
|
+
end: { line: err.line, column: err.column + 1 }
|
|
79954
80162
|
}
|
|
79955
80163
|
});
|
|
79956
80164
|
}
|
|
@@ -80048,6 +80256,7 @@ function analyzeLiquid(source, opts = {}) {
|
|
|
80048
80256
|
severity: "warning",
|
|
80049
80257
|
code: "deprecated-filter",
|
|
80050
80258
|
message: `"${f2.name}" is a compatibility alias; use "${preferred}"`,
|
|
80259
|
+
args: { name: f2.name, preferred },
|
|
80051
80260
|
range: f2.range,
|
|
80052
80261
|
fix: { title: `Rename to ${preferred}`, replacement: preferred }
|
|
80053
80262
|
});
|
|
@@ -80063,6 +80272,7 @@ function analyzeLiquid(source, opts = {}) {
|
|
|
80063
80272
|
severity: "error",
|
|
80064
80273
|
code: "unknown-filter",
|
|
80065
80274
|
message: `Unknown filter "${f2.name}"`,
|
|
80275
|
+
args: { name: f2.name, kind: "filter" },
|
|
80066
80276
|
range: f2.range
|
|
80067
80277
|
});
|
|
80068
80278
|
}
|
|
@@ -80111,11 +80321,11 @@ var LiquidCompiled = class {
|
|
|
80111
80321
|
return enforceLimits(out, started, ctx.limits);
|
|
80112
80322
|
} catch (e) {
|
|
80113
80323
|
if (e instanceof Error && e.name === "RenderLimitError") throw e;
|
|
80114
|
-
const
|
|
80115
|
-
const pos =
|
|
80324
|
+
const err = e;
|
|
80325
|
+
const pos = err.token?.getPosition?.();
|
|
80116
80326
|
throw new RenderError(
|
|
80117
80327
|
"liquid",
|
|
80118
|
-
String(
|
|
80328
|
+
String(err.message ?? e),
|
|
80119
80329
|
pos?.[0],
|
|
80120
80330
|
pos?.[1]
|
|
80121
80331
|
);
|
|
@@ -80265,10 +80475,6 @@ function inferSchema(sample) {
|
|
|
80265
80475
|
|
|
80266
80476
|
// packages/engine/src/lib/output.ts
|
|
80267
80477
|
var outputFormats = ["pdf", "png", "jpg", "webp", "docx", "pptx"];
|
|
80268
|
-
var officeKinds = ["docx", "pptx"];
|
|
80269
|
-
function isOfficeKind(value) {
|
|
80270
|
-
return typeof value === "string" && officeKinds.includes(value);
|
|
80271
|
-
}
|
|
80272
80478
|
|
|
80273
80479
|
// packages/engine/src/lib/snippets.ts
|
|
80274
80480
|
var loop = (engine, item, list2, body) => engine === "handlebars" ? `{{#each ${list2}}}
|
|
@@ -80477,7 +80683,7 @@ ${loop(e, "line", "invoice.lines", ` <tr><td>${val(e, "line.description")}</t
|
|
|
80477
80683
|
invoice: { due_date: "2026-10-13" },
|
|
80478
80684
|
payment: {
|
|
80479
80685
|
name: "Fennlor Studio GmbH",
|
|
80480
|
-
iban: "
|
|
80686
|
+
iban: "DE36000000000000000000",
|
|
80481
80687
|
bic: "XXXXDEXXXXX",
|
|
80482
80688
|
amount: 3760.4,
|
|
80483
80689
|
reference: "2026-0042"
|
|
@@ -80664,7 +80870,7 @@ ${loop(e, "line", "invoice.lines", ` <tr><td>${val(e, "line.description")}</t
|
|
|
80664
80870
|
sampleData: {
|
|
80665
80871
|
payment: {
|
|
80666
80872
|
name: "Fennlor Studio GmbH",
|
|
80667
|
-
iban: "
|
|
80873
|
+
iban: "DE36000000000000000000",
|
|
80668
80874
|
bic: "XXXXDEXXXXX",
|
|
80669
80875
|
amount: 3760.4,
|
|
80670
80876
|
reference: "2026-0042"
|
|
@@ -80769,14 +80975,6 @@ var ASSET_NAME_PATTERN = new RegExp(`^${SEGMENT}(?:/${SEGMENT})*$`);
|
|
|
80769
80975
|
var ASSET_MAX_BYTES = 10 * 1024 * 1024;
|
|
80770
80976
|
|
|
80771
80977
|
// packages/engine/src/lib/office/errors.ts
|
|
80772
|
-
var OfficeError = class extends Error {
|
|
80773
|
-
constructor(code, message2, details = {}) {
|
|
80774
|
-
super(message2);
|
|
80775
|
-
this.code = code;
|
|
80776
|
-
this.details = details;
|
|
80777
|
-
this.name = "OfficeError";
|
|
80778
|
-
}
|
|
80779
|
-
};
|
|
80780
80978
|
var officeLimits = {
|
|
80781
80979
|
/** Entries in one container. */
|
|
80782
80980
|
maxEntries: 2e3,
|
|
@@ -80788,969 +80986,6 @@ var officeLimits = {
|
|
|
80788
80986
|
maxFileBytes: 20 * 1024 * 1024
|
|
80789
80987
|
};
|
|
80790
80988
|
|
|
80791
|
-
// node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/index.mjs
|
|
80792
|
-
import { createRequire } from "module";
|
|
80793
|
-
var require2 = createRequire("/");
|
|
80794
|
-
var _a;
|
|
80795
|
-
var Worker;
|
|
80796
|
-
var isMarkedAsUntransferable;
|
|
80797
|
-
try {
|
|
80798
|
-
_a = require2("worker_threads"), Worker = _a.Worker, isMarkedAsUntransferable = _a.isMarkedAsUntransferable;
|
|
80799
|
-
} catch (e) {
|
|
80800
|
-
}
|
|
80801
|
-
var u8 = Uint8Array;
|
|
80802
|
-
var u16 = Uint16Array;
|
|
80803
|
-
var i32 = Int32Array;
|
|
80804
|
-
var fleb = new u8([
|
|
80805
|
-
0,
|
|
80806
|
-
0,
|
|
80807
|
-
0,
|
|
80808
|
-
0,
|
|
80809
|
-
0,
|
|
80810
|
-
0,
|
|
80811
|
-
0,
|
|
80812
|
-
0,
|
|
80813
|
-
1,
|
|
80814
|
-
1,
|
|
80815
|
-
1,
|
|
80816
|
-
1,
|
|
80817
|
-
2,
|
|
80818
|
-
2,
|
|
80819
|
-
2,
|
|
80820
|
-
2,
|
|
80821
|
-
3,
|
|
80822
|
-
3,
|
|
80823
|
-
3,
|
|
80824
|
-
3,
|
|
80825
|
-
4,
|
|
80826
|
-
4,
|
|
80827
|
-
4,
|
|
80828
|
-
4,
|
|
80829
|
-
5,
|
|
80830
|
-
5,
|
|
80831
|
-
5,
|
|
80832
|
-
5,
|
|
80833
|
-
0,
|
|
80834
|
-
/* unused */
|
|
80835
|
-
0,
|
|
80836
|
-
0,
|
|
80837
|
-
/* impossible */
|
|
80838
|
-
0
|
|
80839
|
-
]);
|
|
80840
|
-
var fdeb = new u8([
|
|
80841
|
-
0,
|
|
80842
|
-
0,
|
|
80843
|
-
0,
|
|
80844
|
-
0,
|
|
80845
|
-
1,
|
|
80846
|
-
1,
|
|
80847
|
-
2,
|
|
80848
|
-
2,
|
|
80849
|
-
3,
|
|
80850
|
-
3,
|
|
80851
|
-
4,
|
|
80852
|
-
4,
|
|
80853
|
-
5,
|
|
80854
|
-
5,
|
|
80855
|
-
6,
|
|
80856
|
-
6,
|
|
80857
|
-
7,
|
|
80858
|
-
7,
|
|
80859
|
-
8,
|
|
80860
|
-
8,
|
|
80861
|
-
9,
|
|
80862
|
-
9,
|
|
80863
|
-
10,
|
|
80864
|
-
10,
|
|
80865
|
-
11,
|
|
80866
|
-
11,
|
|
80867
|
-
12,
|
|
80868
|
-
12,
|
|
80869
|
-
13,
|
|
80870
|
-
13,
|
|
80871
|
-
/* unused */
|
|
80872
|
-
0,
|
|
80873
|
-
0
|
|
80874
|
-
]);
|
|
80875
|
-
var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
|
|
80876
|
-
var freb = function(eb, start) {
|
|
80877
|
-
var b2 = new u16(31);
|
|
80878
|
-
for (var i = 0; i < 31; ++i) {
|
|
80879
|
-
b2[i] = start += 1 << eb[i - 1];
|
|
80880
|
-
}
|
|
80881
|
-
var r = new i32(b2[30]);
|
|
80882
|
-
for (var i = 1; i < 30; ++i) {
|
|
80883
|
-
for (var j2 = b2[i]; j2 < b2[i + 1]; ++j2) {
|
|
80884
|
-
r[j2] = j2 - b2[i] << 5 | i;
|
|
80885
|
-
}
|
|
80886
|
-
}
|
|
80887
|
-
return { b: b2, r };
|
|
80888
|
-
};
|
|
80889
|
-
var _a = freb(fleb, 2);
|
|
80890
|
-
var fl = _a.b;
|
|
80891
|
-
var revfl = _a.r;
|
|
80892
|
-
fl[28] = 258, revfl[258] = 28;
|
|
80893
|
-
var _b = freb(fdeb, 0);
|
|
80894
|
-
var fd = _b.b;
|
|
80895
|
-
var revfd = _b.r;
|
|
80896
|
-
var rev = new u16(32768);
|
|
80897
|
-
for (i = 0; i < 32768; ++i) {
|
|
80898
|
-
x2 = (i & 43690) >> 1 | (i & 21845) << 1;
|
|
80899
|
-
x2 = (x2 & 52428) >> 2 | (x2 & 13107) << 2;
|
|
80900
|
-
x2 = (x2 & 61680) >> 4 | (x2 & 3855) << 4;
|
|
80901
|
-
rev[i] = ((x2 & 65280) >> 8 | (x2 & 255) << 8) >> 1;
|
|
80902
|
-
}
|
|
80903
|
-
var x2;
|
|
80904
|
-
var i;
|
|
80905
|
-
var hMap = (function(cd, mb, r) {
|
|
80906
|
-
var s = cd.length;
|
|
80907
|
-
var i = 0;
|
|
80908
|
-
var l3 = new u16(mb);
|
|
80909
|
-
for (; i < s; ++i) {
|
|
80910
|
-
if (cd[i])
|
|
80911
|
-
++l3[cd[i] - 1];
|
|
80912
|
-
}
|
|
80913
|
-
var le2 = new u16(mb);
|
|
80914
|
-
for (i = 1; i < mb; ++i) {
|
|
80915
|
-
le2[i] = le2[i - 1] + l3[i - 1] << 1;
|
|
80916
|
-
}
|
|
80917
|
-
var co;
|
|
80918
|
-
if (r) {
|
|
80919
|
-
co = new u16(1 << mb);
|
|
80920
|
-
var rvb = 15 - mb;
|
|
80921
|
-
for (i = 0; i < s; ++i) {
|
|
80922
|
-
if (cd[i]) {
|
|
80923
|
-
var sv = i << 4 | cd[i];
|
|
80924
|
-
var r_1 = mb - cd[i];
|
|
80925
|
-
var v2 = le2[cd[i] - 1]++ << r_1;
|
|
80926
|
-
for (var m2 = v2 | (1 << r_1) - 1; v2 <= m2; ++v2) {
|
|
80927
|
-
co[rev[v2] >> rvb] = sv;
|
|
80928
|
-
}
|
|
80929
|
-
}
|
|
80930
|
-
}
|
|
80931
|
-
} else {
|
|
80932
|
-
co = new u16(s);
|
|
80933
|
-
for (i = 0; i < s; ++i) {
|
|
80934
|
-
if (cd[i]) {
|
|
80935
|
-
co[i] = rev[le2[cd[i] - 1]++] >> 15 - cd[i];
|
|
80936
|
-
}
|
|
80937
|
-
}
|
|
80938
|
-
}
|
|
80939
|
-
return co;
|
|
80940
|
-
});
|
|
80941
|
-
var flt = new u8(288);
|
|
80942
|
-
for (i = 0; i < 144; ++i)
|
|
80943
|
-
flt[i] = 8;
|
|
80944
|
-
var i;
|
|
80945
|
-
for (i = 144; i < 256; ++i)
|
|
80946
|
-
flt[i] = 9;
|
|
80947
|
-
var i;
|
|
80948
|
-
for (i = 256; i < 280; ++i)
|
|
80949
|
-
flt[i] = 7;
|
|
80950
|
-
var i;
|
|
80951
|
-
for (i = 280; i < 288; ++i)
|
|
80952
|
-
flt[i] = 8;
|
|
80953
|
-
var i;
|
|
80954
|
-
var fdt = new u8(32);
|
|
80955
|
-
for (i = 0; i < 32; ++i)
|
|
80956
|
-
fdt[i] = 5;
|
|
80957
|
-
var i;
|
|
80958
|
-
var flrm = /* @__PURE__ */ hMap(flt, 9, 1);
|
|
80959
|
-
var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);
|
|
80960
|
-
var max = function(a) {
|
|
80961
|
-
var m2 = a[0];
|
|
80962
|
-
for (var i = 1; i < a.length; ++i) {
|
|
80963
|
-
if (a[i] > m2)
|
|
80964
|
-
m2 = a[i];
|
|
80965
|
-
}
|
|
80966
|
-
return m2;
|
|
80967
|
-
};
|
|
80968
|
-
var bits = function(d, p, m2) {
|
|
80969
|
-
var o = p / 8 | 0;
|
|
80970
|
-
return (d[o] | d[o + 1] << 8) >> (p & 7) & m2;
|
|
80971
|
-
};
|
|
80972
|
-
var bits16 = function(d, p) {
|
|
80973
|
-
var o = p / 8 | 0;
|
|
80974
|
-
return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7);
|
|
80975
|
-
};
|
|
80976
|
-
var shft = function(p) {
|
|
80977
|
-
return (p + 7) / 8 | 0;
|
|
80978
|
-
};
|
|
80979
|
-
var slc = function(v2, s, e) {
|
|
80980
|
-
if (s == null || s < 0)
|
|
80981
|
-
s = 0;
|
|
80982
|
-
if (e == null || e > v2.length)
|
|
80983
|
-
e = v2.length;
|
|
80984
|
-
return new u8(v2.subarray(s, e));
|
|
80985
|
-
};
|
|
80986
|
-
var ec = [
|
|
80987
|
-
"unexpected EOF",
|
|
80988
|
-
"invalid block type",
|
|
80989
|
-
"invalid length/literal",
|
|
80990
|
-
"invalid distance",
|
|
80991
|
-
"stream finished",
|
|
80992
|
-
"no stream handler",
|
|
80993
|
-
,
|
|
80994
|
-
// determined by compression function
|
|
80995
|
-
"no callback",
|
|
80996
|
-
"invalid UTF-8 data",
|
|
80997
|
-
"extra field too long",
|
|
80998
|
-
"date not in range 1980-2099",
|
|
80999
|
-
"filename too long",
|
|
81000
|
-
"stream finishing",
|
|
81001
|
-
"invalid zip data"
|
|
81002
|
-
// determined by unknown compression method
|
|
81003
|
-
];
|
|
81004
|
-
var err = function(ind, msg, nt2) {
|
|
81005
|
-
var e = new Error(msg || ec[ind]);
|
|
81006
|
-
e.code = ind;
|
|
81007
|
-
if (Error.captureStackTrace)
|
|
81008
|
-
Error.captureStackTrace(e, err);
|
|
81009
|
-
if (!nt2)
|
|
81010
|
-
throw e;
|
|
81011
|
-
return e;
|
|
81012
|
-
};
|
|
81013
|
-
var inflt = function(dat, st2, buf, dict) {
|
|
81014
|
-
var sl = dat.length, dl = dict ? dict.length : 0;
|
|
81015
|
-
if (!sl || st2.f && !st2.l)
|
|
81016
|
-
return buf || new u8(0);
|
|
81017
|
-
var noBuf = !buf;
|
|
81018
|
-
var resize = noBuf || st2.i != 2;
|
|
81019
|
-
var noSt = st2.i;
|
|
81020
|
-
if (noBuf)
|
|
81021
|
-
buf = new u8(sl * 3);
|
|
81022
|
-
var cbuf = function(l4) {
|
|
81023
|
-
var bl = buf.length;
|
|
81024
|
-
if (l4 > bl) {
|
|
81025
|
-
var nbuf = new u8(Math.max(bl * 2, l4));
|
|
81026
|
-
nbuf.set(buf);
|
|
81027
|
-
buf = nbuf;
|
|
81028
|
-
}
|
|
81029
|
-
};
|
|
81030
|
-
var final = st2.f || 0, pos = st2.p || 0, bt = st2.b || 0, lm = st2.l, dm = st2.d, lbt = st2.m, dbt = st2.n;
|
|
81031
|
-
var tbts = sl * 8;
|
|
81032
|
-
do {
|
|
81033
|
-
if (!lm) {
|
|
81034
|
-
final = bits(dat, pos, 1);
|
|
81035
|
-
var type = bits(dat, pos + 1, 3);
|
|
81036
|
-
pos += 3;
|
|
81037
|
-
if (!type) {
|
|
81038
|
-
var s = shft(pos) + 4, l3 = dat[s - 4] | dat[s - 3] << 8, t = s + l3;
|
|
81039
|
-
if (t > sl) {
|
|
81040
|
-
if (noSt)
|
|
81041
|
-
err(0);
|
|
81042
|
-
break;
|
|
81043
|
-
}
|
|
81044
|
-
if (resize)
|
|
81045
|
-
cbuf(bt + l3);
|
|
81046
|
-
buf.set(dat.subarray(s, t), bt);
|
|
81047
|
-
st2.b = bt += l3, st2.p = pos = t * 8, st2.f = final;
|
|
81048
|
-
continue;
|
|
81049
|
-
} else if (type == 1)
|
|
81050
|
-
lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
|
|
81051
|
-
else if (type == 2) {
|
|
81052
|
-
var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
|
|
81053
|
-
var tl = hLit + bits(dat, pos + 5, 31) + 1;
|
|
81054
|
-
pos += 14;
|
|
81055
|
-
var ldt = new u8(tl);
|
|
81056
|
-
var clt = new u8(19);
|
|
81057
|
-
for (var i = 0; i < hcLen; ++i) {
|
|
81058
|
-
clt[clim[i]] = bits(dat, pos + i * 3, 7);
|
|
81059
|
-
}
|
|
81060
|
-
pos += hcLen * 3;
|
|
81061
|
-
var clb = max(clt), clbmsk = (1 << clb) - 1;
|
|
81062
|
-
var clm = hMap(clt, clb, 1);
|
|
81063
|
-
for (var i = 0; i < tl; ) {
|
|
81064
|
-
var r = clm[bits(dat, pos, clbmsk)];
|
|
81065
|
-
pos += r & 15;
|
|
81066
|
-
var s = r >> 4;
|
|
81067
|
-
if (s < 16) {
|
|
81068
|
-
ldt[i++] = s;
|
|
81069
|
-
} else {
|
|
81070
|
-
var c = 0, n = 0;
|
|
81071
|
-
if (s == 16)
|
|
81072
|
-
n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
|
|
81073
|
-
else if (s == 17)
|
|
81074
|
-
n = 3 + bits(dat, pos, 7), pos += 3;
|
|
81075
|
-
else if (s == 18)
|
|
81076
|
-
n = 11 + bits(dat, pos, 127), pos += 7;
|
|
81077
|
-
while (n--)
|
|
81078
|
-
ldt[i++] = c;
|
|
81079
|
-
}
|
|
81080
|
-
}
|
|
81081
|
-
var lt2 = ldt.subarray(0, hLit), dt2 = ldt.subarray(hLit);
|
|
81082
|
-
lbt = max(lt2);
|
|
81083
|
-
dbt = max(dt2);
|
|
81084
|
-
lm = hMap(lt2, lbt, 1);
|
|
81085
|
-
dm = hMap(dt2, dbt, 1);
|
|
81086
|
-
} else
|
|
81087
|
-
err(1);
|
|
81088
|
-
if (pos > tbts) {
|
|
81089
|
-
if (noSt)
|
|
81090
|
-
err(0);
|
|
81091
|
-
break;
|
|
81092
|
-
}
|
|
81093
|
-
}
|
|
81094
|
-
if (resize)
|
|
81095
|
-
cbuf(bt + 131072);
|
|
81096
|
-
var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
|
|
81097
|
-
var lpos = pos;
|
|
81098
|
-
for (; ; lpos = pos) {
|
|
81099
|
-
var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
|
|
81100
|
-
pos += c & 15;
|
|
81101
|
-
if (pos > tbts) {
|
|
81102
|
-
if (noSt)
|
|
81103
|
-
err(0);
|
|
81104
|
-
break;
|
|
81105
|
-
}
|
|
81106
|
-
if (!c)
|
|
81107
|
-
err(2);
|
|
81108
|
-
if (sym < 256)
|
|
81109
|
-
buf[bt++] = sym;
|
|
81110
|
-
else if (sym == 256) {
|
|
81111
|
-
lpos = pos, lm = null;
|
|
81112
|
-
break;
|
|
81113
|
-
} else {
|
|
81114
|
-
var add2 = sym - 254;
|
|
81115
|
-
if (sym > 264) {
|
|
81116
|
-
var i = sym - 257, b2 = fleb[i];
|
|
81117
|
-
add2 = bits(dat, pos, (1 << b2) - 1) + fl[i];
|
|
81118
|
-
pos += b2;
|
|
81119
|
-
}
|
|
81120
|
-
var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
|
|
81121
|
-
if (!d)
|
|
81122
|
-
err(3);
|
|
81123
|
-
pos += d & 15;
|
|
81124
|
-
var dt2 = fd[dsym];
|
|
81125
|
-
if (dsym > 3) {
|
|
81126
|
-
var b2 = fdeb[dsym];
|
|
81127
|
-
dt2 += bits16(dat, pos) & (1 << b2) - 1, pos += b2;
|
|
81128
|
-
}
|
|
81129
|
-
if (pos > tbts) {
|
|
81130
|
-
if (noSt)
|
|
81131
|
-
err(0);
|
|
81132
|
-
break;
|
|
81133
|
-
}
|
|
81134
|
-
if (resize)
|
|
81135
|
-
cbuf(bt + 131072);
|
|
81136
|
-
var end = bt + add2;
|
|
81137
|
-
if (bt < dt2) {
|
|
81138
|
-
var shift = dl - dt2, dend = Math.min(dt2, end);
|
|
81139
|
-
if (shift + bt < 0)
|
|
81140
|
-
err(3);
|
|
81141
|
-
for (; bt < dend; ++bt)
|
|
81142
|
-
buf[bt] = dict[shift + bt];
|
|
81143
|
-
}
|
|
81144
|
-
for (; bt < end; ++bt)
|
|
81145
|
-
buf[bt] = buf[bt - dt2];
|
|
81146
|
-
}
|
|
81147
|
-
}
|
|
81148
|
-
st2.l = lm, st2.p = lpos, st2.b = bt, st2.f = final;
|
|
81149
|
-
if (lm)
|
|
81150
|
-
final = 1, st2.m = lbt, st2.d = dm, st2.n = dbt;
|
|
81151
|
-
} while (!final);
|
|
81152
|
-
return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
|
|
81153
|
-
};
|
|
81154
|
-
var et2 = /* @__PURE__ */ new u8(0);
|
|
81155
|
-
var Inflate = /* @__PURE__ */ (function() {
|
|
81156
|
-
function Inflate2(opts, cb) {
|
|
81157
|
-
if (typeof opts == "function")
|
|
81158
|
-
cb = opts, opts = {};
|
|
81159
|
-
this.ondata = cb;
|
|
81160
|
-
var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);
|
|
81161
|
-
this.s = { i: 0, b: dict ? dict.length : 0 };
|
|
81162
|
-
this.o = new u8(32768);
|
|
81163
|
-
this.p = new u8(0);
|
|
81164
|
-
if (dict)
|
|
81165
|
-
this.o.set(dict);
|
|
81166
|
-
}
|
|
81167
|
-
Inflate2.prototype.e = function(c) {
|
|
81168
|
-
if (!this.ondata)
|
|
81169
|
-
err(5);
|
|
81170
|
-
if (this.d)
|
|
81171
|
-
err(4);
|
|
81172
|
-
if (!this.p.length)
|
|
81173
|
-
this.p = c;
|
|
81174
|
-
else if (c.length) {
|
|
81175
|
-
var n = new u8(this.p.length + c.length);
|
|
81176
|
-
n.set(this.p), n.set(c, this.p.length), this.p = n;
|
|
81177
|
-
}
|
|
81178
|
-
};
|
|
81179
|
-
Inflate2.prototype.c = function(final) {
|
|
81180
|
-
this.s.i = +(this.d = final || false);
|
|
81181
|
-
var bts = this.s.b;
|
|
81182
|
-
var dt2 = inflt(this.p, this.s, this.o);
|
|
81183
|
-
this.ondata(slc(dt2, bts, this.s.b), this.d);
|
|
81184
|
-
this.o = slc(dt2, this.s.b - 32768), this.s.b = this.o.length;
|
|
81185
|
-
this.p = slc(this.p, this.s.p / 8 | 0), this.s.p &= 7;
|
|
81186
|
-
};
|
|
81187
|
-
Inflate2.prototype.push = function(chunk, final) {
|
|
81188
|
-
this.e(chunk), this.c(final);
|
|
81189
|
-
};
|
|
81190
|
-
return Inflate2;
|
|
81191
|
-
})();
|
|
81192
|
-
var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
|
|
81193
|
-
var tds = 0;
|
|
81194
|
-
try {
|
|
81195
|
-
td.decode(et2, { stream: true });
|
|
81196
|
-
tds = 1;
|
|
81197
|
-
} catch (e) {
|
|
81198
|
-
}
|
|
81199
|
-
|
|
81200
|
-
// packages/engine/src/lib/office/zip.ts
|
|
81201
|
-
var SIG_EOCD = 101010256;
|
|
81202
|
-
var SIG_EOCD64 = 101075792;
|
|
81203
|
-
var SIG_EOCD64_LOCATOR = 117853008;
|
|
81204
|
-
var SIG_CENTRAL = 33639248;
|
|
81205
|
-
var SIG_LOCAL = 67324752;
|
|
81206
|
-
var MAX32 = 4294967295;
|
|
81207
|
-
var invalid = (message2, details = {}) => new OfficeError("office_document_invalid", message2, details);
|
|
81208
|
-
function isZip(bytes) {
|
|
81209
|
-
return bytes.length >= 4 && bytes[0] === 80 && bytes[1] === 75 && bytes[2] === 3 && bytes[3] === 4;
|
|
81210
|
-
}
|
|
81211
|
-
function isSafeEntryName(name) {
|
|
81212
|
-
if (!name || name.length > 1024) return false;
|
|
81213
|
-
if (name.startsWith("/") || name.includes("\\") || /^[A-Za-z]:/.test(name))
|
|
81214
|
-
return false;
|
|
81215
|
-
if (/[\u0000-\u001F]/.test(name)) return false;
|
|
81216
|
-
return !name.split("/").some((segment) => segment === "..");
|
|
81217
|
-
}
|
|
81218
|
-
function readZip(bytes, limits = officeLimits) {
|
|
81219
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
81220
|
-
const u162 = (at3) => view.getUint16(at3, true);
|
|
81221
|
-
const u32 = (at3) => view.getUint32(at3, true);
|
|
81222
|
-
const within = (at3, length) => at3 >= 0 && length >= 0 && at3 + length <= bytes.length;
|
|
81223
|
-
let eocd = -1;
|
|
81224
|
-
for (let at3 = bytes.length - 22; at3 >= Math.max(0, bytes.length - 22 - 65535); at3--) {
|
|
81225
|
-
if (u32(at3) === SIG_EOCD) {
|
|
81226
|
-
eocd = at3;
|
|
81227
|
-
break;
|
|
81228
|
-
}
|
|
81229
|
-
}
|
|
81230
|
-
if (eocd < 0) throw invalid("The file is not a valid ZIP container");
|
|
81231
|
-
let count = u162(eocd + 10);
|
|
81232
|
-
let cdSize = u32(eocd + 12);
|
|
81233
|
-
let cdOffset = u32(eocd + 16);
|
|
81234
|
-
if (u162(eocd + 4) !== 0 || u162(eocd + 6) !== 0)
|
|
81235
|
-
throw invalid("Multi-part ZIP archives are not supported");
|
|
81236
|
-
if (count === 65535 || cdSize === MAX32 || cdOffset === MAX32) {
|
|
81237
|
-
const locator = eocd - 20;
|
|
81238
|
-
if (!within(locator, 20) || u32(locator) !== SIG_EOCD64_LOCATOR)
|
|
81239
|
-
throw invalid("The ZIP64 directory is missing");
|
|
81240
|
-
const at3 = Number(view.getBigUint64(locator + 8, true));
|
|
81241
|
-
if (!within(at3, 56) || u32(at3) !== SIG_EOCD64)
|
|
81242
|
-
throw invalid("The ZIP64 directory is invalid");
|
|
81243
|
-
count = Number(view.getBigUint64(at3 + 32, true));
|
|
81244
|
-
cdSize = Number(view.getBigUint64(at3 + 40, true));
|
|
81245
|
-
cdOffset = Number(view.getBigUint64(at3 + 48, true));
|
|
81246
|
-
}
|
|
81247
|
-
if (count > limits.maxEntries)
|
|
81248
|
-
throw invalid(
|
|
81249
|
-
`The container has ${count} entries; the limit is ${limits.maxEntries}`,
|
|
81250
|
-
{ entries: count }
|
|
81251
|
-
);
|
|
81252
|
-
if (!within(cdOffset, cdSize))
|
|
81253
|
-
throw invalid("The ZIP central directory lies outside the file");
|
|
81254
|
-
const decoder = new TextDecoder();
|
|
81255
|
-
const entries = [];
|
|
81256
|
-
const byName = /* @__PURE__ */ new Map();
|
|
81257
|
-
const lowerNames = /* @__PURE__ */ new Set();
|
|
81258
|
-
let declared = 0;
|
|
81259
|
-
let at2 = cdOffset;
|
|
81260
|
-
for (let i = 0; i < count; i++) {
|
|
81261
|
-
if (!within(at2, 46) || u32(at2) !== SIG_CENTRAL)
|
|
81262
|
-
throw invalid("The ZIP central directory is corrupt");
|
|
81263
|
-
const flags = u162(at2 + 8);
|
|
81264
|
-
const method = u162(at2 + 10);
|
|
81265
|
-
const dosTime = u162(at2 + 12);
|
|
81266
|
-
const dosDate = u162(at2 + 14);
|
|
81267
|
-
const crc322 = u32(at2 + 16);
|
|
81268
|
-
let compressedSize = u32(at2 + 20);
|
|
81269
|
-
let size = u32(at2 + 24);
|
|
81270
|
-
const nameLength = u162(at2 + 28);
|
|
81271
|
-
const extraLength = u162(at2 + 30);
|
|
81272
|
-
const commentLength = u162(at2 + 32);
|
|
81273
|
-
let localOffset = u32(at2 + 42);
|
|
81274
|
-
if (!within(at2 + 46, nameLength + extraLength + commentLength))
|
|
81275
|
-
throw invalid("The ZIP central directory is corrupt");
|
|
81276
|
-
const nameBytes = bytes.subarray(at2 + 46, at2 + 46 + nameLength);
|
|
81277
|
-
const name = flags & 2048 ? decoder.decode(nameBytes) : String.fromCharCode(...nameBytes);
|
|
81278
|
-
let extra = at2 + 46 + nameLength;
|
|
81279
|
-
const extraEnd = extra + extraLength;
|
|
81280
|
-
while (extra + 4 <= extraEnd) {
|
|
81281
|
-
const id = u162(extra);
|
|
81282
|
-
const length = u162(extra + 2);
|
|
81283
|
-
if (id === 1) {
|
|
81284
|
-
let field = extra + 4;
|
|
81285
|
-
const read64 = () => {
|
|
81286
|
-
if (field + 8 > extra + 4 + length)
|
|
81287
|
-
throw invalid("The ZIP64 extra field is truncated");
|
|
81288
|
-
const value = Number(view.getBigUint64(field, true));
|
|
81289
|
-
field += 8;
|
|
81290
|
-
return value;
|
|
81291
|
-
};
|
|
81292
|
-
if (size === MAX32) size = read64();
|
|
81293
|
-
if (compressedSize === MAX32) compressedSize = read64();
|
|
81294
|
-
if (localOffset === MAX32) localOffset = read64();
|
|
81295
|
-
}
|
|
81296
|
-
extra += 4 + length;
|
|
81297
|
-
}
|
|
81298
|
-
at2 = extraEnd + commentLength;
|
|
81299
|
-
if (flags & 1)
|
|
81300
|
-
throw new OfficeError(
|
|
81301
|
-
"source_encrypted",
|
|
81302
|
-
"The container has encrypted entries",
|
|
81303
|
-
{ entry: name }
|
|
81304
|
-
);
|
|
81305
|
-
if (method !== 0 && method !== 8)
|
|
81306
|
-
throw invalid(`Entry ${name} uses an unsupported compression method`, {
|
|
81307
|
-
entry: name,
|
|
81308
|
-
method
|
|
81309
|
-
});
|
|
81310
|
-
if (!isSafeEntryName(name))
|
|
81311
|
-
throw invalid("The container has an entry with an unsafe name", {
|
|
81312
|
-
entry: name
|
|
81313
|
-
});
|
|
81314
|
-
const lower = name.toLowerCase();
|
|
81315
|
-
if (lowerNames.has(lower))
|
|
81316
|
-
throw invalid("The container has duplicate entries", { entry: name });
|
|
81317
|
-
lowerNames.add(lower);
|
|
81318
|
-
declared += size;
|
|
81319
|
-
if (declared > limits.maxDeclaredBytes)
|
|
81320
|
-
throw new OfficeError(
|
|
81321
|
-
"office_document_too_large",
|
|
81322
|
-
"The container unpacks to more than the limit",
|
|
81323
|
-
{
|
|
81324
|
-
limit: limits.maxDeclaredBytes
|
|
81325
|
-
}
|
|
81326
|
-
);
|
|
81327
|
-
if (!within(localOffset, 30) || u32(localOffset) !== SIG_LOCAL)
|
|
81328
|
-
throw invalid(`Entry ${name} has no local header`);
|
|
81329
|
-
const dataStart = localOffset + 30 + u162(localOffset + 26) + u162(localOffset + 28);
|
|
81330
|
-
if (!within(dataStart, compressedSize))
|
|
81331
|
-
throw invalid(`Entry ${name} lies outside the file`);
|
|
81332
|
-
if (method === 0 && compressedSize !== size)
|
|
81333
|
-
throw invalid(`Entry ${name} has inconsistent sizes`);
|
|
81334
|
-
const entry = {
|
|
81335
|
-
name,
|
|
81336
|
-
method,
|
|
81337
|
-
crc32: crc322,
|
|
81338
|
-
compressedSize,
|
|
81339
|
-
size,
|
|
81340
|
-
dosTime,
|
|
81341
|
-
dosDate,
|
|
81342
|
-
raw: bytes.subarray(dataStart, dataStart + compressedSize)
|
|
81343
|
-
};
|
|
81344
|
-
entries.push(entry);
|
|
81345
|
-
byName.set(name, entry);
|
|
81346
|
-
}
|
|
81347
|
-
return { entries, get: (name) => byName.get(name) };
|
|
81348
|
-
}
|
|
81349
|
-
function readEntry(entry, maxBytes = officeLimits.maxPartBytes) {
|
|
81350
|
-
const tooLarge = () => new OfficeError(
|
|
81351
|
-
"office_document_too_large",
|
|
81352
|
-
`Part ${entry.name} is larger than ${maxBytes} bytes`,
|
|
81353
|
-
{
|
|
81354
|
-
entry: entry.name,
|
|
81355
|
-
limit: maxBytes
|
|
81356
|
-
}
|
|
81357
|
-
);
|
|
81358
|
-
if (entry.size > maxBytes) throw tooLarge();
|
|
81359
|
-
let out;
|
|
81360
|
-
if (entry.method === 0) out = entry.raw;
|
|
81361
|
-
else {
|
|
81362
|
-
const chunks = [];
|
|
81363
|
-
let total = 0;
|
|
81364
|
-
const inflate = new Inflate((chunk) => {
|
|
81365
|
-
total += chunk.length;
|
|
81366
|
-
if (total > maxBytes) throw tooLarge();
|
|
81367
|
-
chunks.push(chunk);
|
|
81368
|
-
});
|
|
81369
|
-
try {
|
|
81370
|
-
inflate.push(entry.raw, true);
|
|
81371
|
-
} catch (e) {
|
|
81372
|
-
if (e instanceof OfficeError) throw e;
|
|
81373
|
-
throw invalid(`Part ${entry.name} cannot be decompressed`, {
|
|
81374
|
-
entry: entry.name
|
|
81375
|
-
});
|
|
81376
|
-
}
|
|
81377
|
-
out = concat(chunks, total);
|
|
81378
|
-
}
|
|
81379
|
-
if (out.length !== entry.size || crc32(out) !== entry.crc32)
|
|
81380
|
-
throw invalid(`Part ${entry.name} is corrupt`, { entry: entry.name });
|
|
81381
|
-
return out;
|
|
81382
|
-
}
|
|
81383
|
-
function readText(entry, maxBytes) {
|
|
81384
|
-
return decodeXml(readEntry(entry, maxBytes));
|
|
81385
|
-
}
|
|
81386
|
-
function decodeXml(bytes) {
|
|
81387
|
-
if (bytes[0] === 255 && bytes[1] === 254)
|
|
81388
|
-
return decodeUtf16(bytes.subarray(2), true);
|
|
81389
|
-
if (bytes[0] === 254 && bytes[1] === 255)
|
|
81390
|
-
return decodeUtf16(bytes.subarray(2), false);
|
|
81391
|
-
return new TextDecoder().decode(bytes);
|
|
81392
|
-
}
|
|
81393
|
-
function decodeUtf16(bytes, littleEndian) {
|
|
81394
|
-
const units = new Uint16Array(bytes.length >> 1);
|
|
81395
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
81396
|
-
for (let i = 0; i < units.length; i++)
|
|
81397
|
-
units[i] = view.getUint16(i * 2, littleEndian);
|
|
81398
|
-
let out = "";
|
|
81399
|
-
for (let i = 0; i < units.length; i += 8192)
|
|
81400
|
-
out += String.fromCharCode(...units.subarray(i, i + 8192));
|
|
81401
|
-
return out;
|
|
81402
|
-
}
|
|
81403
|
-
function concat(chunks, total) {
|
|
81404
|
-
if (chunks.length === 1) return chunks[0];
|
|
81405
|
-
const out = new Uint8Array(total);
|
|
81406
|
-
let at2 = 0;
|
|
81407
|
-
for (const chunk of chunks) {
|
|
81408
|
-
out.set(chunk, at2);
|
|
81409
|
-
at2 += chunk.length;
|
|
81410
|
-
}
|
|
81411
|
-
return out;
|
|
81412
|
-
}
|
|
81413
|
-
var table = null;
|
|
81414
|
-
function crc32(data) {
|
|
81415
|
-
if (!table) {
|
|
81416
|
-
table = new Uint32Array(256);
|
|
81417
|
-
for (let n = 0; n < 256; n++) {
|
|
81418
|
-
let c = n;
|
|
81419
|
-
for (let k2 = 0; k2 < 8; k2++) c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
|
|
81420
|
-
table[n] = c >>> 0;
|
|
81421
|
-
}
|
|
81422
|
-
}
|
|
81423
|
-
let crc = 4294967295;
|
|
81424
|
-
for (let i = 0; i < data.length; i++)
|
|
81425
|
-
crc = table[(crc ^ data[i]) & 255] ^ crc >>> 8;
|
|
81426
|
-
return (crc ^ 4294967295) >>> 0;
|
|
81427
|
-
}
|
|
81428
|
-
|
|
81429
|
-
// packages/engine/src/lib/office/detect.ts
|
|
81430
|
-
var OOXML_MAIN = {
|
|
81431
|
-
"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": "docx",
|
|
81432
|
-
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "xlsx",
|
|
81433
|
-
"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": "pptx"
|
|
81434
|
-
};
|
|
81435
|
-
var OOXML_REFUSED = {
|
|
81436
|
-
"application/vnd.ms-word.document.macroenabled.main+xml": "a macro-enabled Word document (.docm)",
|
|
81437
|
-
"application/vnd.ms-word.template.macroenabledtemplate.main+xml": "a macro-enabled Word template (.dotm)",
|
|
81438
|
-
"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": "a Word template (.dotx)",
|
|
81439
|
-
"application/vnd.ms-excel.sheet.macroenabled.main+xml": "a macro-enabled workbook (.xlsm)",
|
|
81440
|
-
"application/vnd.ms-excel.sheet.binary.macroenabled.main": "a binary workbook (.xlsb)",
|
|
81441
|
-
"application/vnd.ms-excel.template.macroenabled.main+xml": "a macro-enabled Excel template (.xltm)",
|
|
81442
|
-
"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": "an Excel template (.xltx)",
|
|
81443
|
-
"application/vnd.ms-powerpoint.presentation.macroenabled.main+xml": "a macro-enabled presentation (.pptm)",
|
|
81444
|
-
"application/vnd.ms-powerpoint.slideshow.macroenabled.main+xml": "a macro-enabled slide show (.ppsm)",
|
|
81445
|
-
"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": "a slide show (.ppsx)",
|
|
81446
|
-
"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": "a PowerPoint template (.potx)"
|
|
81447
|
-
};
|
|
81448
|
-
var ODF_MIME = {
|
|
81449
|
-
"application/vnd.oasis.opendocument.text": "odt",
|
|
81450
|
-
"application/vnd.oasis.opendocument.spreadsheet": "ods",
|
|
81451
|
-
"application/vnd.oasis.opendocument.presentation": "odp"
|
|
81452
|
-
};
|
|
81453
|
-
var unsupported = (message2, details = {}) => new OfficeError("file_type_unsupported", message2, details);
|
|
81454
|
-
var ACCEPTED = "Accepted are DOCX, XLSX, PPTX, ODT, ODS, ODP, DOC, XLS, PPT, RTF and HTML";
|
|
81455
|
-
function detectOfficeFormat(bytes) {
|
|
81456
|
-
if (bytes.length > officeLimits.maxFileBytes)
|
|
81457
|
-
throw new OfficeError(
|
|
81458
|
-
"office_document_too_large",
|
|
81459
|
-
`The file is larger than ${officeLimits.maxFileBytes / 1024 / 1024} MB`,
|
|
81460
|
-
{
|
|
81461
|
-
bytes: bytes.length,
|
|
81462
|
-
limit: officeLimits.maxFileBytes
|
|
81463
|
-
}
|
|
81464
|
-
);
|
|
81465
|
-
if (isZip(bytes)) return detectZip(bytes);
|
|
81466
|
-
if (isCfb(bytes)) return { format: detectCfb(bytes), archive: null };
|
|
81467
|
-
if (startsWithAscii(bytes, "{\\rtf")) return { format: "rtf", archive: null };
|
|
81468
|
-
if (isHtml(bytes)) return { format: "html", archive: null };
|
|
81469
|
-
throw unsupported(`The file is not an office document. ${ACCEPTED}.`);
|
|
81470
|
-
}
|
|
81471
|
-
function detectZip(bytes) {
|
|
81472
|
-
const archive = readZip(bytes);
|
|
81473
|
-
const macro = archive.entries.find((e) => isMacroPart(e.name));
|
|
81474
|
-
if (macro)
|
|
81475
|
-
throw unsupported("Macro-enabled documents are not accepted", {
|
|
81476
|
-
entry: macro.name
|
|
81477
|
-
});
|
|
81478
|
-
const mimetype = archive.get("mimetype");
|
|
81479
|
-
if (mimetype) {
|
|
81480
|
-
const value = readText(mimetype, 1024).trim();
|
|
81481
|
-
const format2 = ODF_MIME[value];
|
|
81482
|
-
if (!format2)
|
|
81483
|
-
throw unsupported(
|
|
81484
|
-
`OpenDocument type ${value.slice(0, 100)} is not accepted. ${ACCEPTED}.`
|
|
81485
|
-
);
|
|
81486
|
-
const manifest = archive.get("META-INF/manifest.xml");
|
|
81487
|
-
if (manifest && readText(manifest, 1024 * 1024).includes("encryption-data"))
|
|
81488
|
-
throw new OfficeError(
|
|
81489
|
-
"source_encrypted",
|
|
81490
|
-
"The document is password-protected"
|
|
81491
|
-
);
|
|
81492
|
-
return { format: format2, archive };
|
|
81493
|
-
}
|
|
81494
|
-
const types = archive.get("[Content_Types].xml");
|
|
81495
|
-
if (!types)
|
|
81496
|
-
throw unsupported(`The ZIP file is not an office document. ${ACCEPTED}.`);
|
|
81497
|
-
const xml = readText(types, 1024 * 1024);
|
|
81498
|
-
if (hasDoctype(xml))
|
|
81499
|
-
throw new OfficeError(
|
|
81500
|
-
"office_document_invalid",
|
|
81501
|
-
"The document declares a DOCTYPE"
|
|
81502
|
-
);
|
|
81503
|
-
const contentTypes = [...xml.matchAll(/ContentType\s*=\s*"([^"]*)"/g)].map(
|
|
81504
|
-
(m2) => m2[1].toLowerCase()
|
|
81505
|
-
);
|
|
81506
|
-
const refused = contentTypes.find((t) => OOXML_REFUSED[t]);
|
|
81507
|
-
if (refused)
|
|
81508
|
-
throw unsupported(
|
|
81509
|
-
`The file is ${OOXML_REFUSED[refused]}, which is not accepted. ${ACCEPTED}.`
|
|
81510
|
-
);
|
|
81511
|
-
const mains = [
|
|
81512
|
-
...new Set(contentTypes.map((t) => OOXML_MAIN[t]).filter(Boolean))
|
|
81513
|
-
];
|
|
81514
|
-
if (mains.length !== 1)
|
|
81515
|
-
throw unsupported(
|
|
81516
|
-
`The file is not a Word, Excel or PowerPoint document. ${ACCEPTED}.`
|
|
81517
|
-
);
|
|
81518
|
-
return { format: mains[0], archive };
|
|
81519
|
-
}
|
|
81520
|
-
function isMacroPart(name) {
|
|
81521
|
-
const lower = name.toLowerCase();
|
|
81522
|
-
const base = lower.split("/").pop() ?? "";
|
|
81523
|
-
if (base === "vbaproject.bin" || base === "vbadata.xml") return true;
|
|
81524
|
-
if (lower.startsWith("scripts/")) return !lower.endsWith("/");
|
|
81525
|
-
if (lower.startsWith("basic/"))
|
|
81526
|
-
return !lower.endsWith("/") && base !== "script-lc.xml" && base !== "script-lb.xml";
|
|
81527
|
-
return false;
|
|
81528
|
-
}
|
|
81529
|
-
function hasDoctype(xml) {
|
|
81530
|
-
return /<!DOCTYPE/i.test(xml) || /<!ENTITY/i.test(xml);
|
|
81531
|
-
}
|
|
81532
|
-
function isHtml(bytes) {
|
|
81533
|
-
let start = 0;
|
|
81534
|
-
if (bytes[0] === 239 && bytes[1] === 187 && bytes[2] === 191) start = 3;
|
|
81535
|
-
const head = new TextDecoder().decode(bytes.subarray(start, start + 4096));
|
|
81536
|
-
const withoutProlog = head.replace(/^\s+/, "").replace(/^<\?xml[^>]*\?>\s*/i, "");
|
|
81537
|
-
const withoutComments = withoutProlog.replace(/^(?:<!--[\s\S]*?-->\s*)+/, "");
|
|
81538
|
-
return /^(?:<!doctype\s+html|<html[\s>])/i.test(withoutComments);
|
|
81539
|
-
}
|
|
81540
|
-
function startsWithAscii(bytes, prefix) {
|
|
81541
|
-
if (bytes.length < prefix.length) return false;
|
|
81542
|
-
for (let i = 0; i < prefix.length; i++)
|
|
81543
|
-
if (bytes[i] !== prefix.charCodeAt(i)) return false;
|
|
81544
|
-
return true;
|
|
81545
|
-
}
|
|
81546
|
-
var CFB_MAGIC = [208, 207, 17, 224, 161, 177, 26, 225];
|
|
81547
|
-
function isCfb(bytes) {
|
|
81548
|
-
return bytes.length >= 512 && CFB_MAGIC.every((b2, i) => bytes[i] === b2);
|
|
81549
|
-
}
|
|
81550
|
-
function cfbStreamNames(bytes) {
|
|
81551
|
-
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
81552
|
-
const invalid3 = () => new OfficeError(
|
|
81553
|
-
"office_document_invalid",
|
|
81554
|
-
"The compound document is corrupt"
|
|
81555
|
-
);
|
|
81556
|
-
const shift = view.getUint16(30, true);
|
|
81557
|
-
if (shift !== 9 && shift !== 12) throw invalid3();
|
|
81558
|
-
const sectorSize = 1 << shift;
|
|
81559
|
-
const sectorAt = (sector2) => (sector2 + 1) * sectorSize;
|
|
81560
|
-
const fatSectorCount = view.getUint32(44, true);
|
|
81561
|
-
const firstDirSector = view.getUint32(48, true);
|
|
81562
|
-
const firstDifatSector = view.getUint32(68, true);
|
|
81563
|
-
const totalSectors = Math.ceil(bytes.length / sectorSize);
|
|
81564
|
-
if (fatSectorCount > totalSectors) throw invalid3();
|
|
81565
|
-
const fatSectors = [];
|
|
81566
|
-
for (let i = 0; i < 109 && fatSectors.length < fatSectorCount; i++)
|
|
81567
|
-
fatSectors.push(view.getUint32(76 + i * 4, true));
|
|
81568
|
-
let difat = firstDifatSector;
|
|
81569
|
-
for (let guard = 0; fatSectors.length < fatSectorCount && difat < 4294967290; guard++) {
|
|
81570
|
-
if (guard > totalSectors || sectorAt(difat) + sectorSize > bytes.length)
|
|
81571
|
-
throw invalid3();
|
|
81572
|
-
for (let i = 0; i < sectorSize / 4 - 1 && fatSectors.length < fatSectorCount; i++)
|
|
81573
|
-
fatSectors.push(view.getUint32(sectorAt(difat) + i * 4, true));
|
|
81574
|
-
difat = view.getUint32(sectorAt(difat) + sectorSize - 4, true);
|
|
81575
|
-
}
|
|
81576
|
-
const next = (sector2) => {
|
|
81577
|
-
const index = Math.floor(sector2 / (sectorSize / 4));
|
|
81578
|
-
const fat = fatSectors[index];
|
|
81579
|
-
if (fat === void 0 || sectorAt(fat) + sectorSize > bytes.length)
|
|
81580
|
-
throw invalid3();
|
|
81581
|
-
return view.getUint32(
|
|
81582
|
-
sectorAt(fat) + sector2 % (sectorSize / 4) * 4,
|
|
81583
|
-
true
|
|
81584
|
-
);
|
|
81585
|
-
};
|
|
81586
|
-
const names = [];
|
|
81587
|
-
let sector = firstDirSector;
|
|
81588
|
-
for (let guard = 0; sector < 4294967290; guard++) {
|
|
81589
|
-
if (guard > totalSectors || sectorAt(sector) + sectorSize > bytes.length)
|
|
81590
|
-
throw invalid3();
|
|
81591
|
-
for (let at2 = sectorAt(sector); at2 < sectorAt(sector) + sectorSize; at2 += 128) {
|
|
81592
|
-
const length = view.getUint16(at2 + 64, true);
|
|
81593
|
-
const type = bytes[at2 + 66];
|
|
81594
|
-
if (type === 0 || length < 2 || length > 64) continue;
|
|
81595
|
-
let name = "";
|
|
81596
|
-
for (let c = 0; c < length - 2; c += 2)
|
|
81597
|
-
name += String.fromCharCode(view.getUint16(at2 + c, true));
|
|
81598
|
-
names.push(name);
|
|
81599
|
-
}
|
|
81600
|
-
sector = next(sector);
|
|
81601
|
-
}
|
|
81602
|
-
return names;
|
|
81603
|
-
}
|
|
81604
|
-
function detectCfb(bytes) {
|
|
81605
|
-
const names = new Set(cfbStreamNames(bytes));
|
|
81606
|
-
if (names.has("EncryptionInfo") || names.has("EncryptedPackage"))
|
|
81607
|
-
throw new OfficeError(
|
|
81608
|
-
"source_encrypted",
|
|
81609
|
-
"The document is password-protected"
|
|
81610
|
-
);
|
|
81611
|
-
if (names.has("_VBA_PROJECT_CUR") || names.has("VBA") || names.has("Macros"))
|
|
81612
|
-
throw unsupported("Macro-enabled documents are not accepted");
|
|
81613
|
-
if (names.has("WordDocument")) return "doc";
|
|
81614
|
-
if (names.has("Workbook") || names.has("Book")) return "xls";
|
|
81615
|
-
if (names.has("PowerPoint Document")) return "ppt";
|
|
81616
|
-
throw unsupported(
|
|
81617
|
-
`The compound file is not a Word, Excel or PowerPoint document. ${ACCEPTED}.`
|
|
81618
|
-
);
|
|
81619
|
-
}
|
|
81620
|
-
|
|
81621
|
-
// packages/engine/src/lib/office/xml.ts
|
|
81622
|
-
var NAME = /^[A-Za-z_][\w.-]*(?::[A-Za-z_][\w.-]*)?/;
|
|
81623
|
-
var invalid2 = (message2, part) => new OfficeError("office_document_invalid", part ? `${part}: ${message2}` : message2, part ? { entry: part } : {});
|
|
81624
|
-
function tokenize(xml, part) {
|
|
81625
|
-
const tokens = [];
|
|
81626
|
-
let at2 = 0;
|
|
81627
|
-
while (at2 < xml.length) {
|
|
81628
|
-
const lt2 = xml.indexOf("<", at2);
|
|
81629
|
-
if (lt2 === -1) {
|
|
81630
|
-
tokens.push({ kind: "text", raw: xml.slice(at2) });
|
|
81631
|
-
break;
|
|
81632
|
-
}
|
|
81633
|
-
if (lt2 > at2) tokens.push({ kind: "text", raw: xml.slice(at2, lt2) });
|
|
81634
|
-
if (xml.startsWith("<!--", lt2)) {
|
|
81635
|
-
const end = xml.indexOf("-->", lt2 + 4);
|
|
81636
|
-
if (end === -1) throw invalid2("unterminated comment", part);
|
|
81637
|
-
tokens.push({ kind: "comment", raw: xml.slice(lt2, end + 3) });
|
|
81638
|
-
at2 = end + 3;
|
|
81639
|
-
} else if (xml.startsWith("<![CDATA[", lt2)) {
|
|
81640
|
-
const end = xml.indexOf("]]>", lt2 + 9);
|
|
81641
|
-
if (end === -1) throw invalid2("unterminated CDATA section", part);
|
|
81642
|
-
tokens.push({ kind: "cdata", raw: xml.slice(lt2, end + 3) });
|
|
81643
|
-
at2 = end + 3;
|
|
81644
|
-
} else if (xml.startsWith("<?", lt2)) {
|
|
81645
|
-
const end = xml.indexOf("?>", lt2 + 2);
|
|
81646
|
-
if (end === -1) throw invalid2("unterminated processing instruction", part);
|
|
81647
|
-
tokens.push({ kind: "pi", raw: xml.slice(lt2, end + 2) });
|
|
81648
|
-
at2 = end + 2;
|
|
81649
|
-
} else if (xml.startsWith("<!", lt2)) {
|
|
81650
|
-
throw invalid2("declarations such as DOCTYPE are not allowed", part);
|
|
81651
|
-
} else {
|
|
81652
|
-
const end = tagEnd(xml, lt2);
|
|
81653
|
-
if (end === -1) throw invalid2("unterminated tag", part);
|
|
81654
|
-
const raw = xml.slice(lt2, end + 1);
|
|
81655
|
-
if (raw[1] === "/") {
|
|
81656
|
-
const name = NAME.exec(raw.slice(2))?.[0];
|
|
81657
|
-
if (!name || raw.slice(2 + name.length, -1).trim() !== "") throw invalid2(`malformed end tag ${raw.slice(0, 40)}`, part);
|
|
81658
|
-
tokens.push({ kind: "close", raw, name });
|
|
81659
|
-
} else {
|
|
81660
|
-
const name = NAME.exec(raw.slice(1))?.[0];
|
|
81661
|
-
if (!name) throw invalid2(`malformed tag ${raw.slice(0, 40)}`, part);
|
|
81662
|
-
tokens.push({ kind: "open", raw, name, selfClosing: raw.endsWith("/>") });
|
|
81663
|
-
}
|
|
81664
|
-
at2 = end + 1;
|
|
81665
|
-
}
|
|
81666
|
-
}
|
|
81667
|
-
return tokens;
|
|
81668
|
-
}
|
|
81669
|
-
function tagEnd(xml, start) {
|
|
81670
|
-
let quote = null;
|
|
81671
|
-
for (let i = start + 1; i < xml.length; i++) {
|
|
81672
|
-
const c = xml[i];
|
|
81673
|
-
if (quote) {
|
|
81674
|
-
if (c === quote) quote = null;
|
|
81675
|
-
} else if (c === '"' || c === "'") quote = c;
|
|
81676
|
-
else if (c === ">") return i;
|
|
81677
|
-
else if (c === "<") return -1;
|
|
81678
|
-
}
|
|
81679
|
-
return -1;
|
|
81680
|
-
}
|
|
81681
|
-
function assertWellFormed(tokens, part) {
|
|
81682
|
-
const stack = [];
|
|
81683
|
-
let roots = 0;
|
|
81684
|
-
for (const token of tokens) {
|
|
81685
|
-
switch (token.kind) {
|
|
81686
|
-
case "open": {
|
|
81687
|
-
checkAttributes(token.raw, part);
|
|
81688
|
-
if (stack.length === 0) roots++;
|
|
81689
|
-
if (!token.selfClosing) stack.push(token.name);
|
|
81690
|
-
break;
|
|
81691
|
-
}
|
|
81692
|
-
case "close": {
|
|
81693
|
-
const open = stack.pop();
|
|
81694
|
-
if (open !== token.name) throw invalid2(`</${token.name}> closes <${open ?? "nothing"}>`, part);
|
|
81695
|
-
break;
|
|
81696
|
-
}
|
|
81697
|
-
case "text":
|
|
81698
|
-
if (stack.length === 0 && token.raw.trim() !== "") throw invalid2("text outside the root element", part);
|
|
81699
|
-
checkText(token.raw, part);
|
|
81700
|
-
break;
|
|
81701
|
-
default:
|
|
81702
|
-
break;
|
|
81703
|
-
}
|
|
81704
|
-
}
|
|
81705
|
-
if (stack.length) throw invalid2(`<${stack.at(-1)}> is not closed`, part);
|
|
81706
|
-
if (roots !== 1) throw invalid2(roots === 0 ? "no root element" : "more than one root element", part);
|
|
81707
|
-
}
|
|
81708
|
-
var FORBIDDEN = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/;
|
|
81709
|
-
var ENTITY = /&(?:#x[0-9A-Fa-f]+|#\d+|amp|lt|gt|quot|apos);/y;
|
|
81710
|
-
function checkText(text2, part) {
|
|
81711
|
-
if (FORBIDDEN.test(text2)) throw invalid2("a character XML does not allow", part);
|
|
81712
|
-
if (text2.includes("<")) throw invalid2("unescaped < in text", part);
|
|
81713
|
-
for (let i = text2.indexOf("&"); i !== -1; i = text2.indexOf("&", i + 1)) {
|
|
81714
|
-
ENTITY.lastIndex = i;
|
|
81715
|
-
if (!ENTITY.test(text2)) throw invalid2(`invalid entity reference near "${text2.slice(i, i + 12)}"`, part);
|
|
81716
|
-
}
|
|
81717
|
-
}
|
|
81718
|
-
function checkAttributes(raw, part) {
|
|
81719
|
-
const body = raw.replace(/^<[^\s/>]+/, "").replace(/\/?>$/, "");
|
|
81720
|
-
const seen = /* @__PURE__ */ new Set();
|
|
81721
|
-
const rest = body.replace(/\s*([\w.:-]+)\s*=\s*("([^"]*)"|'([^']*)')/g, (_m, name, _q, dq, sq) => {
|
|
81722
|
-
if (seen.has(name)) throw invalid2(`duplicate attribute ${name}`, part);
|
|
81723
|
-
seen.add(name);
|
|
81724
|
-
const value = dq ?? sq ?? "";
|
|
81725
|
-
checkText(value, part);
|
|
81726
|
-
return "";
|
|
81727
|
-
});
|
|
81728
|
-
if (rest.trim() !== "") throw invalid2(`malformed attributes in ${raw.slice(0, 40)}`, part);
|
|
81729
|
-
}
|
|
81730
|
-
function decodeText(raw) {
|
|
81731
|
-
return raw.replace(/&(#x[0-9A-Fa-f]+|#\d+|amp|lt|gt|quot|apos);/g, (whole, name) => {
|
|
81732
|
-
switch (name) {
|
|
81733
|
-
case "amp":
|
|
81734
|
-
return "&";
|
|
81735
|
-
case "lt":
|
|
81736
|
-
return "<";
|
|
81737
|
-
case "gt":
|
|
81738
|
-
return ">";
|
|
81739
|
-
case "quot":
|
|
81740
|
-
return '"';
|
|
81741
|
-
case "apos":
|
|
81742
|
-
return "'";
|
|
81743
|
-
default: {
|
|
81744
|
-
const code = name.startsWith("#x") ? parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);
|
|
81745
|
-
return code > 0 && code <= 1114111 ? String.fromCodePoint(code) : whole;
|
|
81746
|
-
}
|
|
81747
|
-
}
|
|
81748
|
-
});
|
|
81749
|
-
}
|
|
81750
|
-
function escapeText(text2) {
|
|
81751
|
-
return text2.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
81752
|
-
}
|
|
81753
|
-
|
|
81754
80989
|
// packages/engine/src/lib/office/drawings.ts
|
|
81755
80990
|
var OPEN = String.fromCharCode(57346);
|
|
81756
80991
|
var CLOSE = String.fromCharCode(57347);
|
|
@@ -81763,597 +80998,8 @@ var officeDrawingLimits = {
|
|
|
81763
80998
|
maxPixels: 2400
|
|
81764
80999
|
};
|
|
81765
81000
|
|
|
81766
|
-
// packages/engine/src/lib/office/fonts.ts
|
|
81767
|
-
var METRIC_COMPATIBLE = {
|
|
81768
|
-
calibri: "Carlito",
|
|
81769
|
-
cambria: "Caladea",
|
|
81770
|
-
arial: "Liberation Sans",
|
|
81771
|
-
helvetica: "Liberation Sans",
|
|
81772
|
-
"times new roman": "Liberation Serif",
|
|
81773
|
-
"courier new": "Liberation Mono"
|
|
81774
|
-
};
|
|
81775
|
-
var THEME_REFERENCES = /^\+(mj|mn)-/;
|
|
81776
|
-
function documentFonts(archive) {
|
|
81777
|
-
const fonts = /* @__PURE__ */ new Map();
|
|
81778
|
-
const add2 = (name, embedded = false) => {
|
|
81779
|
-
const clean = decodeText(name).trim();
|
|
81780
|
-
if (!clean || THEME_REFERENCES.test(clean)) return;
|
|
81781
|
-
const key = clean.toLowerCase();
|
|
81782
|
-
const known = fonts.get(key);
|
|
81783
|
-
fonts.set(key, { name: known?.name ?? clean, embedded: embedded || (known?.embedded ?? false) });
|
|
81784
|
-
};
|
|
81785
|
-
const table2 = archive.get("word/fontTable.xml");
|
|
81786
|
-
if (table2)
|
|
81787
|
-
for (const m2 of readText(table2).matchAll(/<w:font\b[^>]*\bw:name="([^"]*)"[^>]*?(?:\/>|>([\s\S]*?)<\/w:font>)/g))
|
|
81788
|
-
add2(m2[1] ?? "", /<w:embed(?:Regular|Bold|Italic|BoldItalic)\b/.test(m2[2] ?? ""));
|
|
81789
|
-
for (const entry of archive.entries)
|
|
81790
|
-
if (/^(word|ppt)\/theme\/theme\d*\.xml$/.test(entry.name))
|
|
81791
|
-
for (const m2 of readText(entry).matchAll(/<a:(?:major|minor)Font>\s*<a:latin\s+typeface="([^"]*)"/g)) add2(m2[1] ?? "");
|
|
81792
|
-
const presentation = archive.get("ppt/presentation.xml");
|
|
81793
|
-
if (presentation)
|
|
81794
|
-
for (const m2 of readText(presentation).matchAll(/<p:embeddedFont>\s*<p:font\s+typeface="([^"]*)"/g)) add2(m2[1] ?? "", true);
|
|
81795
|
-
return [...fonts.values()].sort((a, b2) => a.name.localeCompare(b2.name));
|
|
81796
|
-
}
|
|
81797
|
-
function fontDiagnostics(fonts, installed, part = "word/fontTable.xml") {
|
|
81798
|
-
const have = new Set(installed.map((f2) => f2.toLowerCase()));
|
|
81799
|
-
const out = [];
|
|
81800
|
-
for (const font of fonts) {
|
|
81801
|
-
const key = font.name.toLowerCase();
|
|
81802
|
-
if (font.embedded || have.has(key)) continue;
|
|
81803
|
-
const substitute = METRIC_COMPATIBLE[key];
|
|
81804
|
-
out.push(
|
|
81805
|
-
substitute && have.has(substitute.toLowerCase()) ? {
|
|
81806
|
-
severity: "info",
|
|
81807
|
-
code: "office-font-substituted",
|
|
81808
|
-
message: `${font.name} is replaced by ${substitute}, which has the same metrics; lines and pages break the same.`,
|
|
81809
|
-
part,
|
|
81810
|
-
paragraph: 1,
|
|
81811
|
-
text: font.name
|
|
81812
|
-
} : {
|
|
81813
|
-
severity: "warning",
|
|
81814
|
-
code: "office-font-substituted",
|
|
81815
|
-
message: `${font.name} is not available to the converter and is replaced, so the PDF can look different. Embed the font in Word (File > Options > Save > Embed fonts in the file).`,
|
|
81816
|
-
part,
|
|
81817
|
-
paragraph: 1,
|
|
81818
|
-
text: font.name
|
|
81819
|
-
}
|
|
81820
|
-
);
|
|
81821
|
-
}
|
|
81822
|
-
return out;
|
|
81823
|
-
}
|
|
81824
|
-
|
|
81825
|
-
// packages/engine/src/lib/office/template-text.ts
|
|
81826
|
-
var TEXT_ELEMENT = { wordprocessing: "w:t", drawing: "a:t" };
|
|
81827
|
-
var CONTAINERS = /* @__PURE__ */ new Set([
|
|
81828
|
-
"w:hyperlink",
|
|
81829
|
-
"w:sdt",
|
|
81830
|
-
"w:sdtContent",
|
|
81831
|
-
"w:ins",
|
|
81832
|
-
"w:del",
|
|
81833
|
-
"w:smartTag",
|
|
81834
|
-
"w:fldSimple",
|
|
81835
|
-
"w:fldChar",
|
|
81836
|
-
"w:instrText",
|
|
81837
|
-
"mc:AlternateContent",
|
|
81838
|
-
"mc:Choice",
|
|
81839
|
-
"mc:Fallback",
|
|
81840
|
-
"w:txbxContent",
|
|
81841
|
-
"w:tbl",
|
|
81842
|
-
"w:tr",
|
|
81843
|
-
"w:tc",
|
|
81844
|
-
"a:tbl",
|
|
81845
|
-
"a:tr",
|
|
81846
|
-
"a:tc"
|
|
81847
|
-
]);
|
|
81848
|
-
var PARAGRAPHS = /* @__PURE__ */ new Set(["w:p", "a:p"]);
|
|
81849
|
-
var OPEN2 = "\uE000";
|
|
81850
|
-
var CLOSE2 = "\uE001";
|
|
81851
|
-
var STRUCTURAL = "ff:tag";
|
|
81852
|
-
function isTextElement(name, textElement) {
|
|
81853
|
-
return name === textElement || name === STRUCTURAL;
|
|
81854
|
-
}
|
|
81855
|
-
function emptyPiece() {
|
|
81856
|
-
return { raw: "", paragraphOpens: 0, paragraphBoundary: false, containerBoundary: false };
|
|
81857
|
-
}
|
|
81858
|
-
function placeholderPattern(nonce) {
|
|
81859
|
-
return new RegExp(`${OPEN2}${nonce}(\\d+)${CLOSE2}`, "g");
|
|
81860
|
-
}
|
|
81861
|
-
function createNonce(random = Math.random) {
|
|
81862
|
-
let nonce = "";
|
|
81863
|
-
for (let i = 0; i < 16; i++) nonce += String.fromCharCode(97 + Math.floor(random() * 26));
|
|
81864
|
-
return nonce;
|
|
81865
|
-
}
|
|
81866
|
-
function toTemplateSource(xml, flavour, nonce, part) {
|
|
81867
|
-
const tokens = tokenize(xml, part);
|
|
81868
|
-
assertWellFormed(tokens, part);
|
|
81869
|
-
const textElement = TEXT_ELEMENT[flavour];
|
|
81870
|
-
const markup = [];
|
|
81871
|
-
let source = "";
|
|
81872
|
-
let pending = emptyPiece();
|
|
81873
|
-
let inText = false;
|
|
81874
|
-
const flush = () => {
|
|
81875
|
-
if (!pending.raw) return;
|
|
81876
|
-
pending.endsInText = inText;
|
|
81877
|
-
source += `${OPEN2}${nonce}${markup.length}${CLOSE2}`;
|
|
81878
|
-
markup.push(pending);
|
|
81879
|
-
pending = emptyPiece();
|
|
81880
|
-
};
|
|
81881
|
-
for (const token of tokens) {
|
|
81882
|
-
if (token.kind === "text" && inText) {
|
|
81883
|
-
flush();
|
|
81884
|
-
source += decodeText(token.raw);
|
|
81885
|
-
continue;
|
|
81886
|
-
}
|
|
81887
|
-
pending.raw += token.raw;
|
|
81888
|
-
if (token.kind === "open" || token.kind === "close") {
|
|
81889
|
-
if (PARAGRAPHS.has(token.name) || token.name === STRUCTURAL) {
|
|
81890
|
-
pending.paragraphBoundary = true;
|
|
81891
|
-
if (token.kind === "open" && !token.selfClosing) pending.paragraphOpens++;
|
|
81892
|
-
} else if (CONTAINERS.has(token.name)) pending.containerBoundary = true;
|
|
81893
|
-
}
|
|
81894
|
-
if (token.kind === "open" && isTextElement(token.name, textElement) && !token.selfClosing) inText = true;
|
|
81895
|
-
else if (token.kind === "close" && isTextElement(token.name, textElement)) inText = false;
|
|
81896
|
-
}
|
|
81897
|
-
flush();
|
|
81898
|
-
return { source, markup, nonce, flavour };
|
|
81899
|
-
}
|
|
81900
|
-
|
|
81901
|
-
// packages/engine/src/lib/office/tags.ts
|
|
81902
|
-
var OPENERS = ["{{", "{%", "{#"];
|
|
81903
|
-
var CLOSERS = { "{{": "}}", "{%": "%}", "{#": "#}" };
|
|
81904
|
-
var AUTOCORRECTED = [
|
|
81905
|
-
[/[“”„‟″]/g, '"'],
|
|
81906
|
-
[/[‘’‚‛′]/g, "'"],
|
|
81907
|
-
[/…/g, "..."],
|
|
81908
|
-
[/[–—]/g, "-"],
|
|
81909
|
-
[/[\u00A0\u202F\u2007]/g, " "],
|
|
81910
|
-
[/\u200B|\u200C|\u200D|\uFEFF/g, ""]
|
|
81911
|
-
];
|
|
81912
|
-
function normaliseTags(template, part) {
|
|
81913
|
-
const { text: text2, origin, placeholders } = stripPlaceholders(template);
|
|
81914
|
-
const sourceRange = (from, to) => [
|
|
81915
|
-
origin[from] ?? template.source.length,
|
|
81916
|
-
(origin[to - 1] ?? template.source.length - 1) + 1
|
|
81917
|
-
];
|
|
81918
|
-
const diagnostics = [];
|
|
81919
|
-
const edits = [];
|
|
81920
|
-
for (const tag of findTags(text2)) {
|
|
81921
|
-
const inside = placeholders.filter((p) => p.at > tag.start && p.at < tag.end);
|
|
81922
|
-
const paragraph = paragraphOf(template, placeholders, tag.start);
|
|
81923
|
-
const raw = text2.slice(tag.start, tag.end);
|
|
81924
|
-
const unsafe = inside.filter((p) => {
|
|
81925
|
-
const piece = template.markup[p.index];
|
|
81926
|
-
return !piece || piece.paragraphBoundary || piece.containerBoundary;
|
|
81927
|
-
});
|
|
81928
|
-
if (unsafe.length) {
|
|
81929
|
-
diagnostics.push({
|
|
81930
|
-
severity: "error",
|
|
81931
|
-
code: "office-tag-spans-elements",
|
|
81932
|
-
message: `The tag ${short(raw)} is split across a paragraph, a link, a field or a tracked change. Retype it in one go.`,
|
|
81933
|
-
part,
|
|
81934
|
-
paragraph,
|
|
81935
|
-
text: short(raw)
|
|
81936
|
-
});
|
|
81937
|
-
continue;
|
|
81938
|
-
}
|
|
81939
|
-
const corrected = undoAutocorrect(raw);
|
|
81940
|
-
if (inside.length || corrected !== raw) {
|
|
81941
|
-
const [from, to] = sourceRange(tag.start, tag.end);
|
|
81942
|
-
edits.push({ from, to, text: corrected });
|
|
81943
|
-
}
|
|
81944
|
-
if (corrected !== raw) {
|
|
81945
|
-
diagnostics.push({
|
|
81946
|
-
severity: "info",
|
|
81947
|
-
code: "office-tag-autocorrected",
|
|
81948
|
-
message: `Word's autocorrect changed quotes or spaces in ${short(corrected)}; they were read as typed.`,
|
|
81949
|
-
part,
|
|
81950
|
-
paragraph,
|
|
81951
|
-
text: short(corrected)
|
|
81952
|
-
});
|
|
81953
|
-
}
|
|
81954
|
-
}
|
|
81955
|
-
const reported = /* @__PURE__ */ new Set();
|
|
81956
|
-
for (const p of placeholders) {
|
|
81957
|
-
const raw = template.markup[p.index]?.raw ?? "";
|
|
81958
|
-
for (const m2 of raw.matchAll(/<w:instrText\b[^>]*>([^<]*)<\/w:instrText>/g)) {
|
|
81959
|
-
const code = decodeEntities(m2[1] ?? "");
|
|
81960
|
-
if (!/\{\{|\{%|\{#/.test(code)) continue;
|
|
81961
|
-
const paragraph = paragraphOf(template, placeholders, p.at);
|
|
81962
|
-
if (reported.has(paragraph)) continue;
|
|
81963
|
-
reported.add(paragraph);
|
|
81964
|
-
diagnostics.push({
|
|
81965
|
-
severity: "warning",
|
|
81966
|
-
code: "office-tag-in-field",
|
|
81967
|
-
message: `The field code ${short(code.trim())} contains a tag, which stays as typed: fields are not filled. Put the tag in the document text instead.`,
|
|
81968
|
-
part,
|
|
81969
|
-
paragraph,
|
|
81970
|
-
text: short(code.trim())
|
|
81971
|
-
});
|
|
81972
|
-
}
|
|
81973
|
-
}
|
|
81974
|
-
return { template: { ...template, source: applyEdits(template.source, edits) }, diagnostics };
|
|
81975
|
-
}
|
|
81976
|
-
var ENTITIES = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
|
|
81977
|
-
function decodeEntities(text2) {
|
|
81978
|
-
return text2.replace(/&(#x[0-9a-f]+|#\d+|amp|lt|gt|quot|apos);/gi, (whole, name) => {
|
|
81979
|
-
if (name[0] !== "#") return ENTITIES[name.toLowerCase()] ?? whole;
|
|
81980
|
-
const code = name[1] === "x" || name[1] === "X" ? parseInt(name.slice(2), 16) : parseInt(name.slice(1), 10);
|
|
81981
|
-
return Number.isFinite(code) ? String.fromCodePoint(code) : whole;
|
|
81982
|
-
});
|
|
81983
|
-
}
|
|
81984
|
-
function stripPlaceholders(template) {
|
|
81985
|
-
const pattern = placeholderPattern(template.nonce);
|
|
81986
|
-
let text2 = "";
|
|
81987
|
-
const origin = [];
|
|
81988
|
-
const placeholders = [];
|
|
81989
|
-
let last = 0;
|
|
81990
|
-
for (const m2 of template.source.matchAll(pattern)) {
|
|
81991
|
-
for (let i = last; i < (m2.index ?? 0); i++) {
|
|
81992
|
-
text2 += template.source[i];
|
|
81993
|
-
origin.push(i);
|
|
81994
|
-
}
|
|
81995
|
-
placeholders.push({ index: Number(m2[1]), at: text2.length, from: m2.index ?? 0, to: (m2.index ?? 0) + m2[0].length });
|
|
81996
|
-
last = (m2.index ?? 0) + m2[0].length;
|
|
81997
|
-
}
|
|
81998
|
-
for (let i = last; i < template.source.length; i++) {
|
|
81999
|
-
text2 += template.source[i];
|
|
82000
|
-
origin.push(i);
|
|
82001
|
-
}
|
|
82002
|
-
return { text: text2, origin, placeholders };
|
|
82003
|
-
}
|
|
82004
|
-
function listTags(template, part) {
|
|
82005
|
-
const { text: text2, placeholders } = stripPlaceholders(template);
|
|
82006
|
-
return findTags(text2).map((tag) => {
|
|
82007
|
-
const raw = text2.slice(tag.start, tag.end);
|
|
82008
|
-
const kind = raw.startsWith("{#") ? "comment" : raw.startsWith("{%") || /^\{\{~?\s*[#/^]/.test(raw) || /^\{\{~?\s*else\b/.test(raw) ? "block" : "output";
|
|
82009
|
-
return { part, paragraph: paragraphOf(template, placeholders, tag.start), text: raw.replace(/\s+/g, " ").trim(), kind };
|
|
82010
|
-
});
|
|
82011
|
-
}
|
|
82012
|
-
function paragraphAtSource(template, offset) {
|
|
82013
|
-
const { origin, placeholders } = stripPlaceholders(template);
|
|
82014
|
-
let at2 = origin.findIndex((o) => o >= offset);
|
|
82015
|
-
if (at2 === -1) at2 = origin.length;
|
|
82016
|
-
return paragraphOf(template, placeholders, at2);
|
|
82017
|
-
}
|
|
82018
|
-
function applyEdits(source, edits) {
|
|
82019
|
-
let out = source;
|
|
82020
|
-
for (const edit of [...edits].sort((a, b2) => b2.from - a.from)) out = out.slice(0, edit.from) + edit.text + out.slice(edit.to);
|
|
82021
|
-
return out;
|
|
82022
|
-
}
|
|
82023
|
-
function undoAutocorrect(tag) {
|
|
82024
|
-
let out = tag;
|
|
82025
|
-
for (const [pattern, replacement] of AUTOCORRECTED) out = out.replace(pattern, replacement);
|
|
82026
|
-
return out;
|
|
82027
|
-
}
|
|
82028
|
-
function findTags(text2) {
|
|
82029
|
-
const tags = [];
|
|
82030
|
-
for (let i = 0; i < text2.length - 1; i++) {
|
|
82031
|
-
const opener = OPENERS.find((o) => text2.startsWith(o, i));
|
|
82032
|
-
if (!opener) continue;
|
|
82033
|
-
const closer = CLOSERS[opener];
|
|
82034
|
-
const end = text2.indexOf(closer, i + opener.length);
|
|
82035
|
-
if (end === -1) continue;
|
|
82036
|
-
const stop = end + closer.length + (opener === "{{" && text2[end + closer.length] === "}" ? 1 : 0);
|
|
82037
|
-
tags.push({ start: i, end: stop });
|
|
82038
|
-
i = stop - 1;
|
|
82039
|
-
}
|
|
82040
|
-
return tags;
|
|
82041
|
-
}
|
|
82042
|
-
function paragraphOf(template, placeholders, at2) {
|
|
82043
|
-
let paragraphs = 0;
|
|
82044
|
-
for (const p of placeholders) {
|
|
82045
|
-
if (p.at > at2) break;
|
|
82046
|
-
paragraphs += template.markup[p.index]?.paragraphOpens ?? 0;
|
|
82047
|
-
}
|
|
82048
|
-
return Math.max(1, paragraphs);
|
|
82049
|
-
}
|
|
82050
|
-
function short(tag) {
|
|
82051
|
-
const oneLine = tag.replace(/\s+/g, " ").trim();
|
|
82052
|
-
return oneLine.length > 60 ? `${oneLine.slice(0, 57)}\u2026` : oneLine;
|
|
82053
|
-
}
|
|
82054
|
-
|
|
82055
|
-
// packages/engine/src/lib/office/structure.ts
|
|
82056
|
-
var STRUCTURAL_ELEMENT = "ff:tag";
|
|
82057
|
-
var PARAGRAPH = /* @__PURE__ */ new Set(["w:p", "a:p"]);
|
|
82058
|
-
var ROW = /* @__PURE__ */ new Set(["w:tr", "a:tr"]);
|
|
82059
|
-
var CELL = /* @__PURE__ */ new Set(["w:tc", "a:tc"]);
|
|
82060
|
-
var BODIES = /* @__PURE__ */ new Set(["w:tc", "w:txbxContent", "p:txBody", "a:txBody"]);
|
|
82061
|
-
var TEXT = /* @__PURE__ */ new Set(["w:t", "a:t"]);
|
|
82062
|
-
var CONTENT = /* @__PURE__ */ new Set(["w:drawing", "w:pict", "w:object", "w:fldChar", "w:fldSimple", "w:br", "w:tab", "w:sym", "a:br", "a:fld", "w:footnoteReference", "w:endnoteReference"]);
|
|
82063
|
-
var JINJA_OPEN = /^(for|if|unless|case|capture|raw|with|macro|call|filter|block|tablerow|comment|autoescape)\b/;
|
|
82064
|
-
var JINJA_CLOSE = /^end(for|if|unless|case|capture|raw|with|macro|call|filter|block|tablerow|comment|autoescape)\b/;
|
|
82065
|
-
var JINJA_MIDDLE = /^(else|elif|elsif|when)\b/;
|
|
82066
|
-
function blockRole(text2) {
|
|
82067
|
-
const t = text2.trim();
|
|
82068
|
-
let m2 = /^\{%-?\s*([\s\S]*?)\s*-?%\}$/.exec(t);
|
|
82069
|
-
if (m2 && !t.slice(2, -2).includes("%}")) {
|
|
82070
|
-
const body = m2[1] ?? "";
|
|
82071
|
-
const word = /^\w+/.exec(body)?.[0] ?? "";
|
|
82072
|
-
if (JINJA_CLOSE.test(body)) return { role: "close", keyword: word.slice(3) };
|
|
82073
|
-
if (JINJA_OPEN.test(body)) return { role: "open", keyword: word };
|
|
82074
|
-
if (JINJA_MIDDLE.test(body)) return { role: "middle", keyword: word };
|
|
82075
|
-
return { role: "single", keyword: word };
|
|
82076
|
-
}
|
|
82077
|
-
if (/^\{#[\s\S]*#\}$/.test(t)) return { role: "single", keyword: "comment" };
|
|
82078
|
-
m2 = /^\{\{~?\s*([#^/]?)\s*([\w.-]*)[\s\S]*?~?\}\}$/.exec(t);
|
|
82079
|
-
if (m2 && t.indexOf("}}") === t.length - 2) {
|
|
82080
|
-
const sigil = m2[1] ?? "";
|
|
82081
|
-
const word = m2[2] ?? "";
|
|
82082
|
-
if (sigil === "#" || sigil === "^" && word) return { role: "open", keyword: word };
|
|
82083
|
-
if (sigil === "/") return { role: "close", keyword: word };
|
|
82084
|
-
if (sigil === "^" && !word || word === "else") return { role: "middle", keyword: "else" };
|
|
82085
|
-
}
|
|
82086
|
-
return null;
|
|
82087
|
-
}
|
|
82088
|
-
var REFERENCES = /* @__PURE__ */ new Set(["w:footnoteReference", "w:endnoteReference", "w:commentRangeStart", "w:commentReference"]);
|
|
82089
|
-
var LOOPS = /* @__PURE__ */ new Set(["for", "each", "tablerow"]);
|
|
82090
|
-
function dropTaggedFallbacks(xml, part) {
|
|
82091
|
-
if (!xml.includes("mc:Fallback")) return xml;
|
|
82092
|
-
const tokens = tokenize(xml, part);
|
|
82093
|
-
let out = "";
|
|
82094
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
82095
|
-
const t = tokens[i];
|
|
82096
|
-
if (t.kind === "open" && t.name === "mc:Fallback" && !t.selfClosing) {
|
|
82097
|
-
let depth = 1;
|
|
82098
|
-
let j2 = i + 1;
|
|
82099
|
-
let text2 = "";
|
|
82100
|
-
for (; j2 < tokens.length && depth > 0; j2++) {
|
|
82101
|
-
const u = tokens[j2];
|
|
82102
|
-
if (u.kind === "open" && u.name === "mc:Fallback" && !u.selfClosing) depth++;
|
|
82103
|
-
else if (u.kind === "close" && u.name === "mc:Fallback") depth--;
|
|
82104
|
-
else if (u.kind === "text") text2 += decodeText(u.raw);
|
|
82105
|
-
}
|
|
82106
|
-
if (/\{\{|\{%|\{#/.test(text2)) {
|
|
82107
|
-
i = j2 - 1;
|
|
82108
|
-
continue;
|
|
82109
|
-
}
|
|
82110
|
-
}
|
|
82111
|
-
out += t.raw;
|
|
82112
|
-
}
|
|
82113
|
-
return out;
|
|
82114
|
-
}
|
|
82115
|
-
function applyStructure(xml, part) {
|
|
82116
|
-
const tokens = tokenize(xml, part);
|
|
82117
|
-
const root = buildSpans(tokens);
|
|
82118
|
-
const paragraphs = collectParagraphs(tokens, root);
|
|
82119
|
-
const diagnostics = [];
|
|
82120
|
-
const structural = /* @__PURE__ */ new Map();
|
|
82121
|
-
for (const info of paragraphs) {
|
|
82122
|
-
if (info.hasContent) continue;
|
|
82123
|
-
const tag = undoAutocorrect(info.text);
|
|
82124
|
-
const role = blockRole(tag);
|
|
82125
|
-
if (role) structural.set(info.span, { info, ...role, tag: tag.trim() });
|
|
82126
|
-
}
|
|
82127
|
-
if (!structural.size) return { xml, diagnostics };
|
|
82128
|
-
const replacedRows = /* @__PURE__ */ new Map();
|
|
82129
|
-
const rowOf = /* @__PURE__ */ new Map();
|
|
82130
|
-
for (const [span, s] of structural) {
|
|
82131
|
-
const cell = ancestor(span, CELL);
|
|
82132
|
-
const row = cell && ancestor(cell, ROW);
|
|
82133
|
-
if (!row) continue;
|
|
82134
|
-
const others = paragraphs.filter((p) => p.span !== span && isInside(p.span, row));
|
|
82135
|
-
if (others.every((p) => p.text.trim() === "" && !p.hasContent)) {
|
|
82136
|
-
replacedRows.set(row, s.tag);
|
|
82137
|
-
rowOf.set(span, row);
|
|
82138
|
-
}
|
|
82139
|
-
}
|
|
82140
|
-
const unitOf = (span) => rowOf.get(span) ?? span;
|
|
82141
|
-
const stack = [];
|
|
82142
|
-
for (const [span, s] of [...structural].sort((a, b2) => a[0].start - b2[0].start)) {
|
|
82143
|
-
const parent = unitOf(span).parent;
|
|
82144
|
-
if (s.role === "open")
|
|
82145
|
-
stack.push({ keyword: s.keyword, parent, paragraph: s.info.number, tag: s.tag, after: unitOf(span).end });
|
|
82146
|
-
else if (s.role === "close" || s.role === "middle") {
|
|
82147
|
-
const open = s.role === "close" ? stack.pop() : stack.at(-1);
|
|
82148
|
-
if (open && s.role === "close" && LOOPS.has(open.keyword)) {
|
|
82149
|
-
const body = tokens.slice(open.after, unitOf(span).start);
|
|
82150
|
-
const reference = body.find((t) => t.kind === "open" && REFERENCES.has(t.name));
|
|
82151
|
-
if (reference && reference.kind === "open")
|
|
82152
|
-
diagnostics.push({
|
|
82153
|
-
severity: "error",
|
|
82154
|
-
code: "office-reference-in-loop",
|
|
82155
|
-
message: `The loop from paragraph ${open.paragraph} repeats a ${reference.name.includes("comment") ? "comment" : "footnote or endnote"}, which cannot be copied. Move it out of the loop.`,
|
|
82156
|
-
part,
|
|
82157
|
-
paragraph: open.paragraph,
|
|
82158
|
-
text: short2(open.tag)
|
|
82159
|
-
});
|
|
82160
|
-
}
|
|
82161
|
-
if (open && open.parent !== parent)
|
|
82162
|
-
diagnostics.push({
|
|
82163
|
-
severity: "error",
|
|
82164
|
-
code: "office-block-unbalanced",
|
|
82165
|
-
message: `${short2(open.tag)} (paragraph ${open.paragraph}) and ${short2(s.tag)} are in different places: one in a table cell or text box, the other outside it. Put both in the same place.`,
|
|
82166
|
-
part,
|
|
82167
|
-
paragraph: s.info.number,
|
|
82168
|
-
text: short2(s.tag)
|
|
82169
|
-
});
|
|
82170
|
-
}
|
|
82171
|
-
}
|
|
82172
|
-
const replacements = [];
|
|
82173
|
-
const element = (tag) => `<${STRUCTURAL_ELEMENT}>${escapeText(tag)}</${STRUCTURAL_ELEMENT}>`;
|
|
82174
|
-
for (const [row, tag] of replacedRows) replacements.push({ start: row.start, end: row.end, text: element(tag) });
|
|
82175
|
-
const cellsEmptied = /* @__PURE__ */ new Map();
|
|
82176
|
-
for (const [span, s] of structural) {
|
|
82177
|
-
if (rowOf.has(span)) continue;
|
|
82178
|
-
const keep = s.info.sectionProperties;
|
|
82179
|
-
let text2 = element(s.tag);
|
|
82180
|
-
if (keep) text2 = s.role === "open" ? `<w:p>${keep}</w:p>${text2}` : `${text2}<w:p>${keep}</w:p>`;
|
|
82181
|
-
replacements.push({ start: span.start, end: span.end, text: text2 });
|
|
82182
|
-
const holder = span.parent && BODIES.has(span.parent.name) ? span.parent : null;
|
|
82183
|
-
if (holder && !keep) cellsEmptied.set(holder, (cellsEmptied.get(holder) ?? 0) + 1);
|
|
82184
|
-
}
|
|
82185
|
-
for (const [holder, emptied] of cellsEmptied) {
|
|
82186
|
-
const total = paragraphs.filter((p) => p.span.parent === holder).length;
|
|
82187
|
-
if (emptied >= total) {
|
|
82188
|
-
const empty = holder.name.startsWith("w:") ? "<w:p/>" : "<a:p/>";
|
|
82189
|
-
replacements.push({ start: holder.end, end: holder.end - 1, text: empty });
|
|
82190
|
-
}
|
|
82191
|
-
}
|
|
82192
|
-
return { xml: rewrite(tokens, replacements), diagnostics };
|
|
82193
|
-
}
|
|
82194
|
-
function buildSpans(tokens) {
|
|
82195
|
-
const root = { name: "#root", start: -1, end: tokens.length, parent: null, children: [] };
|
|
82196
|
-
const stack = [root];
|
|
82197
|
-
tokens.forEach((token, index) => {
|
|
82198
|
-
if (token.kind === "open") {
|
|
82199
|
-
const parent = stack.at(-1);
|
|
82200
|
-
const span = { name: token.name, start: index, end: index, parent, children: [] };
|
|
82201
|
-
parent.children.push(span);
|
|
82202
|
-
if (!token.selfClosing) stack.push(span);
|
|
82203
|
-
} else if (token.kind === "close") {
|
|
82204
|
-
const span = stack.pop();
|
|
82205
|
-
if (span) span.end = index;
|
|
82206
|
-
}
|
|
82207
|
-
});
|
|
82208
|
-
return root;
|
|
82209
|
-
}
|
|
82210
|
-
function collectParagraphs(tokens, root) {
|
|
82211
|
-
const out = [];
|
|
82212
|
-
const walk3 = (span) => {
|
|
82213
|
-
if (PARAGRAPH.has(span.name)) {
|
|
82214
|
-
let text2 = "";
|
|
82215
|
-
let hasContent = false;
|
|
82216
|
-
let sectionProperties = null;
|
|
82217
|
-
let inText = false;
|
|
82218
|
-
for (let i = span.start + 1; i < span.end; i++) {
|
|
82219
|
-
const t = tokens[i];
|
|
82220
|
-
if (t.kind === "open") {
|
|
82221
|
-
if (TEXT.has(t.name) && !t.selfClosing) inText = true;
|
|
82222
|
-
else if (CONTENT.has(t.name)) hasContent = true;
|
|
82223
|
-
else if (t.name === "w:sectPr") sectionProperties = "";
|
|
82224
|
-
} else if (t.kind === "close" && TEXT.has(t.name)) inText = false;
|
|
82225
|
-
else if (t.kind === "text" && inText) text2 += decodeText(t.raw);
|
|
82226
|
-
}
|
|
82227
|
-
if (sectionProperties !== null) sectionProperties = propertiesOf(tokens, span);
|
|
82228
|
-
out.push({ span, number: out.length + 1, text: text2, hasContent, sectionProperties });
|
|
82229
|
-
}
|
|
82230
|
-
for (const child of span.children) walk3(child);
|
|
82231
|
-
};
|
|
82232
|
-
walk3(root);
|
|
82233
|
-
return out;
|
|
82234
|
-
}
|
|
82235
|
-
function propertiesOf(tokens, paragraph) {
|
|
82236
|
-
const props = paragraph.children.find((c) => c.name === "w:pPr");
|
|
82237
|
-
if (!props) return "";
|
|
82238
|
-
return tokens.slice(props.start, props.end + 1).map((t) => t.raw).join("");
|
|
82239
|
-
}
|
|
82240
|
-
function ancestor(span, names) {
|
|
82241
|
-
for (let p = span.parent; p; p = p.parent) if (names.has(p.name)) return p;
|
|
82242
|
-
return null;
|
|
82243
|
-
}
|
|
82244
|
-
function isInside(span, container) {
|
|
82245
|
-
return span.start > container.start && span.end < container.end;
|
|
82246
|
-
}
|
|
82247
|
-
function rewrite(tokens, replacements) {
|
|
82248
|
-
const byStart = /* @__PURE__ */ new Map();
|
|
82249
|
-
for (const r of replacements) {
|
|
82250
|
-
const list2 = byStart.get(r.start) ?? [];
|
|
82251
|
-
list2.push({ end: r.end, text: r.text });
|
|
82252
|
-
byStart.set(r.start, list2);
|
|
82253
|
-
}
|
|
82254
|
-
let out = "";
|
|
82255
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
82256
|
-
const here = byStart.get(i);
|
|
82257
|
-
if (here) {
|
|
82258
|
-
let skipTo = -1;
|
|
82259
|
-
for (const r of here) {
|
|
82260
|
-
out += r.text;
|
|
82261
|
-
if (r.end >= i) skipTo = Math.max(skipTo, r.end);
|
|
82262
|
-
}
|
|
82263
|
-
if (skipTo >= i) {
|
|
82264
|
-
i = skipTo;
|
|
82265
|
-
continue;
|
|
82266
|
-
}
|
|
82267
|
-
}
|
|
82268
|
-
out += tokens[i].raw;
|
|
82269
|
-
}
|
|
82270
|
-
return out;
|
|
82271
|
-
}
|
|
82272
|
-
function short2(tag) {
|
|
82273
|
-
const oneLine = tag.replace(/\s+/g, " ").trim();
|
|
82274
|
-
return oneLine.length > 50 ? `${oneLine.slice(0, 47)}\u2026` : oneLine;
|
|
82275
|
-
}
|
|
82276
|
-
|
|
82277
81001
|
// packages/engine/src/lib/office/render.ts
|
|
82278
81002
|
var OFFICE_FILLED_MAX_BYTES = 50 * 1024 * 1024;
|
|
82279
|
-
var PARTS = {
|
|
82280
|
-
docx: /^word\/(?:document|header\d*|footer\d*|footnotes|endnotes)\.xml$/,
|
|
82281
|
-
pptx: /^ppt\/(?:slides\/slide\d+|notesSlides\/notesSlide\d+)\.xml$/
|
|
82282
|
-
};
|
|
82283
|
-
var FLAVOUR = { docx: "wordprocessing", pptx: "drawing" };
|
|
82284
|
-
var INCLUDES = /\{%-?\s*(?:include|render|extends|import|from)\b|\{\{~?\s*>/;
|
|
82285
|
-
function preparePart(xml, name, format2, random) {
|
|
82286
|
-
const structured = applyStructure(dropTaggedFallbacks(xml, name), name);
|
|
82287
|
-
const normal = normaliseTags(toTemplateSource(structured.xml, FLAVOUR[format2], createNonce(random), name), name);
|
|
82288
|
-
const diagnostics = [...structured.diagnostics, ...normal.diagnostics];
|
|
82289
|
-
const include = INCLUDES.exec(normal.template.source);
|
|
82290
|
-
if (include)
|
|
82291
|
-
diagnostics.push({
|
|
82292
|
-
severity: "error",
|
|
82293
|
-
code: "unsupported-in-office",
|
|
82294
|
-
message: "Office templates cannot include partials; put the content into the document.",
|
|
82295
|
-
part: name,
|
|
82296
|
-
paragraph: paragraphAtSource(normal.template, include.index),
|
|
82297
|
-
text: include[0]
|
|
82298
|
-
});
|
|
82299
|
-
return { template: normal.template, diagnostics };
|
|
82300
|
-
}
|
|
82301
|
-
function openTemplate(file) {
|
|
82302
|
-
const { format: format2, archive } = detectOfficeFormat(file);
|
|
82303
|
-
if (format2 !== "docx" && format2 !== "pptx" || !archive)
|
|
82304
|
-
throw new OfficeError("file_type_unsupported", "Office templates are Word (DOCX) or PowerPoint (PPTX) files");
|
|
82305
|
-
return { format: format2, archive };
|
|
82306
|
-
}
|
|
82307
|
-
function analyzeOffice(file, options) {
|
|
82308
|
-
const { format: format2, archive } = openTemplate(file);
|
|
82309
|
-
const engine = getEngine(options.engine);
|
|
82310
|
-
const registry = defaultHelpers();
|
|
82311
|
-
const tags = [];
|
|
82312
|
-
const diagnostics = [];
|
|
82313
|
-
const variables = /* @__PURE__ */ new Map();
|
|
82314
|
-
for (const entry of archive.entries) {
|
|
82315
|
-
if (!PARTS[format2].test(entry.name)) continue;
|
|
82316
|
-
const xml = readText(entry);
|
|
82317
|
-
if (!/\{\{|\{%|\{#/.test(xml)) continue;
|
|
82318
|
-
const part = preparePart(xml, entry.name, format2);
|
|
82319
|
-
diagnostics.push(...part.diagnostics);
|
|
82320
|
-
tags.push(...listTags(part.template, entry.name));
|
|
82321
|
-
const analysis = engine.analyze(part.template.source, { sampleData: options.sampleData });
|
|
82322
|
-
const lineStarts = [0];
|
|
82323
|
-
for (let i = 0; i < part.template.source.length; i++) if (part.template.source[i] === "\n") lineStarts.push(i + 1);
|
|
82324
|
-
for (const d of analysis.diagnostics) {
|
|
82325
|
-
const offset = (lineStarts[d.range.start.line - 1] ?? 0) + d.range.start.column - 1;
|
|
82326
|
-
const end = (lineStarts[d.range.end.line - 1] ?? 0) + d.range.end.column - 1;
|
|
82327
|
-
diagnostics.push({
|
|
82328
|
-
severity: d.severity,
|
|
82329
|
-
code: d.code,
|
|
82330
|
-
message: d.message,
|
|
82331
|
-
part: entry.name,
|
|
82332
|
-
paragraph: paragraphAtSource(part.template, offset),
|
|
82333
|
-
text: part.template.source.slice(offset, Math.max(offset, end)).replace(placeholderPattern(part.template.nonce), "").slice(0, 60)
|
|
82334
|
-
});
|
|
82335
|
-
}
|
|
82336
|
-
for (const f2 of analysis.filters) {
|
|
82337
|
-
const name = registry.get(f2.name)?.name ?? f2.name;
|
|
82338
|
-
if (!officeUnsupportedHelpers.has(name)) continue;
|
|
82339
|
-
diagnostics.push({
|
|
82340
|
-
severity: "error",
|
|
82341
|
-
code: "unsupported-in-office",
|
|
82342
|
-
message: `${name}() is not supported in office templates; it returns HTML.`,
|
|
82343
|
-
part: entry.name,
|
|
82344
|
-
paragraph: paragraphAtSource(part.template, (lineStarts[f2.range.start.line - 1] ?? 0) + f2.range.start.column - 1),
|
|
82345
|
-
text: f2.name
|
|
82346
|
-
});
|
|
82347
|
-
}
|
|
82348
|
-
for (const v2 of analysis.variables) {
|
|
82349
|
-
const key = `${v2.kind}:${v2.path.join(".")}`;
|
|
82350
|
-
if (!variables.has(key)) variables.set(key, { path: v2.path, kind: v2.kind });
|
|
82351
|
-
}
|
|
82352
|
-
}
|
|
82353
|
-
const fonts = format2 === "docx" ? documentFonts(archive) : [];
|
|
82354
|
-
if (options.installedFonts) diagnostics.push(...fontDiagnostics(fonts, options.installedFonts));
|
|
82355
|
-
return { format: format2, tags, diagnostics, variables: [...variables.values()], fonts };
|
|
82356
|
-
}
|
|
82357
81003
|
|
|
82358
81004
|
// packages/sdk-ts/src/lib/client.ts
|
|
82359
81005
|
var isOfficeInput = (input) => "file" in input;
|
|
@@ -82803,7 +81449,7 @@ var encoder2 = new TextEncoder();
|
|
|
82803
81449
|
// packages/mcp/src/lib/server.ts
|
|
82804
81450
|
import { z as z2 } from "zod";
|
|
82805
81451
|
var CONVERT_LIMIT_BYTES = 20 * 1024 * 1024;
|
|
82806
|
-
var SERVER_INFO = { name: "formfeed", version: "0.3.
|
|
81452
|
+
var SERVER_INFO = { name: "formfeed", version: "0.3.7" };
|
|
82807
81453
|
var engineSchema = z2.enum(["jinja2", "liquid", "handlebars"]);
|
|
82808
81454
|
var outputSchema = z2.enum(outputFormats);
|
|
82809
81455
|
var kindSchema = z2.enum(["pdf", "image", "docx", "pptx"]);
|
|
@@ -82894,7 +81540,7 @@ function createFormfeedServer(options) {
|
|
|
82894
81540
|
"validate_template",
|
|
82895
81541
|
{
|
|
82896
81542
|
title: "Validate a template with data",
|
|
82897
|
-
description: "
|
|
81543
|
+
description: "Checks a template with data without rendering; free. With a template slug the API checks the version a render uses (the published one, else the latest) as the render would: syntax, header and footer, errors that happen only with this data, and the data against the template's stored JSON Schema (a wrong type or a missing required field is an error). With html plus engine it compiles offline and reports syntax errors, unknown filters and variables missing from the data. Warnings leave ok true: treat each one as a question to settle before rendering. For Word and PowerPoint templates the findings name the document part and paragraph.",
|
|
82898
81544
|
inputSchema: {
|
|
82899
81545
|
template: z2.string().optional().describe("Template slug or tpl_ id"),
|
|
82900
81546
|
html: z2.string().optional().describe("Template source when no slug is given"),
|
|
@@ -82905,39 +81551,34 @@ function createFormfeedServer(options) {
|
|
|
82905
81551
|
},
|
|
82906
81552
|
async ({ template, html, engine, data }) => {
|
|
82907
81553
|
try {
|
|
82908
|
-
let source = html;
|
|
82909
|
-
let engineId = engine;
|
|
82910
|
-
let sample = data;
|
|
82911
81554
|
if (template) {
|
|
82912
|
-
const
|
|
82913
|
-
const
|
|
82914
|
-
|
|
82915
|
-
|
|
82916
|
-
|
|
82917
|
-
|
|
82918
|
-
|
|
82919
|
-
|
|
82920
|
-
|
|
82921
|
-
|
|
82922
|
-
|
|
82923
|
-
|
|
82924
|
-
|
|
82925
|
-
}
|
|
82926
|
-
|
|
82927
|
-
|
|
82928
|
-
|
|
82929
|
-
engineId = meta.engine;
|
|
82930
|
-
sample = data ?? version.sample_data ?? {};
|
|
81555
|
+
const check = (version) => client.templates.validate(template, { version, ...data ? { data } : {} });
|
|
81556
|
+
const result = await check("published").catch((e) => {
|
|
81557
|
+
if (e.status === 404) return check("latest");
|
|
81558
|
+
throw e;
|
|
81559
|
+
});
|
|
81560
|
+
return text({
|
|
81561
|
+
ok: result.ok,
|
|
81562
|
+
template: result.template,
|
|
81563
|
+
diagnostics: result.diagnostics.map((d) => ({
|
|
81564
|
+
severity: d.severity,
|
|
81565
|
+
code: d.code,
|
|
81566
|
+
message: d.message,
|
|
81567
|
+
...d.path ? { path: d.path } : {},
|
|
81568
|
+
...d.location ? { line: d.location.line, column: d.location.column } : {},
|
|
81569
|
+
...d.part ? { part: d.part, paragraph: d.paragraph } : {}
|
|
81570
|
+
}))
|
|
81571
|
+
});
|
|
82931
81572
|
}
|
|
82932
|
-
if (!
|
|
82933
|
-
const eng = getEngine(
|
|
81573
|
+
if (!html || !engine) return failure(new Error("Pass a template slug, or html and engine"));
|
|
81574
|
+
const eng = getEngine(engine);
|
|
82934
81575
|
const diagnostics = [];
|
|
82935
81576
|
try {
|
|
82936
|
-
eng.compile(
|
|
81577
|
+
eng.compile(html, { name: "ad-hoc" });
|
|
82937
81578
|
} catch (e) {
|
|
82938
81579
|
diagnostics.push({ severity: "error", code: "syntax-error", message: e instanceof Error ? e.message : String(e), range: { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } } });
|
|
82939
81580
|
}
|
|
82940
|
-
diagnostics.push(...eng.analyze(
|
|
81581
|
+
diagnostics.push(...eng.analyze(html, { sampleData: data ?? {} }).diagnostics);
|
|
82941
81582
|
return text({
|
|
82942
81583
|
ok: !diagnostics.some((d) => d.severity === "error"),
|
|
82943
81584
|
diagnostics: diagnostics.map((d) => ({ severity: d.severity, code: d.code, message: d.message, line: d.range.start.line, column: d.range.start.column }))
|