@gridsheet/react-core 1.4.0-alpha.2 → 1.4.0-alpha.3

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 (235) hide show
  1. package/dist/_virtual/_commonjsHelpers.js +7 -0
  2. package/dist/_virtual/_commonjsHelpers.js.map +1 -0
  3. package/dist/_virtual/dayjs.min.js +8 -0
  4. package/dist/_virtual/dayjs.min.js.map +1 -0
  5. package/dist/_virtual/dayjs.min2.js +5 -0
  6. package/dist/_virtual/dayjs.min2.js.map +1 -0
  7. package/dist/_virtual/jsx-runtime.js +6 -0
  8. package/dist/_virtual/jsx-runtime.js.map +1 -0
  9. package/dist/_virtual/jsx-runtime2.js +5 -0
  10. package/dist/_virtual/jsx-runtime2.js.map +1 -0
  11. package/dist/_virtual/react-jsx-runtime.development.js +5 -0
  12. package/dist/_virtual/react-jsx-runtime.development.js.map +1 -0
  13. package/dist/_virtual/react-jsx-runtime.production.js +5 -0
  14. package/dist/_virtual/react-jsx-runtime.production.js.map +1 -0
  15. package/dist/_virtual/timezone.js +8 -0
  16. package/dist/_virtual/timezone.js.map +1 -0
  17. package/dist/_virtual/timezone2.js +5 -0
  18. package/dist/_virtual/timezone2.js.map +1 -0
  19. package/dist/_virtual/utc.js +8 -0
  20. package/dist/_virtual/utc.js.map +1 -0
  21. package/dist/_virtual/utc2.js +5 -0
  22. package/dist/_virtual/utc2.js.map +1 -0
  23. package/dist/components/Cell.js +232 -0
  24. package/dist/components/Cell.js.map +1 -0
  25. package/dist/components/ContextMenu.js +297 -0
  26. package/dist/components/ContextMenu.js.map +1 -0
  27. package/dist/components/Editor.js +455 -0
  28. package/dist/components/Editor.js.map +1 -0
  29. package/dist/components/Emitter.js +26 -0
  30. package/dist/components/Emitter.js.map +1 -0
  31. package/dist/components/Fixed.js +17 -0
  32. package/dist/components/Fixed.js.map +1 -0
  33. package/dist/components/FormulaBar.js +149 -0
  34. package/dist/components/FormulaBar.js.map +1 -0
  35. package/dist/components/GridSheet.js +246 -0
  36. package/dist/components/GridSheet.js.map +1 -0
  37. package/dist/components/HeaderCellLeft.js +131 -0
  38. package/dist/components/HeaderCellLeft.js.map +1 -0
  39. package/dist/components/HeaderCellTop.js +132 -0
  40. package/dist/components/HeaderCellTop.js.map +1 -0
  41. package/dist/components/PluginBase.js +35 -0
  42. package/dist/components/PluginBase.js.map +1 -0
  43. package/dist/components/Resizer.js +98 -0
  44. package/dist/components/Resizer.js.map +1 -0
  45. package/dist/components/SearchBar.js +108 -0
  46. package/dist/components/SearchBar.js.map +1 -0
  47. package/dist/components/SheetProvider.js +56 -0
  48. package/dist/components/SheetProvider.js.map +1 -0
  49. package/dist/components/StoreInitializer.js +84 -0
  50. package/dist/components/StoreInitializer.js.map +1 -0
  51. package/dist/components/Tabular.js +308 -0
  52. package/dist/components/Tabular.js.map +1 -0
  53. package/dist/components/hooks.js +15 -0
  54. package/dist/components/hooks.js.map +1 -0
  55. package/dist/components/svg/Base.js +24 -0
  56. package/dist/components/svg/Base.js.map +1 -0
  57. package/dist/components/svg/CloseIcon.js +13 -0
  58. package/dist/components/svg/CloseIcon.js.map +1 -0
  59. package/dist/components/svg/SearchIcon.js +13 -0
  60. package/dist/components/svg/SearchIcon.js.map +1 -0
  61. package/dist/constants.js +43 -0
  62. package/dist/constants.js.map +1 -0
  63. package/dist/formula/evaluator.js +674 -0
  64. package/dist/formula/evaluator.js.map +1 -0
  65. package/dist/formula/functions/__base.js +19 -0
  66. package/dist/formula/functions/__base.js.map +1 -0
  67. package/dist/formula/functions/__utils.js +145 -0
  68. package/dist/formula/functions/__utils.js.map +1 -0
  69. package/dist/formula/functions/abs.js +24 -0
  70. package/dist/formula/functions/abs.js.map +1 -0
  71. package/dist/formula/functions/acos.js +32 -0
  72. package/dist/formula/functions/acos.js.map +1 -0
  73. package/dist/formula/functions/add.js +57 -0
  74. package/dist/formula/functions/add.js.map +1 -0
  75. package/dist/formula/functions/and.js +28 -0
  76. package/dist/formula/functions/and.js.map +1 -0
  77. package/dist/formula/functions/asin.js +32 -0
  78. package/dist/formula/functions/asin.js.map +1 -0
  79. package/dist/formula/functions/atan.js +29 -0
  80. package/dist/formula/functions/atan.js.map +1 -0
  81. package/dist/formula/functions/atan2.js +35 -0
  82. package/dist/formula/functions/atan2.js.map +1 -0
  83. package/dist/formula/functions/average.js +44 -0
  84. package/dist/formula/functions/average.js.map +1 -0
  85. package/dist/formula/functions/col.js +31 -0
  86. package/dist/formula/functions/col.js.map +1 -0
  87. package/dist/formula/functions/concat.js +27 -0
  88. package/dist/formula/functions/concat.js.map +1 -0
  89. package/dist/formula/functions/concatenate.js +28 -0
  90. package/dist/formula/functions/concatenate.js.map +1 -0
  91. package/dist/formula/functions/cos.js +29 -0
  92. package/dist/formula/functions/cos.js.map +1 -0
  93. package/dist/formula/functions/count.js +38 -0
  94. package/dist/formula/functions/count.js.map +1 -0
  95. package/dist/formula/functions/counta.js +38 -0
  96. package/dist/formula/functions/counta.js.map +1 -0
  97. package/dist/formula/functions/countif.js +32 -0
  98. package/dist/formula/functions/countif.js.map +1 -0
  99. package/dist/formula/functions/divide.js +33 -0
  100. package/dist/formula/functions/divide.js.map +1 -0
  101. package/dist/formula/functions/eq.js +29 -0
  102. package/dist/formula/functions/eq.js.map +1 -0
  103. package/dist/formula/functions/exp.js +29 -0
  104. package/dist/formula/functions/exp.js.map +1 -0
  105. package/dist/formula/functions/gt.js +29 -0
  106. package/dist/formula/functions/gt.js.map +1 -0
  107. package/dist/formula/functions/gte.js +29 -0
  108. package/dist/formula/functions/gte.js.map +1 -0
  109. package/dist/formula/functions/hlookup.js +75 -0
  110. package/dist/formula/functions/hlookup.js.map +1 -0
  111. package/dist/formula/functions/if.js +39 -0
  112. package/dist/formula/functions/if.js.map +1 -0
  113. package/dist/formula/functions/iferror.js +45 -0
  114. package/dist/formula/functions/iferror.js.map +1 -0
  115. package/dist/formula/functions/len.js +29 -0
  116. package/dist/formula/functions/len.js.map +1 -0
  117. package/dist/formula/functions/lenb.js +29 -0
  118. package/dist/formula/functions/lenb.js.map +1 -0
  119. package/dist/formula/functions/ln.js +32 -0
  120. package/dist/formula/functions/ln.js.map +1 -0
  121. package/dist/formula/functions/log.js +36 -0
  122. package/dist/formula/functions/log.js.map +1 -0
  123. package/dist/formula/functions/log10.js +32 -0
  124. package/dist/formula/functions/log10.js.map +1 -0
  125. package/dist/formula/functions/lt.js +29 -0
  126. package/dist/formula/functions/lt.js.map +1 -0
  127. package/dist/formula/functions/lte.js +29 -0
  128. package/dist/formula/functions/lte.js.map +1 -0
  129. package/dist/formula/functions/max.js +47 -0
  130. package/dist/formula/functions/max.js.map +1 -0
  131. package/dist/formula/functions/min.js +47 -0
  132. package/dist/formula/functions/min.js.map +1 -0
  133. package/dist/formula/functions/minus.js +57 -0
  134. package/dist/formula/functions/minus.js.map +1 -0
  135. package/dist/formula/functions/mod.js +33 -0
  136. package/dist/formula/functions/mod.js.map +1 -0
  137. package/dist/formula/functions/multiply.js +27 -0
  138. package/dist/formula/functions/multiply.js.map +1 -0
  139. package/dist/formula/functions/ne.js +29 -0
  140. package/dist/formula/functions/ne.js.map +1 -0
  141. package/dist/formula/functions/not.js +30 -0
  142. package/dist/formula/functions/not.js.map +1 -0
  143. package/dist/formula/functions/now.js +22 -0
  144. package/dist/formula/functions/now.js.map +1 -0
  145. package/dist/formula/functions/or.js +28 -0
  146. package/dist/formula/functions/or.js.map +1 -0
  147. package/dist/formula/functions/pi.js +22 -0
  148. package/dist/formula/functions/pi.js.map +1 -0
  149. package/dist/formula/functions/power.js +27 -0
  150. package/dist/formula/functions/power.js.map +1 -0
  151. package/dist/formula/functions/product.js +40 -0
  152. package/dist/formula/functions/product.js.map +1 -0
  153. package/dist/formula/functions/radians.js +29 -0
  154. package/dist/formula/functions/radians.js.map +1 -0
  155. package/dist/formula/functions/rand.js +22 -0
  156. package/dist/formula/functions/rand.js.map +1 -0
  157. package/dist/formula/functions/round.js +35 -0
  158. package/dist/formula/functions/round.js.map +1 -0
  159. package/dist/formula/functions/rounddown.js +35 -0
  160. package/dist/formula/functions/rounddown.js.map +1 -0
  161. package/dist/formula/functions/roundup.js +35 -0
  162. package/dist/formula/functions/roundup.js.map +1 -0
  163. package/dist/formula/functions/row.js +31 -0
  164. package/dist/formula/functions/row.js.map +1 -0
  165. package/dist/formula/functions/sin.js +29 -0
  166. package/dist/formula/functions/sin.js.map +1 -0
  167. package/dist/formula/functions/sqrt.js +32 -0
  168. package/dist/formula/functions/sqrt.js.map +1 -0
  169. package/dist/formula/functions/sum.js +47 -0
  170. package/dist/formula/functions/sum.js.map +1 -0
  171. package/dist/formula/functions/sumif.js +65 -0
  172. package/dist/formula/functions/sumif.js.map +1 -0
  173. package/dist/formula/functions/tan.js +29 -0
  174. package/dist/formula/functions/tan.js.map +1 -0
  175. package/dist/formula/functions/uminus.js +24 -0
  176. package/dist/formula/functions/uminus.js.map +1 -0
  177. package/dist/formula/functions/vlookup.js +75 -0
  178. package/dist/formula/functions/vlookup.js.map +1 -0
  179. package/dist/formula/mapping.js +118 -0
  180. package/dist/formula/mapping.js.map +1 -0
  181. package/dist/formula/solver.js +70 -0
  182. package/dist/formula/solver.js.map +1 -0
  183. package/dist/index.js +16 -9113
  184. package/dist/index.js.map +1 -1
  185. package/dist/lib/autofill.js +391 -0
  186. package/dist/lib/autofill.js.map +1 -0
  187. package/dist/lib/clipboard.js +46 -0
  188. package/dist/lib/clipboard.js.map +1 -0
  189. package/dist/lib/converters.js +141 -0
  190. package/dist/lib/converters.js.map +1 -0
  191. package/dist/lib/input.js +52 -0
  192. package/dist/lib/input.js.map +1 -0
  193. package/dist/lib/palette.js +24 -0
  194. package/dist/lib/palette.js.map +1 -0
  195. package/dist/lib/prevention.js +82 -0
  196. package/dist/lib/prevention.js.map +1 -0
  197. package/dist/lib/structs.js +276 -0
  198. package/dist/lib/structs.js.map +1 -0
  199. package/dist/lib/table.js +1248 -0
  200. package/dist/lib/table.js.map +1 -0
  201. package/dist/lib/time.js +79 -0
  202. package/dist/lib/time.js.map +1 -0
  203. package/dist/lib/virtualization.js +129 -0
  204. package/dist/lib/virtualization.js.map +1 -0
  205. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js +287 -0
  206. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js.map +1 -0
  207. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/timezone.js +72 -0
  208. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/timezone.js.map +1 -0
  209. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.js +85 -0
  210. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.js.map +1 -0
  211. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.development.js +454 -0
  212. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -0
  213. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.production.js +42 -0
  214. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.production.js.map +1 -0
  215. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/jsx-runtime.js +18 -0
  216. package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/jsx-runtime.js.map +1 -0
  217. package/dist/parsers/core.js +139 -0
  218. package/dist/parsers/core.js.map +1 -0
  219. package/dist/renderers/checkbox.js +20 -0
  220. package/dist/renderers/checkbox.js.map +1 -0
  221. package/dist/renderers/core.js +147 -0
  222. package/dist/renderers/core.js.map +1 -0
  223. package/dist/renderers/thousand_separator.js +17 -0
  224. package/dist/renderers/thousand_separator.js.map +1 -0
  225. package/dist/store/actions.js +762 -0
  226. package/dist/store/actions.js.map +1 -0
  227. package/dist/store/helpers.js +88 -0
  228. package/dist/store/helpers.js.map +1 -0
  229. package/dist/store/index.js +8 -0
  230. package/dist/store/index.js.map +1 -0
  231. package/dist/styles/embedder.js +19 -0
  232. package/dist/styles/embedder.js.map +1 -0
  233. package/dist/styles/minified.js +7 -0
  234. package/dist/styles/minified.js.map +1 -0
  235. package/package.json +1 -7
@@ -0,0 +1,391 @@
1
+ import dayjs from "../_virtual/dayjs.min.js";
2
+ import { complementSelectingArea, zoneToArea, areaShape, areaToZone, concatAreas } from "./structs.js";
3
+ import { p2a } from "./converters.js";
4
+ import { absolutizeFormula } from "../formula/evaluator.js";
5
+ import { TimeDelta } from "./time.js";
6
+ const BORDER_AUTOFILL_DRAGGING = "dashed 1px #888888";
7
+ const DirectionMapping = {
8
+ left: ["horizontal", -1],
9
+ right: ["horizontal", 1],
10
+ up: ["vertical", -1],
11
+ down: ["vertical", 1]
12
+ };
13
+ class Autofill {
14
+ constructor(store, draggingTo) {
15
+ const { table, choosing, selectingZone } = store;
16
+ this.src = complementSelectingArea(zoneToArea(selectingZone), choosing);
17
+ this.direction = this.suggestDirection(draggingTo);
18
+ this.dst = this.getDestinationArea(draggingTo);
19
+ this.table = table;
20
+ }
21
+ get applied() {
22
+ var _a, _b;
23
+ const [orientation, sign] = DirectionMapping[this.direction];
24
+ const matrix = this.table.getMatrix({ area: this.src, evaluates: null });
25
+ const srcShape = areaShape({ ...this.src, base: 1 });
26
+ const dstShape = areaShape({ ...this.dst, base: 1 });
27
+ const diff = {};
28
+ if (orientation === "horizontal") {
29
+ for (let i = 0; i < dstShape.height; i++) {
30
+ const patterns = this.getChangePatterns(matrix[i]);
31
+ for (let j = 0; j < dstShape.width; j++) {
32
+ const baseCell = (_a = matrix[i % srcShape.height]) == null ? void 0 : _a[j % srcShape.width];
33
+ const x = sign > 0 ? this.dst.left + j : this.dst.right - j;
34
+ const px = sign > 0 ? j % srcShape.width : (srcShape.width - 1 - j % srcShape.width) % srcShape.width;
35
+ diff[p2a({ y: this.dst.top + i, x })] = {
36
+ ...baseCell,
37
+ value: patterns[px].next().value
38
+ };
39
+ }
40
+ }
41
+ } else {
42
+ for (let i = 0; i < dstShape.width; i++) {
43
+ const patterns = this.getChangePatterns(matrix.map((row) => row[i]));
44
+ for (let j = 0; j < dstShape.height; j++) {
45
+ const baseCell = (_b = matrix[j % srcShape.height]) == null ? void 0 : _b[i % srcShape.width];
46
+ const y = sign > 0 ? this.dst.top + j : this.dst.bottom - j;
47
+ const py = sign > 0 ? j % srcShape.height : (srcShape.height - 1 - j % srcShape.height) % srcShape.height;
48
+ const value = patterns[py].next().value;
49
+ diff[p2a({ y, x: this.dst.left + i })] = { ...baseCell, value };
50
+ }
51
+ }
52
+ }
53
+ const table = this.table.update({
54
+ diff,
55
+ operator: "USER",
56
+ reflection: {
57
+ selectingZone: areaToZone(this.src)
58
+ }
59
+ });
60
+ return table;
61
+ }
62
+ get wholeArea() {
63
+ return concatAreas(this.src, this.dst);
64
+ }
65
+ getCellStyle(target) {
66
+ const { x, y } = target;
67
+ const style = {};
68
+ const { top, left, bottom, right } = this.src;
69
+ switch (this.direction) {
70
+ case "left": {
71
+ if (this.dst.left <= x && x <= this.dst.right) {
72
+ if (top === y) {
73
+ style.borderTop = BORDER_AUTOFILL_DRAGGING;
74
+ }
75
+ if (bottom === y - 1) {
76
+ style.borderTop = BORDER_AUTOFILL_DRAGGING;
77
+ }
78
+ }
79
+ if (this.dst.left === x && top <= y && y <= bottom) {
80
+ style.borderLeft = BORDER_AUTOFILL_DRAGGING;
81
+ }
82
+ break;
83
+ }
84
+ case "right": {
85
+ if (this.dst.left <= x && x <= this.dst.right) {
86
+ if (top === y) {
87
+ style.borderTop = BORDER_AUTOFILL_DRAGGING;
88
+ }
89
+ if (bottom === y - 1) {
90
+ style.borderTop = BORDER_AUTOFILL_DRAGGING;
91
+ }
92
+ }
93
+ if (this.dst.right === x - 1 && top <= y && y <= bottom) {
94
+ style.borderLeft = BORDER_AUTOFILL_DRAGGING;
95
+ }
96
+ break;
97
+ }
98
+ case "up": {
99
+ if (this.dst.top <= y && y <= this.dst.bottom) {
100
+ if (left === x) {
101
+ style.borderLeft = BORDER_AUTOFILL_DRAGGING;
102
+ }
103
+ if (right === x - 1) {
104
+ style.borderLeft = BORDER_AUTOFILL_DRAGGING;
105
+ }
106
+ }
107
+ if (this.dst.top === y && left <= x && x <= right) {
108
+ style.borderTop = BORDER_AUTOFILL_DRAGGING;
109
+ }
110
+ break;
111
+ }
112
+ case "down": {
113
+ if (this.dst.top <= y && y <= this.dst.bottom) {
114
+ if (left === x) {
115
+ style.borderLeft = BORDER_AUTOFILL_DRAGGING;
116
+ }
117
+ if (right === x - 1) {
118
+ style.borderLeft = BORDER_AUTOFILL_DRAGGING;
119
+ }
120
+ }
121
+ if (this.dst.bottom === y - 1 && left <= x && x <= right) {
122
+ style.borderTop = BORDER_AUTOFILL_DRAGGING;
123
+ }
124
+ break;
125
+ }
126
+ }
127
+ return style;
128
+ }
129
+ getDestinationArea(autofillDraggingTo) {
130
+ const { x, y } = autofillDraggingTo;
131
+ const { top, left, bottom, right } = this.src;
132
+ switch (this.direction) {
133
+ case "left":
134
+ return { top, bottom, left: x, right: left - 1 };
135
+ case "right":
136
+ return { top, bottom, left: right + 1, right: x };
137
+ case "up":
138
+ return { left, right, top: y, bottom: top - 1 };
139
+ case "down":
140
+ return { left, right, top: bottom + 1, bottom: y };
141
+ }
142
+ return this.src;
143
+ }
144
+ suggestDirection(draggingTo) {
145
+ const { top, left, bottom, right } = this.src;
146
+ let horizontal = 0, vertical = 0;
147
+ if (draggingTo.x < left) {
148
+ horizontal = draggingTo.x - left;
149
+ } else if (draggingTo.x > right) {
150
+ horizontal = draggingTo.x - right;
151
+ }
152
+ if (draggingTo.y < top) {
153
+ vertical = draggingTo.y - top;
154
+ } else if (draggingTo.y > bottom) {
155
+ vertical = draggingTo.y - bottom;
156
+ }
157
+ if (Math.abs(horizontal) > 0 && Math.abs(vertical) > 0) {
158
+ if (Math.abs(horizontal) > Math.abs(vertical)) {
159
+ return horizontal < 0 ? "left" : "right";
160
+ }
161
+ return vertical < 0 ? "up" : "down";
162
+ }
163
+ if (horizontal !== 0) {
164
+ return horizontal < 0 ? "left" : "right";
165
+ }
166
+ if (vertical !== 0) {
167
+ return vertical < 0 ? "up" : "down";
168
+ }
169
+ return "down";
170
+ }
171
+ getChangePatterns(cells) {
172
+ const result = [];
173
+ const groups = groupByType(cells);
174
+ const [orientation, sign] = DirectionMapping[this.direction];
175
+ groups.forEach((group) => {
176
+ const lastValue = sign > 0 ? group.last : group.first;
177
+ switch (group.kind) {
178
+ case "other": {
179
+ result.push(pass(group.first));
180
+ return;
181
+ }
182
+ case "formula": {
183
+ const value = group.first;
184
+ const table = this.table;
185
+ function* generateFormula() {
186
+ let slide = 0;
187
+ const skip = cells.length * sign;
188
+ while (true) {
189
+ slide += skip;
190
+ yield absolutizeFormula({
191
+ value,
192
+ table,
193
+ slideY: orientation === "vertical" ? slide : 0,
194
+ slideX: orientation === "horizontal" ? slide : 0
195
+ });
196
+ }
197
+ }
198
+ result.push(generateFormula());
199
+ return;
200
+ }
201
+ case "number": {
202
+ if (!group.equidistant) {
203
+ result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));
204
+ return;
205
+ }
206
+ function* generateNumber() {
207
+ let value = lastValue;
208
+ const skip = group.numericDelta * sign;
209
+ while (true) {
210
+ value += skip;
211
+ yield value;
212
+ }
213
+ }
214
+ const g = generateNumber();
215
+ result.push(g, ...group.nexts.map(() => g));
216
+ return;
217
+ }
218
+ case "date": {
219
+ const next = (d) => {
220
+ return sign > 0 ? group.timeDelta.add(d) : group.timeDelta.sub(d);
221
+ };
222
+ if (!group.equidistant) {
223
+ result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));
224
+ return;
225
+ }
226
+ function* generateDate() {
227
+ let value = lastValue;
228
+ while (true) {
229
+ value = next(value);
230
+ yield new Date(value);
231
+ }
232
+ }
233
+ const g = generateDate();
234
+ result.push(g, ...group.nexts.map(() => g));
235
+ return;
236
+ }
237
+ case "string+number": {
238
+ if (!group.equidistant) {
239
+ result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));
240
+ return;
241
+ }
242
+ function* generateStringNumber() {
243
+ const { prefix } = extractStringNumber(group.first);
244
+ const { number: lastNumber } = extractStringNumber(lastValue);
245
+ let value = lastNumber;
246
+ const skip = group.numericDelta * sign;
247
+ while (true) {
248
+ value += skip;
249
+ yield `${prefix}${Math.abs(value)}`;
250
+ }
251
+ }
252
+ const g = generateStringNumber();
253
+ result.push(g, ...group.nexts.map(() => g));
254
+ return;
255
+ }
256
+ }
257
+ });
258
+ return result;
259
+ }
260
+ }
261
+ function* pass(value) {
262
+ while (true) {
263
+ yield value;
264
+ }
265
+ }
266
+ const StringNumberPattern = new RegExp("(.+?)(\\d+)$");
267
+ const extractStringNumber = (value) => {
268
+ const match = value.match(StringNumberPattern);
269
+ if (match) {
270
+ const [, prefix, n] = match;
271
+ return { prefix, number: Number(n) };
272
+ }
273
+ return { prefix: "", number: 0 };
274
+ };
275
+ class TypedGroup {
276
+ constructor(value) {
277
+ this.timeDelta = TimeDelta.create();
278
+ this.numericDelta = 0;
279
+ this.equidistant = true;
280
+ this.first = value;
281
+ this.nexts = [];
282
+ this.kind = this.discriminate(value);
283
+ }
284
+ discriminate(value) {
285
+ const kind = value instanceof Date ? "date" : typeof value;
286
+ if (kind === "number" || kind === "date") {
287
+ return kind;
288
+ }
289
+ if (kind === "string" && value[0] === "=") {
290
+ return "formula";
291
+ } else if (kind === "string" && value.match(StringNumberPattern)) {
292
+ return "string+number";
293
+ }
294
+ return "other";
295
+ }
296
+ get last() {
297
+ if (this.nexts.length === 0) {
298
+ return this.first;
299
+ }
300
+ return this.nexts[this.nexts.length - 1];
301
+ }
302
+ add(value) {
303
+ const kind = this.discriminate(value);
304
+ if (this.kind !== kind || kind === "other" || kind === "formula") {
305
+ return new TypedGroup(value);
306
+ }
307
+ if (this.nexts.length === 0) {
308
+ switch (kind) {
309
+ case "date": {
310
+ this.timeDelta = new TimeDelta(value, this.first);
311
+ break;
312
+ }
313
+ case "number": {
314
+ this.numericDelta = value - this.first;
315
+ break;
316
+ }
317
+ case "string+number": {
318
+ const { prefix: prefix1, number: number1 } = extractStringNumber(this.first);
319
+ const { prefix: prefix2, number: number2 } = extractStringNumber(value);
320
+ if (prefix1 === prefix2) {
321
+ this.numericDelta = number2 - number1;
322
+ }
323
+ break;
324
+ }
325
+ }
326
+ }
327
+ this.nexts.push(value);
328
+ }
329
+ subdivide() {
330
+ if (this.nexts.length === 0) {
331
+ return [];
332
+ }
333
+ const news = [];
334
+ let lastGroup = this;
335
+ switch (this.kind) {
336
+ case "date": {
337
+ const eq = this.nexts.every((v, i) => i === 0 || dayjs(v).isSame(this.timeDelta.add(this.nexts[i - 1])));
338
+ this.equidistant = eq;
339
+ return [];
340
+ }
341
+ case "number": {
342
+ const eq = this.nexts.every((v, i) => i === 0 || v === this.first + this.numericDelta * (i + 1));
343
+ this.equidistant = eq;
344
+ return [];
345
+ }
346
+ case "string+number": {
347
+ const { prefix: basePrefix } = extractStringNumber(this.first);
348
+ for (let i = 0; i < lastGroup.nexts.length; i++) {
349
+ const next = lastGroup.nexts[i];
350
+ const { prefix, number } = extractStringNumber(next);
351
+ if (basePrefix !== prefix) {
352
+ const nexts = this.nexts.splice(i, this.nexts.length);
353
+ lastGroup = new TypedGroup(nexts.splice(0, 1)[0]);
354
+ nexts.forEach(lastGroup.add.bind(lastGroup));
355
+ news.push(lastGroup, ...lastGroup.subdivide());
356
+ break;
357
+ } else {
358
+ const { number: firstNumber } = extractStringNumber(lastGroup.first);
359
+ if (number !== firstNumber + (i + 1) * lastGroup.numericDelta) {
360
+ lastGroup.equidistant = false;
361
+ }
362
+ }
363
+ }
364
+ break;
365
+ }
366
+ }
367
+ return news;
368
+ }
369
+ }
370
+ function groupByType(cells) {
371
+ var _a, _b;
372
+ let group = new TypedGroup((_a = cells[0]) == null ? void 0 : _a.value);
373
+ const groups = [group];
374
+ for (let i = 1; i < cells.length; i++) {
375
+ const value = (_b = cells[i]) == null ? void 0 : _b.value;
376
+ const nextGroup = group.add(value);
377
+ if (nextGroup) {
378
+ groups.push(nextGroup);
379
+ group = nextGroup;
380
+ }
381
+ }
382
+ for (let i = groups.length - 1; i >= 0; i--) {
383
+ const group2 = groups[i];
384
+ groups.splice(i + 1, 0, ...group2.subdivide());
385
+ }
386
+ return groups;
387
+ }
388
+ export {
389
+ Autofill
390
+ };
391
+ //# sourceMappingURL=autofill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autofill.js","sources":["../../lib/autofill.ts"],"sourcesContent":["import React from 'react';\nimport dayjs from 'dayjs';\nimport type { AreaType, CellsByAddressType, CellType, PointType, StoreType } from '../types';\nimport { Table } from './table';\nimport { areaShape, areaToZone, complementSelectingArea, concatAreas, zoneToArea } from './structs';\nimport { p2a } from './converters';\nimport { absolutizeFormula } from '../formula/evaluator';\nimport { TimeDelta } from './time';\n\nconst BORDER_AUTOFILL_DRAGGING = 'dashed 1px #888888';\n\ntype Direction = 'left' | 'right' | 'up' | 'down';\ntype Orientation = 'horizontal' | 'vertical';\nconst DirectionMapping: {\n [key: string]: [Orientation, number];\n} = {\n left: ['horizontal', -1],\n right: ['horizontal', 1],\n up: ['vertical', -1],\n down: ['vertical', 1],\n};\n\nexport class Autofill {\n private readonly src: AreaType;\n private readonly dst: AreaType;\n private readonly direction: Direction;\n private readonly table: Table;\n constructor(store: StoreType, draggingTo: PointType) {\n const { table, choosing, selectingZone } = store;\n this.src = complementSelectingArea(zoneToArea(selectingZone), choosing);\n this.direction = this.suggestDirection(draggingTo);\n this.dst = this.getDestinationArea(draggingTo);\n this.table = table;\n }\n\n public get applied(): Table {\n const [orientation, sign] = DirectionMapping[this.direction];\n const matrix = this.table.getMatrix({ area: this.src, evaluates: null });\n const srcShape = areaShape({ ...this.src, base: 1 });\n const dstShape = areaShape({ ...this.dst, base: 1 });\n\n const diff: CellsByAddressType = {};\n if (orientation === 'horizontal') {\n for (let i = 0; i < dstShape.height; i++) {\n const patterns = this.getChangePatterns(matrix[i]);\n for (let j = 0; j < dstShape.width; j++) {\n const baseCell = matrix[i % srcShape.height]?.[j % srcShape.width];\n const x = sign > 0 ? this.dst.left + j : this.dst.right - j;\n const px = sign > 0 ? j % srcShape.width : (srcShape.width - 1 - (j % srcShape.width)) % srcShape.width;\n diff[p2a({ y: this.dst.top + i, x })] = {\n ...baseCell,\n value: patterns[px].next().value,\n };\n }\n }\n } else {\n for (let i = 0; i < dstShape.width; i++) {\n const patterns = this.getChangePatterns(matrix.map((row) => row[i]));\n for (let j = 0; j < dstShape.height; j++) {\n const baseCell = matrix[j % srcShape.height]?.[i % srcShape.width];\n const y = sign > 0 ? this.dst.top + j : this.dst.bottom - j;\n const py = sign > 0 ? j % srcShape.height : (srcShape.height - 1 - (j % srcShape.height)) % srcShape.height;\n const value = patterns[py].next().value;\n diff[p2a({ y, x: this.dst.left + i })] = { ...baseCell, value };\n }\n }\n }\n const table = this.table.update({\n diff,\n operator: 'USER',\n reflection: {\n selectingZone: areaToZone(this.src),\n },\n });\n return table;\n }\n\n public get wholeArea() {\n return concatAreas(this.src, this.dst);\n }\n\n public getCellStyle(target: PointType) {\n const { x, y } = target;\n const style: React.CSSProperties = {};\n const { top, left, bottom, right } = this.src;\n\n switch (this.direction) {\n case 'left': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.left === x && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'right': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.right === x - 1 && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n\n case 'up': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.top === y && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'down': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.bottom === y - 1 && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n }\n return style;\n }\n\n private getDestinationArea(autofillDraggingTo: PointType): AreaType {\n const { x, y } = autofillDraggingTo;\n const { top, left, bottom, right } = this.src;\n switch (this.direction) {\n case 'left':\n return { top, bottom, left: x, right: left - 1 };\n case 'right':\n return { top, bottom, left: right + 1, right: x };\n case 'up':\n return { left, right, top: y, bottom: top - 1 };\n case 'down':\n return { left, right, top: bottom + 1, bottom: y };\n }\n return this.src;\n }\n\n private suggestDirection(draggingTo: PointType): Direction {\n const { top, left, bottom, right } = this.src;\n let horizontal = 0,\n vertical = 0;\n if (draggingTo.x < left) {\n horizontal = draggingTo.x - left;\n } else if (draggingTo.x > right) {\n horizontal = draggingTo.x - right;\n }\n if (draggingTo.y < top) {\n vertical = draggingTo.y - top;\n } else if (draggingTo.y > bottom) {\n vertical = draggingTo.y - bottom;\n }\n // diagonal\n if (Math.abs(horizontal) > 0 && Math.abs(vertical) > 0) {\n if (Math.abs(horizontal) > Math.abs(vertical)) {\n return horizontal < 0 ? 'left' : 'right';\n }\n return vertical < 0 ? 'up' : 'down';\n }\n if (horizontal !== 0) {\n return horizontal < 0 ? 'left' : 'right';\n }\n if (vertical !== 0) {\n return vertical < 0 ? 'up' : 'down';\n }\n return 'down';\n }\n\n private getChangePatterns(cells: (CellType | null)[]): Generator[] {\n const result: Generator[] = [];\n const groups = groupByType(cells);\n const [orientation, sign] = DirectionMapping[this.direction];\n groups.forEach((group) => {\n const lastValue = sign > 0 ? group.last : group.first;\n switch (group.kind) {\n case 'other': {\n result.push(pass(group.first));\n return;\n }\n case 'formula': {\n const value = group.first;\n const table = this.table;\n\n function* generateFormula() {\n let slide = 0;\n const skip = cells.length * sign;\n while (true) {\n slide += skip;\n yield absolutizeFormula({\n value,\n table,\n slideY: orientation === 'vertical' ? slide : 0,\n slideX: orientation === 'horizontal' ? slide : 0,\n });\n }\n }\n result.push(generateFormula());\n return;\n }\n case 'number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateNumber() {\n let value = lastValue;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield value;\n }\n }\n const g = generateNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'date': {\n const next = (d: Date) => {\n return sign > 0 ? group.timeDelta.add(d) : group.timeDelta.sub(d);\n };\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateDate() {\n let value = lastValue as Date;\n while (true) {\n value = next(value);\n yield new Date(value);\n }\n }\n const g = generateDate();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'string+number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateStringNumber() {\n const { prefix } = extractStringNumber(group.first as string);\n const { number: lastNumber } = extractStringNumber(lastValue as string);\n let value = lastNumber;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield `${prefix}${Math.abs(value)}`;\n }\n }\n const g = generateStringNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n }\n });\n return result;\n }\n}\n\nfunction* pass(value: any) {\n while (true) {\n yield value;\n }\n}\n\ntype GroupKind = 'number' | 'date' | 'string+number' | 'formula' | 'other';\n\nconst StringNumberPattern = new RegExp('(.+?)(\\\\d+)$');\n\nconst extractStringNumber = (value: string) => {\n const match = value.match(StringNumberPattern);\n if (match) {\n const [, prefix, n] = match;\n return { prefix, number: Number(n) };\n }\n return { prefix: '', number: 0 };\n};\n\nclass TypedGroup {\n public timeDelta: TimeDelta = TimeDelta.create();\n public numericDelta: number = 0;\n public kind: GroupKind;\n public nexts: any[];\n public first: any;\n public equidistant = true;\n\n constructor(value: any) {\n this.first = value;\n this.nexts = [];\n this.kind = this.discriminate(value);\n }\n private discriminate(value: any): GroupKind {\n const kind = value instanceof Date ? 'date' : typeof value;\n if (kind === 'number' || kind === 'date') {\n return kind;\n }\n if (kind === 'string' && value[0] === '=') {\n return 'formula';\n } else if (kind === 'string' && value.match(StringNumberPattern)) {\n return 'string+number';\n }\n return 'other';\n }\n\n public get last() {\n if (this.nexts.length === 0) {\n return this.first;\n }\n return this.nexts[this.nexts.length - 1];\n }\n\n public add(value: any): TypedGroup | undefined {\n const kind = this.discriminate(value);\n if (this.kind !== kind || kind === 'other' || kind === 'formula') {\n return new TypedGroup(value);\n }\n if (this.nexts.length === 0) {\n switch (kind) {\n case 'date': {\n this.timeDelta = new TimeDelta(value as Date, this.first as Date);\n break;\n }\n case 'number': {\n this.numericDelta = (value as number) - this.first;\n break;\n }\n case 'string+number': {\n const { prefix: prefix1, number: number1 } = extractStringNumber(this.first as string);\n const { prefix: prefix2, number: number2 } = extractStringNumber(value as string);\n if (prefix1 === prefix2) {\n this.numericDelta = number2 - number1;\n }\n break;\n }\n }\n }\n this.nexts.push(value);\n }\n\n public subdivide() {\n if (this.nexts.length === 0) {\n return [];\n }\n\n const news: TypedGroup[] = [];\n\n let lastGroup: TypedGroup = this;\n switch (this.kind) {\n case 'date': {\n const eq = this.nexts.every((v, i) => i === 0 || dayjs(v).isSame(this.timeDelta.add(this.nexts[i - 1])));\n this.equidistant = eq;\n return [];\n }\n case 'number': {\n const eq = this.nexts.every((v, i) => i === 0 || v === this.first + this.numericDelta * (i + 1));\n this.equidistant = eq;\n return [];\n }\n case 'string+number': {\n const { prefix: basePrefix } = extractStringNumber(this.first as string);\n for (let i = 0; i < lastGroup.nexts.length; i++) {\n const next = lastGroup.nexts[i];\n const { prefix, number } = extractStringNumber(next as string);\n if (basePrefix !== prefix) {\n const nexts = this.nexts.splice(i, this.nexts.length);\n lastGroup = new TypedGroup(nexts.splice(0, 1)[0]);\n nexts.forEach(lastGroup.add.bind(lastGroup));\n news.push(lastGroup, ...lastGroup.subdivide());\n break;\n } else {\n const { number: firstNumber } = extractStringNumber(lastGroup.first as string);\n if (number !== firstNumber + (i + 1) * lastGroup.numericDelta) {\n lastGroup.equidistant = false;\n }\n }\n }\n break;\n }\n }\n\n return news;\n }\n}\n\nfunction groupByType(cells: (CellType | null)[]): TypedGroup[] {\n let group = new TypedGroup(cells[0]?.value);\n const groups: TypedGroup[] = [group];\n\n for (let i = 1; i < cells.length; i++) {\n const value = cells[i]?.value;\n const nextGroup = group.add(value);\n if (nextGroup) {\n groups.push(nextGroup);\n group = nextGroup;\n }\n }\n for (let i = groups.length - 1; i >= 0; i--) {\n const group = groups[i];\n groups.splice(i + 1, 0, ...group.subdivide());\n }\n return groups;\n}\n"],"names":["group"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { zoneToArea } from "./structs.js";
2
+ import { solveTable } from "../formula/solver.js";
3
+ const clip = (store) => {
4
+ const { selectingZone, choosing, editorRef, table } = store;
5
+ const { y, x } = choosing;
6
+ const selectingArea = zoneToArea(selectingZone);
7
+ let area = selectingArea;
8
+ if (area.left === -1) {
9
+ area = { top: y, left: x, bottom: y, right: x };
10
+ }
11
+ const input = editorRef.current;
12
+ const trimmed = table.trim(area);
13
+ const tsv = table2tsv(trimmed);
14
+ if (navigator.clipboard) {
15
+ navigator.clipboard.writeText(tsv);
16
+ } else if (input != null) {
17
+ input.value = tsv;
18
+ input.focus();
19
+ input.select();
20
+ document.execCommand("copy");
21
+ input.value = "";
22
+ input.blur();
23
+ }
24
+ return area;
25
+ };
26
+ const table2tsv = (table) => {
27
+ const lines = [];
28
+ const matrix = solveTable({ table, raise: false });
29
+ matrix.forEach((row, i) => {
30
+ const cols = [];
31
+ row.forEach((col, j) => {
32
+ const value = table.stringify({ y: i, x: j }, col);
33
+ if (value.indexOf("\n") !== -1) {
34
+ cols.push(`"${value.replace(/"/g, '""')}"`);
35
+ } else {
36
+ cols.push(value);
37
+ }
38
+ });
39
+ lines.push(cols.join(" "));
40
+ });
41
+ return lines.join("\n");
42
+ };
43
+ export {
44
+ clip
45
+ };
46
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sources":["../../lib/clipboard.ts"],"sourcesContent":["import type { StoreType, AreaType } from '../types';\n\nimport { zoneToArea } from './structs';\nimport { solveTable } from '../formula/solver';\nimport { Table } from './table';\n\nexport const clip = (store: StoreType): AreaType => {\n const { selectingZone, choosing, editorRef, table } = store;\n const { y, x } = choosing;\n const selectingArea = zoneToArea(selectingZone);\n let area = selectingArea;\n if (area.left === -1) {\n area = { top: y, left: x, bottom: y, right: x };\n }\n const input = editorRef.current;\n const trimmed = table.trim(area);\n const tsv = table2tsv(trimmed);\n\n if (navigator.clipboard) {\n navigator.clipboard.writeText(tsv);\n } else if (input != null) {\n input.value = tsv;\n input.focus();\n input.select();\n document.execCommand('copy');\n input.value = '';\n input.blur();\n }\n return area;\n};\n\nconst table2tsv = (table: Table): string => {\n const lines: string[] = [];\n const matrix = solveTable({ table, raise: false });\n matrix.forEach((row, i) => {\n const cols: string[] = [];\n row.forEach((col, j) => {\n const value = table.stringify({ y: i, x: j }, col);\n if (value.indexOf('\\n') !== -1) {\n cols.push(`\"${value.replace(/\"/g, '\"\"')}\"`);\n } else {\n cols.push(value);\n }\n });\n lines.push(cols.join('\\t'));\n });\n return lines.join('\\n');\n};\n"],"names":[],"mappings":";;AAMa,MAAA,OAAO,CAAC,UAA+B;AAClD,QAAM,EAAE,eAAe,UAAU,WAAW,MAAU,IAAA;AAChD,QAAA,EAAE,GAAG,EAAA,IAAM;AACX,QAAA,gBAAgB,WAAW,aAAa;AAC9C,MAAI,OAAO;AACP,MAAA,KAAK,SAAS,IAAI;AACb,WAAA,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE;AAAA,EAAA;AAEhD,QAAM,QAAQ,UAAU;AAClB,QAAA,UAAU,MAAM,KAAK,IAAI;AACzB,QAAA,MAAM,UAAU,OAAO;AAE7B,MAAI,UAAU,WAAW;AACb,cAAA,UAAU,UAAU,GAAG;AAAA,EAAA,WACxB,SAAS,MAAM;AACxB,UAAM,QAAQ;AACd,UAAM,MAAM;AACZ,UAAM,OAAO;AACb,aAAS,YAAY,MAAM;AAC3B,UAAM,QAAQ;AACd,UAAM,KAAK;AAAA,EAAA;AAEN,SAAA;AACT;AAEA,MAAM,YAAY,CAAC,UAAyB;AAC1C,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAS,WAAW,EAAE,OAAO,OAAO,OAAO;AAC1C,SAAA,QAAQ,CAAC,KAAK,MAAM;AACzB,UAAM,OAAiB,CAAC;AACpB,QAAA,QAAQ,CAAC,KAAK,MAAM;AAChB,YAAA,QAAQ,MAAM,UAAU,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG;AACjD,UAAI,MAAM,QAAQ,IAAI,MAAM,IAAI;AAC9B,aAAK,KAAK,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC,GAAG;AAAA,MAAA,OACrC;AACL,aAAK,KAAK,KAAK;AAAA,MAAA;AAAA,IACjB,CACD;AACD,UAAM,KAAK,KAAK,KAAK,GAAI,CAAC;AAAA,EAAA,CAC3B;AACM,SAAA,MAAM,KAAK,IAAI;AACxB;"}
@@ -0,0 +1,141 @@
1
+ import { DEFAULT_ALPHABET_CACHE_SIZE } from "../constants.js";
2
+ const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
3
+ const N2C_CACHE = /* @__PURE__ */ new Map();
4
+ const C2N_CACHE = /* @__PURE__ */ new Map();
5
+ const getColumnLetterFromNumber = (key, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE) => {
6
+ const cached = N2C_CACHE.get(--key);
7
+ if (cached != null) {
8
+ return cached;
9
+ }
10
+ if (key === 0) {
11
+ return "";
12
+ }
13
+ let num = key;
14
+ let result = "";
15
+ do {
16
+ result = ALPHABET[--num % 26] + result;
17
+ num = Math.floor(num / 26);
18
+ } while (num > 0);
19
+ N2C_CACHE.set(key, result);
20
+ const it = N2C_CACHE.keys();
21
+ for (let st = it.next(); N2C_CACHE.size > cacheSize; st = it.next()) {
22
+ N2C_CACHE.delete(st.value);
23
+ }
24
+ return result;
25
+ };
26
+ const getNumberFromColumnLetter = (key, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE) => {
27
+ const cached = C2N_CACHE.get(key);
28
+ if (cached != null) {
29
+ return cached;
30
+ }
31
+ if (key === "") {
32
+ return 0;
33
+ }
34
+ const alpha = key;
35
+ let result = 0;
36
+ for (let digit = 0; digit < alpha.length; digit++) {
37
+ const a = alpha[alpha.length - digit - 1];
38
+ const num = ALPHABET.indexOf(a) + 1;
39
+ result += ALPHABET.length ** digit * num;
40
+ }
41
+ C2N_CACHE.set(key, result);
42
+ const it = C2N_CACHE.keys();
43
+ for (let st = it.next(); C2N_CACHE.size > cacheSize; st = it.next()) {
44
+ C2N_CACHE.delete(st.value);
45
+ }
46
+ return result;
47
+ };
48
+ const x2c = (x) => {
49
+ if (x === 0) {
50
+ return "";
51
+ }
52
+ const c = getColumnLetterFromNumber(x + 1);
53
+ return x < 0 ? `$${c}` : c;
54
+ };
55
+ const c2x = (col, absolute = false) => {
56
+ const n = getNumberFromColumnLetter(col);
57
+ return absolute ? -n : n;
58
+ };
59
+ const y2r = (y) => {
60
+ if (y === 0) {
61
+ return "";
62
+ }
63
+ return y < 0 ? `$${y}` : String(y);
64
+ };
65
+ const r2y = (row, absolute = false) => {
66
+ if (typeof row === "string") {
67
+ row = parseInt(row, 10);
68
+ }
69
+ return absolute ? -row : row;
70
+ };
71
+ const p2a = ({ y, x }) => {
72
+ return `${x2c(x)}${y2r(y)}`;
73
+ };
74
+ const restoreDoubleQuote = (text) => text.replace(/\x00/g, '"');
75
+ const tsv2matrix = (tsv) => {
76
+ tsv = tsv.replace(/""/g, "\0");
77
+ const rows = [[]];
78
+ let row = rows[0];
79
+ let entering = false;
80
+ let word = "";
81
+ for (let i = 0; i < tsv.length; i++) {
82
+ const s = tsv[i];
83
+ if (s === "\n" && !entering) {
84
+ row.push(restoreDoubleQuote(word));
85
+ word = "";
86
+ row = [];
87
+ rows.push(row);
88
+ continue;
89
+ }
90
+ if (s === " ") {
91
+ row.push(restoreDoubleQuote(word));
92
+ word = "";
93
+ continue;
94
+ }
95
+ if (s === '"' && !entering && word === "") {
96
+ entering = true;
97
+ continue;
98
+ }
99
+ if (s === '"' && entering) {
100
+ entering = false;
101
+ continue;
102
+ }
103
+ word += s;
104
+ }
105
+ if (word) {
106
+ row.push(restoreDoubleQuote(word));
107
+ }
108
+ return rows;
109
+ };
110
+ const a2p = (address) => {
111
+ const m = address.match(/(\$)?([A-Z]*)(\$)?([0-9]*)/);
112
+ if (m == null) {
113
+ console.error("invalid address", address);
114
+ return { y: 1, x: 1 };
115
+ }
116
+ const [, absoluteCol, col, absoluteRow, row] = m.slice();
117
+ return { y: r2y(row, !!absoluteRow) || 0, x: c2x(col, !!absoluteCol) || 0 };
118
+ };
119
+ const grantAddressAbsolute = (address, absCol, absRow) => {
120
+ const m = address.match(/([A-Z]*)([0-9]*)/);
121
+ if (m == null) {
122
+ return;
123
+ }
124
+ const [, col, row] = m.slice();
125
+ return `${absCol ? "$" : ""}${col}${absRow ? "$" : ""}${row}`;
126
+ };
127
+ const stripAddressAbsolute = (address) => {
128
+ return address.replace(/\$/g, "");
129
+ };
130
+ export {
131
+ a2p,
132
+ c2x,
133
+ grantAddressAbsolute,
134
+ p2a,
135
+ r2y,
136
+ stripAddressAbsolute,
137
+ tsv2matrix,
138
+ x2c,
139
+ y2r
140
+ };
141
+ //# sourceMappingURL=converters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.js","sources":["../../lib/converters.ts"],"sourcesContent":["import type { Address, PointType } from '../types';\nimport { DEFAULT_ALPHABET_CACHE_SIZE } from '../constants';\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nconst N2C_CACHE = new Map<number, string>();\nconst C2N_CACHE = new Map<string, number>();\n\nconst getColumnLetterFromNumber = (key: number, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): string => {\n const cached = N2C_CACHE.get(--key);\n if (cached != null) {\n return cached;\n }\n if (key === 0) {\n return '';\n }\n let num = key;\n let result = '';\n do {\n result = ALPHABET[--num % 26] + result;\n num = Math.floor(num / 26);\n } while (num > 0);\n\n N2C_CACHE.set(key, result);\n const it = N2C_CACHE.keys();\n for (let st = it.next(); N2C_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n N2C_CACHE.delete(st.value);\n }\n return result;\n};\n\nconst getNumberFromColumnLetter = (key: string, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): number => {\n const cached = C2N_CACHE.get(key);\n if (cached != null) {\n return cached;\n }\n if (key === '') {\n return 0;\n }\n const alpha = key;\n let result = 0;\n for (let digit = 0; digit < alpha.length; digit++) {\n const a = alpha[alpha.length - digit - 1];\n const num = ALPHABET.indexOf(a) + 1;\n result += ALPHABET.length ** digit * num;\n }\n C2N_CACHE.set(key, result);\n const it = C2N_CACHE.keys();\n for (let st = it.next(); C2N_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n C2N_CACHE.delete(st.value);\n }\n return result;\n};\n\nexport const x2c = (x: number): string => {\n if (x === 0) {\n return '';\n }\n const c = getColumnLetterFromNumber(x + 1);\n return x < 0 ? `$${c}` : c;\n};\n\nexport const c2x = (col: string, absolute = false): number => {\n const n = getNumberFromColumnLetter(col);\n return absolute ? -n : n;\n};\n\nexport const y2r = (y: number) => {\n if (y === 0) {\n return '';\n }\n return y < 0 ? `$${y}` : String(y);\n};\n\nexport const r2y = (row: number | string, absolute = false) => {\n if (typeof row === 'string') {\n row = parseInt(row, 10);\n }\n return absolute ? -row : row;\n};\n\nexport const p2a = ({ y, x }: PointType) => {\n return `${x2c(x)}${y2r(y)}`;\n};\n\nconst restoreDoubleQuote = (text: string) => text.replace(/\\x00/g, '\"');\n\nexport const tsv2matrix = (tsv: string): string[][] => {\n tsv = tsv.replace(/\"\"/g, '\\x00');\n const rows: string[][] = [[]];\n let row = rows[0];\n let entering = false;\n let word = '';\n for (let i = 0; i < tsv.length; i++) {\n const s = tsv[i];\n if (s === '\\n' && !entering) {\n row.push(restoreDoubleQuote(word));\n word = '';\n row = [];\n rows.push(row);\n continue;\n }\n if (s === '\\t') {\n row.push(restoreDoubleQuote(word));\n word = '';\n continue;\n }\n if (s === '\"' && !entering && word === '') {\n entering = true;\n continue;\n }\n if (s === '\"' && entering) {\n entering = false;\n continue;\n }\n word += s;\n }\n if (word) {\n row.push(restoreDoubleQuote(word));\n }\n return rows;\n};\n\nexport const a2p = (address: Address): PointType => {\n const m = address.match(/(\\$)?([A-Z]*)(\\$)?([0-9]*)/);\n if (m == null) {\n console.error('invalid address', address);\n return { y: 1, x: 1 };\n }\n const [, absoluteCol, col, absoluteRow, row] = m.slice();\n return { y: r2y(row, !!absoluteRow) || 0, x: c2x(col, !!absoluteCol) || 0 };\n};\n\nexport const grantAddressAbsolute = (address: Address, absCol: boolean, absRow: boolean) => {\n const m = address.match(/([A-Z]*)([0-9]*)/);\n if (m == null) {\n return;\n }\n const [, col, row] = m.slice();\n return `${absCol ? '$' : ''}${col}${absRow ? '$' : ''}${row}`;\n};\n\nexport const stripAddressAbsolute = (address: Address) => {\n return address.replace(/\\$/g, '');\n};\n"],"names":[],"mappings":";AAGA,MAAM,WAAW;AAEjB,MAAM,gCAAgB,IAAoB;AAC1C,MAAM,gCAAgB,IAAoB;AAE1C,MAAM,4BAA4B,CAAC,KAAa,YAAY,gCAAwC;AAClG,QAAM,SAAS,UAAU,IAAI,EAAE,GAAG;AAClC,MAAI,UAAU,MAAM;AACX,WAAA;AAAA,EAAA;AAET,MAAI,QAAQ,GAAG;AACN,WAAA;AAAA,EAAA;AAET,MAAI,MAAM;AACV,MAAI,SAAS;AACV,KAAA;AACD,aAAS,SAAS,EAAE,MAAM,EAAE,IAAI;AAC1B,UAAA,KAAK,MAAM,MAAM,EAAE;AAAA,WAClB,MAAM;AAEL,YAAA,IAAI,KAAK,MAAM;AACnB,QAAA,KAAK,UAAU,KAAK;AACjB,WAAA,KAAK,GAAG,QAAQ,UAAU,OAAO,WAAW,KAAK,GAAG,KAAA,GAAQ;AAEzD,cAAA,OAAO,GAAG,KAAK;AAAA,EAAA;AAEpB,SAAA;AACT;AAEA,MAAM,4BAA4B,CAAC,KAAa,YAAY,gCAAwC;AAC5F,QAAA,SAAS,UAAU,IAAI,GAAG;AAChC,MAAI,UAAU,MAAM;AACX,WAAA;AAAA,EAAA;AAET,MAAI,QAAQ,IAAI;AACP,WAAA;AAAA,EAAA;AAET,QAAM,QAAQ;AACd,MAAI,SAAS;AACb,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,UAAM,IAAI,MAAM,MAAM,SAAS,QAAQ,CAAC;AACxC,UAAM,MAAM,SAAS,QAAQ,CAAC,IAAI;AACxB,cAAA,SAAS,UAAU,QAAQ;AAAA,EAAA;AAE7B,YAAA,IAAI,KAAK,MAAM;AACnB,QAAA,KAAK,UAAU,KAAK;AACjB,WAAA,KAAK,GAAG,QAAQ,UAAU,OAAO,WAAW,KAAK,GAAG,KAAA,GAAQ;AAEzD,cAAA,OAAO,GAAG,KAAK;AAAA,EAAA;AAEpB,SAAA;AACT;AAEa,MAAA,MAAM,CAAC,MAAsB;AACxC,MAAI,MAAM,GAAG;AACJ,WAAA;AAAA,EAAA;AAEH,QAAA,IAAI,0BAA0B,IAAI,CAAC;AACzC,SAAO,IAAI,IAAI,IAAI,CAAC,KAAK;AAC3B;AAEO,MAAM,MAAM,CAAC,KAAa,WAAW,UAAkB;AACtD,QAAA,IAAI,0BAA0B,GAAG;AAChC,SAAA,WAAW,CAAC,IAAI;AACzB;AAEa,MAAA,MAAM,CAAC,MAAc;AAChC,MAAI,MAAM,GAAG;AACJ,WAAA;AAAA,EAAA;AAET,SAAO,IAAI,IAAI,IAAI,CAAC,KAAK,OAAO,CAAC;AACnC;AAEO,MAAM,MAAM,CAAC,KAAsB,WAAW,UAAU;AACzD,MAAA,OAAO,QAAQ,UAAU;AACrB,UAAA,SAAS,KAAK,EAAE;AAAA,EAAA;AAEjB,SAAA,WAAW,CAAC,MAAM;AAC3B;AAEO,MAAM,MAAM,CAAC,EAAE,GAAG,QAAmB;AAC1C,SAAO,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAC3B;AAEA,MAAM,qBAAqB,CAAC,SAAiB,KAAK,QAAQ,SAAS,GAAG;AAEzD,MAAA,aAAa,CAAC,QAA4B;AAC/C,QAAA,IAAI,QAAQ,OAAO,IAAM;AACzB,QAAA,OAAmB,CAAC,EAAE;AACxB,MAAA,MAAM,KAAK,CAAC;AAChB,MAAI,WAAW;AACf,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAC7B,UAAA,IAAI,IAAI,CAAC;AACX,QAAA,MAAM,QAAQ,CAAC,UAAU;AACvB,UAAA,KAAK,mBAAmB,IAAI,CAAC;AAC1B,aAAA;AACP,YAAM,CAAC;AACP,WAAK,KAAK,GAAG;AACb;AAAA,IAAA;AAEF,QAAI,MAAM,KAAM;AACV,UAAA,KAAK,mBAAmB,IAAI,CAAC;AAC1B,aAAA;AACP;AAAA,IAAA;AAEF,QAAI,MAAM,OAAO,CAAC,YAAY,SAAS,IAAI;AAC9B,iBAAA;AACX;AAAA,IAAA;AAEE,QAAA,MAAM,OAAO,UAAU;AACd,iBAAA;AACX;AAAA,IAAA;AAEM,YAAA;AAAA,EAAA;AAEV,MAAI,MAAM;AACJ,QAAA,KAAK,mBAAmB,IAAI,CAAC;AAAA,EAAA;AAE5B,SAAA;AACT;AAEa,MAAA,MAAM,CAAC,YAAgC;AAC5C,QAAA,IAAI,QAAQ,MAAM,4BAA4B;AACpD,MAAI,KAAK,MAAM;AACL,YAAA,MAAM,mBAAmB,OAAO;AACxC,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EAAA;AAEhB,QAAA,CAAA,EAAG,aAAa,KAAK,aAAa,GAAG,IAAI,EAAE,MAAM;AACvD,SAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,WAAW,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,WAAW,KAAK,EAAE;AAC5E;AAEO,MAAM,uBAAuB,CAAC,SAAkB,QAAiB,WAAoB;AACpF,QAAA,IAAI,QAAQ,MAAM,kBAAkB;AAC1C,MAAI,KAAK,MAAM;AACb;AAAA,EAAA;AAEF,QAAM,CAAG,EAAA,KAAK,GAAG,IAAI,EAAE,MAAM;AACtB,SAAA,GAAG,SAAS,MAAM,EAAE,GAAG,GAAG,GAAG,SAAS,MAAM,EAAE,GAAG,GAAG;AAC7D;AAEa,MAAA,uBAAuB,CAAC,YAAqB;AACjD,SAAA,QAAQ,QAAQ,OAAO,EAAE;AAClC;"}