@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.
- package/dist/_virtual/_commonjsHelpers.js +7 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/dayjs.min.js +8 -0
- package/dist/_virtual/dayjs.min.js.map +1 -0
- package/dist/_virtual/dayjs.min2.js +5 -0
- package/dist/_virtual/dayjs.min2.js.map +1 -0
- package/dist/_virtual/jsx-runtime.js +6 -0
- package/dist/_virtual/jsx-runtime.js.map +1 -0
- package/dist/_virtual/jsx-runtime2.js +5 -0
- package/dist/_virtual/jsx-runtime2.js.map +1 -0
- package/dist/_virtual/react-jsx-runtime.development.js +5 -0
- package/dist/_virtual/react-jsx-runtime.development.js.map +1 -0
- package/dist/_virtual/react-jsx-runtime.production.js +5 -0
- package/dist/_virtual/react-jsx-runtime.production.js.map +1 -0
- package/dist/_virtual/timezone.js +8 -0
- package/dist/_virtual/timezone.js.map +1 -0
- package/dist/_virtual/timezone2.js +5 -0
- package/dist/_virtual/timezone2.js.map +1 -0
- package/dist/_virtual/utc.js +8 -0
- package/dist/_virtual/utc.js.map +1 -0
- package/dist/_virtual/utc2.js +5 -0
- package/dist/_virtual/utc2.js.map +1 -0
- package/dist/components/Cell.js +232 -0
- package/dist/components/Cell.js.map +1 -0
- package/dist/components/ContextMenu.js +297 -0
- package/dist/components/ContextMenu.js.map +1 -0
- package/dist/components/Editor.js +455 -0
- package/dist/components/Editor.js.map +1 -0
- package/dist/components/Emitter.js +26 -0
- package/dist/components/Emitter.js.map +1 -0
- package/dist/components/Fixed.js +17 -0
- package/dist/components/Fixed.js.map +1 -0
- package/dist/components/FormulaBar.js +149 -0
- package/dist/components/FormulaBar.js.map +1 -0
- package/dist/components/GridSheet.js +246 -0
- package/dist/components/GridSheet.js.map +1 -0
- package/dist/components/HeaderCellLeft.js +131 -0
- package/dist/components/HeaderCellLeft.js.map +1 -0
- package/dist/components/HeaderCellTop.js +132 -0
- package/dist/components/HeaderCellTop.js.map +1 -0
- package/dist/components/PluginBase.js +35 -0
- package/dist/components/PluginBase.js.map +1 -0
- package/dist/components/Resizer.js +98 -0
- package/dist/components/Resizer.js.map +1 -0
- package/dist/components/SearchBar.js +108 -0
- package/dist/components/SearchBar.js.map +1 -0
- package/dist/components/SheetProvider.js +56 -0
- package/dist/components/SheetProvider.js.map +1 -0
- package/dist/components/StoreInitializer.js +84 -0
- package/dist/components/StoreInitializer.js.map +1 -0
- package/dist/components/Tabular.js +308 -0
- package/dist/components/Tabular.js.map +1 -0
- package/dist/components/hooks.js +15 -0
- package/dist/components/hooks.js.map +1 -0
- package/dist/components/svg/Base.js +24 -0
- package/dist/components/svg/Base.js.map +1 -0
- package/dist/components/svg/CloseIcon.js +13 -0
- package/dist/components/svg/CloseIcon.js.map +1 -0
- package/dist/components/svg/SearchIcon.js +13 -0
- package/dist/components/svg/SearchIcon.js.map +1 -0
- package/dist/constants.js +43 -0
- package/dist/constants.js.map +1 -0
- package/dist/formula/evaluator.js +674 -0
- package/dist/formula/evaluator.js.map +1 -0
- package/dist/formula/functions/__base.js +19 -0
- package/dist/formula/functions/__base.js.map +1 -0
- package/dist/formula/functions/__utils.js +145 -0
- package/dist/formula/functions/__utils.js.map +1 -0
- package/dist/formula/functions/abs.js +24 -0
- package/dist/formula/functions/abs.js.map +1 -0
- package/dist/formula/functions/acos.js +32 -0
- package/dist/formula/functions/acos.js.map +1 -0
- package/dist/formula/functions/add.js +57 -0
- package/dist/formula/functions/add.js.map +1 -0
- package/dist/formula/functions/and.js +28 -0
- package/dist/formula/functions/and.js.map +1 -0
- package/dist/formula/functions/asin.js +32 -0
- package/dist/formula/functions/asin.js.map +1 -0
- package/dist/formula/functions/atan.js +29 -0
- package/dist/formula/functions/atan.js.map +1 -0
- package/dist/formula/functions/atan2.js +35 -0
- package/dist/formula/functions/atan2.js.map +1 -0
- package/dist/formula/functions/average.js +44 -0
- package/dist/formula/functions/average.js.map +1 -0
- package/dist/formula/functions/col.js +31 -0
- package/dist/formula/functions/col.js.map +1 -0
- package/dist/formula/functions/concat.js +27 -0
- package/dist/formula/functions/concat.js.map +1 -0
- package/dist/formula/functions/concatenate.js +28 -0
- package/dist/formula/functions/concatenate.js.map +1 -0
- package/dist/formula/functions/cos.js +29 -0
- package/dist/formula/functions/cos.js.map +1 -0
- package/dist/formula/functions/count.js +38 -0
- package/dist/formula/functions/count.js.map +1 -0
- package/dist/formula/functions/counta.js +38 -0
- package/dist/formula/functions/counta.js.map +1 -0
- package/dist/formula/functions/countif.js +32 -0
- package/dist/formula/functions/countif.js.map +1 -0
- package/dist/formula/functions/divide.js +33 -0
- package/dist/formula/functions/divide.js.map +1 -0
- package/dist/formula/functions/eq.js +29 -0
- package/dist/formula/functions/eq.js.map +1 -0
- package/dist/formula/functions/exp.js +29 -0
- package/dist/formula/functions/exp.js.map +1 -0
- package/dist/formula/functions/gt.js +29 -0
- package/dist/formula/functions/gt.js.map +1 -0
- package/dist/formula/functions/gte.js +29 -0
- package/dist/formula/functions/gte.js.map +1 -0
- package/dist/formula/functions/hlookup.js +75 -0
- package/dist/formula/functions/hlookup.js.map +1 -0
- package/dist/formula/functions/if.js +39 -0
- package/dist/formula/functions/if.js.map +1 -0
- package/dist/formula/functions/iferror.js +45 -0
- package/dist/formula/functions/iferror.js.map +1 -0
- package/dist/formula/functions/len.js +29 -0
- package/dist/formula/functions/len.js.map +1 -0
- package/dist/formula/functions/lenb.js +29 -0
- package/dist/formula/functions/lenb.js.map +1 -0
- package/dist/formula/functions/ln.js +32 -0
- package/dist/formula/functions/ln.js.map +1 -0
- package/dist/formula/functions/log.js +36 -0
- package/dist/formula/functions/log.js.map +1 -0
- package/dist/formula/functions/log10.js +32 -0
- package/dist/formula/functions/log10.js.map +1 -0
- package/dist/formula/functions/lt.js +29 -0
- package/dist/formula/functions/lt.js.map +1 -0
- package/dist/formula/functions/lte.js +29 -0
- package/dist/formula/functions/lte.js.map +1 -0
- package/dist/formula/functions/max.js +47 -0
- package/dist/formula/functions/max.js.map +1 -0
- package/dist/formula/functions/min.js +47 -0
- package/dist/formula/functions/min.js.map +1 -0
- package/dist/formula/functions/minus.js +57 -0
- package/dist/formula/functions/minus.js.map +1 -0
- package/dist/formula/functions/mod.js +33 -0
- package/dist/formula/functions/mod.js.map +1 -0
- package/dist/formula/functions/multiply.js +27 -0
- package/dist/formula/functions/multiply.js.map +1 -0
- package/dist/formula/functions/ne.js +29 -0
- package/dist/formula/functions/ne.js.map +1 -0
- package/dist/formula/functions/not.js +30 -0
- package/dist/formula/functions/not.js.map +1 -0
- package/dist/formula/functions/now.js +22 -0
- package/dist/formula/functions/now.js.map +1 -0
- package/dist/formula/functions/or.js +28 -0
- package/dist/formula/functions/or.js.map +1 -0
- package/dist/formula/functions/pi.js +22 -0
- package/dist/formula/functions/pi.js.map +1 -0
- package/dist/formula/functions/power.js +27 -0
- package/dist/formula/functions/power.js.map +1 -0
- package/dist/formula/functions/product.js +40 -0
- package/dist/formula/functions/product.js.map +1 -0
- package/dist/formula/functions/radians.js +29 -0
- package/dist/formula/functions/radians.js.map +1 -0
- package/dist/formula/functions/rand.js +22 -0
- package/dist/formula/functions/rand.js.map +1 -0
- package/dist/formula/functions/round.js +35 -0
- package/dist/formula/functions/round.js.map +1 -0
- package/dist/formula/functions/rounddown.js +35 -0
- package/dist/formula/functions/rounddown.js.map +1 -0
- package/dist/formula/functions/roundup.js +35 -0
- package/dist/formula/functions/roundup.js.map +1 -0
- package/dist/formula/functions/row.js +31 -0
- package/dist/formula/functions/row.js.map +1 -0
- package/dist/formula/functions/sin.js +29 -0
- package/dist/formula/functions/sin.js.map +1 -0
- package/dist/formula/functions/sqrt.js +32 -0
- package/dist/formula/functions/sqrt.js.map +1 -0
- package/dist/formula/functions/sum.js +47 -0
- package/dist/formula/functions/sum.js.map +1 -0
- package/dist/formula/functions/sumif.js +65 -0
- package/dist/formula/functions/sumif.js.map +1 -0
- package/dist/formula/functions/tan.js +29 -0
- package/dist/formula/functions/tan.js.map +1 -0
- package/dist/formula/functions/uminus.js +24 -0
- package/dist/formula/functions/uminus.js.map +1 -0
- package/dist/formula/functions/vlookup.js +75 -0
- package/dist/formula/functions/vlookup.js.map +1 -0
- package/dist/formula/mapping.js +118 -0
- package/dist/formula/mapping.js.map +1 -0
- package/dist/formula/solver.js +70 -0
- package/dist/formula/solver.js.map +1 -0
- package/dist/index.js +16 -9113
- package/dist/index.js.map +1 -1
- package/dist/lib/autofill.js +391 -0
- package/dist/lib/autofill.js.map +1 -0
- package/dist/lib/clipboard.js +46 -0
- package/dist/lib/clipboard.js.map +1 -0
- package/dist/lib/converters.js +141 -0
- package/dist/lib/converters.js.map +1 -0
- package/dist/lib/input.js +52 -0
- package/dist/lib/input.js.map +1 -0
- package/dist/lib/palette.js +24 -0
- package/dist/lib/palette.js.map +1 -0
- package/dist/lib/prevention.js +82 -0
- package/dist/lib/prevention.js.map +1 -0
- package/dist/lib/structs.js +276 -0
- package/dist/lib/structs.js.map +1 -0
- package/dist/lib/table.js +1248 -0
- package/dist/lib/table.js.map +1 -0
- package/dist/lib/time.js +79 -0
- package/dist/lib/time.js.map +1 -0
- package/dist/lib/virtualization.js +129 -0
- package/dist/lib/virtualization.js.map +1 -0
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js +287 -0
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js.map +1 -0
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/timezone.js +72 -0
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/timezone.js.map +1 -0
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.js +85 -0
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.js.map +1 -0
- package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.development.js +454 -0
- package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -0
- package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.production.js +42 -0
- package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/cjs/react-jsx-runtime.production.js.map +1 -0
- package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/jsx-runtime.js +18 -0
- package/dist/node_modules/.pnpm/react@19.0.0/node_modules/react/jsx-runtime.js.map +1 -0
- package/dist/parsers/core.js +139 -0
- package/dist/parsers/core.js.map +1 -0
- package/dist/renderers/checkbox.js +20 -0
- package/dist/renderers/checkbox.js.map +1 -0
- package/dist/renderers/core.js +147 -0
- package/dist/renderers/core.js.map +1 -0
- package/dist/renderers/thousand_separator.js +17 -0
- package/dist/renderers/thousand_separator.js.map +1 -0
- package/dist/store/actions.js +762 -0
- package/dist/store/actions.js.map +1 -0
- package/dist/store/helpers.js +88 -0
- package/dist/store/helpers.js.map +1 -0
- package/dist/store/index.js +8 -0
- package/dist/store/index.js.map +1 -0
- package/dist/styles/embedder.js +19 -0
- package/dist/styles/embedder.js.map +1 -0
- package/dist/styles/minified.js +7 -0
- package/dist/styles/minified.js.map +1 -0
- 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":"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"}
|