js.documents 14.4.46 → 14.4.47

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 +2 -2
package/dist/svg/path.cjs CHANGED
@@ -1,5 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/svg/path.ts
3
+ const CUBIC_CONTROL_STEP = 2 / 3;
4
+ const PI_RADIANS_IN_DEGREES = 180;
5
+ const KAPPA_NUMERATOR = 4;
6
+ const KAPPA_DENOMINATOR = 3;
7
+ const KAPPA_ARG_QUARTER = 4;
3
8
  const PATH_NUMBER = /[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?/y;
4
9
  var PathScanner = class {
5
10
  source;
@@ -68,11 +73,11 @@ function addQuad(cursor, acc, control, to) {
68
73
  y: cursor.y
69
74
  };
70
75
  addCubic(cursor, acc, {
71
- x: from.x + 2 / 3 * (control.x - from.x),
72
- y: from.y + 2 / 3 * (control.y - from.y)
76
+ x: from.x + CUBIC_CONTROL_STEP * (control.x - from.x),
77
+ y: from.y + CUBIC_CONTROL_STEP * (control.y - from.y)
73
78
  }, {
74
- x: to.x + 2 / 3 * (control.x - to.x),
75
- y: to.y + 2 / 3 * (control.y - to.y)
79
+ x: to.x + CUBIC_CONTROL_STEP * (control.x - to.x),
80
+ y: to.y + CUBIC_CONTROL_STEP * (control.y - to.y)
76
81
  }, to);
77
82
  cursor.lastQuadControl = control;
78
83
  }
@@ -85,7 +90,7 @@ function addArc(cursor, acc, rx, ry, xRotDeg, largeArc, sweep, to) {
85
90
  if (from.x !== to.x || from.y !== to.y) addLine(cursor, acc, to);
86
91
  return;
87
92
  }
88
- const xRot = xRotDeg * Math.PI / 180;
93
+ const xRot = xRotDeg * Math.PI / PI_RADIANS_IN_DEGREES;
89
94
  const cosRot = Math.cos(xRot);
90
95
  const sinRot = Math.sin(xRot);
91
96
  const dx = (from.x - to.x) / 2;
@@ -120,7 +125,7 @@ function addArc(cursor, acc, rx, ry, xRotDeg, largeArc, sweep, to) {
120
125
  else if (sweep === 1 && deltaTheta < 0) deltaTheta += 2 * Math.PI;
121
126
  const segmentCount = Math.max(1, Math.ceil(Math.abs(deltaTheta) / (Math.PI / 2)));
122
127
  const deltaPerSegment = deltaTheta / segmentCount;
123
- const kappa = 4 / 3 * Math.tan(deltaPerSegment / 4);
128
+ const kappa = KAPPA_NUMERATOR / KAPPA_DENOMINATOR * Math.tan(deltaPerSegment / KAPPA_ARG_QUARTER);
124
129
  const pointAt = (t) => ({
125
130
  x: cx + rx * cosRot * Math.cos(t) - ry * sinRot * Math.sin(t),
126
131
  y: cy + rx * sinRot * Math.cos(t) + ry * cosRot * Math.sin(t)
package/dist/svg/path.js CHANGED
@@ -1,4 +1,9 @@
1
1
  //#region src/svg/path.ts
2
+ const CUBIC_CONTROL_STEP = 2 / 3;
3
+ const PI_RADIANS_IN_DEGREES = 180;
4
+ const KAPPA_NUMERATOR = 4;
5
+ const KAPPA_DENOMINATOR = 3;
6
+ const KAPPA_ARG_QUARTER = 4;
2
7
  const PATH_NUMBER = /[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?/y;
3
8
  var PathScanner = class {
4
9
  source;
@@ -67,11 +72,11 @@ function addQuad(cursor, acc, control, to) {
67
72
  y: cursor.y
68
73
  };
69
74
  addCubic(cursor, acc, {
70
- x: from.x + 2 / 3 * (control.x - from.x),
71
- y: from.y + 2 / 3 * (control.y - from.y)
75
+ x: from.x + CUBIC_CONTROL_STEP * (control.x - from.x),
76
+ y: from.y + CUBIC_CONTROL_STEP * (control.y - from.y)
72
77
  }, {
73
- x: to.x + 2 / 3 * (control.x - to.x),
74
- y: to.y + 2 / 3 * (control.y - to.y)
78
+ x: to.x + CUBIC_CONTROL_STEP * (control.x - to.x),
79
+ y: to.y + CUBIC_CONTROL_STEP * (control.y - to.y)
75
80
  }, to);
76
81
  cursor.lastQuadControl = control;
77
82
  }
@@ -84,7 +89,7 @@ function addArc(cursor, acc, rx, ry, xRotDeg, largeArc, sweep, to) {
84
89
  if (from.x !== to.x || from.y !== to.y) addLine(cursor, acc, to);
85
90
  return;
86
91
  }
87
- const xRot = xRotDeg * Math.PI / 180;
92
+ const xRot = xRotDeg * Math.PI / PI_RADIANS_IN_DEGREES;
88
93
  const cosRot = Math.cos(xRot);
89
94
  const sinRot = Math.sin(xRot);
90
95
  const dx = (from.x - to.x) / 2;
@@ -119,7 +124,7 @@ function addArc(cursor, acc, rx, ry, xRotDeg, largeArc, sweep, to) {
119
124
  else if (sweep === 1 && deltaTheta < 0) deltaTheta += 2 * Math.PI;
120
125
  const segmentCount = Math.max(1, Math.ceil(Math.abs(deltaTheta) / (Math.PI / 2)));
121
126
  const deltaPerSegment = deltaTheta / segmentCount;
122
- const kappa = 4 / 3 * Math.tan(deltaPerSegment / 4);
127
+ const kappa = KAPPA_NUMERATOR / KAPPA_DENOMINATOR * Math.tan(deltaPerSegment / KAPPA_ARG_QUARTER);
123
128
  const pointAt = (t) => ({
124
129
  x: cx + rx * cosRot * Math.cos(t) - ry * sinRot * Math.sin(t),
125
130
  y: cy + rx * sinRot * Math.cos(t) + ry * cosRot * Math.sin(t)
package/dist/svg/read.cjs CHANGED
@@ -6,14 +6,18 @@ const require_svg_transform = require("./transform.cjs");
6
6
  let ooxml_js = require("ooxml.js");
7
7
  let odf_js = require("odf.js");
8
8
  //#region src/svg/read.ts
9
+ const ASPECT_DISPLAY_DECIMALS = 4;
10
+ const ASPECT_COMPARE_TOLERANCE = 1e-6;
9
11
  var SvgMissingRootElementError = class extends Error {
10
12
  constructor() {
11
13
  super("svg text must contain an <svg> root element");
12
14
  this.name = "SvgMissingRootElementError";
13
15
  }
14
16
  };
15
- const DEFAULT_WIDTH_PT = 225;
16
- const DEFAULT_HEIGHT_PT = 112.5;
17
+ const DEFAULT_VIEWPORT_WIDTH_PX = 300;
18
+ const DEFAULT_VIEWPORT_HEIGHT_PX = 150;
19
+ const DEFAULT_WIDTH_PT = DEFAULT_VIEWPORT_WIDTH_PX * require_svg_units.PT_PER_PX;
20
+ const DEFAULT_HEIGHT_PT = DEFAULT_VIEWPORT_HEIGHT_PX * require_svg_units.PT_PER_PX;
17
21
  const KAPPA = 4 / 3 * (Math.SQRT2 - 1);
18
22
  function localName(tag) {
19
23
  return tag.slice(tag.indexOf(":") + 1);
@@ -629,7 +633,7 @@ function resolveRootGeometry(root, state) {
629
633
  if (preserveAspectRatio.trim() !== "none") {
630
634
  const viewBoxAspect = viewBox.width / viewBox.height;
631
635
  const pageAspect = widthPt / heightPt;
632
- if (Math.abs(viewBoxAspect - pageAspect) > 1e-6 * Math.max(viewBoxAspect, pageAspect)) report(state, "svg/preserve-aspect-ratio-stretched", `viewBox aspect ${viewBoxAspect.toFixed(4)} stretched onto page aspect ${pageAspect.toFixed(4)} under preserveAspectRatio="${preserveAspectRatio.trim()}" (letterboxing is out of scope)`);
636
+ if (Math.abs(viewBoxAspect - pageAspect) > ASPECT_COMPARE_TOLERANCE * Math.max(viewBoxAspect, pageAspect)) report(state, "svg/preserve-aspect-ratio-stretched", `viewBox aspect ${viewBoxAspect.toFixed(ASPECT_DISPLAY_DECIMALS)} stretched onto page aspect ${pageAspect.toFixed(ASPECT_DISPLAY_DECIMALS)} under preserveAspectRatio="${preserveAspectRatio.trim()}" (letterboxing is out of scope)`);
633
637
  }
634
638
  const sx = widthPt / viewBox.width;
635
639
  const sy = heightPt / viewBox.height;
package/dist/svg/read.js CHANGED
@@ -1,18 +1,22 @@
1
1
  import { parseSvgDashStyle, parseSvgPaint } from "./paint.js";
2
2
  import { parseSvgPathData } from "./path.js";
3
- import { parseSvgLengthPt, parseSvgUserUnits, parseSvgViewBox } from "./units.js";
3
+ import { PT_PER_PX, parseSvgLengthPt, parseSvgUserUnits, parseSvgViewBox } from "./units.js";
4
4
  import { applyMatrix, composeMatrices, isAxisAligned, isNonReflectingSimilarity, meanScaleFactor, parseSvgTransform, similarityRotationDeg } from "./transform.js";
5
5
  import { decodeEntities } from "ooxml.js";
6
6
  import { parseXml } from "odf.js";
7
7
  //#region src/svg/read.ts
8
+ const ASPECT_DISPLAY_DECIMALS = 4;
9
+ const ASPECT_COMPARE_TOLERANCE = 1e-6;
8
10
  var SvgMissingRootElementError = class extends Error {
9
11
  constructor() {
10
12
  super("svg text must contain an <svg> root element");
11
13
  this.name = "SvgMissingRootElementError";
12
14
  }
13
15
  };
14
- const DEFAULT_WIDTH_PT = 225;
15
- const DEFAULT_HEIGHT_PT = 112.5;
16
+ const DEFAULT_VIEWPORT_WIDTH_PX = 300;
17
+ const DEFAULT_VIEWPORT_HEIGHT_PX = 150;
18
+ const DEFAULT_WIDTH_PT = DEFAULT_VIEWPORT_WIDTH_PX * PT_PER_PX;
19
+ const DEFAULT_HEIGHT_PT = DEFAULT_VIEWPORT_HEIGHT_PX * PT_PER_PX;
16
20
  const KAPPA = 4 / 3 * (Math.SQRT2 - 1);
17
21
  function localName(tag) {
18
22
  return tag.slice(tag.indexOf(":") + 1);
@@ -628,7 +632,7 @@ function resolveRootGeometry(root, state) {
628
632
  if (preserveAspectRatio.trim() !== "none") {
629
633
  const viewBoxAspect = viewBox.width / viewBox.height;
630
634
  const pageAspect = widthPt / heightPt;
631
- if (Math.abs(viewBoxAspect - pageAspect) > 1e-6 * Math.max(viewBoxAspect, pageAspect)) report(state, "svg/preserve-aspect-ratio-stretched", `viewBox aspect ${viewBoxAspect.toFixed(4)} stretched onto page aspect ${pageAspect.toFixed(4)} under preserveAspectRatio="${preserveAspectRatio.trim()}" (letterboxing is out of scope)`);
635
+ if (Math.abs(viewBoxAspect - pageAspect) > ASPECT_COMPARE_TOLERANCE * Math.max(viewBoxAspect, pageAspect)) report(state, "svg/preserve-aspect-ratio-stretched", `viewBox aspect ${viewBoxAspect.toFixed(ASPECT_DISPLAY_DECIMALS)} stretched onto page aspect ${pageAspect.toFixed(ASPECT_DISPLAY_DECIMALS)} under preserveAspectRatio="${preserveAspectRatio.trim()}" (letterboxing is out of scope)`);
632
636
  }
633
637
  const sx = widthPt / viewBox.width;
634
638
  const sy = heightPt / viewBox.height;
@@ -1,5 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/svg/transform.ts
3
+ const PI_RADIANS_IN_DEGREES = 180;
4
+ const SIMILARITY_AXIS_TOLERANCE = 1e-9;
5
+ const ROTATE_WITH_CENTRE_ARGUMENT_COUNT = 3;
6
+ const MATRIX_ARGUMENT_COUNT = 6;
3
7
  const IDENTITY_MATRIX = {
4
8
  a: 1,
5
9
  b: 0,
@@ -43,10 +47,10 @@ function isAxisAligned(m) {
43
47
  function isNonReflectingSimilarity(m) {
44
48
  if (isAxisAligned(m)) return true;
45
49
  if (m.a * m.d - m.b * m.c < 0) return false;
46
- return Math.abs(m.a * m.a + m.b * m.b - (m.c * m.c + m.d * m.d)) < 1e-9;
50
+ return Math.abs(m.a * m.a + m.b * m.b - (m.c * m.c + m.d * m.d)) < SIMILARITY_AXIS_TOLERANCE;
47
51
  }
48
52
  function similarityRotationDeg(m) {
49
- return Math.atan2(m.b, m.a) * 180 / Math.PI;
53
+ return Math.atan2(m.b, m.a) * PI_RADIANS_IN_DEGREES / Math.PI;
50
54
  }
51
55
  const TRANSFORM_NUMBER = /[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?/y;
52
56
  const TRANSFORM_FUNCTIONS = [
@@ -98,8 +102,8 @@ function matrixFromFunction(name, args) {
98
102
  };
99
103
  }
100
104
  case "rotate": {
101
- if (args.length !== 1 && args.length !== 3) return;
102
- const radians = args[0] * Math.PI / 180;
105
+ if (args.length !== 1 && args.length !== ROTATE_WITH_CENTRE_ARGUMENT_COUNT) return;
106
+ const radians = args[0] * Math.PI / PI_RADIANS_IN_DEGREES;
103
107
  const cos = Math.cos(radians);
104
108
  const sin = Math.sin(radians);
105
109
  const rotation = {
@@ -134,7 +138,7 @@ function matrixFromFunction(name, args) {
134
138
  return {
135
139
  a: 1,
136
140
  b: 0,
137
- c: Math.tan(args[0] * Math.PI / 180),
141
+ c: Math.tan(args[0] * Math.PI / PI_RADIANS_IN_DEGREES),
138
142
  d: 1,
139
143
  e: 0,
140
144
  f: 0
@@ -143,14 +147,14 @@ function matrixFromFunction(name, args) {
143
147
  if (args.length !== 1) return;
144
148
  return {
145
149
  a: 1,
146
- b: Math.tan(args[0] * Math.PI / 180),
150
+ b: Math.tan(args[0] * Math.PI / PI_RADIANS_IN_DEGREES),
147
151
  c: 0,
148
152
  d: 1,
149
153
  e: 0,
150
154
  f: 0
151
155
  };
152
156
  case "matrix":
153
- if (args.length !== 6) return;
157
+ if (args.length !== MATRIX_ARGUMENT_COUNT) return;
154
158
  return {
155
159
  a: args[0],
156
160
  b: args[1],
@@ -1,4 +1,8 @@
1
1
  //#region src/svg/transform.ts
2
+ const PI_RADIANS_IN_DEGREES = 180;
3
+ const SIMILARITY_AXIS_TOLERANCE = 1e-9;
4
+ const ROTATE_WITH_CENTRE_ARGUMENT_COUNT = 3;
5
+ const MATRIX_ARGUMENT_COUNT = 6;
2
6
  const IDENTITY_MATRIX = {
3
7
  a: 1,
4
8
  b: 0,
@@ -42,10 +46,10 @@ function isAxisAligned(m) {
42
46
  function isNonReflectingSimilarity(m) {
43
47
  if (isAxisAligned(m)) return true;
44
48
  if (m.a * m.d - m.b * m.c < 0) return false;
45
- return Math.abs(m.a * m.a + m.b * m.b - (m.c * m.c + m.d * m.d)) < 1e-9;
49
+ return Math.abs(m.a * m.a + m.b * m.b - (m.c * m.c + m.d * m.d)) < SIMILARITY_AXIS_TOLERANCE;
46
50
  }
47
51
  function similarityRotationDeg(m) {
48
- return Math.atan2(m.b, m.a) * 180 / Math.PI;
52
+ return Math.atan2(m.b, m.a) * PI_RADIANS_IN_DEGREES / Math.PI;
49
53
  }
50
54
  const TRANSFORM_NUMBER = /[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?/y;
51
55
  const TRANSFORM_FUNCTIONS = [
@@ -97,8 +101,8 @@ function matrixFromFunction(name, args) {
97
101
  };
98
102
  }
99
103
  case "rotate": {
100
- if (args.length !== 1 && args.length !== 3) return;
101
- const radians = args[0] * Math.PI / 180;
104
+ if (args.length !== 1 && args.length !== ROTATE_WITH_CENTRE_ARGUMENT_COUNT) return;
105
+ const radians = args[0] * Math.PI / PI_RADIANS_IN_DEGREES;
102
106
  const cos = Math.cos(radians);
103
107
  const sin = Math.sin(radians);
104
108
  const rotation = {
@@ -133,7 +137,7 @@ function matrixFromFunction(name, args) {
133
137
  return {
134
138
  a: 1,
135
139
  b: 0,
136
- c: Math.tan(args[0] * Math.PI / 180),
140
+ c: Math.tan(args[0] * Math.PI / PI_RADIANS_IN_DEGREES),
137
141
  d: 1,
138
142
  e: 0,
139
143
  f: 0
@@ -142,14 +146,14 @@ function matrixFromFunction(name, args) {
142
146
  if (args.length !== 1) return;
143
147
  return {
144
148
  a: 1,
145
- b: Math.tan(args[0] * Math.PI / 180),
149
+ b: Math.tan(args[0] * Math.PI / PI_RADIANS_IN_DEGREES),
146
150
  c: 0,
147
151
  d: 1,
148
152
  e: 0,
149
153
  f: 0
150
154
  };
151
155
  case "matrix":
152
- if (args.length !== 6) return;
156
+ if (args.length !== MATRIX_ARGUMENT_COUNT) return;
153
157
  return {
154
158
  a: args[0],
155
159
  b: args[1],
@@ -1,9 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/svg/units.ts
3
3
  const PT_PER_PX = .75;
4
- const PT_PER_MM = 72 / 25.4;
5
- const PT_PER_CM = 720 / 25.4;
6
4
  const PT_PER_IN = 72;
5
+ const PT_PER_MM = PT_PER_IN / 25.4;
6
+ const PT_PER_CM = PT_PER_MM * 10;
7
+ const PT_PER_PC = 12;
8
+ const Q_PER_CM = 40;
9
+ const VIEWBOX_COMPONENT_COUNT = 4;
7
10
  const SVG_NUMBER_PATTERN = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/;
8
11
  const SVG_LENGTH_PATTERN = /^([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?)(px|pt|mm|cm|in|pc|q|em|ex|%)?$/;
9
12
  function parseSvgLengthPt(raw) {
@@ -19,8 +22,8 @@ function parseSvgLengthPt(raw) {
19
22
  case "mm": return value * PT_PER_MM;
20
23
  case "cm": return value * PT_PER_CM;
21
24
  case "in": return value * PT_PER_IN;
22
- case "pc": return value * 12;
23
- case "q": return value * PT_PER_CM / 40;
25
+ case "pc": return value * PT_PER_PC;
26
+ case "q": return value * (PT_PER_CM / Q_PER_CM);
24
27
  default: return;
25
28
  }
26
29
  }
@@ -31,7 +34,7 @@ function parseSvgUserUnits(raw) {
31
34
  function parseSvgViewBox(raw) {
32
35
  if (raw === void 0) return;
33
36
  const parts = raw.trim().replace(/,/g, " ").split(/\s+/);
34
- if (parts.length !== 4) return;
37
+ if (parts.length !== VIEWBOX_COMPONENT_COUNT) return;
35
38
  const numbers = parts.map((part) => SVG_NUMBER_PATTERN.test(part) ? Number(part) : NaN);
36
39
  if (!numbers.every((value) => Number.isFinite(value)) || numbers[2] < 0 || numbers[3] < 0) return;
37
40
  return {
@@ -42,6 +45,7 @@ function parseSvgViewBox(raw) {
42
45
  };
43
46
  }
44
47
  //#endregion
48
+ exports.PT_PER_PX = PT_PER_PX;
45
49
  exports.parseSvgLengthPt = parseSvgLengthPt;
46
50
  exports.parseSvgUserUnits = parseSvgUserUnits;
47
51
  exports.parseSvgViewBox = parseSvgViewBox;
@@ -1,4 +1,5 @@
1
1
  //#region src/svg/units.d.ts
2
+ declare const PT_PER_PX = 0.75;
2
3
  declare function parseSvgLengthPt(raw: string | undefined): number | undefined;
3
4
  declare function parseSvgUserUnits(raw: string | undefined): number | undefined;
4
5
  interface SvgViewBox {
@@ -9,4 +10,4 @@ interface SvgViewBox {
9
10
  }
10
11
  declare function parseSvgViewBox(raw: string | undefined): SvgViewBox | undefined;
11
12
  //#endregion
12
- export { SvgViewBox, parseSvgLengthPt, parseSvgUserUnits, parseSvgViewBox };
13
+ export { PT_PER_PX, SvgViewBox, parseSvgLengthPt, parseSvgUserUnits, parseSvgViewBox };
@@ -1,4 +1,5 @@
1
1
  //#region src/svg/units.d.ts
2
+ declare const PT_PER_PX = 0.75;
2
3
  declare function parseSvgLengthPt(raw: string | undefined): number | undefined;
3
4
  declare function parseSvgUserUnits(raw: string | undefined): number | undefined;
4
5
  interface SvgViewBox {
@@ -9,4 +10,4 @@ interface SvgViewBox {
9
10
  }
10
11
  declare function parseSvgViewBox(raw: string | undefined): SvgViewBox | undefined;
11
12
  //#endregion
12
- export { SvgViewBox, parseSvgLengthPt, parseSvgUserUnits, parseSvgViewBox };
13
+ export { PT_PER_PX, SvgViewBox, parseSvgLengthPt, parseSvgUserUnits, parseSvgViewBox };
package/dist/svg/units.js CHANGED
@@ -1,8 +1,11 @@
1
1
  //#region src/svg/units.ts
2
2
  const PT_PER_PX = .75;
3
- const PT_PER_MM = 72 / 25.4;
4
- const PT_PER_CM = 720 / 25.4;
5
3
  const PT_PER_IN = 72;
4
+ const PT_PER_MM = PT_PER_IN / 25.4;
5
+ const PT_PER_CM = PT_PER_MM * 10;
6
+ const PT_PER_PC = 12;
7
+ const Q_PER_CM = 40;
8
+ const VIEWBOX_COMPONENT_COUNT = 4;
6
9
  const SVG_NUMBER_PATTERN = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/;
7
10
  const SVG_LENGTH_PATTERN = /^([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?)(px|pt|mm|cm|in|pc|q|em|ex|%)?$/;
8
11
  function parseSvgLengthPt(raw) {
@@ -18,8 +21,8 @@ function parseSvgLengthPt(raw) {
18
21
  case "mm": return value * PT_PER_MM;
19
22
  case "cm": return value * PT_PER_CM;
20
23
  case "in": return value * PT_PER_IN;
21
- case "pc": return value * 12;
22
- case "q": return value * PT_PER_CM / 40;
24
+ case "pc": return value * PT_PER_PC;
25
+ case "q": return value * (PT_PER_CM / Q_PER_CM);
23
26
  default: return;
24
27
  }
25
28
  }
@@ -30,7 +33,7 @@ function parseSvgUserUnits(raw) {
30
33
  function parseSvgViewBox(raw) {
31
34
  if (raw === void 0) return;
32
35
  const parts = raw.trim().replace(/,/g, " ").split(/\s+/);
33
- if (parts.length !== 4) return;
36
+ if (parts.length !== VIEWBOX_COMPONENT_COUNT) return;
34
37
  const numbers = parts.map((part) => SVG_NUMBER_PATTERN.test(part) ? Number(part) : NaN);
35
38
  if (!numbers.every((value) => Number.isFinite(value)) || numbers[2] < 0 || numbers[3] < 0) return;
36
39
  return {
@@ -41,4 +44,4 @@ function parseSvgViewBox(raw) {
41
44
  };
42
45
  }
43
46
  //#endregion
44
- export { parseSvgLengthPt, parseSvgUserUnits, parseSvgViewBox };
47
+ export { PT_PER_PX, parseSvgLengthPt, parseSvgUserUnits, parseSvgViewBox };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js.documents",
3
- "version": "14.4.46",
3
+ "version": "14.4.47",
4
4
  "description": "Bidirectional docx/pptx <-> PDF conversion and a read+write editable OOXML document model, built on ooxml.js and Zod 4 codecs.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -86,7 +86,7 @@
86
86
  "markdown-codec": "11.1.12",
87
87
  "odf.js": "11.1.12",
88
88
  "ooxml.js": "12.2.26",
89
- "pdf-codec": "5.2.27",
89
+ "pdf-codec": "5.2.28",
90
90
  "ppt-codec": "2.2.19",
91
91
  "rtf-codec": "8.1.20",
92
92
  "temml": "0.13.4",