@rowsncolumns/toolkit 24.4.2 → 24.4.4

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 (166) hide show
  1. package/dist/cjs/excel-parser/cfb-decryptor.d.ts +6 -0
  2. package/dist/cjs/excel-parser/cfb-decryptor.d.ts.map +1 -1
  3. package/dist/cjs/excel-parser/cfb-decryptor.js +6 -0
  4. package/dist/cjs/excel-parser/helpers.d.ts +9 -1
  5. package/dist/cjs/excel-parser/helpers.d.ts.map +1 -1
  6. package/dist/cjs/excel-parser/helpers.js +37 -0
  7. package/dist/cjs/excel-parser/interface.d.ts +15 -2
  8. package/dist/cjs/excel-parser/interface.d.ts.map +1 -1
  9. package/dist/cjs/excel-parser/plugins/base/index.d.ts +2 -0
  10. package/dist/cjs/excel-parser/plugins/base/index.d.ts.map +1 -1
  11. package/dist/cjs/excel-parser/plugins/base/index.js +3 -0
  12. package/dist/cjs/excel-parser/plugins/ods/index.d.ts +19 -0
  13. package/dist/cjs/excel-parser/plugins/ods/index.d.ts.map +1 -1
  14. package/dist/cjs/excel-parser/plugins/ods/index.js +676 -304
  15. package/dist/cjs/excel-parser/plugins/ods/styles.d.ts +43 -1
  16. package/dist/cjs/excel-parser/plugins/ods/styles.d.ts.map +1 -1
  17. package/dist/cjs/excel-parser/plugins/ods/styles.js +343 -45
  18. package/dist/cjs/excel-parser/plugins/xls/index.d.ts +55 -1
  19. package/dist/cjs/excel-parser/plugins/xls/index.d.ts.map +1 -1
  20. package/dist/cjs/excel-parser/plugins/xls/index.js +518 -6
  21. package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts +4 -0
  22. package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts.map +1 -1
  23. package/dist/cjs/excel-parser/plugins/xlsb/index.js +33 -14
  24. package/dist/cjs/excel-parser/plugins/xlsx/chartex.d.ts +37 -0
  25. package/dist/cjs/excel-parser/plugins/xlsx/chartex.d.ts.map +1 -0
  26. package/dist/cjs/excel-parser/plugins/xlsx/chartex.js +244 -0
  27. package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts +10 -0
  28. package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts.map +1 -1
  29. package/dist/cjs/excel-parser/plugins/xlsx/charts.js +68 -9
  30. package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts +28 -1
  31. package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -1
  32. package/dist/cjs/excel-parser/plugins/xlsx/drawing.js +155 -20
  33. package/dist/cjs/excel-parser/plugins/xlsx/form-controls.d.ts +70 -0
  34. package/dist/cjs/excel-parser/plugins/xlsx/form-controls.d.ts.map +1 -0
  35. package/dist/cjs/excel-parser/plugins/xlsx/form-controls.js +295 -0
  36. package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts +35 -2
  37. package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts.map +1 -1
  38. package/dist/cjs/excel-parser/plugins/xlsx/index.js +737 -257
  39. package/dist/cjs/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -1
  40. package/dist/cjs/excel-parser/plugins/xlsx/pivots.js +125 -37
  41. package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts +3 -0
  42. package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -1
  43. package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.js +4 -1
  44. package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts +15 -1
  45. package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts.map +1 -1
  46. package/dist/cjs/excel-parser/plugins/xlsx/styles.js +102 -6
  47. package/dist/cjs/excel-parser/registry.d.ts +7 -0
  48. package/dist/cjs/excel-parser/registry.d.ts.map +1 -1
  49. package/dist/cjs/excel-parser/registry.js +29 -0
  50. package/dist/cjs/excel-parser/types.d.ts +17 -2
  51. package/dist/cjs/excel-parser/types.d.ts.map +1 -1
  52. package/dist/cjs/excel-parser/workbook.d.ts +3 -0
  53. package/dist/cjs/excel-parser/workbook.d.ts.map +1 -1
  54. package/dist/cjs/excel-parser/workbook.js +24 -14
  55. package/dist/cjs/excel-parser/worker.js +131 -131
  56. package/dist/cjs/exporter/ods/ods-export.d.ts.map +1 -1
  57. package/dist/cjs/exporter/ods/ods-export.js +432 -175
  58. package/dist/cjs/exporter/xlsx/chart-builder.d.ts.map +1 -1
  59. package/dist/cjs/exporter/xlsx/chart-builder.js +215 -39
  60. package/dist/cjs/exporter/xlsx/chartex-builder.d.ts +36 -0
  61. package/dist/cjs/exporter/xlsx/chartex-builder.d.ts.map +1 -0
  62. package/dist/cjs/exporter/xlsx/chartex-builder.js +109 -0
  63. package/dist/cjs/exporter/xlsx/form-controls-builder.d.ts +61 -0
  64. package/dist/cjs/exporter/xlsx/form-controls-builder.d.ts.map +1 -0
  65. package/dist/cjs/exporter/xlsx/form-controls-builder.js +197 -0
  66. package/dist/cjs/exporter/xlsx/pivot-builder.d.ts +8 -0
  67. package/dist/cjs/exporter/xlsx/pivot-builder.d.ts.map +1 -1
  68. package/dist/cjs/exporter/xlsx/pivot-builder.js +141 -42
  69. package/dist/cjs/exporter/xlsx/style-builder.js +9 -3
  70. package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts +7 -1
  71. package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -1
  72. package/dist/cjs/exporter/xlsx/threaded-comments-builder.js +15 -3
  73. package/dist/cjs/exporter/xlsx/xlsx-export.d.ts +11 -2
  74. package/dist/cjs/exporter/xlsx/xlsx-export.d.ts.map +1 -1
  75. package/dist/cjs/exporter/xlsx/xlsx-export.js +991 -297
  76. package/dist/cjs/helpers/implicit-intersection.d.ts +16 -0
  77. package/dist/cjs/helpers/implicit-intersection.d.ts.map +1 -0
  78. package/dist/cjs/helpers/implicit-intersection.js +197 -0
  79. package/dist/cjs/print-settings.d.ts +105 -0
  80. package/dist/cjs/print-settings.d.ts.map +1 -0
  81. package/dist/cjs/print-settings.js +494 -0
  82. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  83. package/dist/esm/excel-parser/cfb-decryptor.d.ts +6 -0
  84. package/dist/esm/excel-parser/cfb-decryptor.d.ts.map +1 -1
  85. package/dist/esm/excel-parser/cfb-decryptor.js +6 -0
  86. package/dist/esm/excel-parser/helpers.d.ts +9 -1
  87. package/dist/esm/excel-parser/helpers.d.ts.map +1 -1
  88. package/dist/esm/excel-parser/helpers.js +34 -0
  89. package/dist/esm/excel-parser/interface.d.ts +15 -2
  90. package/dist/esm/excel-parser/interface.d.ts.map +1 -1
  91. package/dist/esm/excel-parser/plugins/base/index.d.ts +2 -0
  92. package/dist/esm/excel-parser/plugins/base/index.d.ts.map +1 -1
  93. package/dist/esm/excel-parser/plugins/base/index.js +3 -0
  94. package/dist/esm/excel-parser/plugins/ods/index.d.ts +19 -0
  95. package/dist/esm/excel-parser/plugins/ods/index.d.ts.map +1 -1
  96. package/dist/esm/excel-parser/plugins/ods/index.js +347 -33
  97. package/dist/esm/excel-parser/plugins/ods/styles.d.ts +43 -1
  98. package/dist/esm/excel-parser/plugins/ods/styles.d.ts.map +1 -1
  99. package/dist/esm/excel-parser/plugins/ods/styles.js +276 -2
  100. package/dist/esm/excel-parser/plugins/xls/index.d.ts +55 -1
  101. package/dist/esm/excel-parser/plugins/xls/index.d.ts.map +1 -1
  102. package/dist/esm/excel-parser/plugins/xls/index.js +441 -3
  103. package/dist/esm/excel-parser/plugins/xlsb/index.d.ts +4 -0
  104. package/dist/esm/excel-parser/plugins/xlsb/index.d.ts.map +1 -1
  105. package/dist/esm/excel-parser/plugins/xlsb/index.js +30 -9
  106. package/dist/esm/excel-parser/plugins/xlsx/chartex.d.ts +37 -0
  107. package/dist/esm/excel-parser/plugins/xlsx/chartex.d.ts.map +1 -0
  108. package/dist/esm/excel-parser/plugins/xlsx/chartex.js +199 -0
  109. package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts +10 -0
  110. package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts.map +1 -1
  111. package/dist/esm/excel-parser/plugins/xlsx/charts.js +69 -6
  112. package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts +28 -1
  113. package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -1
  114. package/dist/esm/excel-parser/plugins/xlsx/drawing.js +99 -0
  115. package/dist/esm/excel-parser/plugins/xlsx/form-controls.d.ts +70 -0
  116. package/dist/esm/excel-parser/plugins/xlsx/form-controls.d.ts.map +1 -0
  117. package/dist/esm/excel-parser/plugins/xlsx/form-controls.js +246 -0
  118. package/dist/esm/excel-parser/plugins/xlsx/index.d.ts +35 -2
  119. package/dist/esm/excel-parser/plugins/xlsx/index.d.ts.map +1 -1
  120. package/dist/esm/excel-parser/plugins/xlsx/index.js +454 -32
  121. package/dist/esm/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -1
  122. package/dist/esm/excel-parser/plugins/xlsx/pivots.js +86 -6
  123. package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts +3 -0
  124. package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -1
  125. package/dist/esm/excel-parser/plugins/xlsx/sheet-views.js +2 -0
  126. package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts +15 -1
  127. package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts.map +1 -1
  128. package/dist/esm/excel-parser/plugins/xlsx/styles.js +92 -2
  129. package/dist/esm/excel-parser/registry.d.ts +7 -0
  130. package/dist/esm/excel-parser/registry.d.ts.map +1 -1
  131. package/dist/esm/excel-parser/registry.js +19 -0
  132. package/dist/esm/excel-parser/types.d.ts +17 -2
  133. package/dist/esm/excel-parser/types.d.ts.map +1 -1
  134. package/dist/esm/excel-parser/workbook.d.ts +3 -0
  135. package/dist/esm/excel-parser/workbook.d.ts.map +1 -1
  136. package/dist/esm/excel-parser/workbook.js +19 -10
  137. package/dist/esm/excel-parser/worker.js +12 -18
  138. package/dist/esm/exporter/ods/ods-export.d.ts.map +1 -1
  139. package/dist/esm/exporter/ods/ods-export.js +306 -35
  140. package/dist/esm/exporter/xlsx/chart-builder.d.ts.map +1 -1
  141. package/dist/esm/exporter/xlsx/chart-builder.js +161 -28
  142. package/dist/esm/exporter/xlsx/chartex-builder.d.ts +36 -0
  143. package/dist/esm/exporter/xlsx/chartex-builder.d.ts.map +1 -0
  144. package/dist/esm/exporter/xlsx/chartex-builder.js +97 -0
  145. package/dist/esm/exporter/xlsx/form-controls-builder.d.ts +61 -0
  146. package/dist/esm/exporter/xlsx/form-controls-builder.d.ts.map +1 -0
  147. package/dist/esm/exporter/xlsx/form-controls-builder.js +173 -0
  148. package/dist/esm/exporter/xlsx/pivot-builder.d.ts +8 -0
  149. package/dist/esm/exporter/xlsx/pivot-builder.d.ts.map +1 -1
  150. package/dist/esm/exporter/xlsx/pivot-builder.js +104 -19
  151. package/dist/esm/exporter/xlsx/style-builder.js +9 -3
  152. package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts +7 -1
  153. package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -1
  154. package/dist/esm/exporter/xlsx/threaded-comments-builder.js +15 -3
  155. package/dist/esm/exporter/xlsx/xlsx-export.d.ts +11 -2
  156. package/dist/esm/exporter/xlsx/xlsx-export.d.ts.map +1 -1
  157. package/dist/esm/exporter/xlsx/xlsx-export.js +675 -64
  158. package/dist/esm/helpers/implicit-intersection.d.ts +16 -0
  159. package/dist/esm/helpers/implicit-intersection.d.ts.map +1 -0
  160. package/dist/esm/helpers/implicit-intersection.js +184 -0
  161. package/dist/esm/print-settings.d.ts +105 -0
  162. package/dist/esm/print-settings.d.ts.map +1 -0
  163. package/dist/esm/print-settings.js +422 -0
  164. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  165. package/package.json +3 -3
  166. package/xlsx.d.ts +14 -0
@@ -1 +1 @@
1
- {"version":3,"file":"drawing.d.ts","sourceRoot":"","sources":["../../../../../excel-parser/plugins/xlsx/drawing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAEd,cAAc,EAWf,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAoDrE,MAAM,MAAM,0BAA0B,GAAG,cAAc,GAAG;IACxD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,GAAG,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,kBAAkB,EAC7B,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,0BAA0B,EAAE,CAAC,CA6dvC;AA6OD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CASlD;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,cAAc,CA8CzD;AA8MD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAqBT"}
1
+ {"version":3,"file":"drawing.d.ts","sourceRoot":"","sources":["../../../../../excel-parser/plugins/xlsx/drawing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAEd,cAAc,EACd,cAAc,EAYf,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAoDrE,MAAM,MAAM,0BAA0B,GAAG,cAAc,GAAG;IACxD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,4EAA4E;AAC5E,QAAA,MAAM,sBAAsB;;;;CAIlB,CAAC;AAEX,KAAK,iBAAiB,GAAG,MAAM,OAAO,sBAAsB,CAAC;AAK7D;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,GAAG,EACZ,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;IACP,IAAI,EAAE,CAAC,OAAO,sBAAsB,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACzD,IAAI,EAAE,GAAG,CAAC;CACX,CAAC,CAkCD;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,GAAG,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,kBAAkB,EAC7B,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,0BAA0B,EAAE,CAAC,CA8dvC;AASD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,GAAG,GACX,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,cAAc,CAAC,CAuC3E;AA6OD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CASlD;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,cAAc,CA8CzD;AA8MD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAqBT"}
@@ -42,6 +42,95 @@ var CELL_IMAGE_OFFSET_THRESHOLD_PX = 1;
42
42
  function emuToPixels(emuValue) {
43
43
  return Math.round(emuValue / EMU_PER_PIXEL);
44
44
  }
45
+ /** `processAnchors` anchor-type tags, keyed by the drawing element name. */
46
+ var ANCHOR_KIND_BY_ELEMENT = {
47
+ oneCellAnchor: "oneCellAnchor",
48
+ twoCellAnchor: "twoCellAnchors",
49
+ absoluteAnchor: "absoluteAnchors",
50
+ };
51
+ var ANCHOR_ELEMENT_REGEX = /<(?:[A-Za-z_][\w.-]*:)?(oneCellAnchor|twoCellAnchor|absoluteAnchor)(?=[\s/>])/g;
52
+ /**
53
+ * The `<xdr:wsDr>` anchors in document order — Excel's z-order (first is
54
+ * the back-most object). The unordered parse keeps document order within one
55
+ * element name but groups the three anchor kinds apart, so the kind sequence
56
+ * is read off the raw part and the parsed nodes are dealt out in that order.
57
+ * Anchors the scan does not account for (namespace quirks) trail in their
58
+ * parsed order, so nothing is ever dropped.
59
+ */
60
+ export function anchorsInDocumentOrder(drawing, drawingXml) {
61
+ var e_1, _a, e_2, _b, e_3, _c, e_4, _d;
62
+ var nodesByElement = {
63
+ oneCellAnchor: [],
64
+ twoCellAnchor: [],
65
+ absoluteAnchor: [],
66
+ };
67
+ try {
68
+ for (var _e = __values(Object.keys(nodesByElement)), _f = _e.next(); !_f.done; _f = _e.next()) {
69
+ var element = _f.value;
70
+ var parsed = get(drawing, "xdr:wsDr.xdr:".concat(element)) || get(drawing, "wsDr.".concat(element));
71
+ if (!parsed)
72
+ continue;
73
+ nodesByElement[element] = Array.isArray(parsed) ? parsed : [parsed];
74
+ }
75
+ }
76
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
77
+ finally {
78
+ try {
79
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
80
+ }
81
+ finally { if (e_1) throw e_1.error; }
82
+ }
83
+ var cursor = {
84
+ oneCellAnchor: 0,
85
+ twoCellAnchor: 0,
86
+ absoluteAnchor: 0,
87
+ };
88
+ var ordered = [];
89
+ try {
90
+ for (var _g = __values(drawingXml.matchAll(ANCHOR_ELEMENT_REGEX)), _h = _g.next(); !_h.done; _h = _g.next()) {
91
+ var match = _h.value;
92
+ var element = match[1];
93
+ var node = nodesByElement[element][cursor[element]];
94
+ if (node === undefined)
95
+ continue;
96
+ cursor[element] += 1;
97
+ ordered.push({ kind: ANCHOR_KIND_BY_ELEMENT[element], node: node });
98
+ }
99
+ }
100
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
101
+ finally {
102
+ try {
103
+ if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
104
+ }
105
+ finally { if (e_2) throw e_2.error; }
106
+ }
107
+ try {
108
+ for (var _j = __values(Object.keys(nodesByElement)), _k = _j.next(); !_k.done; _k = _j.next()) {
109
+ var element = _k.value;
110
+ try {
111
+ for (var _l = (e_4 = void 0, __values(nodesByElement[element].slice(cursor[element]))), _m = _l.next(); !_m.done; _m = _l.next()) {
112
+ var node = _m.value;
113
+ ordered.push({ kind: ANCHOR_KIND_BY_ELEMENT[element], node: node });
114
+ }
115
+ }
116
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
117
+ finally {
118
+ try {
119
+ if (_m && !_m.done && (_d = _l.return)) _d.call(_l);
120
+ }
121
+ finally { if (e_4) throw e_4.error; }
122
+ }
123
+ }
124
+ }
125
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
126
+ finally {
127
+ try {
128
+ if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
129
+ }
130
+ finally { if (e_3) throw e_3.error; }
131
+ }
132
+ return ordered;
133
+ }
45
134
  /**
46
135
  * Process different types of image anchors
47
136
  * @param anchors The anchor elements from the drawing
@@ -54,8 +143,8 @@ function emuToPixels(emuValue) {
54
143
  */
55
144
  export function processAnchors(anchors, anchorType, drawingPath, sheetId, zipParser, xmlParser) {
56
145
  return __awaiter(this, void 0, void 0, function () {
57
- var images, anchorArray, _loop_1, anchorArray_1, anchorArray_1_1, anchor, e_1_1;
58
- var e_1, _a;
146
+ var images, anchorArray, _loop_1, anchorArray_1, anchorArray_1_1, anchor, e_5_1;
147
+ var e_5, _a;
59
148
  var _b;
60
149
  return __generator(this, function (_c) {
61
150
  switch (_c.label) {
@@ -368,12 +457,7 @@ export function processAnchors(anchors, anchorType, drawingPath, sheetId, zipPar
368
457
  images.push({
369
458
  isInsideCell: isInsideCell,
370
459
  embedId: uuid(),
371
- spec: {
372
- id: imageId,
373
- imageUrl: createDataUrl(imageData, imageType),
374
- type: "image",
375
- description: imageName,
376
- },
460
+ spec: __assign({ id: imageId, imageUrl: createDataUrl(imageData, imageType), type: "image", description: imageName }, parsePictureAdjustments(picture)),
377
461
  position: position,
378
462
  draggable: true,
379
463
  lockAspectRatio: true,
@@ -399,20 +483,71 @@ export function processAnchors(anchors, anchorType, drawingPath, sheetId, zipPar
399
483
  return [3 /*break*/, 2];
400
484
  case 5: return [3 /*break*/, 8];
401
485
  case 6:
402
- e_1_1 = _c.sent();
403
- e_1 = { error: e_1_1 };
486
+ e_5_1 = _c.sent();
487
+ e_5 = { error: e_5_1 };
404
488
  return [3 /*break*/, 8];
405
489
  case 7:
406
490
  try {
407
491
  if (anchorArray_1_1 && !anchorArray_1_1.done && (_a = anchorArray_1.return)) _a.call(anchorArray_1);
408
492
  }
409
- finally { if (e_1) throw e_1.error; }
493
+ finally { if (e_5) throw e_5.error; }
410
494
  return [7 /*endfinally*/];
411
495
  case 8: return [2 /*return*/, images];
412
496
  }
413
497
  });
414
498
  });
415
499
  }
500
+ /** DrawingML per-mille-percent (100000 = 100%) → fraction, or undefined. */
501
+ var pctToFraction = function (value) {
502
+ if (value === undefined || value === null || value === "")
503
+ return undefined;
504
+ var n = Number(value);
505
+ return Number.isFinite(n) ? n / 100000 : undefined;
506
+ };
507
+ /**
508
+ * Picture-format adjustments off an `<xdr:pic>`: `<a:blipFill><a:srcRect>`
509
+ * (crop), `<a:blip><a:lum bright contrast>` (brightness / contrast) and
510
+ * `<a:blip><a:alphaModFix amt>` (opacity → `transparency`). Only present
511
+ * values are returned so an untouched picture stays a bare image spec.
512
+ */
513
+ export function parsePictureAdjustments(picture) {
514
+ var _a, _b, _c, _d, _e, _f;
515
+ var blipFill = (_b = (_a = get(picture, "xdr:blipFill")) !== null && _a !== void 0 ? _a : get(picture, "blipFill")) !== null && _b !== void 0 ? _b : undefined;
516
+ var blip = (_c = get(blipFill, "a:blip")) !== null && _c !== void 0 ? _c : get(blipFill, "blip");
517
+ var out = {};
518
+ var srcRect = (_d = get(blipFill, "a:srcRect.a$")) !== null && _d !== void 0 ? _d : get(blipFill, "srcRect.a$");
519
+ if (srcRect) {
520
+ var crop = {};
521
+ var left = pctToFraction(srcRect.l);
522
+ var top_1 = pctToFraction(srcRect.t);
523
+ var right = pctToFraction(srcRect.r);
524
+ var bottom = pctToFraction(srcRect.b);
525
+ if (left)
526
+ crop.left = left;
527
+ if (top_1)
528
+ crop.top = top_1;
529
+ if (right)
530
+ crop.right = right;
531
+ if (bottom)
532
+ crop.bottom = bottom;
533
+ if (Object.keys(crop).length)
534
+ out.crop = crop;
535
+ }
536
+ var lum = (_e = get(blip, "a:lum.a$")) !== null && _e !== void 0 ? _e : get(blip, "lum.a$");
537
+ if (lum) {
538
+ var brightness = pctToFraction(lum.bright);
539
+ var contrast = pctToFraction(lum.contrast);
540
+ if (brightness)
541
+ out.brightness = brightness;
542
+ if (contrast)
543
+ out.contrast = contrast;
544
+ }
545
+ var alpha = pctToFraction((_f = get(blip, "a:alphaModFix.a$.amt")) !== null && _f !== void 0 ? _f : get(blip, "alphaModFix.a$.amt"));
546
+ if (alpha !== undefined && alpha < 1) {
547
+ out.transparency = Math.round((1 - alpha) * 100000) / 100000;
548
+ }
549
+ return out;
550
+ }
416
551
  /**
417
552
  * Parse color from DrawingML color element
418
553
  * Supports both RGB (srgbClr) and theme colors (schemeClr)
@@ -521,7 +656,7 @@ function parseColorOpacity(colorElement) {
521
656
  }
522
657
  /** `<a:prstGeom>` → geometry preset + `<a:avLst>` adjust guides. */
523
658
  function parseShapeGeometry(spPr) {
524
- var e_2, _a;
659
+ var e_6, _a;
525
660
  var _b;
526
661
  var prstGeom = get(spPr, "a:prstGeom");
527
662
  var prst = get(prstGeom, "a$.prst");
@@ -539,12 +674,12 @@ function parseShapeGeometry(spPr) {
539
674
  }
540
675
  }
541
676
  }
542
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
677
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
543
678
  finally {
544
679
  try {
545
680
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
546
681
  }
547
- finally { if (e_2) throw e_2.error; }
682
+ finally { if (e_6) throw e_6.error; }
548
683
  }
549
684
  return { preset: (_b = PRESET_RENAMES[prst]) !== null && _b !== void 0 ? _b : prst, adjustments: adjustments };
550
685
  }
@@ -731,7 +866,7 @@ export function parseShapeSpec(shape) {
731
866
  * @returns EmbedTextBoxSpec object
732
867
  */
733
868
  function parseTextBoxContent(txBody, shape) {
734
- var e_3, _a, e_4, _b;
869
+ var e_7, _a, e_8, _b;
735
870
  var richText = [];
736
871
  var plainText = "";
737
872
  // Get paragraphs
@@ -766,7 +901,7 @@ function parseTextBoxContent(txBody, shape) {
766
901
  // Add indentation and bullet to the first run of the paragraph
767
902
  var isFirstRun = true;
768
903
  try {
769
- for (var runArray_1 = (e_4 = void 0, __values(runArray)), runArray_1_1 = runArray_1.next(); !runArray_1_1.done; runArray_1_1 = runArray_1.next()) {
904
+ for (var runArray_1 = (e_8 = void 0, __values(runArray)), runArray_1_1 = runArray_1.next(); !runArray_1_1.done; runArray_1_1 = runArray_1.next()) {
770
905
  var run = runArray_1_1.value;
771
906
  var text = get(run, "a:t.t$") || get(run, "a:t") || "";
772
907
  // Handle tab characters
@@ -832,12 +967,12 @@ function parseTextBoxContent(txBody, shape) {
832
967
  });
833
968
  }
834
969
  }
835
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
970
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
836
971
  finally {
837
972
  try {
838
973
  if (runArray_1_1 && !runArray_1_1.done && (_b = runArray_1.return)) _b.call(runArray_1);
839
974
  }
840
- finally { if (e_4) throw e_4.error; }
975
+ finally { if (e_8) throw e_8.error; }
841
976
  }
842
977
  // Add paragraph break (newline) between paragraphs
843
978
  if (paragraphArray.indexOf(paragraph) < paragraphArray.length - 1) {
@@ -846,12 +981,12 @@ function parseTextBoxContent(txBody, shape) {
846
981
  }
847
982
  }
848
983
  }
849
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
984
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
850
985
  finally {
851
986
  try {
852
987
  if (paragraphArray_1_1 && !paragraphArray_1_1.done && (_a = paragraphArray_1.return)) _a.call(paragraphArray_1);
853
988
  }
854
- finally { if (e_3) throw e_3.error; }
989
+ finally { if (e_7) throw e_7.error; }
855
990
  }
856
991
  // Get shape properties for background, borders, etc.
857
992
  var spPr = get(shape, "xdr:spPr") || get(shape, "spPr");
@@ -0,0 +1,70 @@
1
+ import type { EmbeddedObject } from "@rowsncolumns/spreadsheet";
2
+ export declare const CTRL_PROP_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp";
3
+ export declare const VML_DRAWING_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing";
4
+ type CellAnchor = {
5
+ col: number;
6
+ colOff: number;
7
+ row: number;
8
+ rowOff: number;
9
+ };
10
+ /**
11
+ * `<controlPr><anchor><from>…</from><to>…</to></anchor>` → the engine's
12
+ * pixel overlay position (1-based anchor cell, EMU offsets → px, size from
13
+ * the cell span at the grid defaults — the same approximation the drawing
14
+ * importer uses for `twoCellAnchor`s).
15
+ */
16
+ export declare const controlAnchorToOverlayPosition: (from: CellAnchor, to: CellAnchor | undefined) => {
17
+ anchorCell: {
18
+ rowIndex: number;
19
+ columnIndex: number;
20
+ };
21
+ offsetXPixels?: number;
22
+ offsetYPixels?: number;
23
+ widthPixels?: number;
24
+ heightPixels?: number;
25
+ };
26
+ /**
27
+ * Parse an `xl/ctrlProps/ctrlPropN.xml` part: `objectType`, every other
28
+ * `formControlPr` attribute verbatim, and the literal `itemLst` items.
29
+ */
30
+ export declare const parseFormControlPr: (ctrlPropDom: any) => {
31
+ objectType: string;
32
+ properties: Record<string, string>;
33
+ listItems?: string[];
34
+ } | undefined;
35
+ /**
36
+ * Captions live only in the legacy VML part: `<v:shape id="_x0000_s1025">
37
+ * … <v:textbox><div>Check Box 1</div></v:textbox>`. Returns shapeId → text.
38
+ * VML is scanned textually — Excel's VML is not reliably well-formed XML.
39
+ */
40
+ export declare const parseVmlControlCaptions: (vml: string | undefined) => Map<number, string>;
41
+ export type RawWorksheetControl = {
42
+ shapeId?: number;
43
+ name?: string;
44
+ relId?: string;
45
+ controlProperties: Record<string, string>;
46
+ moveWithCells?: boolean;
47
+ sizeWithCells?: boolean;
48
+ from?: CellAnchor;
49
+ to?: CellAnchor;
50
+ };
51
+ /**
52
+ * `<controls>` from a worksheet DOM, whether wrapped in
53
+ * `<mc:AlternateContent><mc:Choice Requires="x14">` (Excel) or bare.
54
+ */
55
+ export declare const readWorksheetControls: (sheetDom: any) => RawWorksheetControl[];
56
+ /**
57
+ * Assemble the sheet's form controls. `loadCtrlProp` resolves a control's
58
+ * `r:id` to its parsed `ctrlProp` DOM (undefined when the part is missing —
59
+ * the control is then skipped, Excel would repair it the same way).
60
+ */
61
+ export declare const buildFormControlEmbeds: ({ controls, sheetId, ctrlProps, captions, }: {
62
+ controls: RawWorksheetControl[];
63
+ sheetId: number;
64
+ ctrlProps: Map<string, ReturnType<typeof parseFormControlPr>>;
65
+ captions: Map<number, string>;
66
+ }) => EmbeddedObject[];
67
+ /** The `r:id` of a worksheet's `<legacyDrawing>` (VML part), if any. */
68
+ export declare const readLegacyDrawingRelId: (sheetDom: any) => string | undefined;
69
+ export {};
70
+ //# sourceMappingURL=form-controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-controls.d.ts","sourceRoot":"","sources":["../../../../../excel-parser/plugins/xlsx/form-controls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EACf,MAAM,2BAA2B,CAAC;AAgBnC,eAAO,MAAM,kBAAkB,iFACiD,CAAC;AACjF,eAAO,MAAM,oBAAoB,mFACiD,CAAC;AA6CnF,KAAK,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAe/E;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,GACzC,MAAM,UAAU,EAChB,IAAI,UAAU,GAAG,SAAS;gBAKZ;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;oBACrC,MAAM;oBACN,MAAM;kBACR,MAAM;mBACL,MAAM;CAiBxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,aAAa,GAAG,KACf;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,GAAG,SAkBH,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAClC,KAAK,MAAM,GAAG,SAAS,KACtB,GAAG,CAAC,MAAM,EAAE,MAAM,CAwBpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,EAAE,CAAC,EAAE,UAAU,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,GAAG,KAAG,mBAAmB,EA+BxE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,6CAKpC;IACD,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;IAC9D,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B,KAAG,cAAc,EA+BjB,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,GAAI,UAAU,GAAG,KAAG,MAAM,GAAG,SAK/D,CAAC"}
@@ -0,0 +1,295 @@
1
+ import { __assign, __read, __rest, __spreadArray, __values } from "tslib";
2
+ /**
3
+ * Excel form controls (`<controls>` in the worksheet + `xl/ctrlProps/*` +
4
+ * the legacy VML shape). Parsed into `EmbeddedObject`s with an
5
+ * {@link EmbedFormControlSpec} so the exporter can write the same three
6
+ * parts back (`exporter/xlsx/form-controls-builder.ts`). The grid does not
7
+ * run the control; the spec is a faithful, opaque carrier of what Excel
8
+ * stored.
9
+ */
10
+ var EMU_PER_PIXEL = 9525;
11
+ /** Grid defaults used to size a control from its cell-span anchor. */
12
+ var DEFAULT_COLUMN_WIDTH_PX = 100;
13
+ var DEFAULT_ROW_HEIGHT_PX = 20;
14
+ export var CTRL_PROP_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/ctrlProp";
15
+ export var VML_DRAWING_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing";
16
+ var asArray = function (value) {
17
+ return value == null ? [] : Array.isArray(value) ? value : [value];
18
+ };
19
+ /** Read a child by local name, tolerating any namespace prefix. */
20
+ var childByLocalName = function (node, localName) {
21
+ var e_1, _a;
22
+ if (!node || typeof node !== "object")
23
+ return undefined;
24
+ if (node[localName] !== undefined)
25
+ return node[localName];
26
+ try {
27
+ for (var _b = __values(Object.keys(node)), _c = _b.next(); !_c.done; _c = _b.next()) {
28
+ var key = _c.value;
29
+ var colon = key.indexOf(":");
30
+ if (colon >= 0 && key.slice(colon + 1) === localName) {
31
+ return node[key];
32
+ }
33
+ }
34
+ }
35
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
36
+ finally {
37
+ try {
38
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
39
+ }
40
+ finally { if (e_1) throw e_1.error; }
41
+ }
42
+ return undefined;
43
+ };
44
+ /** Text of a leaf element (`t$` when it carries attributes, else the value). */
45
+ var textOf = function (node) {
46
+ if (node == null)
47
+ return undefined;
48
+ if (typeof node === "object") {
49
+ var inner = node.t$;
50
+ return inner == null ? undefined : String(inner);
51
+ }
52
+ return String(node);
53
+ };
54
+ var numberOf = function (node) {
55
+ var text = textOf(node);
56
+ var value = text == null ? Number.NaN : Number(text);
57
+ return Number.isFinite(value) ? value : 0;
58
+ };
59
+ var attrs = function (node) {
60
+ var e_2, _a;
61
+ var raw = node === null || node === void 0 ? void 0 : node.a$;
62
+ var out = {};
63
+ if (!raw || typeof raw !== "object")
64
+ return out;
65
+ try {
66
+ for (var _b = __values(Object.entries(raw)), _c = _b.next(); !_c.done; _c = _b.next()) {
67
+ var _d = __read(_c.value, 2), key = _d[0], value = _d[1];
68
+ if (value == null)
69
+ continue;
70
+ out[key] = String(value);
71
+ }
72
+ }
73
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
74
+ finally {
75
+ try {
76
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
77
+ }
78
+ finally { if (e_2) throw e_2.error; }
79
+ }
80
+ return out;
81
+ };
82
+ var readCellAnchor = function (node) {
83
+ if (!node)
84
+ return undefined;
85
+ var col = childByLocalName(node, "col");
86
+ var row = childByLocalName(node, "row");
87
+ if (col === undefined || row === undefined)
88
+ return undefined;
89
+ return {
90
+ col: numberOf(col),
91
+ colOff: numberOf(childByLocalName(node, "colOff")),
92
+ row: numberOf(row),
93
+ rowOff: numberOf(childByLocalName(node, "rowOff")),
94
+ };
95
+ };
96
+ /**
97
+ * `<controlPr><anchor><from>…</from><to>…</to></anchor>` → the engine's
98
+ * pixel overlay position (1-based anchor cell, EMU offsets → px, size from
99
+ * the cell span at the grid defaults — the same approximation the drawing
100
+ * importer uses for `twoCellAnchor`s).
101
+ */
102
+ export var controlAnchorToOverlayPosition = function (from, to) {
103
+ var offsetXPixels = Math.round(from.colOff / EMU_PER_PIXEL);
104
+ var offsetYPixels = Math.round(from.rowOff / EMU_PER_PIXEL);
105
+ var overlay = {
106
+ anchorCell: { rowIndex: from.row + 1, columnIndex: from.col + 1 },
107
+ };
108
+ if (offsetXPixels)
109
+ overlay.offsetXPixels = offsetXPixels;
110
+ if (offsetYPixels)
111
+ overlay.offsetYPixels = offsetYPixels;
112
+ if (to) {
113
+ var width = (to.col - from.col) * DEFAULT_COLUMN_WIDTH_PX +
114
+ (to.colOff - from.colOff) / EMU_PER_PIXEL;
115
+ var height = (to.row - from.row) * DEFAULT_ROW_HEIGHT_PX +
116
+ (to.rowOff - from.rowOff) / EMU_PER_PIXEL;
117
+ if (width > 0)
118
+ overlay.widthPixels = Math.round(width);
119
+ if (height > 0)
120
+ overlay.heightPixels = Math.round(height);
121
+ }
122
+ return overlay;
123
+ };
124
+ /**
125
+ * Parse an `xl/ctrlProps/ctrlPropN.xml` part: `objectType`, every other
126
+ * `formControlPr` attribute verbatim, and the literal `itemLst` items.
127
+ */
128
+ export var parseFormControlPr = function (ctrlPropDom) {
129
+ var e_3, _a;
130
+ var root = childByLocalName(ctrlPropDom, "formControlPr");
131
+ if (!root)
132
+ return undefined;
133
+ var _b = attrs(root), objectType = _b.objectType, properties = __rest(_b, ["objectType"]);
134
+ if (!objectType)
135
+ return undefined;
136
+ try {
137
+ // Namespace declarations ride along as attributes in fast-xml-parser.
138
+ for (var _c = __values(Object.keys(properties)), _d = _c.next(); !_d.done; _d = _c.next()) {
139
+ var key = _d.value;
140
+ if (key === "xmlns" || key.startsWith("xmlns:"))
141
+ delete properties[key];
142
+ }
143
+ }
144
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
145
+ finally {
146
+ try {
147
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
148
+ }
149
+ finally { if (e_3) throw e_3.error; }
150
+ }
151
+ var itemLst = childByLocalName(root, "itemLst");
152
+ var listItems = asArray(childByLocalName(itemLst, "item"))
153
+ .map(function (item) { return attrs(item).val; })
154
+ .filter(function (val) { return typeof val === "string"; });
155
+ return __assign({ objectType: objectType, properties: properties }, (listItems.length ? { listItems: listItems } : {}));
156
+ };
157
+ /**
158
+ * Captions live only in the legacy VML part: `<v:shape id="_x0000_s1025">
159
+ * … <v:textbox><div>Check Box 1</div></v:textbox>`. Returns shapeId → text.
160
+ * VML is scanned textually — Excel's VML is not reliably well-formed XML.
161
+ */
162
+ export var parseVmlControlCaptions = function (vml) {
163
+ var captions = new Map();
164
+ if (!vml)
165
+ return captions;
166
+ var shapeRe = /<v:shape\b([^>]*)>([\s\S]*?)<\/v:shape>/g;
167
+ var match;
168
+ while ((match = shapeRe.exec(vml))) {
169
+ var idMatch = /\bid="_x0000_s(\d+)"/.exec(match[1]);
170
+ if (!idMatch)
171
+ continue;
172
+ var body = match[2];
173
+ if (!/<x:ClientData\b/.test(body))
174
+ continue;
175
+ var textbox = /<v:textbox\b[^>]*>([\s\S]*?)<\/v:textbox>/.exec(body);
176
+ if (!textbox)
177
+ continue;
178
+ var text = textbox[1]
179
+ .replace(/<br\s*\/?>/gi, "\n")
180
+ .replace(/<[^>]+>/g, "")
181
+ .replace(/&amp;/g, "&")
182
+ .replace(/&lt;/g, "<")
183
+ .replace(/&gt;/g, ">")
184
+ .replace(/&quot;/g, '"')
185
+ .replace(/&#(\d+);/g, function (_, code) { return String.fromCodePoint(Number(code)); })
186
+ .trim();
187
+ if (text)
188
+ captions.set(Number(idMatch[1]), text);
189
+ }
190
+ return captions;
191
+ };
192
+ /**
193
+ * `<controls>` from a worksheet DOM, whether wrapped in
194
+ * `<mc:AlternateContent><mc:Choice Requires="x14">` (Excel) or bare.
195
+ */
196
+ export var readWorksheetControls = function (sheetDom) {
197
+ var e_4, _a, e_5, _b;
198
+ var _c;
199
+ var worksheet = (_c = childByLocalName(sheetDom, "worksheet")) !== null && _c !== void 0 ? _c : sheetDom;
200
+ var controls = childByLocalName(worksheet, "controls");
201
+ if (!controls)
202
+ return [];
203
+ var controlNodes = __spreadArray([], __read(asArray(childByLocalName(controls, "control"))), false);
204
+ try {
205
+ for (var _d = __values(asArray(childByLocalName(controls, "AlternateContent"))), _e = _d.next(); !_e.done; _e = _d.next()) {
206
+ var alternate = _e.value;
207
+ try {
208
+ for (var _f = (e_5 = void 0, __values(asArray(childByLocalName(alternate, "Choice")))), _g = _f.next(); !_g.done; _g = _f.next()) {
209
+ var choice = _g.value;
210
+ controlNodes.push.apply(controlNodes, __spreadArray([], __read(asArray(childByLocalName(choice, "control"))), false));
211
+ }
212
+ }
213
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
214
+ finally {
215
+ try {
216
+ if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
217
+ }
218
+ finally { if (e_5) throw e_5.error; }
219
+ }
220
+ }
221
+ }
222
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
223
+ finally {
224
+ try {
225
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
226
+ }
227
+ finally { if (e_4) throw e_4.error; }
228
+ }
229
+ return controlNodes.map(function (node) {
230
+ var _a, _b;
231
+ var a = attrs(node);
232
+ var controlPr = childByLocalName(node, "controlPr");
233
+ var anchor = childByLocalName(controlPr, "anchor");
234
+ var anchorAttrs = attrs(anchor);
235
+ var shapeId = Number(a.shapeId);
236
+ return __assign(__assign(__assign(__assign(__assign(__assign(__assign({}, (Number.isFinite(shapeId) && a.shapeId ? { shapeId: shapeId } : {})), (a.name ? { name: a.name } : {})), (((_a = a["r:id"]) !== null && _a !== void 0 ? _a : a.id) ? { relId: (_b = a["r:id"]) !== null && _b !== void 0 ? _b : a.id } : {})), { controlProperties: attrs(controlPr) }), (anchorAttrs.moveWithCells !== undefined
237
+ ? { moveWithCells: anchorAttrs.moveWithCells === "1" || anchorAttrs.moveWithCells === "true" }
238
+ : {})), (anchorAttrs.sizeWithCells !== undefined
239
+ ? { sizeWithCells: anchorAttrs.sizeWithCells === "1" || anchorAttrs.sizeWithCells === "true" }
240
+ : {})), { from: readCellAnchor(childByLocalName(anchor, "from")), to: readCellAnchor(childByLocalName(anchor, "to")) });
241
+ });
242
+ };
243
+ /**
244
+ * Assemble the sheet's form controls. `loadCtrlProp` resolves a control's
245
+ * `r:id` to its parsed `ctrlProp` DOM (undefined when the part is missing —
246
+ * the control is then skipped, Excel would repair it the same way).
247
+ */
248
+ export var buildFormControlEmbeds = function (_a) {
249
+ var controls = _a.controls, sheetId = _a.sheetId, ctrlProps = _a.ctrlProps, captions = _a.captions;
250
+ var embeds = [];
251
+ controls.forEach(function (control, index) {
252
+ var _a;
253
+ var parsed = control.relId ? ctrlProps.get(control.relId) : undefined;
254
+ if (!parsed || !control.from)
255
+ return;
256
+ var spec = {
257
+ type: "formControl",
258
+ objectType: parsed.objectType,
259
+ properties: parsed.properties,
260
+ };
261
+ if (control.name)
262
+ spec.name = control.name;
263
+ if (control.shapeId !== undefined)
264
+ spec.shapeId = control.shapeId;
265
+ var caption = control.shapeId !== undefined ? captions.get(control.shapeId) : undefined;
266
+ if (caption)
267
+ spec.text = caption;
268
+ if (parsed.listItems)
269
+ spec.listItems = parsed.listItems;
270
+ if (Object.keys(control.controlProperties).length) {
271
+ spec.controlProperties = control.controlProperties;
272
+ }
273
+ if (control.moveWithCells !== undefined)
274
+ spec.moveWithCells = control.moveWithCells;
275
+ if (control.sizeWithCells !== undefined)
276
+ spec.sizeWithCells = control.sizeWithCells;
277
+ embeds.push({
278
+ embedId: "control-".concat(sheetId, "-").concat((_a = control.shapeId) !== null && _a !== void 0 ? _a : index + 1),
279
+ spec: spec,
280
+ position: {
281
+ sheetId: sheetId,
282
+ overlayPosition: controlAnchorToOverlayPosition(control.from, control.to),
283
+ },
284
+ });
285
+ });
286
+ return embeds;
287
+ };
288
+ /** The `r:id` of a worksheet's `<legacyDrawing>` (VML part), if any. */
289
+ export var readLegacyDrawingRelId = function (sheetDom) {
290
+ var _a, _b;
291
+ var worksheet = (_a = childByLocalName(sheetDom, "worksheet")) !== null && _a !== void 0 ? _a : sheetDom;
292
+ var legacy = childByLocalName(worksheet, "legacyDrawing");
293
+ var a = attrs(legacy);
294
+ return (_b = a["r:id"]) !== null && _b !== void 0 ? _b : a.id;
295
+ };