@harbour-enterprises/superdoc 1.17.0-next.22 → 1.17.0-next.26

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 (40) hide show
  1. package/dist/chunks/{DocxZipper-B5QHkGwk.cjs → DocxZipper-B8xyRRbO.cjs} +10 -4
  2. package/dist/chunks/{DocxZipper-CXjNiywL.es.js → DocxZipper-B9Uo1uiZ.es.js} +10 -4
  3. package/dist/chunks/{SuperConverter-Da2sHpq1.es.js → SuperConverter-BTdYC9eH.es.js} +288 -127
  4. package/dist/chunks/{SuperConverter-D7RZNOcI.cjs → SuperConverter-h-dPQ2kg.cjs} +288 -127
  5. package/dist/chunks/{constants-CpniKo9Z.cjs → constants-C-hTr4No.cjs} +24 -0
  6. package/dist/chunks/{constants-DBKi0Amm.es.js → constants-Dw0kAsLd.es.js} +19 -1
  7. package/dist/chunks/{src-nkjmbRm8.es.js → src-C-8JeNgT.es.js} +280 -85
  8. package/dist/chunks/{src-B58kawL4.cjs → src-kYXJzFjl.cjs} +280 -85
  9. package/dist/super-editor/converter.cjs +2 -2
  10. package/dist/super-editor/converter.es.js +2 -2
  11. package/dist/super-editor/docx-zipper.cjs +2 -2
  12. package/dist/super-editor/docx-zipper.es.js +2 -2
  13. package/dist/super-editor/src/core/DocxZipper.d.ts.map +1 -1
  14. package/dist/super-editor/src/core/super-converter/helpers.d.ts.map +1 -1
  15. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/decode-image-node-helpers.d.ts.map +1 -1
  16. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/encode-image-node-helpers.d.ts +1 -1
  17. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/encode-image-node-helpers.d.ts.map +1 -1
  18. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/rtfjs/emfjs/Bitmap.d.ts +1 -0
  19. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/rtfjs/emfjs/Bitmap.d.ts.map +1 -1
  20. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/rtfjs/emfjs/EMFRecords.d.ts +2 -0
  21. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/rtfjs/emfjs/EMFRecords.d.ts.map +1 -1
  22. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/rtfjs/emfjs/GDIContext.d.ts +3 -0
  23. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/rtfjs/emfjs/GDIContext.d.ts.map +1 -1
  24. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/rtfjs/emfjs/Renderer.d.ts.map +1 -1
  25. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/vector-shape-helpers.d.ts +15 -0
  26. package/dist/super-editor/src/core/super-converter/v3/handlers/wp/helpers/vector-shape-helpers.d.ts.map +1 -1
  27. package/dist/super-editor/src/extensions/comment/comments-plugin.d.ts.map +1 -1
  28. package/dist/super-editor/src/extensions/image/image.d.ts.map +1 -1
  29. package/dist/super-editor/src/extensions/run/wrapTextInRunsPlugin.d.ts.map +1 -1
  30. package/dist/super-editor/src/extensions/shape-group/ShapeGroupView.d.ts.map +1 -1
  31. package/dist/super-editor/src/extensions/track-changes/track-changes.d.ts.map +1 -1
  32. package/dist/super-editor/src/extensions/vector-shape/vector-shape.d.ts.map +1 -1
  33. package/dist/super-editor.cjs +4 -4
  34. package/dist/super-editor.es.js +4 -4
  35. package/dist/superdoc/src/stores/comments-store.d.ts.map +1 -1
  36. package/dist/superdoc.cjs +15 -7
  37. package/dist/superdoc.es.js +15 -7
  38. package/dist/superdoc.umd.js +602 -214
  39. package/dist/superdoc.umd.js.map +1 -1
  40. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-Dp2H1eGw.cjs");
2
2
  const require_jszip = require("./jszip-DCT9QYaK.cjs");
3
3
  const require_xml_js = require("./xml-js--DznO7Gk.cjs");
4
- const require_constants = require("./constants-CpniKo9Z.cjs");
4
+ const require_constants = require("./constants-C-hTr4No.cjs");
5
5
  const DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
6
6
  const PDF = "application/pdf";
7
7
  const HTML = "text/html";
@@ -1477,8 +1477,8 @@ var DocxZipper = class {
1477
1477
  this.mediaFiles[name] = fileBase64;
1478
1478
  } else {
1479
1479
  const fileBase64 = await zipEntry.async("base64");
1480
- const extension = this.getFileExtension(name)?.toLowerCase();
1481
- if (new Set([
1480
+ let extension = this.getFileExtension(name)?.toLowerCase();
1481
+ const imageTypes = new Set([
1482
1482
  "png",
1483
1483
  "jpg",
1484
1484
  "jpeg",
@@ -1489,7 +1489,13 @@ var DocxZipper = class {
1489
1489
  "wmf",
1490
1490
  "svg",
1491
1491
  "webp"
1492
- ]).has(extension)) {
1492
+ ]);
1493
+ let detectedType = null;
1494
+ if (!imageTypes.has(extension) || extension === "tmp") {
1495
+ detectedType = require_constants.detectImageType(fileBase64);
1496
+ if (detectedType) extension = detectedType;
1497
+ }
1498
+ if (imageTypes.has(extension)) {
1493
1499
  this.mediaFiles[name] = `data:image/${extension};base64,${fileBase64}`;
1494
1500
  const blob = await zipEntry.async("blob");
1495
1501
  const fileObj = new File([blob], name, { type: blob.type });
@@ -1,7 +1,7 @@
1
1
  import { o as __toESM } from "./rolldown-runtime-B2q5OVn9.es.js";
2
2
  import { t as require_jszip_min } from "./jszip-ChlR43oI.es.js";
3
3
  import { t as require_lib } from "./xml-js-DLE8mr0n.es.js";
4
- import { m as getContentTypesFromXml, o as base64ToUint8Array, t as COMMENT_FILE_BASENAMES } from "./constants-DBKi0Amm.es.js";
4
+ import { d as detectImageType, h as getContentTypesFromXml, o as base64ToUint8Array, t as COMMENT_FILE_BASENAMES } from "./constants-Dw0kAsLd.es.js";
5
5
  const DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
6
6
  const PDF = "application/pdf";
7
7
  const HTML = "text/html";
@@ -1477,8 +1477,8 @@ var DocxZipper = class {
1477
1477
  this.mediaFiles[name] = fileBase64;
1478
1478
  } else {
1479
1479
  const fileBase64 = await zipEntry.async("base64");
1480
- const extension = this.getFileExtension(name)?.toLowerCase();
1481
- if (new Set([
1480
+ let extension = this.getFileExtension(name)?.toLowerCase();
1481
+ const imageTypes = new Set([
1482
1482
  "png",
1483
1483
  "jpg",
1484
1484
  "jpeg",
@@ -1489,7 +1489,13 @@ var DocxZipper = class {
1489
1489
  "wmf",
1490
1490
  "svg",
1491
1491
  "webp"
1492
- ]).has(extension)) {
1492
+ ]);
1493
+ let detectedType = null;
1494
+ if (!imageTypes.has(extension) || extension === "tmp") {
1495
+ detectedType = detectImageType(fileBase64);
1496
+ if (detectedType) extension = detectedType;
1497
+ }
1498
+ if (imageTypes.has(extension)) {
1493
1499
  this.mediaFiles[name] = `data:image/${extension};base64,${fileBase64}`;
1494
1500
  const blob = await zipEntry.async("blob");
1495
1501
  const fileObj = new File([blob], name, { type: blob.type });
@@ -2,7 +2,7 @@ import { o as __toESM, r as __export, t as __commonJSMin } from "./rolldown-runt
2
2
  import { a as init_dist, i as global } from "./jszip-ChlR43oI.es.js";
3
3
  import { t as require_lib } from "./xml-js-DLE8mr0n.es.js";
4
4
  import { t as v4_default } from "./uuid-2IzDu5nl.es.js";
5
- import { A as resolveOpcTargetPath, C as objToPolygon, D as pointsToTwips, E as pixelsToTwips, F as twipsToLines, I as twipsToPixels, L as twipsToPt, M as rgbToHex, N as rotToDegrees, O as polygonToObj, P as twipsToInches, S as normalizeHexColor, T as pixelsToEmu, _ as halfPointToPoints, a as HYPERLINK_RELATIONSHIP_TYPE, b as isValidHexColor, d as eighthPointsToPixels, f as emuToPixels, g as getHexColorFromDocxSystem, h as getDocxHighlightKeywordFromHex, i as HEADER_RELATIONSHIP_TYPE, j as resolveShadingFillColor, k as ptToTwips, l as degreesToRot, n as COMMENT_RELATIONSHIP_TYPES, o as base64ToUint8Array, p as getArrayBufferFromUrl, r as FOOTER_RELATIONSHIP_TYPE, s as computeCrc32Hex, t as COMMENT_FILE_BASENAMES, u as deobfuscateFont, w as pixelsToEightPoints, x as linesToTwips, y as inchesToTwips } from "./constants-DBKi0Amm.es.js";
5
+ import { A as ptToTwips, C as normalizeHexColor, D as pixelsToTwips, E as pixelsToEmu, F as twipsToInches, I as twipsToLines, L as twipsToPixels, M as resolveShadingFillColor, N as rgbToHex, O as pointsToTwips, P as rotToDegrees, R as twipsToPt, S as linesToTwips, T as pixelsToEightPoints, _ as getHexColorFromDocxSystem, a as HYPERLINK_RELATIONSHIP_TYPE, b as inchesToTwips, f as eighthPointsToPixels, g as getDocxHighlightKeywordFromHex, i as HEADER_RELATIONSHIP_TYPE, j as resolveOpcTargetPath, k as polygonToObj, l as degreesToRot, m as getArrayBufferFromUrl, n as COMMENT_RELATIONSHIP_TYPES, o as base64ToUint8Array, p as emuToPixels, r as FOOTER_RELATIONSHIP_TYPE, s as computeCrc32Hex, t as COMMENT_FILE_BASENAMES, u as deobfuscateFont, v as halfPointToPoints, w as objToPolygon, x as isValidHexColor } from "./constants-Dw0kAsLd.es.js";
6
6
  import { t as unified } from "./unified-BRHLwnjP.es.js";
7
7
  import { r as stringifyPosition } from "./lib-HnbxUP96.es.js";
8
8
  import { s as toString } from "./lib-DAB30bX1.es.js";
@@ -10901,6 +10901,54 @@ function extractFillColor(spPr, style) {
10901
10901
  }
10902
10902
  return null;
10903
10903
  }
10904
+ function extractCustomGeometry(spPr) {
10905
+ const custGeom = spPr?.elements?.find((el) => el.name === "a:custGeom");
10906
+ if (!custGeom) return null;
10907
+ const pathLst = custGeom.elements?.find((el) => el.name === "a:pathLst");
10908
+ if (!pathLst?.elements) return null;
10909
+ const paths = pathLst.elements.filter((el) => el.name === "a:path").map((pathEl) => {
10910
+ const w = parseInt(pathEl.attributes?.["w"] || "0", 10);
10911
+ const h = parseInt(pathEl.attributes?.["h"] || "0", 10);
10912
+ return {
10913
+ d: convertDrawingMLPathToSvg(pathEl),
10914
+ w,
10915
+ h
10916
+ };
10917
+ }).filter((p) => p.d);
10918
+ if (paths.length === 0) return null;
10919
+ return { paths };
10920
+ }
10921
+ function convertDrawingMLPathToSvg(pathEl) {
10922
+ if (!pathEl?.elements) return "";
10923
+ const parts = [];
10924
+ for (const cmd of pathEl.elements) switch (cmd.name) {
10925
+ case "a:moveTo": {
10926
+ const pt = cmd.elements?.find((el) => el.name === "a:pt");
10927
+ if (pt) parts.push(`M ${pt.attributes?.["x"] || 0} ${pt.attributes?.["y"] || 0}`);
10928
+ break;
10929
+ }
10930
+ case "a:lnTo": {
10931
+ const pt = cmd.elements?.find((el) => el.name === "a:pt");
10932
+ if (pt) parts.push(`L ${pt.attributes?.["x"] || 0} ${pt.attributes?.["y"] || 0}`);
10933
+ break;
10934
+ }
10935
+ case "a:cubicBezTo": {
10936
+ const pts = cmd.elements?.filter((el) => el.name === "a:pt") || [];
10937
+ if (pts.length === 3) parts.push(`C ${pts[0].attributes?.["x"] || 0} ${pts[0].attributes?.["y"] || 0} ${pts[1].attributes?.["x"] || 0} ${pts[1].attributes?.["y"] || 0} ${pts[2].attributes?.["x"] || 0} ${pts[2].attributes?.["y"] || 0}`);
10938
+ break;
10939
+ }
10940
+ case "a:quadBezTo": {
10941
+ const pts = cmd.elements?.filter((el) => el.name === "a:pt") || [];
10942
+ if (pts.length === 2) parts.push(`Q ${pts[0].attributes?.["x"] || 0} ${pts[0].attributes?.["y"] || 0} ${pts[1].attributes?.["x"] || 0} ${pts[1].attributes?.["y"] || 0}`);
10943
+ break;
10944
+ }
10945
+ case "a:close":
10946
+ parts.push("Z");
10947
+ break;
10948
+ default: break;
10949
+ }
10950
+ return parts.join(" ");
10951
+ }
10904
10952
  function extractGradientFill(gradFill) {
10905
10953
  const gradient = {
10906
10954
  type: "gradient",
@@ -11519,6 +11567,155 @@ var Blob$2 = class Blob$2 {
11519
11567
  return ret;
11520
11568
  }
11521
11569
  };
11570
+ var BitmapCoreHeader$1 = class {
11571
+ constructor(reader, skipsize) {
11572
+ if (skipsize) reader.skip(4);
11573
+ this.width = reader.readUint16();
11574
+ this.height = reader.readUint16();
11575
+ this.planes = reader.readUint16();
11576
+ this.bitcount = reader.readUint16();
11577
+ }
11578
+ colors() {
11579
+ return this.bitcount <= 8 ? 1 << this.bitcount : 0;
11580
+ }
11581
+ };
11582
+ var BitmapInfoHeader$1 = class {
11583
+ constructor(reader, skipsize) {
11584
+ if (skipsize) reader.skip(4);
11585
+ this.width = reader.readInt32();
11586
+ this.height = reader.readInt32();
11587
+ this.planes = reader.readUint16();
11588
+ this.bitcount = reader.readUint16();
11589
+ this.compression = reader.readUint32();
11590
+ this.sizeimage = reader.readUint32();
11591
+ this.xpelspermeter = reader.readInt32();
11592
+ this.ypelspermeter = reader.readInt32();
11593
+ this.clrused = reader.readUint32();
11594
+ this.clrimportant = reader.readUint32();
11595
+ }
11596
+ colors() {
11597
+ if (this.clrused !== 0) return this.clrused < 256 ? this.clrused : 256;
11598
+ else return this.bitcount > 8 ? 0 : 1 << this.bitcount;
11599
+ }
11600
+ };
11601
+ var BitmapInfo$1 = class {
11602
+ constructor(reader, usergb) {
11603
+ this._usergb = usergb;
11604
+ const hdrsize = reader.readUint32();
11605
+ this._infosize = hdrsize;
11606
+ if (hdrsize === Helper$1.GDI.BITMAPCOREHEADER_SIZE) {
11607
+ this._header = new BitmapCoreHeader$1(reader, false);
11608
+ this._infosize += this._header.colors() * (usergb ? 3 : 2);
11609
+ } else {
11610
+ this._header = new BitmapInfoHeader$1(reader, false);
11611
+ const masks = this._header.compression === Helper$1.GDI.BitmapCompression.BI_BITFIELDS ? 3 : 0;
11612
+ if (hdrsize <= Helper$1.GDI.BITMAPINFOHEADER_SIZE + masks * 4) this._infosize = Helper$1.GDI.BITMAPINFOHEADER_SIZE + masks * 4;
11613
+ this._infosize += this._header.colors() * (usergb ? 4 : 2);
11614
+ }
11615
+ }
11616
+ getWidth() {
11617
+ return this._header.width;
11618
+ }
11619
+ getHeight() {
11620
+ return Math.abs(this._header.height);
11621
+ }
11622
+ infosize() {
11623
+ return this._infosize;
11624
+ }
11625
+ header() {
11626
+ return this._header;
11627
+ }
11628
+ };
11629
+ var DIBitmap$1 = class {
11630
+ constructor(reader, bitmapInfo) {
11631
+ this._reader = reader;
11632
+ this._offset = reader.pos;
11633
+ this._location = bitmapInfo;
11634
+ this._info = new BitmapInfo$1(reader, true);
11635
+ }
11636
+ getWidth() {
11637
+ return this._info.getWidth();
11638
+ }
11639
+ getHeight() {
11640
+ return this._info.getHeight();
11641
+ }
11642
+ totalSize() {
11643
+ return this._location.header.size + this._location.data.size;
11644
+ }
11645
+ makeBitmapFileHeader() {
11646
+ const buf = /* @__PURE__ */ new ArrayBuffer(14);
11647
+ const view = new Uint8Array(buf);
11648
+ view[0] = 66;
11649
+ view[1] = 77;
11650
+ Helper$1._writeUint32Val(view, 2, this.totalSize() + 14);
11651
+ Helper$1._writeUint32Val(view, 10, this._info.infosize() + 14);
11652
+ return Helper$1._blobToBinary(view);
11653
+ }
11654
+ convertToPNG(bitmapData, width, height, hasAlpha) {
11655
+ const canvas = document.createElement("canvas");
11656
+ canvas.width = width;
11657
+ canvas.height = Math.abs(height);
11658
+ const ctx = canvas.getContext("2d");
11659
+ if (!ctx) throw new Error("Unable to get canvas context for PNG conversion");
11660
+ const imageData = ctx.createImageData(width, Math.abs(height));
11661
+ const pixels = imageData.data;
11662
+ const rowSize = width * 32 + 31 >>> 5 << 2;
11663
+ const absHeight = Math.abs(height);
11664
+ const topDown = height < 0;
11665
+ let alphaUsed = false;
11666
+ if (hasAlpha) for (let y = 0; y < absHeight && !alphaUsed; y++) {
11667
+ const srcY = topDown ? y : absHeight - 1 - y;
11668
+ for (let x = 0; x < width && !alphaUsed; x++) if (bitmapData[srcY * rowSize + x * 4 + 3] > 0) alphaUsed = true;
11669
+ }
11670
+ for (let y = 0; y < absHeight; y++) {
11671
+ const srcY = topDown ? y : absHeight - 1 - y;
11672
+ for (let x = 0; x < width; x++) {
11673
+ const srcOffset = srcY * rowSize + x * 4;
11674
+ const dstOffset = (y * width + x) * 4;
11675
+ pixels[dstOffset] = bitmapData[srcOffset + 2];
11676
+ pixels[dstOffset + 1] = bitmapData[srcOffset + 1];
11677
+ pixels[dstOffset + 2] = bitmapData[srcOffset];
11678
+ pixels[dstOffset + 3] = alphaUsed ? bitmapData[srcOffset + 3] : 255;
11679
+ }
11680
+ }
11681
+ ctx.putImageData(imageData, 0, 0);
11682
+ return canvas.toDataURL("image/png");
11683
+ }
11684
+ base64ref() {
11685
+ const prevpos = this._reader.pos;
11686
+ this._reader.seek(this._offset);
11687
+ const header = this._info.header();
11688
+ if (header instanceof BitmapInfoHeader$1 && header.compression != null) switch (header.compression) {
11689
+ case Helper$1.GDI.BitmapCompression.BI_JPEG:
11690
+ this._reader.seek(this._location.data.off);
11691
+ const jpegData = "data:image/jpeg;base64," + btoa(this._reader.readBinary(this._location.data.size));
11692
+ this._reader.seek(prevpos);
11693
+ return jpegData;
11694
+ case Helper$1.GDI.BitmapCompression.BI_PNG:
11695
+ this._reader.seek(this._location.data.off);
11696
+ const pngData = "data:image/png;base64," + btoa(this._reader.readBinary(this._location.data.size));
11697
+ this._reader.seek(prevpos);
11698
+ return pngData;
11699
+ }
11700
+ if (header instanceof BitmapInfoHeader$1 && header.bitcount === 32) {
11701
+ this._reader.seek(this._location.data.off);
11702
+ const bitmapBytes = new Uint8Array(this._location.data.size);
11703
+ const bitmapData = this._reader.readBinary(this._location.data.size);
11704
+ for (let i = 0; i < this._location.data.size; i++) bitmapBytes[i] = bitmapData.charCodeAt(i);
11705
+ const pngDataUrl = this.convertToPNG(bitmapBytes, header.width, header.height, true);
11706
+ this._reader.seek(prevpos);
11707
+ return pngDataUrl;
11708
+ }
11709
+ let data = this.makeBitmapFileHeader();
11710
+ this._reader.seek(this._location.header.off);
11711
+ data += this._reader.readBinary(this._location.header.size);
11712
+ this._reader.seek(this._location.data.off);
11713
+ data += this._reader.readBinary(this._location.data.size);
11714
+ const ref = "data:image/bmp;base64," + btoa(data);
11715
+ this._reader.seek(prevpos);
11716
+ return ref;
11717
+ }
11718
+ };
11522
11719
  var PointS$1 = class PointS$1 {
11523
11720
  constructor(reader, x, y) {
11524
11721
  if (reader != null) {
@@ -11917,118 +12114,6 @@ var Scan$1 = class Scan$1 {
11917
12114
  return this.scanlines.length > 0;
11918
12115
  }
11919
12116
  };
11920
- var BitmapCoreHeader$1 = class {
11921
- constructor(reader, skipsize) {
11922
- if (skipsize) reader.skip(4);
11923
- this.width = reader.readUint16();
11924
- this.height = reader.readUint16();
11925
- this.planes = reader.readUint16();
11926
- this.bitcount = reader.readUint16();
11927
- }
11928
- colors() {
11929
- return this.bitcount <= 8 ? 1 << this.bitcount : 0;
11930
- }
11931
- };
11932
- var BitmapInfoHeader$1 = class {
11933
- constructor(reader, skipsize) {
11934
- if (skipsize) reader.skip(4);
11935
- this.width = reader.readInt32();
11936
- this.height = reader.readInt32();
11937
- this.planes = reader.readUint16();
11938
- this.bitcount = reader.readUint16();
11939
- this.compression = reader.readUint32();
11940
- this.sizeimage = reader.readUint32();
11941
- this.xpelspermeter = reader.readInt32();
11942
- this.ypelspermeter = reader.readInt32();
11943
- this.clrused = reader.readUint32();
11944
- this.clrimportant = reader.readUint32();
11945
- }
11946
- colors() {
11947
- if (this.clrused !== 0) return this.clrused < 256 ? this.clrused : 256;
11948
- else return this.bitcount > 8 ? 0 : 1 << this.bitcount;
11949
- }
11950
- };
11951
- var BitmapInfo$1 = class {
11952
- constructor(reader, usergb) {
11953
- this._usergb = usergb;
11954
- const hdrsize = reader.readUint32();
11955
- this._infosize = hdrsize;
11956
- if (hdrsize === Helper$1.GDI.BITMAPCOREHEADER_SIZE) {
11957
- this._header = new BitmapCoreHeader$1(reader, false);
11958
- this._infosize += this._header.colors() * (usergb ? 3 : 2);
11959
- } else {
11960
- this._header = new BitmapInfoHeader$1(reader, false);
11961
- const masks = this._header.compression === Helper$1.GDI.BitmapCompression.BI_BITFIELDS ? 3 : 0;
11962
- if (hdrsize <= Helper$1.GDI.BITMAPINFOHEADER_SIZE + masks * 4) this._infosize = Helper$1.GDI.BITMAPINFOHEADER_SIZE + masks * 4;
11963
- this._infosize += this._header.colors() * (usergb ? 4 : 2);
11964
- }
11965
- }
11966
- getWidth() {
11967
- return this._header.width;
11968
- }
11969
- getHeight() {
11970
- return Math.abs(this._header.height);
11971
- }
11972
- infosize() {
11973
- return this._infosize;
11974
- }
11975
- header() {
11976
- return this._header;
11977
- }
11978
- };
11979
- var DIBitmap$1 = class {
11980
- constructor(reader, bitmapInfo) {
11981
- this._reader = reader;
11982
- this._offset = reader.pos;
11983
- this._location = bitmapInfo;
11984
- this._info = new BitmapInfo$1(reader, true);
11985
- }
11986
- getWidth() {
11987
- return this._info.getWidth();
11988
- }
11989
- getHeight() {
11990
- return this._info.getHeight();
11991
- }
11992
- totalSize() {
11993
- return this._location.header.size + this._location.data.size;
11994
- }
11995
- makeBitmapFileHeader() {
11996
- const buf = /* @__PURE__ */ new ArrayBuffer(14);
11997
- const view = new Uint8Array(buf);
11998
- view[0] = 66;
11999
- view[1] = 77;
12000
- Helper$1._writeUint32Val(view, 2, this.totalSize() + 14);
12001
- Helper$1._writeUint32Val(view, 10, this._info.infosize() + 14);
12002
- return Helper$1._blobToBinary(view);
12003
- }
12004
- base64ref() {
12005
- const prevpos = this._reader.pos;
12006
- this._reader.seek(this._offset);
12007
- let mime = "image/bmp";
12008
- const header = this._info.header();
12009
- let data;
12010
- if (header instanceof BitmapInfoHeader$1 && header.compression != null) switch (header.compression) {
12011
- case Helper$1.GDI.BitmapCompression.BI_JPEG:
12012
- mime = "data:image/jpeg";
12013
- break;
12014
- case Helper$1.GDI.BitmapCompression.BI_PNG:
12015
- mime = "data:image/png";
12016
- break;
12017
- default:
12018
- data = this.makeBitmapFileHeader();
12019
- break;
12020
- }
12021
- else data = this.makeBitmapFileHeader();
12022
- this._reader.seek(this._location.header.offset);
12023
- if (data != null) data += this._reader.readBinary(this._location.header.size);
12024
- else data = this._reader.readBinary(this._location.header.size);
12025
- this._reader.seek(this._location.data.offset);
12026
- data += this._reader.readBinary(this._location.data.size);
12027
- const ref = "data:" + mime + ";base64," + btoa(data);
12028
- this._reader.seek(prevpos);
12029
- return ref;
12030
- }
12031
- };
12032
12117
  var ColorRef$1 = class ColorRef$1 {
12033
12118
  constructor(reader, r, g, b) {
12034
12119
  if (reader != null) {
@@ -12244,6 +12329,9 @@ var EmfHeader = class {
12244
12329
  }
12245
12330
  }
12246
12331
  }
12332
+ getBounds() {
12333
+ return this.bounds;
12334
+ }
12247
12335
  toString() {
12248
12336
  return "{bounds: " + this.bounds.toString() + ", frame: " + this.frame.toString() + ", description: " + this.description + "}";
12249
12337
  }
@@ -12352,11 +12440,11 @@ var EMFRecords = class {
12352
12440
  const cbBits = reader.readUint32();
12353
12441
  const pen = new Pen$1(reader, {
12354
12442
  header: {
12355
- off: offBmi,
12443
+ off: curpos + offBmi,
12356
12444
  size: cbBmi
12357
12445
  },
12358
12446
  data: {
12359
- off: offBits,
12447
+ off: curpos + offBits,
12360
12448
  size: cbBits
12361
12449
  }
12362
12450
  });
@@ -12594,6 +12682,37 @@ var EMFRecords = class {
12594
12682
  });
12595
12683
  break;
12596
12684
  }
12685
+ case Helper$1.GDI.RecordType.EMR_STRETCHDIBITS: {
12686
+ new RectL(reader);
12687
+ const xDest = reader.readInt32();
12688
+ const yDest = reader.readInt32();
12689
+ const xSrc = reader.readInt32();
12690
+ const ySrc = reader.readInt32();
12691
+ const cxSrc = reader.readInt32();
12692
+ const cySrc = reader.readInt32();
12693
+ const offBmiSrc = reader.readUint32();
12694
+ const cbBmiSrc = reader.readUint32();
12695
+ const offBitsSrc = reader.readUint32();
12696
+ const cbBitsSrc = reader.readUint32();
12697
+ const iUsageSrc = reader.readUint32();
12698
+ const dwRop = reader.readUint32();
12699
+ const cxDest = reader.readInt32();
12700
+ const cyDest = reader.readInt32();
12701
+ const dib = new DIBitmap$1(reader, {
12702
+ header: {
12703
+ off: curpos + offBmiSrc,
12704
+ size: cbBmiSrc
12705
+ },
12706
+ data: {
12707
+ off: curpos + offBitsSrc,
12708
+ size: cbBitsSrc
12709
+ }
12710
+ });
12711
+ this._records.push((gdi) => {
12712
+ gdi.stretchDibBits(xSrc, ySrc, cxSrc, cySrc, xDest, yDest, cxDest, cyDest, dwRop, iUsageSrc, dib);
12713
+ });
12714
+ break;
12715
+ }
12597
12716
  case Helper$1.GDI.RecordType.EMR_POLYLINE:
12598
12717
  case Helper$1.GDI.RecordType.EMR_POLYLINETO:
12599
12718
  case Helper$1.GDI.RecordType.EMR_POLYPOLYLINE:
@@ -12636,7 +12755,6 @@ var EMFRecords = class {
12636
12755
  case Helper$1.GDI.RecordType.EMR_MASKBLT:
12637
12756
  case Helper$1.GDI.RecordType.EMR_PLGBLT:
12638
12757
  case Helper$1.GDI.RecordType.EMR_SETDIBITSTODEVICE:
12639
- case Helper$1.GDI.RecordType.EMR_STRETCHDIBITS:
12640
12758
  case Helper$1.GDI.RecordType.EMR_EXTCREATEFONTINDIRECTW:
12641
12759
  case Helper$1.GDI.RecordType.EMR_EXTTEXTOUTA:
12642
12760
  case Helper$1.GDI.RecordType.EMR_EXTTEXTOUTW:
@@ -12683,6 +12801,9 @@ var EMFRecords = class {
12683
12801
  }
12684
12802
  if (!all) throw new EMFJSError("Could not read all records");
12685
12803
  }
12804
+ getBounds() {
12805
+ return this._header.getBounds();
12806
+ }
12686
12807
  play(gdi) {
12687
12808
  const len = this._records.length;
12688
12809
  for (let i = 0; i < len; i++) this._records[i](gdi);
@@ -12832,6 +12953,9 @@ var GDIContext$1 = class {
12832
12953
  this.state.mapmode = mode;
12833
12954
  this.state._svggroup = null;
12834
12955
  }
12956
+ getMapMode() {
12957
+ return this.state.mapmode;
12958
+ }
12835
12959
  setWindowOrgEx(x, y) {
12836
12960
  Helper$1.log("[gdi] setWindowOrgEx: x=" + x + " y=" + y);
12837
12961
  this.state.wx = x;
@@ -12880,6 +13004,20 @@ var GDIContext$1 = class {
12880
13004
  setStretchBltMode(stretchMode) {
12881
13005
  Helper$1.log("[gdi] setStretchBltMode: stretchMode=" + stretchMode);
12882
13006
  }
13007
+ stretchDibBits(srcX, srcY, srcW, srcH, dstX, dstY, dstW, dstH, rasterOp, colorUsage, dib) {
13008
+ Helper$1.log("[gdi] stretchDibBits: srcX=" + srcX + " srcY=" + srcY + " srcW=" + srcW + " srcH=" + srcH + " dstX=" + dstX + " dstY=" + dstY + " dstW=" + dstW + " dstH=" + dstH + " rasterOp=0x" + rasterOp.toString(16));
13009
+ srcX = this._todevX(srcX);
13010
+ srcY = this._todevY(srcY);
13011
+ srcW = this._todevW(srcW);
13012
+ srcH = this._todevH(srcH);
13013
+ dstX = this._todevX(dstX);
13014
+ dstY = this._todevY(dstY);
13015
+ dstW = this._todevW(dstW);
13016
+ dstH = this._todevH(dstH);
13017
+ Helper$1.log("[gdi] stretchDibBits: TRANSLATED: srcX=" + srcX + " srcY=" + srcY + " srcW=" + srcW + " srcH=" + srcH + " dstX=" + dstX + " dstY=" + dstY + " dstW=" + dstW + " dstH=" + dstH + " rasterOp=0x" + rasterOp.toString(16));
13018
+ this._pushGroup();
13019
+ this._svg.image(this.state._svggroup, dstX, dstY, dstW, dstH, dib.base64ref());
13020
+ }
12883
13021
  rectangle(rect, rw, rh) {
12884
13022
  Helper$1.log("[gdi] rectangle: rect=" + rect.toString() + " with pen " + this.state.selected.pen.toString() + " and brush " + this.state.selected.brush.toString());
12885
13023
  const bottom = this._todevY(rect.bottom);
@@ -13327,14 +13465,16 @@ var Renderer$1 = class {
13327
13465
  }
13328
13466
  render(info) {
13329
13467
  const svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
13330
- this._render(new SVG(svgElement), info.mapMode, info.wExt, info.hExt, info.xExt, info.yExt);
13468
+ const emfBounds = this._img.getBounds();
13469
+ const gdi = this._render(new SVG(svgElement), info.mapMode, emfBounds.width, emfBounds.height, emfBounds.width, emfBounds.height);
13331
13470
  svgElement.setAttribute("viewBox", [
13332
13471
  0,
13333
13472
  0,
13334
- info.xExt,
13335
- info.yExt
13473
+ emfBounds.width,
13474
+ emfBounds.height
13336
13475
  ].join(" "));
13337
- svgElement.setAttribute("preserveAspectRatio", "none");
13476
+ const preserveAspectRatio = gdi.getMapMode() === Helper$1.GDI.MapMode.MM_ANISOTROPIC ? "none" : "xMidYMid meet";
13477
+ svgElement.setAttribute("preserveAspectRatio", preserveAspectRatio);
13338
13478
  svgElement.setAttribute("width", info.width);
13339
13479
  svgElement.setAttribute("height", info.height);
13340
13480
  return svgElement;
@@ -13356,6 +13496,7 @@ var Renderer$1 = class {
13356
13496
  Helper$1.log("[EMF] BEGIN RENDERING --->");
13357
13497
  this._img.render(gdi);
13358
13498
  Helper$1.log("[EMF] <--- DONE RENDERING");
13499
+ return gdi;
13359
13500
  }
13360
13501
  };
13361
13502
  var EMF = class {
@@ -13366,6 +13507,13 @@ var EMF = class {
13366
13507
  render(gdi) {
13367
13508
  this._records.play(gdi);
13368
13509
  }
13510
+ getBounds() {
13511
+ const bounds = this._records.getBounds();
13512
+ return {
13513
+ width: bounds.right - bounds.left,
13514
+ height: bounds.bottom - bounds.top
13515
+ };
13516
+ }
13369
13517
  };
13370
13518
  var WMFJSError = class extends Error {
13371
13519
  constructor(message) {
@@ -16530,6 +16678,7 @@ function handleImageNode(node, params, isAnchor) {
16530
16678
  const blipFill = picture.elements.find((el) => el.name === "pic:blipFill");
16531
16679
  const blip = blipFill?.elements.find((el) => el.name === "a:blip");
16532
16680
  if (!blip) return null;
16681
+ const hasGrayscale = blip.elements?.some((el) => el.name === "a:grayscl");
16533
16682
  const stretch = blipFill?.elements?.find((el) => el.name === "a:stretch");
16534
16683
  const fillRect = stretch?.elements?.find((el) => el.name === "a:fillRect");
16535
16684
  const srcRect = blipFill?.elements?.find((el) => el.name === "a:srcRect");
@@ -16625,14 +16774,18 @@ function handleImageNode(node, params, isAnchor) {
16625
16774
  originalAttributes: node.attributes,
16626
16775
  rId: relAttributes["Id"],
16627
16776
  ...order.length ? { drawingChildOrder: order } : {},
16628
- ...originalChildren.length ? { originalDrawingChildren: originalChildren } : {}
16777
+ ...originalChildren.length ? { originalDrawingChildren: originalChildren } : {},
16778
+ ...hasGrayscale ? { grayscale: true } : {}
16629
16779
  }
16630
16780
  };
16631
16781
  }
16632
16782
  var handleShapeDrawing = (params, node, graphicData, size, padding, marginOffset, anchorData, wrap$1, isAnchor, isHidden) => {
16633
16783
  const wsp = graphicData.elements.find((el) => el.name === "wps:wsp");
16634
16784
  const textBoxContent = wsp.elements.find((el) => el.name === "wps:txbx")?.elements?.find((el) => el.name === "w:txbxContent");
16635
- if ((wsp.elements.find((el) => el.name === "wps:spPr")?.elements.find((el) => el.name === "a:prstGeom"))?.attributes["prst"]) {
16785
+ const spPr = wsp.elements.find((el) => el.name === "wps:spPr");
16786
+ const shapeType = (spPr?.elements.find((el) => el.name === "a:prstGeom"))?.attributes["prst"];
16787
+ const custGeom = !shapeType ? extractCustomGeometry(spPr) : null;
16788
+ if (shapeType || custGeom) {
16636
16789
  const result = getVectorShape({
16637
16790
  params,
16638
16791
  node,
@@ -16641,7 +16794,8 @@ var handleShapeDrawing = (params, node, graphicData, size, padding, marginOffset
16641
16794
  marginOffset,
16642
16795
  anchorData,
16643
16796
  wrap: wrap$1,
16644
- isAnchor
16797
+ isAnchor,
16798
+ customGeometry: custGeom
16645
16799
  });
16646
16800
  if (result?.attrs && isHidden) result.attrs.hidden = true;
16647
16801
  if (result) return result;
@@ -16710,6 +16864,7 @@ var handleShapeGroup = (params, node, graphicData, size, padding, marginOffset,
16710
16864
  const spPr = wsp.elements?.find((el) => el.name === "wps:spPr");
16711
16865
  if (!spPr) return null;
16712
16866
  const shapeKind = (spPr.elements?.find((el) => el.name === "a:prstGeom"))?.attributes?.["prst"];
16867
+ const customGeom = !shapeKind ? extractCustomGeometry(spPr) : null;
16713
16868
  const shapeXfrm = spPr.elements?.find((el) => el.name === "a:xfrm");
16714
16869
  const shapeOff = shapeXfrm?.elements?.find((el) => el.name === "a:off");
16715
16870
  const shapeExt = shapeXfrm?.elements?.find((el) => el.name === "a:ext");
@@ -16753,6 +16908,7 @@ var handleShapeGroup = (params, node, graphicData, size, padding, marginOffset,
16753
16908
  shapeType: "vectorShape",
16754
16909
  attrs: {
16755
16910
  kind: shapeKind,
16911
+ customGeometry: customGeom || void 0,
16756
16912
  x,
16757
16913
  y,
16758
16914
  width,
@@ -16979,7 +17135,7 @@ var buildShapePlaceholder = (node, size, padding, marginOffset, shapeType) => {
16979
17135
  attrs
16980
17136
  };
16981
17137
  };
16982
- function getVectorShape({ params, node, graphicData, size, marginOffset, anchorData, wrap: wrap$1, isAnchor }) {
17138
+ function getVectorShape({ params, node, graphicData, size, marginOffset, anchorData, wrap: wrap$1, isAnchor, customGeometry }) {
16983
17139
  const schemaAttrs = {};
16984
17140
  const drawingNode = params.nodes?.[0];
16985
17141
  if (drawingNode?.name === "w:drawing") schemaAttrs.drawingContent = drawingNode;
@@ -16988,8 +17144,12 @@ function getVectorShape({ params, node, graphicData, size, marginOffset, anchorD
16988
17144
  const spPr = wsp.elements?.find((el) => el.name === "wps:spPr");
16989
17145
  if (!spPr) return null;
16990
17146
  const shapeKind = (spPr.elements?.find((el) => el.name === "a:prstGeom"))?.attributes?.["prst"];
16991
- if (!shapeKind) console.warn("Shape kind not found");
16992
17147
  schemaAttrs.kind = shapeKind;
17148
+ if (customGeometry) schemaAttrs.customGeometry = customGeometry;
17149
+ else if (!shapeKind) {
17150
+ const extracted = extractCustomGeometry(spPr);
17151
+ if (extracted) schemaAttrs.customGeometry = extracted;
17152
+ }
16993
17153
  const width = size?.width ?? DEFAULT_SHAPE_WIDTH;
16994
17154
  const height = size?.height ?? DEFAULT_SHAPE_HEIGHT;
16995
17155
  const xfrm = spPr.elements?.find((el) => el.name === "a:xfrm");
@@ -25587,7 +25747,8 @@ const translateImageNode = (params) => {
25587
25747
  elements: [
25588
25748
  {
25589
25749
  name: "a:blip",
25590
- attributes: { "r:embed": imageId }
25750
+ attributes: { "r:embed": imageId },
25751
+ ...attrs.grayscale ? { elements: [{ name: "a:grayscl" }] } : {}
25591
25752
  },
25592
25753
  ...rawSrcRect ? [rawSrcRect] : [],
25593
25754
  {
@@ -36996,7 +37157,7 @@ var SuperConverter = class SuperConverter {
36996
37157
  static getStoredSuperdocVersion(docx) {
36997
37158
  return SuperConverter.getStoredCustomProperty(docx, "SuperdocVersion");
36998
37159
  }
36999
- static setStoredSuperdocVersion(docx = this.convertedXml, version = "1.17.0-next.22") {
37160
+ static setStoredSuperdocVersion(docx = this.convertedXml, version = "1.17.0-next.26") {
37000
37161
  return SuperConverter.setStoredCustomProperty(docx, "SuperdocVersion", version, false);
37001
37162
  }
37002
37163
  static generateWordTimestamp() {