js.documents 14.4.46 → 14.4.48

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.
Files changed (67) hide show
  1. package/dist/convert/composition.cjs +9 -4
  2. package/dist/convert/composition.js +9 -4
  3. package/dist/convert/variant-bridges.cjs +2 -1
  4. package/dist/convert/variant-bridges.js +2 -1
  5. package/dist/csv/records.cjs +2 -1
  6. package/dist/csv/records.js +2 -1
  7. package/dist/edit/geometry.cjs +2 -1
  8. package/dist/edit/geometry.js +2 -1
  9. package/dist/edit/odg/svg-path.cjs +2 -1
  10. package/dist/edit/odg/svg-path.js +2 -1
  11. package/dist/edit/ods/cell.cjs +2 -1
  12. package/dist/edit/ods/cell.js +2 -1
  13. package/dist/edit/pdf/util.cjs +2 -1
  14. package/dist/edit/pdf/util.js +2 -1
  15. package/dist/firebird/data.cjs +2 -1
  16. package/dist/firebird/data.js +2 -1
  17. package/dist/firebird/date.cjs +40 -21
  18. package/dist/firebird/date.js +40 -21
  19. package/dist/firebird/reader.cjs +30 -19
  20. package/dist/firebird/reader.js +30 -19
  21. package/dist/hsqldb/binary-script.cjs +5 -4
  22. package/dist/hsqldb/binary-script.js +5 -4
  23. package/dist/hsqldb/cache.cjs +4 -2
  24. package/dist/hsqldb/cache.js +4 -2
  25. package/dist/hsqldb/rowformat.cjs +93 -57
  26. package/dist/hsqldb/rowformat.js +93 -57
  27. package/dist/hsqldb/script.cjs +2 -1
  28. package/dist/hsqldb/script.js +2 -1
  29. package/dist/latex/lower.cjs +2 -1
  30. package/dist/latex/lower.js +2 -1
  31. package/dist/latex/rational.cjs +6 -3
  32. package/dist/latex/rational.js +6 -3
  33. package/dist/layout/cell-typing.cjs +7 -3
  34. package/dist/layout/cell-typing.js +7 -3
  35. package/dist/layout/reconstruct.cjs +17 -15
  36. package/dist/layout/reconstruct.js +17 -15
  37. package/dist/layout/shared.cjs +2 -1
  38. package/dist/layout/shared.js +2 -1
  39. package/dist/layout/sheets.cjs +2 -1
  40. package/dist/layout/sheets.js +2 -1
  41. package/dist/mathml/layout.cjs +11 -5
  42. package/dist/mathml/layout.js +11 -5
  43. package/dist/mathml/length.cjs +12 -10
  44. package/dist/mathml/length.js +12 -10
  45. package/dist/mathml/operators.cjs +7 -3
  46. package/dist/mathml/operators.js +7 -3
  47. package/dist/mathml/variant.cjs +116 -1142
  48. package/dist/mathml/variant.js +116 -1142
  49. package/dist/model/bytes.cjs +9 -16
  50. package/dist/model/bytes.js +9 -16
  51. package/dist/model/geometry.cjs +2 -1
  52. package/dist/model/geometry.js +2 -1
  53. package/dist/odb/read.cjs +10 -2
  54. package/dist/odb/read.js +10 -2
  55. package/dist/svg/paint.cjs +177 -749
  56. package/dist/svg/paint.js +177 -749
  57. package/dist/svg/path.cjs +11 -6
  58. package/dist/svg/path.js +11 -6
  59. package/dist/svg/read.cjs +7 -3
  60. package/dist/svg/read.js +8 -4
  61. package/dist/svg/transform.cjs +11 -7
  62. package/dist/svg/transform.js +11 -7
  63. package/dist/svg/units.cjs +9 -5
  64. package/dist/svg/units.d.cts +2 -1
  65. package/dist/svg/units.d.ts +2 -1
  66. package/dist/svg/units.js +9 -6
  67. package/package.json +12 -12
@@ -5,29 +5,46 @@ var HsqldbRowFormatError = class extends Error {
5
5
  this.name = "HsqldbRowFormatError";
6
6
  }
7
7
  };
8
+ const SQL_CHAR = 1;
9
+ const SQL_NUMERIC = 2;
10
+ const SQL_DECIMAL = 3;
11
+ const SQL_INTEGER = 4;
12
+ const SQL_SMALLINT = 5;
13
+ const SQL_FLOAT = 6;
14
+ const SQL_REAL = 7;
15
+ const SQL_DOUBLE = 8;
16
+ const SQL_VARCHAR = 12;
17
+ const SQL_BOOLEAN_BIT = 16;
18
+ const SQL_DATE = 91;
19
+ const SQL_TIME = 92;
20
+ const SQL_TIMESTAMP = 93;
21
+ const SQL_VARCHAR_IGNORECASE = 100;
22
+ const SQL_BIGINT = -5;
23
+ const SQL_TINYINT = -6;
24
+ const SQL_LONGVARCHAR = -1;
8
25
  const SQL_TYPE_NAME_TO_CODE = {
9
- INTEGER: 4,
10
- INT: 4,
11
- IDENTITY: 4,
12
- DOUBLE: 8,
13
- FLOAT: 6,
14
- REAL: 7,
15
- VARCHAR: 12,
16
- CHAR: 1,
17
- CHARACTER: 1,
18
- LONGVARCHAR: -1,
19
- VARCHAR_IGNORECASE: 100,
20
- DATE: 91,
21
- TIME: 92,
22
- TIMESTAMP: 93,
23
- DATETIME: 93,
24
- DECIMAL: 3,
25
- NUMERIC: 2,
26
- BIT: 16,
27
- BOOLEAN: 16,
28
- TINYINT: -6,
29
- SMALLINT: 5,
30
- BIGINT: -5
26
+ INTEGER: SQL_INTEGER,
27
+ INT: SQL_INTEGER,
28
+ IDENTITY: SQL_INTEGER,
29
+ DOUBLE: SQL_DOUBLE,
30
+ FLOAT: SQL_FLOAT,
31
+ REAL: SQL_REAL,
32
+ VARCHAR: SQL_VARCHAR,
33
+ CHAR: SQL_CHAR,
34
+ CHARACTER: SQL_CHAR,
35
+ LONGVARCHAR: SQL_LONGVARCHAR,
36
+ VARCHAR_IGNORECASE: SQL_VARCHAR_IGNORECASE,
37
+ DATE: SQL_DATE,
38
+ TIME: SQL_TIME,
39
+ TIMESTAMP: SQL_TIMESTAMP,
40
+ DATETIME: SQL_TIMESTAMP,
41
+ DECIMAL: SQL_DECIMAL,
42
+ NUMERIC: SQL_NUMERIC,
43
+ BIT: SQL_BOOLEAN_BIT,
44
+ BOOLEAN: SQL_BOOLEAN_BIT,
45
+ TINYINT: SQL_TINYINT,
46
+ SMALLINT: SQL_SMALLINT,
47
+ BIGINT: SQL_BIGINT
31
48
  };
32
49
  const UNSUPPORTED_SQL_TYPE_NAMES = /* @__PURE__ */ new Set([
33
50
  "BINARY",
@@ -85,46 +102,62 @@ var HsqldbDataCursor = class {
85
102
  return slice;
86
103
  }
87
104
  };
105
+ const HIGH_BIT = 128;
106
+ const UTF8_CONTINUATION_MASK = 192;
107
+ const UTF8_TWO_BYTE_LEAD_NIBBLE_LOW = 12;
108
+ const UTF8_TWO_BYTE_LEAD_NIBBLE_HIGH = 13;
109
+ const UTF8_TWO_BYTE_DATA_MASK = 31;
110
+ const UTF8_THREE_BYTE_LEAD_NIBBLE = 14;
111
+ const UTF8_THREE_BYTE_DATA_MASK = 15;
112
+ const UTF8_CONTINUATION_DATA_MASK = 63;
113
+ const UTF8_CONTINUATION_BITS = 6;
114
+ const UTF8_THREE_BYTE_SEQUENCE_LENGTH = 3;
115
+ const HEX_RADIX = 16;
116
+ const NIBBLE_BITS = 4;
88
117
  function readModifiedUtf8(bytes) {
89
118
  let result = "";
90
119
  let i = 0;
91
120
  while (i < bytes.length) {
92
121
  const b0 = bytes[i];
93
122
  if (b0 === void 0) throw new HsqldbRowFormatError("truncated modified-UTF-8 byte sequence");
94
- if (b0 > 0 && b0 < 128) {
123
+ if (b0 > 0 && b0 < HIGH_BIT) {
95
124
  result += String.fromCharCode(b0);
96
125
  i += 1;
97
126
  continue;
98
127
  }
99
- const leadNibble = b0 >> 4;
100
- if (leadNibble === 12 || leadNibble === 13) {
128
+ const leadNibble = b0 >> NIBBLE_BITS;
129
+ if (leadNibble === UTF8_TWO_BYTE_LEAD_NIBBLE_LOW || leadNibble === UTF8_TWO_BYTE_LEAD_NIBBLE_HIGH) {
101
130
  const b1 = bytes[i + 1];
102
- if (b1 === void 0 || (b1 & 192) !== 128) throw new HsqldbRowFormatError("malformed modified-UTF-8 2-byte sequence");
103
- result += String.fromCharCode((b0 & 31) << 6 | b1 & 63);
131
+ if (b1 === void 0 || (b1 & UTF8_CONTINUATION_MASK) !== HIGH_BIT) throw new HsqldbRowFormatError("malformed modified-UTF-8 2-byte sequence");
132
+ result += String.fromCharCode((b0 & UTF8_TWO_BYTE_DATA_MASK) << UTF8_CONTINUATION_BITS | b1 & UTF8_CONTINUATION_DATA_MASK);
104
133
  i += 2;
105
134
  continue;
106
135
  }
107
- if (leadNibble === 14) {
136
+ if (leadNibble === UTF8_THREE_BYTE_LEAD_NIBBLE) {
108
137
  const b1 = bytes[i + 1];
109
138
  const b2 = bytes[i + 2];
110
- if (b1 === void 0 || b2 === void 0 || (b1 & 192) !== 128 || (b2 & 192) !== 128) throw new HsqldbRowFormatError("malformed modified-UTF-8 3-byte sequence");
111
- result += String.fromCharCode((b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63);
112
- i += 3;
139
+ if (b1 === void 0 || b2 === void 0 || (b1 & UTF8_CONTINUATION_MASK) !== HIGH_BIT || (b2 & UTF8_CONTINUATION_MASK) !== HIGH_BIT) throw new HsqldbRowFormatError("malformed modified-UTF-8 3-byte sequence");
140
+ result += String.fromCharCode((b0 & UTF8_THREE_BYTE_DATA_MASK) << 12 | (b1 & UTF8_CONTINUATION_DATA_MASK) << UTF8_CONTINUATION_BITS | b2 & UTF8_CONTINUATION_DATA_MASK);
141
+ i += UTF8_THREE_BYTE_SEQUENCE_LENGTH;
113
142
  continue;
114
143
  }
115
- throw new HsqldbRowFormatError(`malformed modified-UTF-8 lead byte 0x${b0.toString(16)}`);
144
+ throw new HsqldbRowFormatError(`malformed modified-UTF-8 lead byte 0x${b0.toString(HEX_RADIX)}`);
116
145
  }
117
146
  return result;
118
147
  }
148
+ const ZERO_BIGINT = 0n;
149
+ const ONE_BIGINT = 1n;
150
+ const BITS_PER_BYTE = 8;
151
+ const BITS_PER_BYTE_BIGINT = 8n;
119
152
  function signedBigIntFromBytes(bytes) {
120
- if (bytes.length === 0) return 0n;
121
- let magnitude = 0n;
122
- for (const byte of bytes) magnitude = magnitude << 8n | BigInt(byte);
153
+ if (bytes.length === 0) return ZERO_BIGINT;
154
+ let magnitude = ZERO_BIGINT;
155
+ for (const byte of bytes) magnitude = magnitude << BITS_PER_BYTE_BIGINT | BigInt(byte);
123
156
  const firstByte = bytes[0];
124
- return firstByte !== void 0 && (firstByte & 128) !== 0 ? magnitude - (1n << BigInt(8 * bytes.length)) : magnitude;
157
+ return firstByte !== void 0 && (firstByte & HIGH_BIT) !== 0 ? magnitude - (ONE_BIGINT << BigInt(BITS_PER_BYTE * bytes.length)) : magnitude;
125
158
  }
126
159
  function exactDecimalDigits(unscaled, scale) {
127
- const isNegative = unscaled < 0n;
160
+ const isNegative = unscaled < ZERO_BIGINT;
128
161
  const magnitudeDigits = (isNegative ? -unscaled : unscaled).toString();
129
162
  const sign = isNegative ? "-" : "";
130
163
  if (scale <= 0) return `${sign}${magnitudeDigits}${"0".repeat(-scale)}`;
@@ -193,73 +226,76 @@ function calendarFieldsAt(epochMillis, timeZone) {
193
226
  seconds: requiredPart(parts, "second", timeZone)
194
227
  };
195
228
  }
229
+ const MILLIS_PER_SECOND_BIGINT = 1000n;
196
230
  function millisOfSecond(epochMillis) {
197
- return Number((epochMillis % 1000n + 1000n) % 1000n);
231
+ return Number((epochMillis % MILLIS_PER_SECOND_BIGINT + MILLIS_PER_SECOND_BIGINT) % MILLIS_PER_SECOND_BIGINT);
198
232
  }
199
233
  function formatDate(epochMillis, timeZone) {
200
234
  const { year, month, day } = calendarFieldsAt(epochMillis, timeZone);
201
235
  return `${year}-${pad2(month)}-${pad2(day)}`;
202
236
  }
237
+ const MILLIS_DIGIT_WIDTH = 3;
203
238
  function formatTime(epochMillis, timeZone) {
204
239
  const { hours, minutes, seconds } = calendarFieldsAt(epochMillis, timeZone);
205
240
  const base = `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;
206
241
  const millis = millisOfSecond(epochMillis);
207
- return millis === 0 ? base : `${base}.${String(millis).padStart(3, "0")}`;
242
+ return millis === 0 ? base : `${base}.${String(millis).padStart(MILLIS_DIGIT_WIDTH, "0")}`;
208
243
  }
244
+ const NANOS_DIGIT_WIDTH = 9;
209
245
  function formatTimestamp(epochMillis, nanos, timeZone) {
210
246
  const { year, month, day, hours, minutes, seconds } = calendarFieldsAt(epochMillis, timeZone);
211
247
  const base = `${year}-${pad2(month)}-${pad2(day)} ${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;
212
- return nanos === 0 ? base : `${base}.${String(nanos).padStart(9, "0")}`;
248
+ return nanos === 0 ? base : `${base}.${String(nanos).padStart(NANOS_DIGIT_WIDTH, "0")}`;
213
249
  }
214
250
  function readHsqldbColumnValue(cursor, typeCode, options) {
215
251
  if (cursor.readUint8() === 0) return { kind: "empty" };
216
252
  switch (typeCode) {
217
- case 1:
218
- case 12:
219
- case -1:
220
- case 100: {
253
+ case SQL_CHAR:
254
+ case SQL_VARCHAR:
255
+ case SQL_LONGVARCHAR:
256
+ case SQL_VARCHAR_IGNORECASE: {
221
257
  const byteLength = cursor.readInt32();
222
258
  return {
223
259
  kind: "string",
224
260
  value: readModifiedUtf8(cursor.readBytes(byteLength))
225
261
  };
226
262
  }
227
- case 5:
228
- case -6: return {
263
+ case SQL_SMALLINT:
264
+ case SQL_TINYINT: return {
229
265
  kind: "number",
230
266
  value: cursor.readInt16()
231
267
  };
232
- case 4: return {
268
+ case SQL_INTEGER: return {
233
269
  kind: "number",
234
270
  value: cursor.readInt32()
235
271
  };
236
- case -5: return numericCellValue(cursor.readBigInt64(), 0);
237
- case 6:
238
- case 7:
239
- case 8: return {
272
+ case SQL_BIGINT: return numericCellValue(cursor.readBigInt64(), 0);
273
+ case SQL_FLOAT:
274
+ case SQL_REAL:
275
+ case SQL_DOUBLE: return {
240
276
  kind: "number",
241
277
  value: cursor.readFloat64()
242
278
  };
243
- case 2:
244
- case 3: {
279
+ case SQL_NUMERIC:
280
+ case SQL_DECIMAL: {
245
281
  const byteLength = cursor.readInt32();
246
282
  const magnitudeBytes = cursor.readBytes(byteLength);
247
283
  const scale = cursor.readInt32();
248
284
  return numericCellValue(signedBigIntFromBytes(magnitudeBytes), scale);
249
285
  }
250
- case 16: return {
286
+ case SQL_BOOLEAN_BIT: return {
251
287
  kind: "boolean",
252
288
  value: cursor.readUint8() !== 0
253
289
  };
254
- case 91: return {
290
+ case SQL_DATE: return {
255
291
  kind: "date",
256
292
  value: formatDate(cursor.readBigInt64(), options?.timeZone)
257
293
  };
258
- case 92: return {
294
+ case SQL_TIME: return {
259
295
  kind: "time",
260
296
  value: formatTime(cursor.readBigInt64(), options?.timeZone)
261
297
  };
262
- case 93: return {
298
+ case SQL_TIMESTAMP: return {
263
299
  kind: "date",
264
300
  value: formatTimestamp(cursor.readBigInt64(), cursor.readInt32(), options?.timeZone)
265
301
  };
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/hsqldb/script.ts
3
+ const PERCENT_SCALE = 100;
3
4
  var HsqldbScriptParseError = class extends Error {
4
5
  statement;
5
6
  constructor(message, statement) {
@@ -15,7 +16,7 @@ function truncateForMessage(statement) {
15
16
  function displayTextFor(value) {
16
17
  switch (value.kind) {
17
18
  case "number": return String(value.value);
18
- case "percentage": return `${value.value * 100}%`;
19
+ case "percentage": return `${value.value * PERCENT_SCALE}%`;
19
20
  case "currency": return value.currency === void 0 ? String(value.value) : `${value.value} ${value.currency}`;
20
21
  case "boolean": return value.value ? "TRUE" : "FALSE";
21
22
  case "date":
@@ -1,4 +1,5 @@
1
1
  //#region src/hsqldb/script.ts
2
+ const PERCENT_SCALE = 100;
2
3
  var HsqldbScriptParseError = class extends Error {
3
4
  statement;
4
5
  constructor(message, statement) {
@@ -14,7 +15,7 @@ function truncateForMessage(statement) {
14
15
  function displayTextFor(value) {
15
16
  switch (value.kind) {
16
17
  case "number": return String(value.value);
17
- case "percentage": return `${value.value * 100}%`;
18
+ case "percentage": return `${value.value * PERCENT_SCALE}%`;
18
19
  case "currency": return value.currency === void 0 ? String(value.value) : `${value.value} ${value.currency}`;
19
20
  case "boolean": return value.value ? "TRUE" : "FALSE";
20
21
  case "date":
@@ -3,6 +3,7 @@ const require_latex_temml = require("./temml.cjs");
3
3
  const require_latex_symbols = require("./symbols.cjs");
4
4
  const require_latex_rational = require("./rational.cjs");
5
5
  //#region src/latex/lower.ts
6
+ const RELATION_SUBSCRIPT_MIN_NODES = 3;
6
7
  const BINARY_ATOM_OPERATORS = {
7
8
  "+": "math:add",
8
9
  "-": "math:subtract",
@@ -523,7 +524,7 @@ function readBinder(node, context) {
523
524
  const sub = nodesOfScript(node.sub);
524
525
  const sup = nodesOfScript(node.sup);
525
526
  const upper = sup === void 0 ? implicitBound(context) : lowerNodeList(sup, context);
526
- if ((sub?.length ?? 0) >= 3) {
527
+ if ((sub?.length ?? 0) >= RELATION_SUBSCRIPT_MIN_NODES) {
527
528
  const first = sub?.[0];
528
529
  const relation = sub?.[1];
529
530
  const rest = sub?.slice(2) ?? [];
@@ -2,6 +2,7 @@ import { isTemmlNode, parseLatex } from "./temml.js";
2
2
  import { SymbolResolver, glyphOfSymbolText } from "./symbols.js";
3
3
  import { decimalToRational } from "./rational.js";
4
4
  //#region src/latex/lower.ts
5
+ const RELATION_SUBSCRIPT_MIN_NODES = 3;
5
6
  const BINARY_ATOM_OPERATORS = {
6
7
  "+": "math:add",
7
8
  "-": "math:subtract",
@@ -522,7 +523,7 @@ function readBinder(node, context) {
522
523
  const sub = nodesOfScript(node.sub);
523
524
  const sup = nodesOfScript(node.sup);
524
525
  const upper = sup === void 0 ? implicitBound(context) : lowerNodeList(sup, context);
525
- if ((sub?.length ?? 0) >= 3) {
526
+ if ((sub?.length ?? 0) >= RELATION_SUBSCRIPT_MIN_NODES) {
526
527
  const first = sub?.[0];
527
528
  const relation = sub?.[1];
528
529
  const rest = sub?.slice(2) ?? [];
@@ -1,21 +1,24 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/latex/rational.ts
3
+ const BIGINT_ZERO = 0n;
4
+ const BIGINT_ONE = 1n;
5
+ const BIGINT_TEN = 10n;
3
6
  function gcd(a, b) {
4
7
  let x = a;
5
8
  let y = b;
6
- while (y !== 0n) {
9
+ while (y !== BIGINT_ZERO) {
7
10
  const next = x % y;
8
11
  x = y;
9
12
  y = next;
10
13
  }
11
- return x === 0n ? 1n : x;
14
+ return x === BIGINT_ZERO ? BIGINT_ONE : x;
12
15
  }
13
16
  function decimalToRational(literal) {
14
17
  const point = literal.indexOf(".");
15
18
  const digits = point === -1 ? literal : literal.slice(0, point) + literal.slice(point + 1);
16
19
  if (!/^\d+$/.test(digits) || literal.includes(".", point + 1)) return;
17
20
  const denominatorPower = point === -1 ? 0 : literal.length - point - 1;
18
- return reduceRational(BigInt(digits), 10n ** BigInt(denominatorPower));
21
+ return reduceRational(BigInt(digits), BIGINT_TEN ** BigInt(denominatorPower));
19
22
  }
20
23
  function reduceRational(numerator, denominator) {
21
24
  const divisor = gcd(numerator, denominator);
@@ -1,20 +1,23 @@
1
1
  //#region src/latex/rational.ts
2
+ const BIGINT_ZERO = 0n;
3
+ const BIGINT_ONE = 1n;
4
+ const BIGINT_TEN = 10n;
2
5
  function gcd(a, b) {
3
6
  let x = a;
4
7
  let y = b;
5
- while (y !== 0n) {
8
+ while (y !== BIGINT_ZERO) {
6
9
  const next = x % y;
7
10
  x = y;
8
11
  y = next;
9
12
  }
10
- return x === 0n ? 1n : x;
13
+ return x === BIGINT_ZERO ? BIGINT_ONE : x;
11
14
  }
12
15
  function decimalToRational(literal) {
13
16
  const point = literal.indexOf(".");
14
17
  const digits = point === -1 ? literal : literal.slice(0, point) + literal.slice(point + 1);
15
18
  if (!/^\d+$/.test(digits) || literal.includes(".", point + 1)) return;
16
19
  const denominatorPower = point === -1 ? 0 : literal.length - point - 1;
17
- return reduceRational(BigInt(digits), 10n ** BigInt(denominatorPower));
20
+ return reduceRational(BigInt(digits), BIGINT_TEN ** BigInt(denominatorPower));
18
21
  }
19
22
  function reduceRational(numerator, denominator) {
20
23
  const divisor = gcd(numerator, denominator);
@@ -1,5 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/layout/cell-typing.ts
3
+ const YEAR_DIGITS = 4;
4
+ const MONTH_DAY_DIGITS = 2;
5
+ const MONTH_ABBREVIATION_LENGTH = 3;
6
+ const COMMA_GROUP_LENGTH = 4;
3
7
  const CURRENCY_SYMBOLS = /* @__PURE__ */ new Map([
4
8
  ["$", void 0],
5
9
  ["¥", void 0],
@@ -22,7 +26,7 @@ const MONTH_NAMES = new Map([
22
26
  "october",
23
27
  "november",
24
28
  "december"
25
- ].flatMap((name, index) => [[name, index + 1], [name.slice(0, 3), index + 1]]));
29
+ ].flatMap((name, index) => [[name, index + 1], [name.slice(0, MONTH_ABBREVIATION_LENGTH), index + 1]]));
26
30
  const BOOLEAN_LITERALS = /* @__PURE__ */ new Map([["true", true], ["false", false]]);
27
31
  const AMBIGUOUS_BOOLEAN_WORDS = /* @__PURE__ */ new Set([
28
32
  "yes",
@@ -48,7 +52,7 @@ function parseNumericLiteral(text) {
48
52
  if (grouped?.groups !== void 0) {
49
53
  const { sign, lead, groups, fraction } = grouped.groups;
50
54
  if (lead.length > 1 && lead.startsWith("0")) return { declined: "leading-zero-digits" };
51
- if (groups.length / 4 === 1 && fraction === void 0) return { declined: "ambiguous-grouping-separator" };
55
+ if (groups.length / COMMA_GROUP_LENGTH === 1 && fraction === void 0) return { declined: "ambiguous-grouping-separator" };
52
56
  return {
53
57
  canonicalDecimal: `${sign === "-" ? "-" : ""}${lead}${groups.replaceAll(",", "")}${fraction === void 0 ? "" : `.${fraction}`}`,
54
58
  grouped: true
@@ -126,7 +130,7 @@ function isRealCalendarDate(year, month, day) {
126
130
  return probe.getUTCFullYear() === year && probe.getUTCMonth() === month - 1 && probe.getUTCDate() === day;
127
131
  }
128
132
  function isoDateValue(year, month, day) {
129
- return `${String(year).padStart(4, "0")}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
133
+ return `${String(year).padStart(YEAR_DIGITS, "0")}-${String(month).padStart(MONTH_DAY_DIGITS, "0")}-${String(day).padStart(MONTH_DAY_DIGITS, "0")}`;
130
134
  }
131
135
  function inferDate(text) {
132
136
  const iso = ISO_DATE_PATTERN.exec(text);
@@ -1,4 +1,8 @@
1
1
  //#region src/layout/cell-typing.ts
2
+ const YEAR_DIGITS = 4;
3
+ const MONTH_DAY_DIGITS = 2;
4
+ const MONTH_ABBREVIATION_LENGTH = 3;
5
+ const COMMA_GROUP_LENGTH = 4;
2
6
  const CURRENCY_SYMBOLS = /* @__PURE__ */ new Map([
3
7
  ["$", void 0],
4
8
  ["¥", void 0],
@@ -21,7 +25,7 @@ const MONTH_NAMES = new Map([
21
25
  "october",
22
26
  "november",
23
27
  "december"
24
- ].flatMap((name, index) => [[name, index + 1], [name.slice(0, 3), index + 1]]));
28
+ ].flatMap((name, index) => [[name, index + 1], [name.slice(0, MONTH_ABBREVIATION_LENGTH), index + 1]]));
25
29
  const BOOLEAN_LITERALS = /* @__PURE__ */ new Map([["true", true], ["false", false]]);
26
30
  const AMBIGUOUS_BOOLEAN_WORDS = /* @__PURE__ */ new Set([
27
31
  "yes",
@@ -47,7 +51,7 @@ function parseNumericLiteral(text) {
47
51
  if (grouped?.groups !== void 0) {
48
52
  const { sign, lead, groups, fraction } = grouped.groups;
49
53
  if (lead.length > 1 && lead.startsWith("0")) return { declined: "leading-zero-digits" };
50
- if (groups.length / 4 === 1 && fraction === void 0) return { declined: "ambiguous-grouping-separator" };
54
+ if (groups.length / COMMA_GROUP_LENGTH === 1 && fraction === void 0) return { declined: "ambiguous-grouping-separator" };
51
55
  return {
52
56
  canonicalDecimal: `${sign === "-" ? "-" : ""}${lead}${groups.replaceAll(",", "")}${fraction === void 0 ? "" : `.${fraction}`}`,
53
57
  grouped: true
@@ -125,7 +129,7 @@ function isRealCalendarDate(year, month, day) {
125
129
  return probe.getUTCFullYear() === year && probe.getUTCMonth() === month - 1 && probe.getUTCDate() === day;
126
130
  }
127
131
  function isoDateValue(year, month, day) {
128
- return `${String(year).padStart(4, "0")}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
132
+ return `${String(year).padStart(YEAR_DIGITS, "0")}-${String(month).padStart(MONTH_DAY_DIGITS, "0")}-${String(day).padStart(MONTH_DAY_DIGITS, "0")}`;
129
133
  }
130
134
  function inferDate(text) {
131
135
  const iso = ISO_DATE_PATTERN.exec(text);
@@ -20,6 +20,8 @@ const ZERO_MARGINS = {
20
20
  leftPt: 0
21
21
  };
22
22
  const LINE_BASELINE_TOLERANCE_FACTOR = .5;
23
+ const AFM_UNITS_PER_EM = 1e3;
24
+ const HALF_POINT_BUCKET_PT = .5;
23
25
  function sharesBaseline(anchor, item) {
24
26
  return (0, pdf_codec_text_group.runsShareBaseline)(anchor, item, { baselineToleranceEm: LINE_BASELINE_TOLERANCE_FACTOR });
25
27
  }
@@ -151,8 +153,8 @@ function textItemVerticalExtent(item) {
151
153
  const { standardName } = (0, pdf_codec_fonts.resolveStandardFont)(item.font.family, item.font.weight === "bold", item.font.style === "italic");
152
154
  const metrics = pdf_codec_afm_widths.STANDARD_METRICS[standardName];
153
155
  return {
154
- ascentPt: metrics.ascender / 1e3 * item.sizePt,
155
- descentPt: Math.abs(metrics.descender) / 1e3 * item.sizePt
156
+ ascentPt: metrics.ascender / AFM_UNITS_PER_EM * item.sizePt,
157
+ descentPt: Math.abs(metrics.descender) / AFM_UNITS_PER_EM * item.sizePt
156
158
  };
157
159
  }
158
160
  function textItemToContentRun(item) {
@@ -232,7 +234,7 @@ function modeOf(values, bucketSize) {
232
234
  return bestBucket;
233
235
  }
234
236
  function modalLineGap(gaps) {
235
- const counts = bucketCounts(gaps, .5);
237
+ const counts = bucketCounts(gaps, HALF_POINT_BUCKET_PT);
236
238
  let bestBucket = gaps[0];
237
239
  let bestCount = 0;
238
240
  for (const [bucket, count] of counts) if (count > bestCount) {
@@ -245,7 +247,7 @@ const PARAGRAPH_GAP_MULTIPLIER = 1.25;
245
247
  const NOMINAL_LINE_SPACING_RATIO = 1.2;
246
248
  const MIN_LINES_FOR_GAP_MODE = 3;
247
249
  function estimateModalLineSpacing(lines) {
248
- if (lines.length < MIN_LINES_FOR_GAP_MODE) return modeOf(lines.map((l) => l.items[0].sizePt), .5) * NOMINAL_LINE_SPACING_RATIO;
250
+ if (lines.length < MIN_LINES_FOR_GAP_MODE) return modeOf(lines.map((l) => l.items[0].sizePt), HALF_POINT_BUCKET_PT) * NOMINAL_LINE_SPACING_RATIO;
249
251
  const gaps = [];
250
252
  for (let i = 1; i < lines.length; i++) gaps.push(lines[i - 1].baselineY - lines[i].baselineY);
251
253
  return modalLineGap(gaps);
@@ -288,14 +290,14 @@ function dropHiddenLayerContent(doc) {
288
290
  }))
289
291
  };
290
292
  }
291
- const HEADING_LEVELS = /* @__PURE__ */ new Map([
292
- ["H1", 1],
293
- ["H2", 2],
294
- ["H3", 3],
295
- ["H4", 4],
296
- ["H5", 5],
297
- ["H6", 6]
298
- ]);
293
+ const HEADING_LEVELS = new Map([
294
+ "H1",
295
+ "H2",
296
+ "H3",
297
+ "H4",
298
+ "H5",
299
+ "H6"
300
+ ].map((tag, index) => [tag, index + 1]));
299
301
  const DIVISION_TYPES = /* @__PURE__ */ new Set([
300
302
  "Part",
301
303
  "Sect",
@@ -350,10 +352,10 @@ function headingSizeLevels(doc) {
350
352
  const sizes = [];
351
353
  for (const page of doc.pages) for (const item of page.items) if (item.kind === "text" && hasVisibleText(item.text)) sizes.push(item.sizePt);
352
354
  if (sizes.length === 0) return /* @__PURE__ */ new Map();
353
- const bodySizePt = modeOf(sizes, .5);
355
+ const bodySizePt = modeOf(sizes, HALF_POINT_BUCKET_PT);
354
356
  const headingBuckets = /* @__PURE__ */ new Set();
355
357
  for (const size of sizes) {
356
- const bucket = Math.round(size / .5) * .5;
358
+ const bucket = Math.round(size / HALF_POINT_BUCKET_PT) * HALF_POINT_BUCKET_PT;
357
359
  if (bucket - bodySizePt >= HEADING_MIN_SIZE_DELTA_PT) headingBuckets.add(bucket);
358
360
  }
359
361
  const levels = /* @__PURE__ */ new Map();
@@ -363,7 +365,7 @@ function headingSizeLevels(doc) {
363
365
  return levels;
364
366
  }
365
367
  function headingLevelOf(paragraph, levels) {
366
- return levels.get(modeOf(paragraph.lines.flatMap((line) => line.items).filter((item) => hasVisibleText(item.text)).map((item) => item.sizePt), .5));
368
+ return levels.get(modeOf(paragraph.lines.flatMap((line) => line.items).filter((item) => hasVisibleText(item.text)).map((item) => item.sizePt), HALF_POINT_BUCKET_PT));
367
369
  }
368
370
  function samePageSize(a, b) {
369
371
  return a.widthPt === b.widthPt && a.heightPt === b.heightPt;
@@ -19,6 +19,8 @@ const ZERO_MARGINS = {
19
19
  leftPt: 0
20
20
  };
21
21
  const LINE_BASELINE_TOLERANCE_FACTOR = .5;
22
+ const AFM_UNITS_PER_EM = 1e3;
23
+ const HALF_POINT_BUCKET_PT = .5;
22
24
  function sharesBaseline(anchor, item) {
23
25
  return runsShareBaseline(anchor, item, { baselineToleranceEm: LINE_BASELINE_TOLERANCE_FACTOR });
24
26
  }
@@ -150,8 +152,8 @@ function textItemVerticalExtent(item) {
150
152
  const { standardName } = resolveStandardFont(item.font.family, item.font.weight === "bold", item.font.style === "italic");
151
153
  const metrics = STANDARD_METRICS[standardName];
152
154
  return {
153
- ascentPt: metrics.ascender / 1e3 * item.sizePt,
154
- descentPt: Math.abs(metrics.descender) / 1e3 * item.sizePt
155
+ ascentPt: metrics.ascender / AFM_UNITS_PER_EM * item.sizePt,
156
+ descentPt: Math.abs(metrics.descender) / AFM_UNITS_PER_EM * item.sizePt
155
157
  };
156
158
  }
157
159
  function textItemToContentRun(item) {
@@ -231,7 +233,7 @@ function modeOf(values, bucketSize) {
231
233
  return bestBucket;
232
234
  }
233
235
  function modalLineGap(gaps) {
234
- const counts = bucketCounts(gaps, .5);
236
+ const counts = bucketCounts(gaps, HALF_POINT_BUCKET_PT);
235
237
  let bestBucket = gaps[0];
236
238
  let bestCount = 0;
237
239
  for (const [bucket, count] of counts) if (count > bestCount) {
@@ -244,7 +246,7 @@ const PARAGRAPH_GAP_MULTIPLIER = 1.25;
244
246
  const NOMINAL_LINE_SPACING_RATIO = 1.2;
245
247
  const MIN_LINES_FOR_GAP_MODE = 3;
246
248
  function estimateModalLineSpacing(lines) {
247
- if (lines.length < MIN_LINES_FOR_GAP_MODE) return modeOf(lines.map((l) => l.items[0].sizePt), .5) * NOMINAL_LINE_SPACING_RATIO;
249
+ if (lines.length < MIN_LINES_FOR_GAP_MODE) return modeOf(lines.map((l) => l.items[0].sizePt), HALF_POINT_BUCKET_PT) * NOMINAL_LINE_SPACING_RATIO;
248
250
  const gaps = [];
249
251
  for (let i = 1; i < lines.length; i++) gaps.push(lines[i - 1].baselineY - lines[i].baselineY);
250
252
  return modalLineGap(gaps);
@@ -287,14 +289,14 @@ function dropHiddenLayerContent(doc) {
287
289
  }))
288
290
  };
289
291
  }
290
- const HEADING_LEVELS = /* @__PURE__ */ new Map([
291
- ["H1", 1],
292
- ["H2", 2],
293
- ["H3", 3],
294
- ["H4", 4],
295
- ["H5", 5],
296
- ["H6", 6]
297
- ]);
292
+ const HEADING_LEVELS = new Map([
293
+ "H1",
294
+ "H2",
295
+ "H3",
296
+ "H4",
297
+ "H5",
298
+ "H6"
299
+ ].map((tag, index) => [tag, index + 1]));
298
300
  const DIVISION_TYPES = /* @__PURE__ */ new Set([
299
301
  "Part",
300
302
  "Sect",
@@ -349,10 +351,10 @@ function headingSizeLevels(doc) {
349
351
  const sizes = [];
350
352
  for (const page of doc.pages) for (const item of page.items) if (item.kind === "text" && hasVisibleText(item.text)) sizes.push(item.sizePt);
351
353
  if (sizes.length === 0) return /* @__PURE__ */ new Map();
352
- const bodySizePt = modeOf(sizes, .5);
354
+ const bodySizePt = modeOf(sizes, HALF_POINT_BUCKET_PT);
353
355
  const headingBuckets = /* @__PURE__ */ new Set();
354
356
  for (const size of sizes) {
355
- const bucket = Math.round(size / .5) * .5;
357
+ const bucket = Math.round(size / HALF_POINT_BUCKET_PT) * HALF_POINT_BUCKET_PT;
356
358
  if (bucket - bodySizePt >= HEADING_MIN_SIZE_DELTA_PT) headingBuckets.add(bucket);
357
359
  }
358
360
  const levels = /* @__PURE__ */ new Map();
@@ -362,7 +364,7 @@ function headingSizeLevels(doc) {
362
364
  return levels;
363
365
  }
364
366
  function headingLevelOf(paragraph, levels) {
365
- return levels.get(modeOf(paragraph.lines.flatMap((line) => line.items).filter((item) => hasVisibleText(item.text)).map((item) => item.sizePt), .5));
367
+ return levels.get(modeOf(paragraph.lines.flatMap((line) => line.items).filter((item) => hasVisibleText(item.text)).map((item) => item.sizePt), HALF_POINT_BUCKET_PT));
366
368
  }
367
369
  function samePageSize(a, b) {
368
370
  return a.widthPt === b.widthPt && a.heightPt === b.heightPt;
@@ -6,6 +6,7 @@ let document_schema_js = require("document-schema.js");
6
6
  let byte_codec = require("byte-codec");
7
7
  let pdf_codec_layout = require("pdf-codec/layout");
8
8
  //#region src/layout/shared.ts
9
+ const HEX_RADIX = 16;
9
10
  function stampFrame(node, pageIndex, box) {
10
11
  const frame = {
11
12
  pageIndex,
@@ -200,7 +201,7 @@ function decodeImageDimensions(format, bytes) {
200
201
  function registerImage(block, images) {
201
202
  if (block.format === "svg" || block.format === "gif") throw new Error(`registerImage: an image block in ${block.format} format cannot be laid out to PDF — pdf-codec's own LayoutImageAsset registry (and its writer, byte-codec's image encoders) supports png and jpeg only`);
202
203
  const bytes = (0, ooxml_js.base64ToBytes)(block.base64);
203
- const imageId = `img${(0, byte_codec.crc32)(bytes).toString(16)}`;
204
+ const imageId = `img${(0, byte_codec.crc32)(bytes).toString(HEX_RADIX)}`;
204
205
  if (!(imageId in images)) {
205
206
  const { widthPx, heightPx } = decodeImageDimensions(block.format, bytes);
206
207
  images[imageId] = {
@@ -5,6 +5,7 @@ import { COLOR_BLACK, DEFAULT_LAYOUT_FONT, tableCellColumnSpan, walkTableGrid }
5
5
  import { crc32, decodePng, readJpegInfo } from "byte-codec";
6
6
  import { LAYOUT_FORMAT_VERSION } from "pdf-codec/layout";
7
7
  //#region src/layout/shared.ts
8
+ const HEX_RADIX = 16;
8
9
  function stampFrame(node, pageIndex, box) {
9
10
  const frame = {
10
11
  pageIndex,
@@ -199,7 +200,7 @@ function decodeImageDimensions(format, bytes) {
199
200
  function registerImage(block, images) {
200
201
  if (block.format === "svg" || block.format === "gif") throw new Error(`registerImage: an image block in ${block.format} format cannot be laid out to PDF — pdf-codec's own LayoutImageAsset registry (and its writer, byte-codec's image encoders) supports png and jpeg only`);
201
202
  const bytes = base64ToBytes(block.base64);
202
- const imageId = `img${crc32(bytes).toString(16)}`;
203
+ const imageId = `img${crc32(bytes).toString(HEX_RADIX)}`;
203
204
  if (!(imageId in images)) {
204
205
  const { widthPx, heightPx } = decodeImageDimensions(block.format, bytes);
205
206
  images[imageId] = {
@@ -6,6 +6,7 @@ const require_layout_shared = require("./shared.cjs");
6
6
  const require_ports_abort = require("../ports/abort.cjs");
7
7
  let document_schema_js = require("document-schema.js");
8
8
  //#region src/layout/sheets.ts
9
+ const PERCENT_SCALE = 100;
9
10
  function anchoredFormulas(sheet) {
10
11
  const resolved = [];
11
12
  for (const object of sheet.embeddedObjects ?? []) {
@@ -102,7 +103,7 @@ function computeHeaderGutter(printSettings, range, measurer) {
102
103
  };
103
104
  }
104
105
  function resolveScale(printSettings, availableWidthPt, availableHeightPt, totalContentWidthPt, totalContentHeightPt) {
105
- if (printSettings.scalePercent !== void 0) return Math.max(printSettings.scalePercent / 100, MINIMUM_SCALE);
106
+ if (printSettings.scalePercent !== void 0) return Math.max(printSettings.scalePercent / PERCENT_SCALE, MINIMUM_SCALE);
106
107
  if (printSettings.fitToPages !== void 0) {
107
108
  const budgetWidthPt = availableWidthPt * printSettings.fitToPages.width;
108
109
  const budgetHeightPt = availableHeightPt * printSettings.fitToPages.height;