@gridsheet/react-core 1.4.0-alpha.8 → 1.4.0
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/README.md +27 -0
- 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/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.d.ts.map +1 -1
- package/dist/components/Cell.js +3 -1
- package/dist/components/Cell.js.map +1 -1
- package/dist/components/Editor.d.ts +2 -1
- package/dist/components/Editor.d.ts.map +1 -1
- package/dist/components/Editor.js +13 -4
- package/dist/components/Editor.js.map +1 -1
- package/dist/components/FormulaBar.d.ts.map +1 -1
- package/dist/components/FormulaBar.js +4 -3
- package/dist/components/FormulaBar.js.map +1 -1
- package/dist/components/GridSheet.d.ts.map +1 -1
- package/dist/components/GridSheet.js +3 -2
- package/dist/components/GridSheet.js.map +1 -1
- package/dist/components/SheetProvider.d.ts +2 -0
- package/dist/components/SheetProvider.d.ts.map +1 -1
- package/dist/components/SheetProvider.js +3 -0
- package/dist/components/SheetProvider.js.map +1 -1
- package/dist/components/Tabular.d.ts.map +1 -1
- package/dist/components/Tabular.js +38 -29
- package/dist/components/Tabular.js.map +1 -1
- package/dist/formula/evaluator.d.ts +10 -3
- package/dist/formula/evaluator.d.ts.map +1 -1
- package/dist/formula/evaluator.js +11 -6
- package/dist/formula/evaluator.js.map +1 -1
- package/dist/formula/functions/__base.d.ts +4 -1
- package/dist/formula/functions/__base.d.ts.map +1 -1
- package/dist/formula/functions/__base.js +2 -1
- package/dist/formula/functions/__base.js.map +1 -1
- package/dist/formula/functions/__utils.js +1 -1
- package/dist/formula/functions/add.js +5 -5
- package/dist/formula/functions/add.js.map +1 -1
- package/dist/formula/functions/col.d.ts +1 -2
- package/dist/formula/functions/col.d.ts.map +1 -1
- package/dist/formula/functions/col.js +8 -5
- package/dist/formula/functions/col.js.map +1 -1
- package/dist/formula/functions/col.spec.d.ts +2 -0
- package/dist/formula/functions/col.spec.d.ts.map +1 -0
- package/dist/formula/functions/minus.js +5 -5
- package/dist/formula/functions/minus.js.map +1 -1
- package/dist/formula/functions/row.d.ts +1 -2
- package/dist/formula/functions/row.d.ts.map +1 -1
- package/dist/formula/functions/row.js +8 -5
- package/dist/formula/functions/row.js.map +1 -1
- package/dist/formula/functions/row.spec.d.ts +2 -0
- package/dist/formula/functions/row.spec.d.ts.map +1 -0
- package/dist/formula/mapping.d.ts.map +1 -1
- package/dist/formula/mapping.js +1 -0
- package/dist/formula/mapping.js.map +1 -1
- package/dist/formula/solver.d.ts +3 -2
- package/dist/formula/solver.d.ts.map +1 -1
- package/dist/formula/solver.js +3 -3
- package/dist/formula/solver.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/autofill.js +1 -1
- package/dist/lib/clipboard.d.ts.map +1 -1
- package/dist/lib/clipboard.js +28 -2
- package/dist/lib/clipboard.js.map +1 -1
- package/dist/lib/table.d.ts +2 -1
- package/dist/lib/table.d.ts.map +1 -1
- package/dist/lib/table.js +21 -10
- package/dist/lib/table.js.map +1 -1
- package/dist/lib/time.d.ts +7 -1
- package/dist/lib/time.d.ts.map +1 -1
- package/dist/lib/time.js +95 -4
- package/dist/lib/time.js.map +1 -1
- 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/parsers/core.d.ts.map +1 -1
- package/dist/parsers/core.js +4 -32
- package/dist/parsers/core.js.map +1 -1
- package/dist/renderers/core.d.ts +24 -21
- package/dist/renderers/core.d.ts.map +1 -1
- package/dist/renderers/core.js +35 -47
- package/dist/renderers/core.js.map +1 -1
- package/dist/store/actions.d.ts.map +1 -1
- package/dist/store/actions.js.map +1 -1
- package/dist/types.d.ts +5 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SheetProvider.js","sources":["../../components/SheetProvider.tsx"],"sourcesContent":["import React from 'react';\n\nimport { RefPaletteType, SheetMapType, TableMapType } from '../types';\n\nexport type SheetContextType = {\n mounted: boolean;\n sheets: React.MutableRefObject<SheetMapType>;\n tables: React.MutableRefObject<TableMapType>;\n head: React.MutableRefObject<number>;\n editingCell: string;\n setEditingCell: (cell: string) => void;\n externalRefs?: { [sheetName: string]: RefPaletteType };\n setExternalRefs?: (refs: { [sheetName: string]: RefPaletteType }) => void;\n lastFocusedRef: React.MutableRefObject<HTMLTextAreaElement | null>;\n setLastFocusedRef: (ref: React.MutableRefObject<HTMLTextAreaElement | null>) => void;\n forceRender: () => void;\n};\n\nexport const SheetContext = React.createContext({} as SheetContextType);\n\nexport function useSheetContext(): [boolean, SheetContextType] {\n const ctx = React.useContext(SheetContext);\n if (ctx.tables?.current == null) {\n return [false, ctx];\n }\n return [true, ctx];\n}\n\nexport function useSheetDispatch() {\n const dispatch = React.useContext(SheetContext);\n if (!dispatch) {\n return undefined;\n }\n return dispatch;\n}\n\ntype Props = {\n children: React.ReactNode;\n};\n\nexport function SheetProvider({ children }: Props) {\n const [mounted, setMounted] = React.useState(false);\n const [version, setVersion] = React.useState(0);\n const head = React.useRef(1);\n const sheets = React.useRef<SheetMapType>({});\n const tables = React.useRef<TableMapType>({});\n const [editingCell, setEditingCell] = React.useState('');\n const [externalRefs, setExternalRefs] = React.useState<{ [sheetName: string]: RefPaletteType }>({});\n const lastFocusedRefInitial = React.useRef<HTMLTextAreaElement | null>(null);\n const [lastFocusedRef, setLastFocusedRef] = React.useState(lastFocusedRefInitial);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <SheetContext.Provider\n value={{\n mounted,\n tables,\n sheets,\n head,\n editingCell,\n setEditingCell,\n externalRefs,\n setExternalRefs,\n lastFocusedRef,\n setLastFocusedRef,\n forceRender: () => {\n if (version >= Number.MAX_SAFE_INTEGER) {\n setVersion(0);\n return;\n }\n setVersion(version + 1);\n },\n }}\n >\n {children}\n </SheetContext.Provider>\n );\n}\n"],"names":["React"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"SheetProvider.js","sources":["../../components/SheetProvider.tsx"],"sourcesContent":["import React from 'react';\n\nimport { RefPaletteType, SheetMapType, TableMapType } from '../types';\n\nexport type SheetContextType = {\n mounted: boolean;\n sheets: React.MutableRefObject<SheetMapType>;\n tables: React.MutableRefObject<TableMapType>;\n head: React.MutableRefObject<number>;\n choosingCell: string;\n setChoosingCell: (cell: string) => void;\n editingCell: string;\n setEditingCell: (cell: string) => void;\n externalRefs?: { [sheetName: string]: RefPaletteType };\n setExternalRefs?: (refs: { [sheetName: string]: RefPaletteType }) => void;\n lastFocusedRef: React.MutableRefObject<HTMLTextAreaElement | null>;\n setLastFocusedRef: (ref: React.MutableRefObject<HTMLTextAreaElement | null>) => void;\n forceRender: () => void;\n};\n\nexport const SheetContext = React.createContext({} as SheetContextType);\n\nexport function useSheetContext(): [boolean, SheetContextType] {\n const ctx = React.useContext(SheetContext);\n if (ctx.tables?.current == null) {\n return [false, ctx];\n }\n return [true, ctx];\n}\n\nexport function useSheetDispatch() {\n const dispatch = React.useContext(SheetContext);\n if (!dispatch) {\n return undefined;\n }\n return dispatch;\n}\n\ntype Props = {\n children: React.ReactNode;\n};\n\nexport function SheetProvider({ children }: Props) {\n const [mounted, setMounted] = React.useState(false);\n const [version, setVersion] = React.useState(0);\n const head = React.useRef(1);\n const sheets = React.useRef<SheetMapType>({});\n const tables = React.useRef<TableMapType>({});\n const [choosingCell, setChoosingCell] = React.useState('');\n const [editingCell, setEditingCell] = React.useState('');\n const [externalRefs, setExternalRefs] = React.useState<{ [sheetName: string]: RefPaletteType }>({});\n const lastFocusedRefInitial = React.useRef<HTMLTextAreaElement | null>(null);\n const [lastFocusedRef, setLastFocusedRef] = React.useState(lastFocusedRefInitial);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <SheetContext.Provider\n value={{\n mounted,\n tables,\n sheets,\n head,\n choosingCell,\n setChoosingCell,\n editingCell,\n setEditingCell,\n externalRefs,\n setExternalRefs,\n lastFocusedRef,\n setLastFocusedRef,\n forceRender: () => {\n if (version >= Number.MAX_SAFE_INTEGER) {\n setVersion(0);\n return;\n }\n setVersion(version + 1);\n },\n }}\n >\n {children}\n </SheetContext.Provider>\n );\n}\n"],"names":["React"],"mappings":";;AAoBO,MAAM,eAAeA,eAAM,cAAc,CAAsB,CAAA;AAE/D,SAAS,kBAA+C;;AACvD,QAAA,MAAMA,eAAM,WAAW,YAAY;AACrC,QAAA,SAAI,WAAJ,mBAAY,YAAW,MAAM;AACxB,WAAA,CAAC,OAAO,GAAG;AAAA,EAAA;AAEb,SAAA,CAAC,MAAM,GAAG;AACnB;AAcgB,SAAA,cAAc,EAAE,YAAmB;AACjD,QAAM,CAAC,SAAS,UAAU,IAAIA,eAAM,SAAS,KAAK;AAClD,QAAM,CAAC,SAAS,UAAU,IAAIA,eAAM,SAAS,CAAC;AACxC,QAAA,OAAOA,eAAM,OAAO,CAAC;AAC3B,QAAM,SAASA,eAAM,OAAqB,EAAE;AAC5C,QAAM,SAASA,eAAM,OAAqB,EAAE;AAC5C,QAAM,CAAC,cAAc,eAAe,IAAIA,eAAM,SAAS,EAAE;AACzD,QAAM,CAAC,aAAa,cAAc,IAAIA,eAAM,SAAS,EAAE;AACvD,QAAM,CAAC,cAAc,eAAe,IAAIA,eAAM,SAAkD,CAAA,CAAE;AAC5F,QAAA,wBAAwBA,eAAM,OAAmC,IAAI;AAC3E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,eAAM,SAAS,qBAAqB;AAEhFA,iBAAM,UAAU,MAAM;AACpB,eAAW,IAAI;AAAA,EACjB,GAAG,EAAE;AAGH,SAAA;AAAA,IAAC,aAAa;AAAA,IAAb;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,MAAM;AACb,cAAA,WAAW,OAAO,kBAAkB;AACtC,uBAAW,CAAC;AACZ;AAAA,UAAA;AAEF,qBAAW,UAAU,CAAC;AAAA,QAAA;AAAA,MAE1B;AAAA,MAEC;AAAA,IAAA;AAAA,EACH;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabular.d.ts","sourceRoot":"","sources":["../../components/Tabular.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,EAAwC,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAS1F,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,cAAc,+CAA4C,CAAC;AAExE,eAAO,MAAM,OAAO,GAAI,cAAc,KAAK,
|
|
1
|
+
{"version":3,"file":"Tabular.d.ts","sourceRoot":"","sources":["../../components/Tabular.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,OAAO,EAAwC,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAS1F,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/D,CAAC;AAEF,eAAO,MAAM,cAAc,+CAA4C,CAAC;AAExE,eAAO,MAAM,OAAO,GAAI,cAAc,KAAK,sBAmL1C,CAAC"}
|
|
@@ -8,7 +8,7 @@ import { updateTable, setInputting, choose, select, setEntering } from "../store
|
|
|
8
8
|
import { virtualize } from "../lib/virtualization.js";
|
|
9
9
|
import { stripAddressAbsolute, p2a, a2p } from "../lib/converters.js";
|
|
10
10
|
import { zoneToArea } from "../lib/structs.js";
|
|
11
|
-
import { Lexer } from "../formula/evaluator.js";
|
|
11
|
+
import { Lexer, stripSheetName } from "../formula/evaluator.js";
|
|
12
12
|
import { REF_PALETTE } from "../lib/palette.js";
|
|
13
13
|
import { useSheetContext } from "./SheetProvider.js";
|
|
14
14
|
import { Autofill } from "../lib/autofill.js";
|
|
@@ -29,39 +29,44 @@ const Tabular = ({ tableRef }) => {
|
|
|
29
29
|
editingCell,
|
|
30
30
|
inputting
|
|
31
31
|
} = store;
|
|
32
|
+
const [sheetProvided, sheetContext] = useSheetContext();
|
|
32
33
|
React__default.useEffect(() => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
34
|
+
const formulaEditing = editingCell && inputting.startsWith("=");
|
|
35
|
+
if (!formulaEditing) {
|
|
36
|
+
setRefs({});
|
|
37
|
+
setExternalRefs == null ? void 0 : setExternalRefs({});
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const refs2 = {};
|
|
41
|
+
const externalRefs2 = {};
|
|
42
|
+
const lexer = new Lexer(inputting.substring(1));
|
|
43
|
+
lexer.tokenize();
|
|
44
|
+
let i = 0;
|
|
45
|
+
for (const token of lexer.tokens) {
|
|
46
|
+
if (token.type === "REF" || token.type === "RANGE") {
|
|
47
|
+
const normalizedRef = stripAddressAbsolute(token.stringify());
|
|
48
|
+
const splitterIndex = normalizedRef.indexOf("!");
|
|
49
|
+
if (splitterIndex !== -1) {
|
|
50
|
+
const sheetName = normalizedRef.substring(0, splitterIndex);
|
|
51
|
+
const ref = normalizedRef.substring(splitterIndex + 1);
|
|
52
|
+
const stripped = stripSheetName(sheetName);
|
|
53
|
+
const upperRef = ref.toUpperCase();
|
|
54
|
+
if (externalRefs2[stripped] == null) {
|
|
55
|
+
externalRefs2[stripped] = {};
|
|
56
|
+
}
|
|
57
|
+
if (externalRefs2[stripped][upperRef] == null) {
|
|
58
|
+
externalRefs2[stripped][upperRef] = i++;
|
|
59
|
+
}
|
|
60
|
+
} else {
|
|
61
|
+
const upperRef = normalizedRef.toUpperCase();
|
|
62
|
+
if (refs2[upperRef] == null) {
|
|
63
|
+
refs2[upperRef] = i++;
|
|
56
64
|
}
|
|
57
65
|
}
|
|
58
66
|
}
|
|
59
|
-
setRefs(refs2);
|
|
60
|
-
setExternalRefs == null ? void 0 : setExternalRefs(externalRefs2);
|
|
61
|
-
} else {
|
|
62
|
-
setRefs({});
|
|
63
|
-
setExternalRefs == null ? void 0 : setExternalRefs({});
|
|
64
67
|
}
|
|
68
|
+
setRefs(refs2);
|
|
69
|
+
setExternalRefs == null ? void 0 : setExternalRefs(externalRefs2);
|
|
65
70
|
}, [store.inputting, store.editingCell]);
|
|
66
71
|
React__default.useEffect(() => {
|
|
67
72
|
if (tableRef && tableInitialized) {
|
|
@@ -77,6 +82,10 @@ const Tabular = ({ tableRef }) => {
|
|
|
77
82
|
const v = table.stringify(store.choosing);
|
|
78
83
|
dispatch(setInputting(v || ""));
|
|
79
84
|
}, [table, store.choosing]);
|
|
85
|
+
React__default.useEffect(() => {
|
|
86
|
+
var _a2;
|
|
87
|
+
(_a2 = sheetContext == null ? void 0 : sheetContext.setChoosingCell) == null ? void 0 : _a2.call(sheetContext, p2a(store.choosing));
|
|
88
|
+
}, [store.choosing]);
|
|
80
89
|
const [virtualized, setVirtualized] = React__default.useState(null);
|
|
81
90
|
React__default.useEffect(() => {
|
|
82
91
|
setVirtualized(virtualize(table, tabularRef.current));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabular.js","sources":["../../components/Tabular.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Cell } from './Cell';\nimport { HeaderCellTop } from './HeaderCellTop';\nimport { HeaderCellLeft } from './HeaderCellLeft';\n\nimport { Context } from '../store';\nimport { choose, select, setEntering, updateTable, setInputting } from '../store/actions';\n\nimport { Table } from '../lib/table';\nimport { RefPaletteType, PointType, StoreType, TableRef, Virtualization } from '../types';\nimport { virtualize } from '../lib/virtualization';\nimport { a2p, p2a, stripAddressAbsolute } from '../lib/converters';\nimport { zoneToArea } from '../lib/structs';\nimport { Lexer } from '../formula/evaluator';\nimport { REF_PALETTE } from '../lib/palette';\nimport { useSheetContext } from './SheetProvider';\nimport { Autofill } from '../lib/autofill';\n\ntype Props = {\n tableRef: React.MutableRefObject<TableRef | null> | undefined;\n};\n\nexport const createTableRef = () => React.useRef<TableRef | null>(null);\n\nexport const Tabular = ({ tableRef }: Props) => {\n const [refs, setRefs] = React.useState<RefPaletteType>({});\n const [, { externalRefs = {}, setExternalRefs }] = useSheetContext();\n const { store, dispatch } = React.useContext(Context);\n const {\n sheetHeight,\n table,\n tableInitialized,\n tabularRef,\n mainRef,\n headerWidth,\n headerHeight,\n editingCell,\n inputting,\n } = store;\n\n React.useEffect(() => {\n if (editingCell && inputting.startsWith('=')) {\n const refs: RefPaletteType = {};\n const externalRefs: { [sheetName: string]: RefPaletteType } = {};\n const lexer = new Lexer(inputting.substring(1));\n lexer.tokenize();\n\n let i = 0;\n for (const token of lexer.tokens) {\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedRef = stripAddressAbsolute(token.stringify());\n if (normalizedRef.includes('!')) {\n const [sheetName, ref] = normalizedRef.split('!');\n const upperRef = ref.toUpperCase();\n if (externalRefs[sheetName] == null) {\n externalRefs[sheetName] = {};\n }\n if (externalRefs[sheetName][upperRef] == null) {\n externalRefs[sheetName][upperRef] = i++;\n }\n } else {\n const upperRef = normalizedRef.toUpperCase();\n if (refs[upperRef] == null) {\n refs[upperRef] = i++;\n }\n }\n }\n }\n setRefs(refs);\n setExternalRefs?.(externalRefs);\n } else {\n setRefs({});\n setExternalRefs?.({});\n }\n }, [store.inputting, store.editingCell]);\n\n React.useEffect(() => {\n if (tableRef && tableInitialized) {\n tableRef.current = {\n table,\n dispatch: (table) => {\n dispatch(updateTable(table as Table));\n },\n };\n }\n }, [table]);\n React.useEffect(() => {\n const v = table.stringify(store.choosing);\n dispatch(setInputting(v || ''));\n }, [table, store.choosing]);\n const [virtualized, setVirtualized] = React.useState<Virtualization | null>(null);\n React.useEffect(() => {\n setVirtualized(virtualize(table, tabularRef.current));\n }, [tabularRef.current, table, mainRef.current?.clientHeight, mainRef.current?.clientWidth]);\n\n const operationStyles = useOperationStyles(store, { ...refs, ...externalRefs[table.sheetName] });\n\n return (\n <>\n <div\n className=\"gs-tabular\"\n style={{\n //width: sheetWidth,\n height: sheetHeight,\n }}\n ref={tabularRef}\n onMouseEnter={() => {\n dispatch(setEntering(true));\n }}\n onMouseLeave={() => {\n dispatch(setEntering(false));\n }}\n onScroll={(e) => {\n setVirtualized(virtualize(table, e.currentTarget));\n }}\n >\n <div\n className={'gs-tabular-inner'}\n style={{\n width: table.totalWidth + 1,\n height: table.totalHeight + 1,\n }}\n >\n <table\n className={`gs-table`}\n style={{\n width: table.totalWidth,\n }}\n >\n <thead className=\"gs-thead\" style={{ height: headerHeight }}>\n <tr className=\"gs-row\">\n <th\n className=\"gs-th gs-th-left gs-th-top\"\n style={{ position: 'sticky', width: headerWidth, height: headerHeight }}\n onClick={() => {\n dispatch(choose({ y: -1, x: -1 }));\n window.setTimeout(() => {\n dispatch(choose({ y: 1, x: 1 }));\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: table.getNumRows(),\n endX: table.getNumCols(),\n }),\n );\n }, 100);\n }}\n >\n <div className=\"gs-th-inner\"></div>\n </th>\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\"\n style={{ width: virtualized?.adjuster?.left || 1 }}\n ></th>\n {virtualized?.xs?.map?.((x) => <HeaderCellTop x={x} key={x} />)}\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\"\n style={{ width: virtualized?.adjuster?.right }}\n ></th>\n </tr>\n </thead>\n\n <tbody className=\"gs-table-body-adjuster\">\n <tr className=\"gs-row\">\n <th\n className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}\n style={{ height: virtualized?.adjuster?.top || 1 }}\n ></th>\n <td className=\"gs-adjuster gs-adjuster-vertical\"></td>\n {virtualized?.xs?.map((x) => <td className=\"gs-adjuster gs-adjuster-vertical\" key={x}></td>)}\n <th className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}></th>\n </tr>\n </tbody>\n\n <tbody className=\"gs-table-body-data\">\n {virtualized?.ys?.map((y) => {\n return (\n <tr key={y} className=\"gs-row\">\n <HeaderCellLeft y={y} />\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\" />\n {virtualized?.xs?.map((x) => (\n <Cell key={x} y={y} x={x} operationStyle={operationStyles[p2a({ y, x })]} />\n ))}\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\" />\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </>\n );\n};\n\nconst BORDER_POINTED = 'solid 2px #0077ff';\nconst BORDER_SELECTED = 'solid 1px #0077ff';\nconst BORDER_CUTTING = 'dotted 2px #0077ff';\nconst BORDER_COPYING = 'dashed 2px #0077ff';\nconst SEARCH_MATCHING_BACKGROUND = 'rgba(0,200,100,.2)';\nconst SEARCH_MATCHING_BORDER = 'solid 2px #00aa78';\nconst AUTOFILL_BORDER = 'dashed 1px #444444';\n\nconst useOperationStyles = (store: StoreType, refs: RefPaletteType) => {\n const cellStyles: { [key: string]: React.CSSProperties } = {};\n const updateStyle = (point: PointType, style: React.CSSProperties) => {\n const address = p2a(point);\n cellStyles[address] = cellStyles[address] || {};\n Object.assign(cellStyles[address], style);\n };\n const { choosing, selectingZone, copyingZone, cutting, matchingCells, matchingCellIndex, table, autofillDraggingTo } =\n store;\n {\n // selecting\n const { top, left, bottom, right } = zoneToArea(selectingZone);\n for (let y = top; y <= bottom; y++) {\n updateStyle({ y, x: left - 1 }, { borderRight: BORDER_SELECTED });\n updateStyle({ y, x: left }, { borderLeft: BORDER_SELECTED });\n updateStyle({ y, x: right }, { borderRight: BORDER_SELECTED });\n updateStyle({ y, x: right + 1 }, { borderLeft: BORDER_SELECTED });\n }\n for (let x = left; x <= right; x++) {\n updateStyle({ y: top - 1, x }, { borderBottom: BORDER_SELECTED });\n updateStyle({ y: top, x }, { borderTop: BORDER_SELECTED });\n updateStyle({ y: bottom, x }, { borderBottom: BORDER_SELECTED });\n updateStyle({ y: bottom + 1, x }, { borderTop: BORDER_SELECTED });\n }\n }\n if (autofillDraggingTo) {\n const autofill = new Autofill(store, autofillDraggingTo);\n const { top, left, bottom, right } = autofill.wholeArea;\n for (let y = top; y <= bottom; y++) {\n updateStyle({ y, x: left - 1 }, { borderRight: AUTOFILL_BORDER });\n updateStyle({ y, x: left }, { borderLeft: AUTOFILL_BORDER });\n updateStyle({ y, x: right }, { borderRight: AUTOFILL_BORDER });\n updateStyle({ y, x: right + 1 }, { borderLeft: AUTOFILL_BORDER });\n }\n for (let x = left; x <= right; x++) {\n updateStyle({ y: top - 1, x }, { borderBottom: AUTOFILL_BORDER });\n updateStyle({ y: top, x }, { borderTop: AUTOFILL_BORDER });\n updateStyle({ y: bottom, x }, { borderBottom: AUTOFILL_BORDER });\n updateStyle({ y: bottom + 1, x }, { borderTop: AUTOFILL_BORDER });\n }\n }\n {\n // choosing\n const { y, x } = choosing;\n updateStyle(\n { y, x },\n {\n borderLeft: BORDER_POINTED,\n borderRight: BORDER_POINTED,\n borderTop: BORDER_POINTED,\n borderBottom: BORDER_POINTED,\n },\n );\n updateStyle({ y, x: x - 1 }, { borderRight: BORDER_POINTED });\n updateStyle({ y, x: x + 1 }, { borderLeft: BORDER_POINTED });\n updateStyle({ y: y - 1, x }, { borderBottom: BORDER_POINTED });\n updateStyle({ y: y + 1, x }, { borderTop: BORDER_POINTED });\n }\n {\n // copying\n const borderStyle = cutting ? BORDER_CUTTING : BORDER_COPYING;\n const { top, left, bottom, right } = zoneToArea(copyingZone);\n for (let y = top; y <= bottom; y++) {\n updateStyle({ y, x: left - 1 }, { borderRight: borderStyle });\n updateStyle({ y, x: left }, { borderLeft: borderStyle });\n updateStyle({ y, x: right }, { borderRight: borderStyle });\n updateStyle({ y, x: right + 1 }, { borderLeft: borderStyle });\n }\n for (let x = left; x <= right; x++) {\n updateStyle({ y: top - 1, x }, { borderBottom: borderStyle });\n updateStyle({ y: top, x }, { borderTop: borderStyle });\n updateStyle({ y: bottom, x }, { borderBottom: borderStyle });\n updateStyle({ y: bottom + 1, x }, { borderTop: borderStyle });\n }\n }\n\n Object.entries(refs).forEach(([ref, i]) => {\n const palette = REF_PALETTE[i % REF_PALETTE.length];\n const borderStyle = `dashed 2px ${palette}`;\n const { top, left, bottom, right } = table.rangeToArea(ref);\n for (let y = top; y <= bottom; y++) {\n updateStyle({ y, x: left - 1 }, { borderRight: borderStyle });\n updateStyle({ y, x: left }, { borderLeft: borderStyle });\n updateStyle({ y, x: right }, { borderRight: borderStyle });\n updateStyle({ y, x: right + 1 }, { borderLeft: borderStyle });\n }\n for (let x = left; x <= right; x++) {\n updateStyle({ y: top - 1, x }, { borderBottom: borderStyle });\n updateStyle({ y: top, x }, { borderTop: borderStyle });\n updateStyle({ y: bottom, x }, { borderBottom: borderStyle });\n updateStyle({ y: bottom + 1, x }, { borderTop: borderStyle });\n }\n });\n matchingCells.forEach((address) => {\n const { y, x } = a2p(address);\n updateStyle({ y, x }, { backgroundColor: SEARCH_MATCHING_BACKGROUND });\n });\n if (matchingCells.length > 0) {\n const { y, x } = a2p(matchingCells[matchingCellIndex]);\n updateStyle(\n { y, x },\n {\n borderLeft: SEARCH_MATCHING_BORDER,\n borderRight: SEARCH_MATCHING_BORDER,\n borderTop: SEARCH_MATCHING_BORDER,\n borderBottom: SEARCH_MATCHING_BORDER,\n },\n );\n updateStyle({ y, x: x - 1 }, { borderRight: SEARCH_MATCHING_BORDER });\n updateStyle({ y, x: x + 1 }, { borderLeft: SEARCH_MATCHING_BORDER });\n updateStyle({ y: y - 1, x }, { borderBottom: SEARCH_MATCHING_BORDER });\n updateStyle({ y: y + 1, x }, { borderTop: SEARCH_MATCHING_BORDER });\n }\n return cellStyles;\n};\n"],"names":["React","refs","externalRefs","table","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tabular.js","sources":["../../components/Tabular.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Cell } from './Cell';\nimport { HeaderCellTop } from './HeaderCellTop';\nimport { HeaderCellLeft } from './HeaderCellLeft';\n\nimport { Context } from '../store';\nimport { choose, select, setEntering, updateTable, setInputting } from '../store/actions';\n\nimport { Table } from '../lib/table';\nimport { RefPaletteType, PointType, StoreType, TableRef, Virtualization } from '../types';\nimport { virtualize } from '../lib/virtualization';\nimport { a2p, p2a, stripAddressAbsolute } from '../lib/converters';\nimport { zoneToArea } from '../lib/structs';\nimport { Lexer, stripSheetName } from '../formula/evaluator';\nimport { REF_PALETTE } from '../lib/palette';\nimport { useSheetContext } from './SheetProvider';\nimport { Autofill } from '../lib/autofill';\n\ntype Props = {\n tableRef: React.MutableRefObject<TableRef | null> | undefined;\n};\n\nexport const createTableRef = () => React.useRef<TableRef | null>(null);\n\nexport const Tabular = ({ tableRef }: Props) => {\n const [refs, setRefs] = React.useState<RefPaletteType>({});\n const [, { externalRefs = {}, setExternalRefs }] = useSheetContext();\n const { store, dispatch } = React.useContext(Context);\n const {\n sheetHeight,\n table,\n tableInitialized,\n tabularRef,\n mainRef,\n headerWidth,\n headerHeight,\n editingCell,\n inputting,\n } = store;\n\n const [sheetProvided, sheetContext] = useSheetContext();\n\n React.useEffect(() => {\n const formulaEditing = editingCell && inputting.startsWith('=');\n if (!formulaEditing) {\n setRefs({});\n setExternalRefs?.({});\n return;\n }\n const refs: RefPaletteType = {};\n const externalRefs: { [sheetName: string]: RefPaletteType } = {};\n const lexer = new Lexer(inputting.substring(1));\n lexer.tokenize();\n\n let i = 0;\n for (const token of lexer.tokens) {\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedRef = stripAddressAbsolute(token.stringify());\n const splitterIndex = normalizedRef.indexOf('!');\n if (splitterIndex !== -1) {\n const sheetName = normalizedRef.substring(0, splitterIndex);\n const ref = normalizedRef.substring(splitterIndex + 1);\n const stripped = stripSheetName(sheetName);\n const upperRef = ref.toUpperCase();\n if (externalRefs[stripped] == null) {\n externalRefs[stripped] = {};\n }\n if (externalRefs[stripped][upperRef] == null) {\n externalRefs[stripped][upperRef] = i++;\n }\n } else {\n const upperRef = normalizedRef.toUpperCase();\n if (refs[upperRef] == null) {\n refs[upperRef] = i++;\n }\n }\n }\n }\n setRefs(refs);\n setExternalRefs?.(externalRefs);\n }, [store.inputting, store.editingCell]);\n\n React.useEffect(() => {\n if (tableRef && tableInitialized) {\n tableRef.current = {\n table,\n dispatch: (table) => {\n dispatch(updateTable(table as Table));\n },\n };\n }\n }, [table]);\n React.useEffect(() => {\n const v = table.stringify(store.choosing);\n dispatch(setInputting(v || ''));\n }, [table, store.choosing]);\n React.useEffect(() => {\n sheetContext?.setChoosingCell?.(p2a(store.choosing));\n }, [store.choosing]);\n const [virtualized, setVirtualized] = React.useState<Virtualization | null>(null);\n React.useEffect(() => {\n setVirtualized(virtualize(table, tabularRef.current));\n }, [tabularRef.current, table, mainRef.current?.clientHeight, mainRef.current?.clientWidth]);\n\n const operationStyles = useOperationStyles(store, { ...refs, ...externalRefs[table.sheetName] });\n\n return (\n <>\n <div\n className=\"gs-tabular\"\n style={{\n //width: sheetWidth,\n height: sheetHeight,\n }}\n ref={tabularRef}\n onMouseEnter={() => {\n dispatch(setEntering(true));\n }}\n onMouseLeave={() => {\n dispatch(setEntering(false));\n }}\n onScroll={(e) => {\n setVirtualized(virtualize(table, e.currentTarget));\n }}\n >\n <div\n className={'gs-tabular-inner'}\n style={{\n width: table.totalWidth + 1,\n height: table.totalHeight + 1,\n }}\n >\n <table\n className={`gs-table`}\n style={{\n width: table.totalWidth,\n }}\n >\n <thead className=\"gs-thead\" style={{ height: headerHeight }}>\n <tr className=\"gs-row\">\n <th\n className=\"gs-th gs-th-left gs-th-top\"\n style={{ position: 'sticky', width: headerWidth, height: headerHeight }}\n onClick={() => {\n dispatch(choose({ y: -1, x: -1 }));\n window.setTimeout(() => {\n dispatch(choose({ y: 1, x: 1 }));\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: table.getNumRows(),\n endX: table.getNumCols(),\n }),\n );\n }, 100);\n }}\n >\n <div className=\"gs-th-inner\"></div>\n </th>\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\"\n style={{ width: virtualized?.adjuster?.left || 1 }}\n ></th>\n {virtualized?.xs?.map?.((x) => <HeaderCellTop x={x} key={x} />)}\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\"\n style={{ width: virtualized?.adjuster?.right }}\n ></th>\n </tr>\n </thead>\n\n <tbody className=\"gs-table-body-adjuster\">\n <tr className=\"gs-row\">\n <th\n className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}\n style={{ height: virtualized?.adjuster?.top || 1 }}\n ></th>\n <td className=\"gs-adjuster gs-adjuster-vertical\"></td>\n {virtualized?.xs?.map((x) => <td className=\"gs-adjuster gs-adjuster-vertical\" key={x}></td>)}\n <th className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}></th>\n </tr>\n </tbody>\n\n <tbody className=\"gs-table-body-data\">\n {virtualized?.ys?.map((y) => {\n return (\n <tr key={y} className=\"gs-row\">\n <HeaderCellLeft y={y} />\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\" />\n {virtualized?.xs?.map((x) => (\n <Cell key={x} y={y} x={x} operationStyle={operationStyles[p2a({ y, x })]} />\n ))}\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\" />\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </>\n );\n};\n\nconst BORDER_POINTED = 'solid 2px #0077ff';\nconst BORDER_SELECTED = 'solid 1px #0077ff';\nconst BORDER_CUTTING = 'dotted 2px #0077ff';\nconst BORDER_COPYING = 'dashed 2px #0077ff';\nconst SEARCH_MATCHING_BACKGROUND = 'rgba(0,200,100,.2)';\nconst SEARCH_MATCHING_BORDER = 'solid 2px #00aa78';\nconst AUTOFILL_BORDER = 'dashed 1px #444444';\n\nconst useOperationStyles = (store: StoreType, refs: RefPaletteType) => {\n const cellStyles: { [key: string]: React.CSSProperties } = {};\n const updateStyle = (point: PointType, style: React.CSSProperties) => {\n const address = p2a(point);\n cellStyles[address] = cellStyles[address] || {};\n Object.assign(cellStyles[address], style);\n };\n const { choosing, selectingZone, copyingZone, cutting, matchingCells, matchingCellIndex, table, autofillDraggingTo } =\n store;\n {\n // selecting\n const { top, left, bottom, right } = zoneToArea(selectingZone);\n for (let y = top; y <= bottom; y++) {\n updateStyle({ y, x: left - 1 }, { borderRight: BORDER_SELECTED });\n updateStyle({ y, x: left }, { borderLeft: BORDER_SELECTED });\n updateStyle({ y, x: right }, { borderRight: BORDER_SELECTED });\n updateStyle({ y, x: right + 1 }, { borderLeft: BORDER_SELECTED });\n }\n for (let x = left; x <= right; x++) {\n updateStyle({ y: top - 1, x }, { borderBottom: BORDER_SELECTED });\n updateStyle({ y: top, x }, { borderTop: BORDER_SELECTED });\n updateStyle({ y: bottom, x }, { borderBottom: BORDER_SELECTED });\n updateStyle({ y: bottom + 1, x }, { borderTop: BORDER_SELECTED });\n }\n }\n if (autofillDraggingTo) {\n const autofill = new Autofill(store, autofillDraggingTo);\n const { top, left, bottom, right } = autofill.wholeArea;\n for (let y = top; y <= bottom; y++) {\n updateStyle({ y, x: left - 1 }, { borderRight: AUTOFILL_BORDER });\n updateStyle({ y, x: left }, { borderLeft: AUTOFILL_BORDER });\n updateStyle({ y, x: right }, { borderRight: AUTOFILL_BORDER });\n updateStyle({ y, x: right + 1 }, { borderLeft: AUTOFILL_BORDER });\n }\n for (let x = left; x <= right; x++) {\n updateStyle({ y: top - 1, x }, { borderBottom: AUTOFILL_BORDER });\n updateStyle({ y: top, x }, { borderTop: AUTOFILL_BORDER });\n updateStyle({ y: bottom, x }, { borderBottom: AUTOFILL_BORDER });\n updateStyle({ y: bottom + 1, x }, { borderTop: AUTOFILL_BORDER });\n }\n }\n {\n // choosing\n const { y, x } = choosing;\n updateStyle(\n { y, x },\n {\n borderLeft: BORDER_POINTED,\n borderRight: BORDER_POINTED,\n borderTop: BORDER_POINTED,\n borderBottom: BORDER_POINTED,\n },\n );\n updateStyle({ y, x: x - 1 }, { borderRight: BORDER_POINTED });\n updateStyle({ y, x: x + 1 }, { borderLeft: BORDER_POINTED });\n updateStyle({ y: y - 1, x }, { borderBottom: BORDER_POINTED });\n updateStyle({ y: y + 1, x }, { borderTop: BORDER_POINTED });\n }\n {\n // copying\n const borderStyle = cutting ? BORDER_CUTTING : BORDER_COPYING;\n const { top, left, bottom, right } = zoneToArea(copyingZone);\n for (let y = top; y <= bottom; y++) {\n updateStyle({ y, x: left - 1 }, { borderRight: borderStyle });\n updateStyle({ y, x: left }, { borderLeft: borderStyle });\n updateStyle({ y, x: right }, { borderRight: borderStyle });\n updateStyle({ y, x: right + 1 }, { borderLeft: borderStyle });\n }\n for (let x = left; x <= right; x++) {\n updateStyle({ y: top - 1, x }, { borderBottom: borderStyle });\n updateStyle({ y: top, x }, { borderTop: borderStyle });\n updateStyle({ y: bottom, x }, { borderBottom: borderStyle });\n updateStyle({ y: bottom + 1, x }, { borderTop: borderStyle });\n }\n }\n\n Object.entries(refs).forEach(([ref, i]) => {\n const palette = REF_PALETTE[i % REF_PALETTE.length];\n const borderStyle = `dashed 2px ${palette}`;\n const { top, left, bottom, right } = table.rangeToArea(ref);\n for (let y = top; y <= bottom; y++) {\n updateStyle({ y, x: left - 1 }, { borderRight: borderStyle });\n updateStyle({ y, x: left }, { borderLeft: borderStyle });\n updateStyle({ y, x: right }, { borderRight: borderStyle });\n updateStyle({ y, x: right + 1 }, { borderLeft: borderStyle });\n }\n for (let x = left; x <= right; x++) {\n updateStyle({ y: top - 1, x }, { borderBottom: borderStyle });\n updateStyle({ y: top, x }, { borderTop: borderStyle });\n updateStyle({ y: bottom, x }, { borderBottom: borderStyle });\n updateStyle({ y: bottom + 1, x }, { borderTop: borderStyle });\n }\n });\n matchingCells.forEach((address) => {\n const { y, x } = a2p(address);\n updateStyle({ y, x }, { backgroundColor: SEARCH_MATCHING_BACKGROUND });\n });\n if (matchingCells.length > 0) {\n const { y, x } = a2p(matchingCells[matchingCellIndex]);\n updateStyle(\n { y, x },\n {\n borderLeft: SEARCH_MATCHING_BORDER,\n borderRight: SEARCH_MATCHING_BORDER,\n borderTop: SEARCH_MATCHING_BORDER,\n borderBottom: SEARCH_MATCHING_BORDER,\n },\n );\n updateStyle({ y, x: x - 1 }, { borderRight: SEARCH_MATCHING_BORDER });\n updateStyle({ y, x: x + 1 }, { borderLeft: SEARCH_MATCHING_BORDER });\n updateStyle({ y: y - 1, x }, { borderBottom: SEARCH_MATCHING_BORDER });\n updateStyle({ y: y + 1, x }, { borderTop: SEARCH_MATCHING_BORDER });\n }\n return cellStyles;\n};\n"],"names":["React","refs","externalRefs","table","_a"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Table } from '../lib/table';
|
|
2
|
+
import { PointType } from '../types';
|
|
2
3
|
type EvaluateProps = {
|
|
3
4
|
table: Table;
|
|
4
5
|
};
|
|
@@ -50,7 +51,8 @@ export declare class FunctionEntity {
|
|
|
50
51
|
args: Expression[];
|
|
51
52
|
name: string;
|
|
52
53
|
precedence: number;
|
|
53
|
-
|
|
54
|
+
private origin?;
|
|
55
|
+
constructor(name: string, precedence?: number, args?: Expression[], origin?: PointType);
|
|
54
56
|
evaluate({ table }: EvaluateProps): any;
|
|
55
57
|
}
|
|
56
58
|
export type Expression = ValueEntity | RefEntity | RangeEntity | IdEntity | IdRangeEntity | FunctionEntity | UnreferencedEntity | InvalidRefEntity;
|
|
@@ -59,17 +61,22 @@ export declare class Token {
|
|
|
59
61
|
type: TokenType;
|
|
60
62
|
entity: any;
|
|
61
63
|
precedence: number;
|
|
62
|
-
|
|
64
|
+
private origin?;
|
|
65
|
+
constructor(type: TokenType, entity: any, precedence?: number, origin?: PointType);
|
|
63
66
|
length(): number;
|
|
64
67
|
stringify(): string;
|
|
65
68
|
convert(): ValueEntity | UnreferencedEntity | InvalidRefEntity | RefEntity | RangeEntity | IdEntity | IdRangeEntity | FunctionEntity | undefined;
|
|
66
69
|
}
|
|
70
|
+
type LexerOption = {
|
|
71
|
+
origin?: PointType;
|
|
72
|
+
};
|
|
67
73
|
export declare class Lexer {
|
|
68
74
|
private index;
|
|
69
75
|
private formula;
|
|
70
76
|
tokens: Token[];
|
|
71
77
|
foreign: boolean;
|
|
72
|
-
|
|
78
|
+
private origin?;
|
|
79
|
+
constructor(formula: string, options?: LexerOption);
|
|
73
80
|
private isWhiteSpace;
|
|
74
81
|
private next;
|
|
75
82
|
private get;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../formula/evaluator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,KAAK,CAAC;CACd,CAAC;AAcF,qBAAa,YAAY;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;gBACT,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAKzD;AAED,cAAM,MAAM,CAAC,CAAC,GAAG,GAAG;IACX,KAAK,EAAE,CAAC,CAAC;gBACJ,KAAK,EAAE,CAAC;CAGrB;AAED,qBAAa,WAAY,SAAQ,MAAM;IAC9B,QAAQ;CAGhB;AAED,qBAAa,kBAAmB,SAAQ,MAAM;IACrC,QAAQ;CAGhB;AAED,qBAAa,gBAAiB,SAAQ,MAAM,CAAC,MAAM,CAAC;IAC3C,QAAQ;CAGhB;AAED,qBAAa,SAAU,SAAQ,MAAM,CAAC,MAAM,CAAC;gBAC/B,KAAK,EAAE,MAAM;IAGlB,SAAS;IAIhB,OAAO,CAAC,KAAK;IAqBN,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,GAAG,KAAK;IAQzC,EAAE,CAAC,KAAK,EAAE,KAAK;CAevB;AAED,qBAAa,WAAY,SAAQ,MAAM,CAAC,MAAM,CAAC;IAC7C,OAAO,CAAC,KAAK;IA0BN,SAAS;IAIT,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,GAAG,KAAK;IAQzC,OAAO,CAAC,KAAK,EAAE,KAAK;CAY5B;AAED,qBAAa,QAAS,SAAQ,MAAM,CAAC,MAAM,CAAC;IAC1C,OAAO,CAAC,KAAK;IAON,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa;IAWjC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,SAAI,EAAE,MAAM,SAAI;IAQxC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,SAAI,EAAE,MAAM,SAAI;CAOlD;AAED,qBAAa,aAAc,SAAQ,MAAM,CAAC,MAAM,CAAC;IAC/C,OAAO,CAAC,KAAK;IAUN,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,GAAG,KAAK;IAWzC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,SAAI,EAAE,MAAM,SAAI;IAY1C,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,SAAI,EAAE,MAAM,SAAI;CAIlD;AAED,qBAAa,cAAc;IAClB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../formula/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -198,10 +198,11 @@ class IdRangeEntity extends Entity {
|
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
200
|
class FunctionEntity {
|
|
201
|
-
constructor(name, precedence = 0, args = []) {
|
|
201
|
+
constructor(name, precedence = 0, args = [], origin) {
|
|
202
202
|
this.name = name;
|
|
203
203
|
this.precedence = precedence;
|
|
204
204
|
this.args = args;
|
|
205
|
+
this.origin = origin;
|
|
205
206
|
}
|
|
206
207
|
evaluate({ table }) {
|
|
207
208
|
const name = this.name.toLowerCase();
|
|
@@ -209,7 +210,7 @@ class FunctionEntity {
|
|
|
209
210
|
if (Func == null) {
|
|
210
211
|
throw new FormulaError("#NAME?", `Unknown function: ${name}`);
|
|
211
212
|
}
|
|
212
|
-
const func = new Func({ args: this.args, table });
|
|
213
|
+
const func = new Func({ args: this.args, table, origin: this.origin });
|
|
213
214
|
return func.call();
|
|
214
215
|
}
|
|
215
216
|
}
|
|
@@ -234,10 +235,11 @@ const PREFIX_FUNCTION_NAME_MAP = {
|
|
|
234
235
|
const WHITESPACE_CHARS = /* @__PURE__ */ new Set([" ", "\n", "\r", " ", "\f"]);
|
|
235
236
|
const SPECIAL_CHARS = /* @__PURE__ */ new Set([...WHITESPACE_CHARS, "+", "-", "/", "*", "^", "&", "=", "<", ">", ")", ",", "%"]);
|
|
236
237
|
class Token {
|
|
237
|
-
constructor(type, entity, precedence = 0) {
|
|
238
|
+
constructor(type, entity, precedence = 0, origin) {
|
|
238
239
|
this.type = type;
|
|
239
240
|
this.entity = entity;
|
|
240
241
|
this.precedence = precedence;
|
|
242
|
+
this.origin = origin;
|
|
241
243
|
}
|
|
242
244
|
length() {
|
|
243
245
|
if (this.type === "VALUE" && typeof this.entity === "string") {
|
|
@@ -277,7 +279,7 @@ class Token {
|
|
|
277
279
|
return new FunctionEntity(name, this.precedence);
|
|
278
280
|
}
|
|
279
281
|
case "FUNCTION":
|
|
280
|
-
return new FunctionEntity(this.entity);
|
|
282
|
+
return new FunctionEntity(this.entity, 0, [], this.origin);
|
|
281
283
|
case "UNREFERENCED":
|
|
282
284
|
return new UnreferencedEntity(this.entity);
|
|
283
285
|
case "INVALID_REF":
|
|
@@ -291,12 +293,15 @@ const isWhiteSpace = (char) => {
|
|
|
291
293
|
const TOKEN_OPEN = new Token("OPEN", "("), TOKEN_CLOSE = new Token("CLOSE", ")"), TOKEN_COMMA = new Token("COMMA", ","), TOKEN_ADD = new Token("INFIX_OPERATOR", "+", 3), TOKEN_MINUS = new Token("INFIX_OPERATOR", "-", 3), TOKEN_UMINUS = new Token("PREFIX_OPERATOR", "-", 6), TOKEN_DIVIDE = new Token("INFIX_OPERATOR", "/", 4), TOKEN_MULTIPLY = new Token("INFIX_OPERATOR", "*", 4), TOKEN_POWER = new Token("INFIX_OPERATOR", "^", 5), TOKEN_CONCAT = new Token("INFIX_OPERATOR", "&", 4), TOKEN_GTE = new Token("INFIX_OPERATOR", ">=", 2), TOKEN_GT = new Token("INFIX_OPERATOR", ">", 2), TOKEN_LTE = new Token("INFIX_OPERATOR", "<=", 2), TOKEN_LT = new Token("INFIX_OPERATOR", "<", 2), TOKEN_NE = new Token("INFIX_OPERATOR", "<>", 1), TOKEN_EQ = new Token("INFIX_OPERATOR", "=", 1);
|
|
292
294
|
const BOOLS = { ["true"]: true, ["false"]: false };
|
|
293
295
|
class Lexer {
|
|
294
|
-
constructor(formula) {
|
|
296
|
+
constructor(formula, options) {
|
|
295
297
|
this.tokens = [];
|
|
296
298
|
this.foreign = false;
|
|
297
299
|
this.formula = formula;
|
|
298
300
|
this.index = 0;
|
|
299
301
|
this.tokens = [];
|
|
302
|
+
if (options == null ? void 0 : options.origin) {
|
|
303
|
+
this.origin = options.origin;
|
|
304
|
+
}
|
|
300
305
|
}
|
|
301
306
|
isWhiteSpace() {
|
|
302
307
|
return isWhiteSpace(this.formula[this.index]);
|
|
@@ -460,7 +465,7 @@ class Lexer {
|
|
|
460
465
|
while (true) {
|
|
461
466
|
const c = this.get();
|
|
462
467
|
if (c === "(") {
|
|
463
|
-
this.tokens.push(new Token("FUNCTION", buf), TOKEN_OPEN);
|
|
468
|
+
this.tokens.push(new Token("FUNCTION", buf, 0, this.origin), TOKEN_OPEN);
|
|
464
469
|
this.next();
|
|
465
470
|
break;
|
|
466
471
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","sources":["../../formula/evaluator.ts"],"sourcesContent":["import { a2p } from '../lib/converters';\nimport { Table } from '../lib/table';\n\ntype EvaluateProps = {\n table: Table;\n};\n\n// strip sharp and dollars\nconst getId = (idString: string, stripAbsolute = true) => {\n let id = idString.slice(1);\n if (stripAbsolute && id.startsWith('$')) {\n id = id.slice(1);\n }\n if (stripAbsolute && id.endsWith('$')) {\n id = id.slice(0, -1);\n }\n return id;\n};\n\nexport class FormulaError {\n public code: string;\n public message: string;\n public error?: Error;\n constructor(code: string, message: string, error?: Error) {\n this.code = code;\n this.message = message;\n this.error = error;\n }\n}\n\nclass Entity<T = any> {\n public value: T;\n constructor(value: T) {\n this.value = value;\n }\n}\n\nexport class ValueEntity extends Entity {\n public evaluate() {\n return this.value;\n }\n}\n\nexport class UnreferencedEntity extends Entity {\n public evaluate() {\n throw new FormulaError('#REF!', `Reference does not exist.`);\n }\n}\n\nexport class InvalidRefEntity extends Entity<string> {\n public evaluate() {\n throw new FormulaError('#NAME?', `Invalid ref: ${this.value}`);\n }\n}\n\nexport class RefEntity extends Entity<string> {\n constructor(value: string) {\n super(value);\n }\n public stringify() {\n return this.value.toUpperCase();\n }\n\n private parse(table: Table): {\n table: Table;\n ref: string;\n sheetName: string;\n } {\n if (this.value.indexOf('!') !== -1) {\n const [rawSheetName, ref] = this.value.split('!');\n const sheetName = stripSheetName(rawSheetName);\n return {\n table: table.getTableBySheetName(sheetName),\n ref: ref.toUpperCase(),\n sheetName,\n };\n }\n return {\n table,\n ref: this.value.toUpperCase(),\n sheetName: stripSheetName(table.sheetName),\n };\n }\n\n public evaluate({ table }: EvaluateProps): Table {\n const parsed = this.parse(table);\n if (parsed.table == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n const { y, x } = a2p(parsed.ref);\n return parsed.table.trim({ top: y, left: x, bottom: y, right: x });\n }\n public id(table: Table) {\n const parsed = this.parse(table);\n if (parsed.table == null) {\n return this.value;\n }\n const id = parsed.table.getIdByAddress(parsed.ref);\n if (id) {\n if (parsed.table === table) {\n return id;\n }\n return `#${parsed.table.sheetId}!${id}`;\n }\n\n return this.value;\n }\n}\n\nexport class RangeEntity extends Entity<string> {\n private parse(table: Table): {\n table: Table;\n refs: string[];\n sheetName: string;\n } {\n const rawRefs = this.value.split(':');\n const refs: string[] = [];\n let sheetName = '';\n for (let i = 0; i < rawRefs.length; i++) {\n const ref = rawRefs[i];\n if (ref.indexOf('!') !== -1) {\n const [rawSheetName, rawRef] = ref.split('!');\n refs.push(rawRef.toUpperCase());\n if (i === 0) {\n sheetName = stripSheetName(rawSheetName);\n table = table.getTableBySheetName(sheetName);\n }\n if (table == null) {\n return { table, refs, sheetName };\n }\n } else {\n refs.push(ref);\n }\n }\n return { table, refs, sheetName: sheetName || table.sheetName };\n }\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ table }: EvaluateProps): Table {\n const parsed = this.parse(table);\n if (parsed.table == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n const area = parsed.table.rangeToArea(parsed.refs.join(':'));\n return parsed.table.trim(area);\n }\n public idRange(table: Table) {\n const parsed = this.parse(table);\n if (parsed.table == null) {\n return this.value;\n }\n const range = parsed.refs.map((ref) => parsed.table.getIdByAddress(ref)).join(':');\n\n if (parsed.table === table) {\n return range;\n }\n return `#${parsed.table.sheetId}!${range}`;\n }\n}\n\nexport class IdEntity extends Entity<string> {\n private parse(table: Table): { table: Table; id: string } {\n if (this.value.indexOf('!') !== -1) {\n const [tableId, id] = this.value.split('!');\n return { table: table.tables[tableId.slice(1)], id: getId(id, false) };\n }\n return { table, id: getId(this.value, false) };\n }\n public evaluate({ table }: EvaluateProps) {\n const parsed = this.parse(table);\n const { y, x } = parsed.table.getPointById(parsed.id);\n const [absY, absX] = [Math.abs(y), Math.abs(x)];\n return parsed.table.trim({\n top: absY,\n left: absX,\n bottom: absY,\n right: absX,\n });\n }\n public ref(table: Table, slideY = 0, slideX = 0) {\n const parsed = this.parse(table);\n const address = parsed.table.getAddressById(parsed.id, slideY, slideX);\n if (parsed.table.sheetId === table.sheetId) {\n return address;\n }\n return `${parsed.table.sheetPrefix()}${address}`;\n }\n public slide(table: Table, slideY = 0, slideX = 0) {\n const address = this.ref(table, slideY, slideX);\n if (address == null || address.length < 2) {\n return '#REF!';\n }\n return table.getIdByAddress(address);\n }\n}\n\nexport class IdRangeEntity extends Entity<string> {\n private parse(table: Table): { table: Table; ids: string[] } {\n const range = this.value;\n if (range.indexOf('!') !== -1) {\n const [sheetId, idRange] = range.split('!');\n table = table.tables[sheetId.slice(1)];\n return { table, ids: idRange.split(':') };\n }\n return { table, ids: range.split(':') };\n }\n\n public evaluate({ table }: EvaluateProps): Table {\n const parsed = this.parse(table);\n const [p1, p2] = parsed.ids.map((id) => getId(id)).map((id) => parsed.table.getPointById(id));\n const [top, left, bottom, right] = [\n p1.y,\n p1.x,\n p2.y || parsed.table.getNumRows(),\n p2.x || parsed.table.getNumCols(),\n ];\n return parsed.table.trim({ top, left, bottom, right });\n }\n public range(table: Table, slideY = 0, slideX = 0) {\n const parsed = this.parse(table);\n const range = parsed.ids\n .map((id) => getId(id, false))\n .map((id) => parsed.table.getAddressById(id, slideY, slideX))\n .join(':');\n if (parsed.table.sheetId === table.sheetId) {\n return range;\n }\n return `${parsed.table.sheetPrefix()}${range}`;\n }\n\n public slide(table: Table, slideY = 0, slideX = 0) {\n const range = this.range(table, slideY, slideX);\n return new RangeEntity(range).idRange(table);\n }\n}\n\nexport class FunctionEntity {\n public args: Expression[];\n public name: string;\n public precedence: number;\n constructor(name: string, precedence = 0, args: Expression[] = []) {\n this.name = name;\n this.precedence = precedence;\n this.args = args;\n }\n\n public evaluate({ table }: EvaluateProps): any {\n const name = this.name.toLowerCase();\n const Func = table.getFunction(name);\n if (Func == null) {\n throw new FormulaError('#NAME?', `Unknown function: ${name}`);\n }\n const func = new Func({ args: this.args, table });\n return func.call();\n }\n}\n\nexport type Expression =\n | ValueEntity\n | RefEntity\n | RangeEntity\n | IdEntity\n | IdRangeEntity\n | FunctionEntity\n | UnreferencedEntity\n | InvalidRefEntity;\n\nconst ZERO = new ValueEntity(0);\n\nexport type TokenType =\n | 'VALUE'\n | 'REF'\n | 'RANGE'\n | 'ID'\n | 'ID_RANGE'\n | 'FUNCTION'\n | 'PREFIX_OPERATOR'\n | 'INFIX_OPERATOR'\n | 'POSTFIX_OPERATOR'\n | 'OPEN'\n | 'CLOSE'\n | 'COMMA'\n | 'SPACE'\n | 'UNREFERENCED'\n | 'INVALID_REF';\n\nconst INFIX_FUNCTION_NAME_MAP = {\n '+': 'add',\n '-': 'minus',\n '/': 'divide',\n '*': 'multiply',\n '^': 'power',\n '&': 'concat',\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n};\n\nconst PREFIX_FUNCTION_NAME_MAP = {\n '-': 'uminus',\n};\n\nconst WHITESPACE_CHARS = new Set([' ', '\\n', '\\r', '\\t', '\\f']);\nconst SPECIAL_CHARS = new Set([...WHITESPACE_CHARS, '+', '-', '/', '*', '^', '&', '=', '<', '>', ')', ',', '%']);\n\nexport class Token {\n type: TokenType;\n entity: any;\n precedence: number;\n\n constructor(type: TokenType, entity: any, precedence = 0) {\n this.type = type;\n this.entity = entity;\n this.precedence = precedence;\n }\n\n public length() {\n if (this.type === 'VALUE' && typeof this.entity === 'string') {\n return this.entity.length + 2;\n }\n return new String(this.entity).length;\n }\n\n public stringify() {\n if (this.type === 'VALUE') {\n if (typeof this.entity === 'string') {\n return `\"${this.entity}\"`;\n }\n if (typeof this.entity === 'boolean') {\n return this.entity ? 'TRUE' : 'FALSE';\n }\n }\n return this.entity as string;\n }\n\n public convert() {\n switch (this.type) {\n case 'VALUE':\n return new ValueEntity(this.entity);\n\n case 'ID':\n return new IdEntity(this.entity as string);\n\n case 'ID_RANGE':\n return new IdRangeEntity(this.entity as string);\n\n case 'REF':\n return new RefEntity(this.entity as string);\n\n case 'RANGE':\n return new RangeEntity(this.entity as string);\n\n case 'INFIX_OPERATOR': {\n const name = INFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof INFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence);\n }\n case 'PREFIX_OPERATOR': {\n const name = PREFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof PREFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence);\n }\n case 'FUNCTION':\n return new FunctionEntity(this.entity as string);\n\n case 'UNREFERENCED':\n return new UnreferencedEntity(this.entity);\n\n case 'INVALID_REF':\n return new InvalidRefEntity(this.entity as string);\n }\n }\n}\n\nconst isWhiteSpace = (char: string) => {\n return WHITESPACE_CHARS.has(char);\n};\n\nconst TOKEN_OPEN = new Token('OPEN', '('),\n TOKEN_CLOSE = new Token('CLOSE', ')'),\n TOKEN_COMMA = new Token('COMMA', ','),\n TOKEN_ADD = new Token('INFIX_OPERATOR', '+', 3),\n TOKEN_MINUS = new Token('INFIX_OPERATOR', '-', 3),\n TOKEN_UMINUS = new Token('PREFIX_OPERATOR', '-', 6),\n TOKEN_DIVIDE = new Token('INFIX_OPERATOR', '/', 4),\n TOKEN_MULTIPLY = new Token('INFIX_OPERATOR', '*', 4),\n TOKEN_POWER = new Token('INFIX_OPERATOR', '^', 5),\n TOKEN_CONCAT = new Token('INFIX_OPERATOR', '&', 4),\n TOKEN_GTE = new Token('INFIX_OPERATOR', '>=', 2),\n TOKEN_GT = new Token('INFIX_OPERATOR', '>', 2),\n TOKEN_LTE = new Token('INFIX_OPERATOR', '<=', 2),\n TOKEN_LT = new Token('INFIX_OPERATOR', '<', 2),\n TOKEN_NE = new Token('INFIX_OPERATOR', '<>', 1),\n TOKEN_EQ = new Token('INFIX_OPERATOR', '=', 1);\n\nconst BOOLS: { [s: string]: boolean } = { ['true']: true, ['false']: false };\nexport class Lexer {\n private index: number;\n private formula: string;\n public tokens: Token[] = [];\n public foreign: boolean = false;\n\n constructor(formula: string) {\n this.formula = formula;\n this.index = 0;\n this.tokens = [];\n }\n\n private isWhiteSpace() {\n return isWhiteSpace(this.formula[this.index]);\n }\n\n private next(base = 1) {\n this.index += base;\n }\n\n private get(base = 0) {\n const c = this.formula[this.index + base];\n return c;\n }\n\n private getToken(base = 0) {\n return this.tokens[this.tokens.length + base];\n }\n\n public getTokenIndexByCharPosition(pos: number) {\n let start = 0,\n end = 0;\n\n for (let i = 0; i < this.tokens.length; i++) {\n const token = this.tokens[i];\n end = start + token.length();\n if (start <= pos && pos <= end) {\n return i;\n }\n start = end;\n }\n return -1;\n }\n\n public getTokenPositionRange(index: number, slide = 1): [number, number] {\n let start = 0,\n end = 0;\n for (let i = 0; i < index; i++) {\n start = end;\n end += this.tokens[i].length();\n }\n return [start + slide, end + slide];\n }\n\n public stringify() {\n return this.tokens.map((t) => t.stringify()).join('');\n }\n\n public stringifyToId(table: Table, slideY = 0, slideX = 0) {\n return this.tokens\n .map((t) => {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n return t.entity;\n }\n return `\"${t.entity}\"`;\n\n case 'ID':\n return new IdEntity(t.entity as string).slide(table, slideY, slideX);\n\n case 'ID_RANGE':\n return new IdRangeEntity(t.entity as string).slide(table, slideY, slideX);\n\n case 'REF':\n return new RefEntity(t.entity as string).id(table);\n\n case 'RANGE':\n return new RangeEntity(t.entity as string).idRange(table);\n }\n return t.entity;\n })\n .join('');\n }\n\n public stringifyToRef(table: Table) {\n return this.tokens\n .map((t) => {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n return t.entity;\n }\n return `\"${t.entity}\"`;\n case 'ID':\n return new IdEntity(t.entity as string).ref(table);\n case 'ID_RANGE':\n return new IdRangeEntity(t.entity as string).range(table);\n }\n return t.entity;\n })\n .join('');\n }\n\n public tokenize() {\n while (this.index <= this.formula.length) {\n this.skipSpaces();\n let char = this.get();\n this.next();\n switch (char) {\n case undefined:\n return;\n case '(':\n this.tokens.push(TOKEN_OPEN);\n continue;\n case ')':\n this.tokens.push(TOKEN_CLOSE);\n continue;\n case ',':\n this.tokens.push(TOKEN_COMMA);\n continue;\n case '+':\n this.tokens.push(TOKEN_ADD);\n continue;\n case '-': {\n const prev1 = this.getToken(-1)?.type;\n const prev2 = this.getToken(-2)?.type;\n if (prev1 === 'INFIX_OPERATOR' || (prev1 === 'SPACE' && prev2 === 'INFIX_OPERATOR')) {\n this.tokens.push(TOKEN_UMINUS);\n } else {\n this.tokens.push(TOKEN_MINUS);\n }\n continue;\n }\n case '/':\n this.tokens.push(TOKEN_DIVIDE);\n continue;\n case '*':\n this.tokens.push(TOKEN_MULTIPLY);\n continue;\n case '^':\n this.tokens.push(TOKEN_POWER);\n continue;\n case '&':\n this.tokens.push(TOKEN_CONCAT);\n continue;\n case '=':\n this.tokens.push(TOKEN_EQ);\n continue;\n case '>':\n if (this.get() === '=') {\n this.next();\n this.tokens.push(TOKEN_GTE);\n continue;\n }\n this.tokens.push(TOKEN_GT);\n continue;\n case '<':\n if (this.get() === '=') {\n this.next();\n this.tokens.push(TOKEN_LTE);\n continue;\n }\n if (this.get() === '>') {\n this.next();\n this.tokens.push(TOKEN_NE);\n continue;\n }\n this.tokens.push(TOKEN_LT);\n continue;\n case '\"': {\n const buf = this.getString('\"');\n this.tokens.push(new Token('VALUE', buf));\n continue;\n }\n case \"'\": {\n const buf = this.getString(\"'\");\n char = `'${buf}'`;\n break;\n }\n case '!': {\n this.foreign = true;\n break;\n // not continue\n }\n case '%': {\n this.tokens.push(new Token('POSTFIX_OPERATOR', '%', 4));\n continue;\n }\n } // switch end\n let buf = char;\n\n while (true) {\n const c = this.get();\n if (c === '(') {\n this.tokens.push(new Token('FUNCTION', buf), TOKEN_OPEN);\n this.next();\n break;\n }\n if (c == null || SPECIAL_CHARS.has(c)) {\n if (buf.length === 0) {\n break;\n }\n if (buf.match(/^[+-]?(\\d*[.])?\\d+$/)) {\n this.tokens.push(new Token('VALUE', parseFloat(buf)));\n } else {\n const bool = BOOLS[buf.toLowerCase()];\n if (bool != null) {\n this.tokens.push(new Token('VALUE', bool));\n } else if (buf.startsWith('#')) {\n if (buf === '#REF!') {\n this.tokens.push(new Token('UNREFERENCED', buf));\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('ID_RANGE', buf));\n } else {\n this.tokens.push(new Token('ID', buf));\n }\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('RANGE', buf));\n } else {\n if (isNaN(buf[buf.length - 1] as unknown as number)) {\n this.tokens.push(new Token('INVALID_REF', buf));\n } else {\n this.tokens.push(new Token('REF', buf));\n }\n }\n }\n break;\n }\n buf += c;\n this.next();\n }\n }\n }\n private skipSpaces() {\n let space: string = '';\n while (this.isWhiteSpace()) {\n space += this.formula[this.index++];\n }\n if (space !== '') {\n this.tokens.push(new Token('SPACE', space));\n }\n }\n\n private getString(quote = '\"') {\n let buf = '';\n\n while (true) {\n const c = this.get();\n this.next();\n if (c == null) {\n break;\n }\n if (c === quote) {\n if (this.get() === quote) {\n // escape\n buf += quote;\n this.next();\n continue;\n } else {\n break;\n }\n } else {\n buf += c;\n }\n }\n return buf;\n }\n}\n\nexport class Parser {\n public index = 0;\n public depth = 0;\n public tokens: Token[];\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n public build() {\n const { expr } = this.parse(false);\n return expr;\n }\n\n private parse(underFunction: boolean) {\n const stack: Expression[] = [];\n let lastOperator: undefined | FunctionEntity;\n\n const complement = (hasNext = false) => {\n if (lastOperator) {\n const outer = stack.pop();\n lastOperator.args.push(outer!);\n }\n return { hasNext, expr: stack.shift() };\n };\n\n while (this.tokens.length > this.index) {\n const token = this.tokens[this.index++];\n if (token.type === 'SPACE') {\n continue;\n }\n if (token.type === 'COMMA') {\n if (!underFunction) {\n throw new FormulaError('#ERROR!', 'Invalid comma');\n }\n return complement(true);\n } else if (\n token.type === 'VALUE' ||\n token.type === 'ID' ||\n token.type === 'ID_RANGE' ||\n token.type === 'REF' ||\n token.type === 'RANGE' ||\n token.type === 'UNREFERENCED' ||\n token.type === 'INVALID_REF'\n ) {\n const expr = token.convert();\n stack.push(expr!);\n } else if (token.type === 'POSTFIX_OPERATOR' && token.entity === '%') {\n const expr = stack.pop();\n if (!expr) {\n throw new FormulaError('#ERROR!', 'Missing expression before %');\n }\n const divideBy100 = new FunctionEntity('divide', 4, [expr, new ValueEntity(100)]);\n stack.push(divideBy100);\n } else if (token.type === 'FUNCTION') {\n this.index++;\n this.depth++;\n const func = token.convert() as FunctionEntity;\n stack.push(func);\n\n while (true) {\n const { expr, hasNext } = this.parse(true);\n if (expr) {\n func.args.push(expr);\n }\n if (!hasNext) {\n break;\n }\n }\n } else if (token.type === 'OPEN') {\n this.depth++;\n const { expr } = this.parse(false);\n stack.push(expr!);\n } else if (token.type === 'CLOSE') {\n if (this.depth-- === 0) {\n throw new FormulaError('#ERROR!', 'Unexpected end paren');\n }\n return complement();\n } else if (token.type === 'INFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n let left = stack.pop();\n if (left == null) {\n if (operator.name === 'minus' || operator.name === 'add') {\n left = ZERO;\n } else {\n throw new FormulaError('#ERROR!', 'Missing left expression');\n }\n }\n\n if (lastOperator == null) {\n operator.args.push(left);\n stack.unshift(operator);\n } else if (operator.precedence > lastOperator.precedence) {\n operator.args.push(left);\n lastOperator.args.push(operator);\n stack.unshift(lastOperator);\n } else {\n const outer = stack.shift();\n operator.args.push(outer!);\n lastOperator.args.push(left);\n stack.unshift(operator);\n }\n lastOperator = operator;\n } else if (token.type === 'PREFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n if (lastOperator) {\n lastOperator.args.push(operator);\n } else {\n stack.unshift(operator);\n }\n lastOperator = operator;\n }\n }\n return complement();\n }\n}\n\nexport const absolutizeFormula = ({\n value,\n table,\n slideY = 0,\n slideX = 0,\n}: {\n value: any;\n table: Table;\n slideY?: number;\n slideX?: number;\n}) => {\n if (typeof value === 'string' || value instanceof String) {\n if (value.charAt(0) === '=') {\n const lexer = new Lexer(value.substring(1));\n lexer.tokenize();\n return '=' + lexer.stringifyToId(table, slideY, slideX);\n }\n }\n return value;\n};\n\nexport const stripSheetName = (sheetName: string) => {\n if (sheetName.charAt(0) === \"'\") {\n sheetName = sheetName.slice(1);\n }\n if (sheetName.charAt(sheetName.length - 1) === \"'\") {\n sheetName = sheetName.slice(0, -1);\n }\n return sheetName;\n};\n"],"names":["buf"],"mappings":";AAQA,MAAM,QAAQ,CAAC,UAAkB,gBAAgB,SAAS;AACpD,MAAA,KAAK,SAAS,MAAM,CAAC;AACzB,MAAI,iBAAiB,GAAG,WAAW,GAAG,GAAG;AAClC,SAAA,GAAG,MAAM,CAAC;AAAA,EAAA;AAEjB,MAAI,iBAAiB,GAAG,SAAS,GAAG,GAAG;AAChC,SAAA,GAAG,MAAM,GAAG,EAAE;AAAA,EAAA;AAEd,SAAA;AACT;AAEO,MAAM,aAAa;AAAA,EAIxB,YAAY,MAAc,SAAiB,OAAe;AACxD,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,QAAQ;AAAA,EAAA;AAEjB;AAEA,MAAM,OAAgB;AAAA,EAEpB,YAAY,OAAU;AACpB,SAAK,QAAQ;AAAA,EAAA;AAEjB;AAEO,MAAM,oBAAoB,OAAO;AAAA,EAC/B,WAAW;AAChB,WAAO,KAAK;AAAA,EAAA;AAEhB;AAEO,MAAM,2BAA2B,OAAO;AAAA,EACtC,WAAW;AACV,UAAA,IAAI,aAAa,SAAS,2BAA2B;AAAA,EAAA;AAE/D;AAEO,MAAM,yBAAyB,OAAe;AAAA,EAC5C,WAAW;AAChB,UAAM,IAAI,aAAa,UAAU,gBAAgB,KAAK,KAAK,EAAE;AAAA,EAAA;AAEjE;AAEO,MAAM,kBAAkB,OAAe;AAAA,EAC5C,YAAY,OAAe;AACzB,UAAM,KAAK;AAAA,EAAA;AAAA,EAEN,YAAY;AACV,WAAA,KAAK,MAAM,YAAY;AAAA,EAAA;AAAA,EAGxB,MAAM,OAIZ;AACA,QAAI,KAAK,MAAM,QAAQ,GAAG,MAAM,IAAI;AAClC,YAAM,CAAC,cAAc,GAAG,IAAI,KAAK,MAAM,MAAM,GAAG;AAC1C,YAAA,YAAY,eAAe,YAAY;AACtC,aAAA;AAAA,QACL,OAAO,MAAM,oBAAoB,SAAS;AAAA,QAC1C,KAAK,IAAI,YAAY;AAAA,QACrB;AAAA,MACF;AAAA,IAAA;AAEK,WAAA;AAAA,MACL;AAAA,MACA,KAAK,KAAK,MAAM,YAAY;AAAA,MAC5B,WAAW,eAAe,MAAM,SAAS;AAAA,IAC3C;AAAA,EAAA;AAAA,EAGK,SAAS,EAAE,SAA+B;AACzC,UAAA,SAAS,KAAK,MAAM,KAAK;AAC3B,QAAA,OAAO,SAAS,MAAM;AACxB,YAAM,IAAI,aAAa,SAAS,kBAAkB,OAAO,SAAS,EAAE;AAAA,IAAA;AAEtE,UAAM,EAAE,GAAG,EAAA,IAAM,IAAI,OAAO,GAAG;AAC/B,WAAO,OAAO,MAAM,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAA,CAAG;AAAA,EAAA;AAAA,EAE5D,GAAG,OAAc;AAChB,UAAA,SAAS,KAAK,MAAM,KAAK;AAC3B,QAAA,OAAO,SAAS,MAAM;AACxB,aAAO,KAAK;AAAA,IAAA;AAEd,UAAM,KAAK,OAAO,MAAM,eAAe,OAAO,GAAG;AACjD,QAAI,IAAI;AACF,UAAA,OAAO,UAAU,OAAO;AACnB,eAAA;AAAA,MAAA;AAET,aAAO,IAAI,OAAO,MAAM,OAAO,IAAI,EAAE;AAAA,IAAA;AAGvC,WAAO,KAAK;AAAA,EAAA;AAEhB;AAEO,MAAM,oBAAoB,OAAe;AAAA,EACtC,MAAM,OAIZ;AACA,UAAM,UAAU,KAAK,MAAM,MAAM,GAAG;AACpC,UAAM,OAAiB,CAAC;AACxB,QAAI,YAAY;AAChB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACjC,YAAA,MAAM,QAAQ,CAAC;AACrB,UAAI,IAAI,QAAQ,GAAG,MAAM,IAAI;AAC3B,cAAM,CAAC,cAAc,MAAM,IAAI,IAAI,MAAM,GAAG;AACvC,aAAA,KAAK,OAAO,aAAa;AAC9B,YAAI,MAAM,GAAG;AACX,sBAAY,eAAe,YAAY;AAC/B,kBAAA,MAAM,oBAAoB,SAAS;AAAA,QAAA;AAE7C,YAAI,SAAS,MAAM;AACV,iBAAA,EAAE,OAAO,MAAM,UAAU;AAAA,QAAA;AAAA,MAClC,OACK;AACL,aAAK,KAAK,GAAG;AAAA,MAAA;AAAA,IACf;AAEF,WAAO,EAAE,OAAO,MAAM,WAAW,aAAa,MAAM,UAAU;AAAA,EAAA;AAAA,EAEzD,YAAY;AACV,WAAA,KAAK,MAAM,YAAY;AAAA,EAAA;AAAA,EAGzB,SAAS,EAAE,SAA+B;AACzC,UAAA,SAAS,KAAK,MAAM,KAAK;AAC3B,QAAA,OAAO,SAAS,MAAM;AACxB,YAAM,IAAI,aAAa,SAAS,kBAAkB,OAAO,SAAS,EAAE;AAAA,IAAA;AAEhE,UAAA,OAAO,OAAO,MAAM,YAAY,OAAO,KAAK,KAAK,GAAG,CAAC;AACpD,WAAA,OAAO,MAAM,KAAK,IAAI;AAAA,EAAA;AAAA,EAExB,QAAQ,OAAc;AACrB,UAAA,SAAS,KAAK,MAAM,KAAK;AAC3B,QAAA,OAAO,SAAS,MAAM;AACxB,aAAO,KAAK;AAAA,IAAA;AAEd,UAAM,QAAQ,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,MAAM,eAAe,GAAG,CAAC,EAAE,KAAK,GAAG;AAE7E,QAAA,OAAO,UAAU,OAAO;AACnB,aAAA;AAAA,IAAA;AAET,WAAO,IAAI,OAAO,MAAM,OAAO,IAAI,KAAK;AAAA,EAAA;AAE5C;AAEO,MAAM,iBAAiB,OAAe;AAAA,EACnC,MAAM,OAA4C;AACxD,QAAI,KAAK,MAAM,QAAQ,GAAG,MAAM,IAAI;AAClC,YAAM,CAAC,SAAS,EAAE,IAAI,KAAK,MAAM,MAAM,GAAG;AAC1C,aAAO,EAAE,OAAO,MAAM,OAAO,QAAQ,MAAM,CAAC,CAAC,GAAG,IAAI,MAAM,IAAI,KAAK,EAAE;AAAA,IAAA;AAEvE,WAAO,EAAE,OAAO,IAAI,MAAM,KAAK,OAAO,KAAK,EAAE;AAAA,EAAA;AAAA,EAExC,SAAS,EAAE,SAAwB;AAClC,UAAA,SAAS,KAAK,MAAM,KAAK;AACzB,UAAA,EAAE,GAAG,MAAM,OAAO,MAAM,aAAa,OAAO,EAAE;AACpD,UAAM,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;AACvC,WAAA,OAAO,MAAM,KAAK;AAAA,MACvB,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IAAA,CACR;AAAA,EAAA;AAAA,EAEI,IAAI,OAAc,SAAS,GAAG,SAAS,GAAG;AACzC,UAAA,SAAS,KAAK,MAAM,KAAK;AAC/B,UAAM,UAAU,OAAO,MAAM,eAAe,OAAO,IAAI,QAAQ,MAAM;AACrE,QAAI,OAAO,MAAM,YAAY,MAAM,SAAS;AACnC,aAAA;AAAA,IAAA;AAET,WAAO,GAAG,OAAO,MAAM,YAAa,CAAA,GAAG,OAAO;AAAA,EAAA;AAAA,EAEzC,MAAM,OAAc,SAAS,GAAG,SAAS,GAAG;AACjD,UAAM,UAAU,KAAK,IAAI,OAAO,QAAQ,MAAM;AAC9C,QAAI,WAAW,QAAQ,QAAQ,SAAS,GAAG;AAClC,aAAA;AAAA,IAAA;AAEF,WAAA,MAAM,eAAe,OAAO;AAAA,EAAA;AAEvC;AAEO,MAAM,sBAAsB,OAAe;AAAA,EACxC,MAAM,OAA+C;AAC3D,UAAM,QAAQ,KAAK;AACnB,QAAI,MAAM,QAAQ,GAAG,MAAM,IAAI;AAC7B,YAAM,CAAC,SAAS,OAAO,IAAI,MAAM,MAAM,GAAG;AAC1C,cAAQ,MAAM,OAAO,QAAQ,MAAM,CAAC,CAAC;AACrC,aAAO,EAAE,OAAO,KAAK,QAAQ,MAAM,GAAG,EAAE;AAAA,IAAA;AAE1C,WAAO,EAAE,OAAO,KAAK,MAAM,MAAM,GAAG,EAAE;AAAA,EAAA;AAAA,EAGjC,SAAS,EAAE,SAA+B;AACzC,UAAA,SAAS,KAAK,MAAM,KAAK;AACzB,UAAA,CAAC,IAAI,EAAE,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,OAAO,MAAM,aAAa,EAAE,CAAC;AAC5F,UAAM,CAAC,KAAK,MAAM,QAAQ,KAAK,IAAI;AAAA,MACjC,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG,KAAK,OAAO,MAAM,WAAW;AAAA,MAChC,GAAG,KAAK,OAAO,MAAM,WAAW;AAAA,IAClC;AACO,WAAA,OAAO,MAAM,KAAK,EAAE,KAAK,MAAM,QAAQ,OAAO;AAAA,EAAA;AAAA,EAEhD,MAAM,OAAc,SAAS,GAAG,SAAS,GAAG;AAC3C,UAAA,SAAS,KAAK,MAAM,KAAK;AACzB,UAAA,QAAQ,OAAO,IAClB,IAAI,CAAC,OAAO,MAAM,IAAI,KAAK,CAAC,EAC5B,IAAI,CAAC,OAAO,OAAO,MAAM,eAAe,IAAI,QAAQ,MAAM,CAAC,EAC3D,KAAK,GAAG;AACX,QAAI,OAAO,MAAM,YAAY,MAAM,SAAS;AACnC,aAAA;AAAA,IAAA;AAET,WAAO,GAAG,OAAO,MAAM,YAAa,CAAA,GAAG,KAAK;AAAA,EAAA;AAAA,EAGvC,MAAM,OAAc,SAAS,GAAG,SAAS,GAAG;AACjD,UAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,MAAM;AAC9C,WAAO,IAAI,YAAY,KAAK,EAAE,QAAQ,KAAK;AAAA,EAAA;AAE/C;AAEO,MAAM,eAAe;AAAA,EAI1B,YAAY,MAAc,aAAa,GAAG,OAAqB,CAAA,GAAI;AACjE,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,OAAO;AAAA,EAAA;AAAA,EAGP,SAAS,EAAE,SAA6B;AACvC,UAAA,OAAO,KAAK,KAAK,YAAY;AAC7B,UAAA,OAAO,MAAM,YAAY,IAAI;AACnC,QAAI,QAAQ,MAAM;AAChB,YAAM,IAAI,aAAa,UAAU,qBAAqB,IAAI,EAAE;AAAA,IAAA;AAExD,UAAA,OAAO,IAAI,KAAK,EAAE,MAAM,KAAK,MAAM,OAAO;AAChD,WAAO,KAAK,KAAK;AAAA,EAAA;AAErB;AAYA,MAAM,OAAO,IAAI,YAAY,CAAC;AAmB9B,MAAM,0BAA0B;AAAA,EAC9B,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR;AAEA,MAAM,2BAA2B;AAAA,EAC/B,KAAK;AACP;AAEA,MAAM,uCAAuB,IAAI,CAAC,KAAK,MAAM,MAAM,KAAM,IAAI,CAAC;AAC9D,MAAM,gBAAoB,oBAAA,IAAI,CAAC,GAAG,kBAAkB,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAExG,MAAM,MAAM;AAAA,EAKjB,YAAY,MAAiB,QAAa,aAAa,GAAG;AACxD,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,aAAa;AAAA,EAAA;AAAA,EAGb,SAAS;AACd,QAAI,KAAK,SAAS,WAAW,OAAO,KAAK,WAAW,UAAU;AACrD,aAAA,KAAK,OAAO,SAAS;AAAA,IAAA;AAE9B,WAAO,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,EAAA;AAAA,EAG1B,YAAY;AACb,QAAA,KAAK,SAAS,SAAS;AACrB,UAAA,OAAO,KAAK,WAAW,UAAU;AAC5B,eAAA,IAAI,KAAK,MAAM;AAAA,MAAA;AAEpB,UAAA,OAAO,KAAK,WAAW,WAAW;AAC7B,eAAA,KAAK,SAAS,SAAS;AAAA,MAAA;AAAA,IAChC;AAEF,WAAO,KAAK;AAAA,EAAA;AAAA,EAGP,UAAU;AACf,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACI,eAAA,IAAI,YAAY,KAAK,MAAM;AAAA,MAEpC,KAAK;AACI,eAAA,IAAI,SAAS,KAAK,MAAgB;AAAA,MAE3C,KAAK;AACI,eAAA,IAAI,cAAc,KAAK,MAAgB;AAAA,MAEhD,KAAK;AACI,eAAA,IAAI,UAAU,KAAK,MAAgB;AAAA,MAE5C,KAAK;AACI,eAAA,IAAI,YAAY,KAAK,MAAgB;AAAA,MAE9C,KAAK,kBAAkB;AACf,cAAA,OAAO,wBAAwB,KAAK,MAA8C;AACxF,eAAO,IAAI,eAAe,MAAM,KAAK,UAAU;AAAA,MAAA;AAAA,MAEjD,KAAK,mBAAmB;AAChB,cAAA,OAAO,yBAAyB,KAAK,MAA+C;AAC1F,eAAO,IAAI,eAAe,MAAM,KAAK,UAAU;AAAA,MAAA;AAAA,MAEjD,KAAK;AACI,eAAA,IAAI,eAAe,KAAK,MAAgB;AAAA,MAEjD,KAAK;AACI,eAAA,IAAI,mBAAmB,KAAK,MAAM;AAAA,MAE3C,KAAK;AACI,eAAA,IAAI,iBAAiB,KAAK,MAAgB;AAAA,IAAA;AAAA,EACrD;AAEJ;AAEA,MAAM,eAAe,CAAC,SAAiB;AAC9B,SAAA,iBAAiB,IAAI,IAAI;AAClC;AAEA,MAAM,aAAa,IAAI,MAAM,QAAQ,GAAG,GACtC,cAAc,IAAI,MAAM,SAAS,GAAG,GACpC,cAAc,IAAI,MAAM,SAAS,GAAG,GACpC,YAAY,IAAI,MAAM,kBAAkB,KAAK,CAAC,GAC9C,cAAc,IAAI,MAAM,kBAAkB,KAAK,CAAC,GAChD,eAAe,IAAI,MAAM,mBAAmB,KAAK,CAAC,GAClD,eAAe,IAAI,MAAM,kBAAkB,KAAK,CAAC,GACjD,iBAAiB,IAAI,MAAM,kBAAkB,KAAK,CAAC,GACnD,cAAc,IAAI,MAAM,kBAAkB,KAAK,CAAC,GAChD,eAAe,IAAI,MAAM,kBAAkB,KAAK,CAAC,GACjD,YAAY,IAAI,MAAM,kBAAkB,MAAM,CAAC,GAC/C,WAAW,IAAI,MAAM,kBAAkB,KAAK,CAAC,GAC7C,YAAY,IAAI,MAAM,kBAAkB,MAAM,CAAC,GAC/C,WAAW,IAAI,MAAM,kBAAkB,KAAK,CAAC,GAC7C,WAAW,IAAI,MAAM,kBAAkB,MAAM,CAAC,GAC9C,WAAW,IAAI,MAAM,kBAAkB,KAAK,CAAC;AAE/C,MAAM,QAAkC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM;AACpE,MAAM,MAAM;AAAA,EAMjB,YAAY,SAAiB;AAH7B,SAAO,SAAkB,CAAC;AAC1B,SAAO,UAAmB;AAGxB,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,SAAS,CAAC;AAAA,EAAA;AAAA,EAGT,eAAe;AACrB,WAAO,aAAa,KAAK,QAAQ,KAAK,KAAK,CAAC;AAAA,EAAA;AAAA,EAGtC,KAAK,OAAO,GAAG;AACrB,SAAK,SAAS;AAAA,EAAA;AAAA,EAGR,IAAI,OAAO,GAAG;AACpB,UAAM,IAAI,KAAK,QAAQ,KAAK,QAAQ,IAAI;AACjC,WAAA;AAAA,EAAA;AAAA,EAGD,SAAS,OAAO,GAAG;AACzB,WAAO,KAAK,OAAO,KAAK,OAAO,SAAS,IAAI;AAAA,EAAA;AAAA,EAGvC,4BAA4B,KAAa;AAC1C,QAAA,QAAQ,GACV,MAAM;AAER,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AACrC,YAAA,QAAQ,KAAK,OAAO,CAAC;AACrB,YAAA,QAAQ,MAAM,OAAO;AACvB,UAAA,SAAS,OAAO,OAAO,KAAK;AACvB,eAAA;AAAA,MAAA;AAED,cAAA;AAAA,IAAA;AAEH,WAAA;AAAA,EAAA;AAAA,EAGF,sBAAsB,OAAe,QAAQ,GAAqB;AACnE,QAAA,QAAQ,GACV,MAAM;AACR,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AACtB,cAAA;AACR,aAAO,KAAK,OAAO,CAAC,EAAE,OAAO;AAAA,IAAA;AAE/B,WAAO,CAAC,QAAQ,OAAO,MAAM,KAAK;AAAA,EAAA;AAAA,EAG7B,YAAY;AACV,WAAA,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,UAAW,CAAA,EAAE,KAAK,EAAE;AAAA,EAAA;AAAA,EAG/C,cAAc,OAAc,SAAS,GAAG,SAAS,GAAG;AACzD,WAAO,KAAK,OACT,IAAI,CAAC,MAAM;AACV,cAAQ,EAAE,MAAM;AAAA,QACd,KAAK;AACH,cAAI,OAAO,EAAE,WAAW,YAAY,OAAO,EAAE,WAAW,WAAW;AACjE,mBAAO,EAAE;AAAA,UAAA;AAEJ,iBAAA,IAAI,EAAE,MAAM;AAAA,QAErB,KAAK;AACI,iBAAA,IAAI,SAAS,EAAE,MAAgB,EAAE,MAAM,OAAO,QAAQ,MAAM;AAAA,QAErE,KAAK;AACI,iBAAA,IAAI,cAAc,EAAE,MAAgB,EAAE,MAAM,OAAO,QAAQ,MAAM;AAAA,QAE1E,KAAK;AACH,iBAAO,IAAI,UAAU,EAAE,MAAgB,EAAE,GAAG,KAAK;AAAA,QAEnD,KAAK;AACH,iBAAO,IAAI,YAAY,EAAE,MAAgB,EAAE,QAAQ,KAAK;AAAA,MAAA;AAE5D,aAAO,EAAE;AAAA,IAAA,CACV,EACA,KAAK,EAAE;AAAA,EAAA;AAAA,EAGL,eAAe,OAAc;AAClC,WAAO,KAAK,OACT,IAAI,CAAC,MAAM;AACV,cAAQ,EAAE,MAAM;AAAA,QACd,KAAK;AACH,cAAI,OAAO,EAAE,WAAW,YAAY,OAAO,EAAE,WAAW,WAAW;AACjE,mBAAO,EAAE;AAAA,UAAA;AAEJ,iBAAA,IAAI,EAAE,MAAM;AAAA,QACrB,KAAK;AACH,iBAAO,IAAI,SAAS,EAAE,MAAgB,EAAE,IAAI,KAAK;AAAA,QACnD,KAAK;AACH,iBAAO,IAAI,cAAc,EAAE,MAAgB,EAAE,MAAM,KAAK;AAAA,MAAA;AAE5D,aAAO,EAAE;AAAA,IAAA,CACV,EACA,KAAK,EAAE;AAAA,EAAA;AAAA,EAGL,WAAW;;AAChB,WAAO,KAAK,SAAS,KAAK,QAAQ,QAAQ;AACxC,WAAK,WAAW;AACZ,UAAA,OAAO,KAAK,IAAI;AACpB,WAAK,KAAK;AACV,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH;AAAA,QACF,KAAK;AACE,eAAA,OAAO,KAAK,UAAU;AAC3B;AAAA,QACF,KAAK;AACE,eAAA,OAAO,KAAK,WAAW;AAC5B;AAAA,QACF,KAAK;AACE,eAAA,OAAO,KAAK,WAAW;AAC5B;AAAA,QACF,KAAK;AACE,eAAA,OAAO,KAAK,SAAS;AAC1B;AAAA,QACF,KAAK,KAAK;AACR,gBAAM,SAAQ,UAAK,SAAS,EAAE,MAAhB,mBAAmB;AACjC,gBAAM,SAAQ,UAAK,SAAS,EAAE,MAAhB,mBAAmB;AACjC,cAAI,UAAU,oBAAqB,UAAU,WAAW,UAAU,kBAAmB;AAC9E,iBAAA,OAAO,KAAK,YAAY;AAAA,UAAA,OACxB;AACA,iBAAA,OAAO,KAAK,WAAW;AAAA,UAAA;AAE9B;AAAA,QAAA;AAAA,QAEF,KAAK;AACE,eAAA,OAAO,KAAK,YAAY;AAC7B;AAAA,QACF,KAAK;AACE,eAAA,OAAO,KAAK,cAAc;AAC/B;AAAA,QACF,KAAK;AACE,eAAA,OAAO,KAAK,WAAW;AAC5B;AAAA,QACF,KAAK;AACE,eAAA,OAAO,KAAK,YAAY;AAC7B;AAAA,QACF,KAAK;AACE,eAAA,OAAO,KAAK,QAAQ;AACzB;AAAA,QACF,KAAK;AACC,cAAA,KAAK,IAAI,MAAM,KAAK;AACtB,iBAAK,KAAK;AACL,iBAAA,OAAO,KAAK,SAAS;AAC1B;AAAA,UAAA;AAEG,eAAA,OAAO,KAAK,QAAQ;AACzB;AAAA,QACF,KAAK;AACC,cAAA,KAAK,IAAI,MAAM,KAAK;AACtB,iBAAK,KAAK;AACL,iBAAA,OAAO,KAAK,SAAS;AAC1B;AAAA,UAAA;AAEE,cAAA,KAAK,IAAI,MAAM,KAAK;AACtB,iBAAK,KAAK;AACL,iBAAA,OAAO,KAAK,QAAQ;AACzB;AAAA,UAAA;AAEG,eAAA,OAAO,KAAK,QAAQ;AACzB;AAAA,QACF,KAAK,KAAK;AACFA,gBAAAA,OAAM,KAAK,UAAU,GAAG;AAC9B,eAAK,OAAO,KAAK,IAAI,MAAM,SAASA,IAAG,CAAC;AACxC;AAAA,QAAA;AAAA,QAEF,KAAK,KAAK;AACFA,gBAAAA,OAAM,KAAK,UAAU,GAAG;AAC9B,iBAAO,IAAIA,IAAG;AACd;AAAA,QAAA;AAAA,QAEF,KAAK,KAAK;AACR,eAAK,UAAU;AACf;AAAA,QAAA;AAAA,QAGF,KAAK,KAAK;AACR,eAAK,OAAO,KAAK,IAAI,MAAM,oBAAoB,KAAK,CAAC,CAAC;AACtD;AAAA,QAAA;AAAA,MACF;AAEF,UAAI,MAAM;AAEV,aAAO,MAAM;AACL,cAAA,IAAI,KAAK,IAAI;AACnB,YAAI,MAAM,KAAK;AACb,eAAK,OAAO,KAAK,IAAI,MAAM,YAAY,GAAG,GAAG,UAAU;AACvD,eAAK,KAAK;AACV;AAAA,QAAA;AAEF,YAAI,KAAK,QAAQ,cAAc,IAAI,CAAC,GAAG;AACjC,cAAA,IAAI,WAAW,GAAG;AACpB;AAAA,UAAA;AAEE,cAAA,IAAI,MAAM,qBAAqB,GAAG;AAC/B,iBAAA,OAAO,KAAK,IAAI,MAAM,SAAS,WAAW,GAAG,CAAC,CAAC;AAAA,UAAA,OAC/C;AACL,kBAAM,OAAO,MAAM,IAAI,YAAA,CAAa;AACpC,gBAAI,QAAQ,MAAM;AAChB,mBAAK,OAAO,KAAK,IAAI,MAAM,SAAS,IAAI,CAAC;AAAA,YAChC,WAAA,IAAI,WAAW,GAAG,GAAG;AAC9B,kBAAI,QAAQ,SAAS;AACnB,qBAAK,OAAO,KAAK,IAAI,MAAM,gBAAgB,GAAG,CAAC;AAAA,cACtC,WAAA,IAAI,QAAQ,GAAG,MAAM,IAAI;AAClC,qBAAK,OAAO,KAAK,IAAI,MAAM,YAAY,GAAG,CAAC;AAAA,cAAA,OACtC;AACL,qBAAK,OAAO,KAAK,IAAI,MAAM,MAAM,GAAG,CAAC;AAAA,cAAA;AAAA,YAE9B,WAAA,IAAI,QAAQ,GAAG,MAAM,IAAI;AAClC,mBAAK,OAAO,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC;AAAA,YAAA,OACnC;AACL,kBAAI,MAAM,IAAI,IAAI,SAAS,CAAC,CAAsB,GAAG;AACnD,qBAAK,OAAO,KAAK,IAAI,MAAM,eAAe,GAAG,CAAC;AAAA,cAAA,OACzC;AACL,qBAAK,OAAO,KAAK,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,cAAA;AAAA,YACxC;AAAA,UACF;AAEF;AAAA,QAAA;AAEK,eAAA;AACP,aAAK,KAAK;AAAA,MAAA;AAAA,IACZ;AAAA,EACF;AAAA,EAEM,aAAa;AACnB,QAAI,QAAgB;AACb,WAAA,KAAK,gBAAgB;AACjB,eAAA,KAAK,QAAQ,KAAK,OAAO;AAAA,IAAA;AAEpC,QAAI,UAAU,IAAI;AAChB,WAAK,OAAO,KAAK,IAAI,MAAM,SAAS,KAAK,CAAC;AAAA,IAAA;AAAA,EAC5C;AAAA,EAGM,UAAU,QAAQ,KAAK;AAC7B,QAAI,MAAM;AAEV,WAAO,MAAM;AACL,YAAA,IAAI,KAAK,IAAI;AACnB,WAAK,KAAK;AACV,UAAI,KAAK,MAAM;AACb;AAAA,MAAA;AAEF,UAAI,MAAM,OAAO;AACX,YAAA,KAAK,IAAI,MAAM,OAAO;AAEjB,iBAAA;AACP,eAAK,KAAK;AACV;AAAA,QAAA,OACK;AACL;AAAA,QAAA;AAAA,MACF,OACK;AACE,eAAA;AAAA,MAAA;AAAA,IACT;AAEK,WAAA;AAAA,EAAA;AAEX;AAEO,MAAM,OAAO;AAAA,EAIlB,YAAY,QAAiB;AAH7B,SAAO,QAAQ;AACf,SAAO,QAAQ;AAGb,SAAK,SAAS;AAAA,EAAA;AAAA,EAET,QAAQ;AACb,UAAM,EAAE,KAAS,IAAA,KAAK,MAAM,KAAK;AAC1B,WAAA;AAAA,EAAA;AAAA,EAGD,MAAM,eAAwB;AACpC,UAAM,QAAsB,CAAC;AACzB,QAAA;AAEE,UAAA,aAAa,CAAC,UAAU,UAAU;AACtC,UAAI,cAAc;AACV,cAAA,QAAQ,MAAM,IAAI;AACX,qBAAA,KAAK,KAAK,KAAM;AAAA,MAAA;AAE/B,aAAO,EAAE,SAAS,MAAM,MAAM,QAAQ;AAAA,IACxC;AAEA,WAAO,KAAK,OAAO,SAAS,KAAK,OAAO;AACtC,YAAM,QAAQ,KAAK,OAAO,KAAK,OAAO;AAClC,UAAA,MAAM,SAAS,SAAS;AAC1B;AAAA,MAAA;AAEE,UAAA,MAAM,SAAS,SAAS;AAC1B,YAAI,CAAC,eAAe;AACZ,gBAAA,IAAI,aAAa,WAAW,eAAe;AAAA,QAAA;AAEnD,eAAO,WAAW,IAAI;AAAA,MAAA,WAEtB,MAAM,SAAS,WACf,MAAM,SAAS,QACf,MAAM,SAAS,cACf,MAAM,SAAS,SACf,MAAM,SAAS,WACf,MAAM,SAAS,kBACf,MAAM,SAAS,eACf;AACM,cAAA,OAAO,MAAM,QAAQ;AAC3B,cAAM,KAAK,IAAK;AAAA,MAAA,WACP,MAAM,SAAS,sBAAsB,MAAM,WAAW,KAAK;AAC9D,cAAA,OAAO,MAAM,IAAI;AACvB,YAAI,CAAC,MAAM;AACH,gBAAA,IAAI,aAAa,WAAW,6BAA6B;AAAA,QAAA;AAE3D,cAAA,cAAc,IAAI,eAAe,UAAU,GAAG,CAAC,MAAM,IAAI,YAAY,GAAG,CAAC,CAAC;AAChF,cAAM,KAAK,WAAW;AAAA,MAAA,WACb,MAAM,SAAS,YAAY;AAC/B,aAAA;AACA,aAAA;AACC,cAAA,OAAO,MAAM,QAAQ;AAC3B,cAAM,KAAK,IAAI;AAEf,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,QAAA,IAAY,KAAK,MAAM,IAAI;AACzC,cAAI,MAAM;AACH,iBAAA,KAAK,KAAK,IAAI;AAAA,UAAA;AAErB,cAAI,CAAC,SAAS;AACZ;AAAA,UAAA;AAAA,QACF;AAAA,MACF,WACS,MAAM,SAAS,QAAQ;AAC3B,aAAA;AACL,cAAM,EAAE,KAAS,IAAA,KAAK,MAAM,KAAK;AACjC,cAAM,KAAK,IAAK;AAAA,MAAA,WACP,MAAM,SAAS,SAAS;AAC7B,YAAA,KAAK,YAAY,GAAG;AAChB,gBAAA,IAAI,aAAa,WAAW,sBAAsB;AAAA,QAAA;AAE1D,eAAO,WAAW;AAAA,MAAA,WACT,MAAM,SAAS,kBAAkB;AACpC,cAAA,WAAW,MAAM,QAAQ;AAC3B,YAAA,OAAO,MAAM,IAAI;AACrB,YAAI,QAAQ,MAAM;AAChB,cAAI,SAAS,SAAS,WAAW,SAAS,SAAS,OAAO;AACjD,mBAAA;AAAA,UAAA,OACF;AACC,kBAAA,IAAI,aAAa,WAAW,yBAAyB;AAAA,UAAA;AAAA,QAC7D;AAGF,YAAI,gBAAgB,MAAM;AACf,mBAAA,KAAK,KAAK,IAAI;AACvB,gBAAM,QAAQ,QAAQ;AAAA,QACb,WAAA,SAAS,aAAa,aAAa,YAAY;AAC/C,mBAAA,KAAK,KAAK,IAAI;AACV,uBAAA,KAAK,KAAK,QAAQ;AAC/B,gBAAM,QAAQ,YAAY;AAAA,QAAA,OACrB;AACC,gBAAA,QAAQ,MAAM,MAAM;AACjB,mBAAA,KAAK,KAAK,KAAM;AACZ,uBAAA,KAAK,KAAK,IAAI;AAC3B,gBAAM,QAAQ,QAAQ;AAAA,QAAA;AAET,uBAAA;AAAA,MAAA,WACN,MAAM,SAAS,mBAAmB;AACrC,cAAA,WAAW,MAAM,QAAQ;AAC/B,YAAI,cAAc;AACH,uBAAA,KAAK,KAAK,QAAQ;AAAA,QAAA,OAC1B;AACL,gBAAM,QAAQ,QAAQ;AAAA,QAAA;AAET,uBAAA;AAAA,MAAA;AAAA,IACjB;AAEF,WAAO,WAAW;AAAA,EAAA;AAEtB;AAEO,MAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,SAAS;AACX,MAKM;AACJ,MAAI,OAAO,UAAU,YAAY,iBAAiB,QAAQ;AACxD,QAAI,MAAM,OAAO,CAAC,MAAM,KAAK;AAC3B,YAAM,QAAQ,IAAI,MAAM,MAAM,UAAU,CAAC,CAAC;AAC1C,YAAM,SAAS;AACf,aAAO,MAAM,MAAM,cAAc,OAAO,QAAQ,MAAM;AAAA,IAAA;AAAA,EACxD;AAEK,SAAA;AACT;AAEa,MAAA,iBAAiB,CAAC,cAAsB;AACnD,MAAI,UAAU,OAAO,CAAC,MAAM,KAAK;AACnB,gBAAA,UAAU,MAAM,CAAC;AAAA,EAAA;AAE/B,MAAI,UAAU,OAAO,UAAU,SAAS,CAAC,MAAM,KAAK;AACtC,gBAAA,UAAU,MAAM,GAAG,EAAE;AAAA,EAAA;AAE5B,SAAA;AACT;"}
|
|
1
|
+
{"version":3,"file":"evaluator.js","sources":["../../formula/evaluator.ts"],"sourcesContent":["import { a2p } from '../lib/converters';\nimport { Table } from '../lib/table';\nimport { PointType } from '../types';\n\ntype EvaluateProps = {\n table: Table;\n};\n\n// strip sharp and dollars\nconst getId = (idString: string, stripAbsolute = true) => {\n let id = idString.slice(1);\n if (stripAbsolute && id.startsWith('$')) {\n id = id.slice(1);\n }\n if (stripAbsolute && id.endsWith('$')) {\n id = id.slice(0, -1);\n }\n return id;\n};\n\nexport class FormulaError {\n public code: string;\n public message: string;\n public error?: Error;\n constructor(code: string, message: string, error?: Error) {\n this.code = code;\n this.message = message;\n this.error = error;\n }\n}\n\nclass Entity<T = any> {\n public value: T;\n constructor(value: T) {\n this.value = value;\n }\n}\n\nexport class ValueEntity extends Entity {\n public evaluate() {\n return this.value;\n }\n}\n\nexport class UnreferencedEntity extends Entity {\n public evaluate() {\n throw new FormulaError('#REF!', `Reference does not exist.`);\n }\n}\n\nexport class InvalidRefEntity extends Entity<string> {\n public evaluate() {\n throw new FormulaError('#NAME?', `Invalid ref: ${this.value}`);\n }\n}\n\nexport class RefEntity extends Entity<string> {\n constructor(value: string) {\n super(value);\n }\n public stringify() {\n return this.value.toUpperCase();\n }\n\n private parse(table: Table): {\n table: Table;\n ref: string;\n sheetName: string;\n } {\n if (this.value.indexOf('!') !== -1) {\n const [rawSheetName, ref] = this.value.split('!');\n const sheetName = stripSheetName(rawSheetName);\n return {\n table: table.getTableBySheetName(sheetName),\n ref: ref.toUpperCase(),\n sheetName,\n };\n }\n return {\n table,\n ref: this.value.toUpperCase(),\n sheetName: stripSheetName(table.sheetName),\n };\n }\n\n public evaluate({ table }: EvaluateProps): Table {\n const parsed = this.parse(table);\n if (parsed.table == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n const { y, x } = a2p(parsed.ref);\n return parsed.table.trim({ top: y, left: x, bottom: y, right: x });\n }\n public id(table: Table) {\n const parsed = this.parse(table);\n if (parsed.table == null) {\n return this.value;\n }\n const id = parsed.table.getIdByAddress(parsed.ref);\n if (id) {\n if (parsed.table === table) {\n return id;\n }\n return `#${parsed.table.sheetId}!${id}`;\n }\n\n return this.value;\n }\n}\n\nexport class RangeEntity extends Entity<string> {\n private parse(table: Table): {\n table: Table;\n refs: string[];\n sheetName: string;\n } {\n const rawRefs = this.value.split(':');\n const refs: string[] = [];\n let sheetName = '';\n for (let i = 0; i < rawRefs.length; i++) {\n const ref = rawRefs[i];\n if (ref.indexOf('!') !== -1) {\n const [rawSheetName, rawRef] = ref.split('!');\n refs.push(rawRef.toUpperCase());\n if (i === 0) {\n sheetName = stripSheetName(rawSheetName);\n table = table.getTableBySheetName(sheetName);\n }\n if (table == null) {\n return { table, refs, sheetName };\n }\n } else {\n refs.push(ref);\n }\n }\n return { table, refs, sheetName: sheetName || table.sheetName };\n }\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ table }: EvaluateProps): Table {\n const parsed = this.parse(table);\n if (parsed.table == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n const area = parsed.table.rangeToArea(parsed.refs.join(':'));\n return parsed.table.trim(area);\n }\n public idRange(table: Table) {\n const parsed = this.parse(table);\n if (parsed.table == null) {\n return this.value;\n }\n const range = parsed.refs.map((ref) => parsed.table.getIdByAddress(ref)).join(':');\n\n if (parsed.table === table) {\n return range;\n }\n return `#${parsed.table.sheetId}!${range}`;\n }\n}\n\nexport class IdEntity extends Entity<string> {\n private parse(table: Table): { table: Table; id: string } {\n if (this.value.indexOf('!') !== -1) {\n const [tableId, id] = this.value.split('!');\n return { table: table.tables[tableId.slice(1)], id: getId(id, false) };\n }\n return { table, id: getId(this.value, false) };\n }\n public evaluate({ table }: EvaluateProps) {\n const parsed = this.parse(table);\n const { y, x } = parsed.table.getPointById(parsed.id);\n const [absY, absX] = [Math.abs(y), Math.abs(x)];\n return parsed.table.trim({\n top: absY,\n left: absX,\n bottom: absY,\n right: absX,\n });\n }\n public ref(table: Table, slideY = 0, slideX = 0) {\n const parsed = this.parse(table);\n const address = parsed.table.getAddressById(parsed.id, slideY, slideX);\n if (parsed.table.sheetId === table.sheetId) {\n return address;\n }\n return `${parsed.table.sheetPrefix()}${address}`;\n }\n public slide(table: Table, slideY = 0, slideX = 0) {\n const address = this.ref(table, slideY, slideX);\n if (address == null || address.length < 2) {\n return '#REF!';\n }\n return table.getIdByAddress(address);\n }\n}\n\nexport class IdRangeEntity extends Entity<string> {\n private parse(table: Table): { table: Table; ids: string[] } {\n const range = this.value;\n if (range.indexOf('!') !== -1) {\n const [sheetId, idRange] = range.split('!');\n table = table.tables[sheetId.slice(1)];\n return { table, ids: idRange.split(':') };\n }\n return { table, ids: range.split(':') };\n }\n\n public evaluate({ table }: EvaluateProps): Table {\n const parsed = this.parse(table);\n const [p1, p2] = parsed.ids.map((id) => getId(id)).map((id) => parsed.table.getPointById(id));\n const [top, left, bottom, right] = [\n p1.y,\n p1.x,\n p2.y || parsed.table.getNumRows(),\n p2.x || parsed.table.getNumCols(),\n ];\n return parsed.table.trim({ top, left, bottom, right });\n }\n public range(table: Table, slideY = 0, slideX = 0) {\n const parsed = this.parse(table);\n const range = parsed.ids\n .map((id) => getId(id, false))\n .map((id) => parsed.table.getAddressById(id, slideY, slideX))\n .join(':');\n if (parsed.table.sheetId === table.sheetId) {\n return range;\n }\n return `${parsed.table.sheetPrefix()}${range}`;\n }\n\n public slide(table: Table, slideY = 0, slideX = 0) {\n const range = this.range(table, slideY, slideX);\n return new RangeEntity(range).idRange(table);\n }\n}\n\nexport class FunctionEntity {\n public args: Expression[];\n public name: string;\n public precedence: number;\n private origin?: PointType;\n constructor(name: string, precedence = 0, args: Expression[] = [], origin?: PointType) {\n this.name = name;\n this.precedence = precedence;\n this.args = args;\n this.origin = origin;\n }\n\n public evaluate({ table }: EvaluateProps): any {\n const name = this.name.toLowerCase();\n const Func = table.getFunction(name);\n if (Func == null) {\n throw new FormulaError('#NAME?', `Unknown function: ${name}`);\n }\n const func = new Func({ args: this.args, table, origin: this.origin });\n return func.call();\n }\n}\n\nexport type Expression =\n | ValueEntity\n | RefEntity\n | RangeEntity\n | IdEntity\n | IdRangeEntity\n | FunctionEntity\n | UnreferencedEntity\n | InvalidRefEntity;\n\nconst ZERO = new ValueEntity(0);\n\nexport type TokenType =\n | 'VALUE'\n | 'REF'\n | 'RANGE'\n | 'ID'\n | 'ID_RANGE'\n | 'FUNCTION'\n | 'PREFIX_OPERATOR'\n | 'INFIX_OPERATOR'\n | 'POSTFIX_OPERATOR'\n | 'OPEN'\n | 'CLOSE'\n | 'COMMA'\n | 'SPACE'\n | 'UNREFERENCED'\n | 'INVALID_REF';\n\nconst INFIX_FUNCTION_NAME_MAP = {\n '+': 'add',\n '-': 'minus',\n '/': 'divide',\n '*': 'multiply',\n '^': 'power',\n '&': 'concat',\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n};\n\nconst PREFIX_FUNCTION_NAME_MAP = {\n '-': 'uminus',\n};\n\nconst WHITESPACE_CHARS = new Set([' ', '\\n', '\\r', '\\t', '\\f']);\nconst SPECIAL_CHARS = new Set([...WHITESPACE_CHARS, '+', '-', '/', '*', '^', '&', '=', '<', '>', ')', ',', '%']);\n\nexport class Token {\n type: TokenType;\n entity: any;\n precedence: number;\n private origin?: PointType;\n\n constructor(type: TokenType, entity: any, precedence = 0, origin?: PointType) {\n this.type = type;\n this.entity = entity;\n this.precedence = precedence;\n this.origin = origin;\n }\n\n public length() {\n if (this.type === 'VALUE' && typeof this.entity === 'string') {\n return this.entity.length + 2;\n }\n return new String(this.entity).length;\n }\n\n public stringify() {\n if (this.type === 'VALUE') {\n if (typeof this.entity === 'string') {\n return `\"${this.entity}\"`;\n }\n if (typeof this.entity === 'boolean') {\n return this.entity ? 'TRUE' : 'FALSE';\n }\n }\n return this.entity as string;\n }\n\n public convert() {\n switch (this.type) {\n case 'VALUE':\n return new ValueEntity(this.entity);\n\n case 'ID':\n return new IdEntity(this.entity as string);\n\n case 'ID_RANGE':\n return new IdRangeEntity(this.entity as string);\n\n case 'REF':\n return new RefEntity(this.entity as string);\n\n case 'RANGE':\n return new RangeEntity(this.entity as string);\n\n case 'INFIX_OPERATOR': {\n const name = INFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof INFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence);\n }\n case 'PREFIX_OPERATOR': {\n const name = PREFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof PREFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence);\n }\n case 'FUNCTION':\n return new FunctionEntity(this.entity as string, 0, [], this.origin);\n\n case 'UNREFERENCED':\n return new UnreferencedEntity(this.entity);\n\n case 'INVALID_REF':\n return new InvalidRefEntity(this.entity as string);\n }\n }\n}\n\nconst isWhiteSpace = (char: string) => {\n return WHITESPACE_CHARS.has(char);\n};\n\nconst TOKEN_OPEN = new Token('OPEN', '('),\n TOKEN_CLOSE = new Token('CLOSE', ')'),\n TOKEN_COMMA = new Token('COMMA', ','),\n TOKEN_ADD = new Token('INFIX_OPERATOR', '+', 3),\n TOKEN_MINUS = new Token('INFIX_OPERATOR', '-', 3),\n TOKEN_UMINUS = new Token('PREFIX_OPERATOR', '-', 6),\n TOKEN_DIVIDE = new Token('INFIX_OPERATOR', '/', 4),\n TOKEN_MULTIPLY = new Token('INFIX_OPERATOR', '*', 4),\n TOKEN_POWER = new Token('INFIX_OPERATOR', '^', 5),\n TOKEN_CONCAT = new Token('INFIX_OPERATOR', '&', 4),\n TOKEN_GTE = new Token('INFIX_OPERATOR', '>=', 2),\n TOKEN_GT = new Token('INFIX_OPERATOR', '>', 2),\n TOKEN_LTE = new Token('INFIX_OPERATOR', '<=', 2),\n TOKEN_LT = new Token('INFIX_OPERATOR', '<', 2),\n TOKEN_NE = new Token('INFIX_OPERATOR', '<>', 1),\n TOKEN_EQ = new Token('INFIX_OPERATOR', '=', 1);\n\nconst BOOLS: { [s: string]: boolean } = { ['true']: true, ['false']: false };\n\ntype LexerOption = {\n origin?: PointType;\n};\n\nexport class Lexer {\n private index: number;\n private formula: string;\n public tokens: Token[] = [];\n public foreign: boolean = false;\n private origin?: PointType;\n\n constructor(formula: string, options?: LexerOption) {\n this.formula = formula;\n this.index = 0;\n this.tokens = [];\n if (options?.origin) {\n this.origin = options.origin;\n }\n }\n\n private isWhiteSpace() {\n return isWhiteSpace(this.formula[this.index]);\n }\n\n private next(base = 1) {\n this.index += base;\n }\n\n private get(base = 0) {\n const c = this.formula[this.index + base];\n return c;\n }\n\n private getToken(base = 0) {\n return this.tokens[this.tokens.length + base];\n }\n\n public getTokenIndexByCharPosition(pos: number) {\n let start = 0,\n end = 0;\n\n for (let i = 0; i < this.tokens.length; i++) {\n const token = this.tokens[i];\n end = start + token.length();\n if (start <= pos && pos <= end) {\n return i;\n }\n start = end;\n }\n return -1;\n }\n\n public getTokenPositionRange(index: number, slide = 1): [number, number] {\n let start = 0,\n end = 0;\n for (let i = 0; i < index; i++) {\n start = end;\n end += this.tokens[i].length();\n }\n return [start + slide, end + slide];\n }\n\n public stringify() {\n return this.tokens.map((t) => t.stringify()).join('');\n }\n\n public stringifyToId(table: Table, slideY = 0, slideX = 0) {\n return this.tokens\n .map((t) => {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n return t.entity;\n }\n return `\"${t.entity}\"`;\n\n case 'ID':\n return new IdEntity(t.entity as string).slide(table, slideY, slideX);\n\n case 'ID_RANGE':\n return new IdRangeEntity(t.entity as string).slide(table, slideY, slideX);\n\n case 'REF':\n return new RefEntity(t.entity as string).id(table);\n\n case 'RANGE':\n return new RangeEntity(t.entity as string).idRange(table);\n }\n return t.entity;\n })\n .join('');\n }\n\n public stringifyToRef(table: Table) {\n return this.tokens\n .map((t) => {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n return t.entity;\n }\n return `\"${t.entity}\"`;\n case 'ID':\n return new IdEntity(t.entity as string).ref(table);\n case 'ID_RANGE':\n return new IdRangeEntity(t.entity as string).range(table);\n }\n return t.entity;\n })\n .join('');\n }\n\n public tokenize() {\n while (this.index <= this.formula.length) {\n this.skipSpaces();\n let char = this.get();\n this.next();\n switch (char) {\n case undefined:\n return;\n case '(':\n this.tokens.push(TOKEN_OPEN);\n continue;\n case ')':\n this.tokens.push(TOKEN_CLOSE);\n continue;\n case ',':\n this.tokens.push(TOKEN_COMMA);\n continue;\n case '+':\n this.tokens.push(TOKEN_ADD);\n continue;\n case '-': {\n const prev1 = this.getToken(-1)?.type;\n const prev2 = this.getToken(-2)?.type;\n if (prev1 === 'INFIX_OPERATOR' || (prev1 === 'SPACE' && prev2 === 'INFIX_OPERATOR')) {\n this.tokens.push(TOKEN_UMINUS);\n } else {\n this.tokens.push(TOKEN_MINUS);\n }\n continue;\n }\n case '/':\n this.tokens.push(TOKEN_DIVIDE);\n continue;\n case '*':\n this.tokens.push(TOKEN_MULTIPLY);\n continue;\n case '^':\n this.tokens.push(TOKEN_POWER);\n continue;\n case '&':\n this.tokens.push(TOKEN_CONCAT);\n continue;\n case '=':\n this.tokens.push(TOKEN_EQ);\n continue;\n case '>':\n if (this.get() === '=') {\n this.next();\n this.tokens.push(TOKEN_GTE);\n continue;\n }\n this.tokens.push(TOKEN_GT);\n continue;\n case '<':\n if (this.get() === '=') {\n this.next();\n this.tokens.push(TOKEN_LTE);\n continue;\n }\n if (this.get() === '>') {\n this.next();\n this.tokens.push(TOKEN_NE);\n continue;\n }\n this.tokens.push(TOKEN_LT);\n continue;\n case '\"': {\n const buf = this.getString('\"');\n this.tokens.push(new Token('VALUE', buf));\n continue;\n }\n case \"'\": {\n const buf = this.getString(\"'\");\n char = `'${buf}'`;\n break;\n }\n case '!': {\n this.foreign = true;\n break;\n // not continue\n }\n case '%': {\n this.tokens.push(new Token('POSTFIX_OPERATOR', '%', 4));\n continue;\n }\n } // switch end\n let buf = char;\n\n while (true) {\n const c = this.get();\n if (c === '(') {\n this.tokens.push(new Token('FUNCTION', buf, 0, this.origin), TOKEN_OPEN);\n this.next();\n break;\n }\n if (c == null || SPECIAL_CHARS.has(c)) {\n if (buf.length === 0) {\n break;\n }\n if (buf.match(/^[+-]?(\\d*[.])?\\d+$/)) {\n this.tokens.push(new Token('VALUE', parseFloat(buf)));\n } else {\n const bool = BOOLS[buf.toLowerCase()];\n if (bool != null) {\n this.tokens.push(new Token('VALUE', bool));\n } else if (buf.startsWith('#')) {\n if (buf === '#REF!') {\n this.tokens.push(new Token('UNREFERENCED', buf));\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('ID_RANGE', buf));\n } else {\n this.tokens.push(new Token('ID', buf));\n }\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('RANGE', buf));\n } else {\n if (isNaN(buf[buf.length - 1] as unknown as number)) {\n this.tokens.push(new Token('INVALID_REF', buf));\n } else {\n this.tokens.push(new Token('REF', buf));\n }\n }\n }\n break;\n }\n buf += c;\n this.next();\n }\n }\n }\n private skipSpaces() {\n let space: string = '';\n while (this.isWhiteSpace()) {\n space += this.formula[this.index++];\n }\n if (space !== '') {\n this.tokens.push(new Token('SPACE', space));\n }\n }\n\n private getString(quote = '\"') {\n let buf = '';\n\n while (true) {\n const c = this.get();\n this.next();\n if (c == null) {\n break;\n }\n if (c === quote) {\n if (this.get() === quote) {\n // escape\n buf += quote;\n this.next();\n continue;\n } else {\n break;\n }\n } else {\n buf += c;\n }\n }\n return buf;\n }\n}\n\nexport class Parser {\n public index = 0;\n public depth = 0;\n public tokens: Token[];\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n public build() {\n const { expr } = this.parse(false);\n return expr;\n }\n\n private parse(underFunction: boolean) {\n const stack: Expression[] = [];\n let lastOperator: undefined | FunctionEntity;\n\n const complement = (hasNext = false) => {\n if (lastOperator) {\n const outer = stack.pop();\n lastOperator.args.push(outer!);\n }\n return { hasNext, expr: stack.shift() };\n };\n\n while (this.tokens.length > this.index) {\n const token = this.tokens[this.index++];\n if (token.type === 'SPACE') {\n continue;\n }\n if (token.type === 'COMMA') {\n if (!underFunction) {\n throw new FormulaError('#ERROR!', 'Invalid comma');\n }\n return complement(true);\n } else if (\n token.type === 'VALUE' ||\n token.type === 'ID' ||\n token.type === 'ID_RANGE' ||\n token.type === 'REF' ||\n token.type === 'RANGE' ||\n token.type === 'UNREFERENCED' ||\n token.type === 'INVALID_REF'\n ) {\n const expr = token.convert();\n stack.push(expr!);\n } else if (token.type === 'POSTFIX_OPERATOR' && token.entity === '%') {\n const expr = stack.pop();\n if (!expr) {\n throw new FormulaError('#ERROR!', 'Missing expression before %');\n }\n const divideBy100 = new FunctionEntity('divide', 4, [expr, new ValueEntity(100)]);\n stack.push(divideBy100);\n } else if (token.type === 'FUNCTION') {\n this.index++;\n this.depth++;\n const func = token.convert() as FunctionEntity;\n stack.push(func);\n\n while (true) {\n const { expr, hasNext } = this.parse(true);\n if (expr) {\n func.args.push(expr);\n }\n if (!hasNext) {\n break;\n }\n }\n } else if (token.type === 'OPEN') {\n this.depth++;\n const { expr } = this.parse(false);\n stack.push(expr!);\n } else if (token.type === 'CLOSE') {\n if (this.depth-- === 0) {\n throw new FormulaError('#ERROR!', 'Unexpected end paren');\n }\n return complement();\n } else if (token.type === 'INFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n let left = stack.pop();\n if (left == null) {\n if (operator.name === 'minus' || operator.name === 'add') {\n left = ZERO;\n } else {\n throw new FormulaError('#ERROR!', 'Missing left expression');\n }\n }\n\n if (lastOperator == null) {\n operator.args.push(left);\n stack.unshift(operator);\n } else if (operator.precedence > lastOperator.precedence) {\n operator.args.push(left);\n lastOperator.args.push(operator);\n stack.unshift(lastOperator);\n } else {\n const outer = stack.shift();\n operator.args.push(outer!);\n lastOperator.args.push(left);\n stack.unshift(operator);\n }\n lastOperator = operator;\n } else if (token.type === 'PREFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n if (lastOperator) {\n lastOperator.args.push(operator);\n } else {\n stack.unshift(operator);\n }\n lastOperator = operator;\n }\n }\n return complement();\n }\n}\n\nexport const absolutizeFormula = ({\n value,\n table,\n slideY = 0,\n slideX = 0,\n}: {\n value: any;\n table: Table;\n slideY?: number;\n slideX?: number;\n}) => {\n if (typeof value === 'string' || value instanceof String) {\n if (value.charAt(0) === '=') {\n const lexer = new Lexer(value.substring(1));\n lexer.tokenize();\n return '=' + lexer.stringifyToId(table, slideY, slideX);\n }\n }\n return value;\n};\n\nexport const stripSheetName = (sheetName: string) => {\n if (sheetName.charAt(0) === \"'\") {\n sheetName = sheetName.slice(1);\n }\n if (sheetName.charAt(sheetName.length - 1) === \"'\") {\n sheetName = sheetName.slice(0, -1);\n }\n return sheetName;\n};\n"],"names":["buf"],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Table } from '../../lib/table';
|
|
2
|
+
import { PointType } from '../../types';
|
|
2
3
|
import { Expression } from '../evaluator';
|
|
3
4
|
export type FunctionProps = {
|
|
4
5
|
args: Expression[];
|
|
5
6
|
table: Table;
|
|
7
|
+
origin?: PointType;
|
|
6
8
|
};
|
|
7
9
|
export declare class BaseFunction {
|
|
8
10
|
example: string;
|
|
@@ -13,7 +15,8 @@ export declare class BaseFunction {
|
|
|
13
15
|
}[];
|
|
14
16
|
protected bareArgs: any[];
|
|
15
17
|
protected table: Table;
|
|
16
|
-
|
|
18
|
+
protected origin?: PointType;
|
|
19
|
+
constructor({ args, table, origin }: FunctionProps);
|
|
17
20
|
protected validate(): void;
|
|
18
21
|
call(): any;
|
|
19
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"__base.d.ts","sourceRoot":"","sources":["../../../formula/functions/__base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"__base.d.ts","sourceRoot":"","sources":["../../../formula/functions/__base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,qBAAa,YAAY;IAChB,OAAO,SAAa;IACpB,SAAS,WAA+B;IACxC,QAAQ;;;QAAyC;IACxD,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC1B,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;IACvB,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;gBAEjB,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,aAAa;IAKlD,SAAS,CAAC,QAAQ;IAEX,IAAI;CAOZ;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,YAAY,CAAA;CAAE,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
class BaseFunction {
|
|
2
|
-
constructor({ args, table }) {
|
|
2
|
+
constructor({ args, table, origin }) {
|
|
3
3
|
this.example = "_BASE()";
|
|
4
4
|
this.helpTexts = ["Function's description."];
|
|
5
5
|
this.helpArgs = [{ name: "value1", description: "" }];
|
|
6
6
|
this.bareArgs = args.map((a) => a.evaluate({ table }));
|
|
7
7
|
this.table = table;
|
|
8
|
+
this.origin = origin;
|
|
8
9
|
}
|
|
9
10
|
validate() {
|
|
10
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"__base.js","sources":["../../../formula/functions/__base.ts"],"sourcesContent":["import { Table } from '../../lib/table';\nimport { Expression } from '../evaluator';\n\nexport type FunctionProps = {\n args: Expression[];\n table: Table;\n};\n\nexport class BaseFunction {\n public example = '_BASE()';\n public helpTexts = [\"Function's description.\"];\n public helpArgs = [{ name: 'value1', description: '' }];\n protected bareArgs: any[];\n protected table: Table;\n\n constructor({ args, table }: FunctionProps) {\n this.bareArgs = args.map((a) => a.evaluate({ table }));\n this.table = table;\n }\n protected validate() {}\n\n public call() {\n this.validate();\n\n // @ts-expect-error main is not defined in BaseFunction\n\n return this.main(...this.bareArgs);\n }\n}\n\nexport type FunctionMapping = { [functionName: string]: typeof BaseFunction };\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"__base.js","sources":["../../../formula/functions/__base.ts"],"sourcesContent":["import { Table } from '../../lib/table';\nimport type { PointType } from '../../types';\nimport { Expression } from '../evaluator';\n\nexport type FunctionProps = {\n args: Expression[];\n table: Table;\n origin?: PointType;\n};\n\nexport class BaseFunction {\n public example = '_BASE()';\n public helpTexts = [\"Function's description.\"];\n public helpArgs = [{ name: 'value1', description: '' }];\n protected bareArgs: any[];\n protected table: Table;\n protected origin?: PointType;\n\n constructor({ args, table, origin }: FunctionProps) {\n this.bareArgs = args.map((a) => a.evaluate({ table }));\n this.table = table;\n this.origin = origin;\n }\n protected validate() {}\n\n public call() {\n this.validate();\n\n // @ts-expect-error main is not defined in BaseFunction\n\n return this.main(...this.bareArgs);\n }\n}\n\nexport type FunctionMapping = { [functionName: string]: typeof BaseFunction };\n"],"names":[],"mappings":"AAUO,MAAM,aAAa;AAAA,EAQxB,YAAY,EAAE,MAAM,OAAO,UAAyB;AAPpD,SAAO,UAAU;AACV,SAAA,YAAY,CAAC,yBAAyB;AAC7C,SAAO,WAAW,CAAC,EAAE,MAAM,UAAU,aAAa,IAAI;AAM/C,SAAA,WAAW,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACrD,SAAK,QAAQ;AACb,SAAK,SAAS;AAAA,EAAA;AAAA,EAEN,WAAW;AAAA,EAAA;AAAA,EAEd,OAAO;AACZ,SAAK,SAAS;AAId,WAAO,KAAK,KAAK,GAAG,KAAK,QAAQ;AAAA,EAAA;AAErC;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { solveTable } from "../solver.js";
|
|
2
2
|
import { Table } from "../../lib/table.js";
|
|
3
3
|
import { FormulaError } from "../evaluator.js";
|
|
4
|
-
import dayjs from "dayjs";
|
|
4
|
+
import dayjs from "../../_virtual/dayjs.min.js";
|
|
5
5
|
import { FULLDATE_FORMAT_UTC } from "../../constants.js";
|
|
6
6
|
const gt = (left, right) => {
|
|
7
7
|
if (typeof left === "string" || typeof right === "string") {
|