@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.
Files changed (99) hide show
  1. package/README.md +27 -0
  2. package/dist/_virtual/_commonjsHelpers.js +7 -0
  3. package/dist/_virtual/_commonjsHelpers.js.map +1 -0
  4. package/dist/_virtual/dayjs.min.js +8 -0
  5. package/dist/_virtual/dayjs.min.js.map +1 -0
  6. package/dist/_virtual/dayjs.min2.js +5 -0
  7. package/dist/_virtual/dayjs.min2.js.map +1 -0
  8. package/dist/_virtual/timezone.js +8 -0
  9. package/dist/_virtual/timezone.js.map +1 -0
  10. package/dist/_virtual/timezone2.js +5 -0
  11. package/dist/_virtual/timezone2.js.map +1 -0
  12. package/dist/_virtual/utc.js +8 -0
  13. package/dist/_virtual/utc.js.map +1 -0
  14. package/dist/_virtual/utc2.js +5 -0
  15. package/dist/_virtual/utc2.js.map +1 -0
  16. package/dist/components/Cell.d.ts.map +1 -1
  17. package/dist/components/Cell.js +3 -1
  18. package/dist/components/Cell.js.map +1 -1
  19. package/dist/components/Editor.d.ts +2 -1
  20. package/dist/components/Editor.d.ts.map +1 -1
  21. package/dist/components/Editor.js +13 -4
  22. package/dist/components/Editor.js.map +1 -1
  23. package/dist/components/FormulaBar.d.ts.map +1 -1
  24. package/dist/components/FormulaBar.js +4 -3
  25. package/dist/components/FormulaBar.js.map +1 -1
  26. package/dist/components/GridSheet.d.ts.map +1 -1
  27. package/dist/components/GridSheet.js +3 -2
  28. package/dist/components/GridSheet.js.map +1 -1
  29. package/dist/components/SheetProvider.d.ts +2 -0
  30. package/dist/components/SheetProvider.d.ts.map +1 -1
  31. package/dist/components/SheetProvider.js +3 -0
  32. package/dist/components/SheetProvider.js.map +1 -1
  33. package/dist/components/Tabular.d.ts.map +1 -1
  34. package/dist/components/Tabular.js +38 -29
  35. package/dist/components/Tabular.js.map +1 -1
  36. package/dist/formula/evaluator.d.ts +10 -3
  37. package/dist/formula/evaluator.d.ts.map +1 -1
  38. package/dist/formula/evaluator.js +11 -6
  39. package/dist/formula/evaluator.js.map +1 -1
  40. package/dist/formula/functions/__base.d.ts +4 -1
  41. package/dist/formula/functions/__base.d.ts.map +1 -1
  42. package/dist/formula/functions/__base.js +2 -1
  43. package/dist/formula/functions/__base.js.map +1 -1
  44. package/dist/formula/functions/__utils.js +1 -1
  45. package/dist/formula/functions/add.js +5 -5
  46. package/dist/formula/functions/add.js.map +1 -1
  47. package/dist/formula/functions/col.d.ts +1 -2
  48. package/dist/formula/functions/col.d.ts.map +1 -1
  49. package/dist/formula/functions/col.js +8 -5
  50. package/dist/formula/functions/col.js.map +1 -1
  51. package/dist/formula/functions/col.spec.d.ts +2 -0
  52. package/dist/formula/functions/col.spec.d.ts.map +1 -0
  53. package/dist/formula/functions/minus.js +5 -5
  54. package/dist/formula/functions/minus.js.map +1 -1
  55. package/dist/formula/functions/row.d.ts +1 -2
  56. package/dist/formula/functions/row.d.ts.map +1 -1
  57. package/dist/formula/functions/row.js +8 -5
  58. package/dist/formula/functions/row.js.map +1 -1
  59. package/dist/formula/functions/row.spec.d.ts +2 -0
  60. package/dist/formula/functions/row.spec.d.ts.map +1 -0
  61. package/dist/formula/mapping.d.ts.map +1 -1
  62. package/dist/formula/mapping.js +1 -0
  63. package/dist/formula/mapping.js.map +1 -1
  64. package/dist/formula/solver.d.ts +3 -2
  65. package/dist/formula/solver.d.ts.map +1 -1
  66. package/dist/formula/solver.js +3 -3
  67. package/dist/formula/solver.js.map +1 -1
  68. package/dist/index.d.ts +1 -1
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/lib/autofill.js +1 -1
  71. package/dist/lib/clipboard.d.ts.map +1 -1
  72. package/dist/lib/clipboard.js +28 -2
  73. package/dist/lib/clipboard.js.map +1 -1
  74. package/dist/lib/table.d.ts +2 -1
  75. package/dist/lib/table.d.ts.map +1 -1
  76. package/dist/lib/table.js +21 -10
  77. package/dist/lib/table.js.map +1 -1
  78. package/dist/lib/time.d.ts +7 -1
  79. package/dist/lib/time.d.ts.map +1 -1
  80. package/dist/lib/time.js +95 -4
  81. package/dist/lib/time.js.map +1 -1
  82. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js +287 -0
  83. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js.map +1 -0
  84. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/timezone.js +72 -0
  85. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/timezone.js.map +1 -0
  86. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.js +85 -0
  87. package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/utc.js.map +1 -0
  88. package/dist/parsers/core.d.ts.map +1 -1
  89. package/dist/parsers/core.js +4 -32
  90. package/dist/parsers/core.js.map +1 -1
  91. package/dist/renderers/core.d.ts +24 -21
  92. package/dist/renderers/core.d.ts.map +1 -1
  93. package/dist/renderers/core.js +35 -47
  94. package/dist/renderers/core.js.map +1 -1
  95. package/dist/store/actions.d.ts.map +1 -1
  96. package/dist/store/actions.js.map +1 -1
  97. package/dist/types.d.ts +5 -2
  98. package/dist/types.d.ts.map +1 -1
  99. 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":";;AAkBO,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,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,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
+ {"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,sBA0K1C,CAAC"}
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
- if (editingCell && inputting.startsWith("=")) {
34
- const refs2 = {};
35
- const externalRefs2 = {};
36
- const lexer = new Lexer(inputting.substring(1));
37
- lexer.tokenize();
38
- let i = 0;
39
- for (const token of lexer.tokens) {
40
- if (token.type === "REF" || token.type === "RANGE") {
41
- const normalizedRef = stripAddressAbsolute(token.stringify());
42
- if (normalizedRef.includes("!")) {
43
- const [sheetName, ref] = normalizedRef.split("!");
44
- const upperRef = ref.toUpperCase();
45
- if (externalRefs2[sheetName] == null) {
46
- externalRefs2[sheetName] = {};
47
- }
48
- if (externalRefs2[sheetName][upperRef] == null) {
49
- externalRefs2[sheetName][upperRef] = i++;
50
- }
51
- } else {
52
- const upperRef = normalizedRef.toUpperCase();
53
- if (refs2[upperRef] == null) {
54
- refs2[upperRef] = i++;
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":";;;;;;;;;;;;;;AAuBO,MAAM,iBAAiB,MAAMA,eAAM,OAAwB,IAAI;AAE/D,MAAM,UAAU,CAAC,EAAE,eAAsB;;AAC9C,QAAM,CAAC,MAAM,OAAO,IAAIA,eAAM,SAAyB,CAAA,CAAE;AACnD,QAAA,CAAA,EAAG,EAAE,eAAe,CAAA,GAAI,gBAAiB,CAAA,IAAI,gBAAgB;AACnE,QAAM,EAAE,OAAO,SAAA,IAAaA,eAAM,WAAW,OAAO;AAC9C,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,CAAC,eAAe,YAAY,IAAI,gBAAgB;AAEtDA,iBAAM,UAAU,MAAM;AACpB,UAAM,iBAAiB,eAAe,UAAU,WAAW,GAAG;AAC9D,QAAI,CAAC,gBAAgB;AACnB,cAAQ,CAAA,CAAE;AACV,yDAAkB,CAAA;AAClB;AAAA,IAAA;AAEF,UAAMC,QAAuB,CAAC;AAC9B,UAAMC,gBAAwD,CAAC;AAC/D,UAAM,QAAQ,IAAI,MAAM,UAAU,UAAU,CAAC,CAAC;AAC9C,UAAM,SAAS;AAEf,QAAI,IAAI;AACG,eAAA,SAAS,MAAM,QAAQ;AAChC,UAAI,MAAM,SAAS,SAAS,MAAM,SAAS,SAAS;AAClD,cAAM,gBAAgB,qBAAqB,MAAM,UAAA,CAAW;AACtD,cAAA,gBAAgB,cAAc,QAAQ,GAAG;AAC/C,YAAI,kBAAkB,IAAI;AACxB,gBAAM,YAAY,cAAc,UAAU,GAAG,aAAa;AAC1D,gBAAM,MAAM,cAAc,UAAU,gBAAgB,CAAC;AAC/C,gBAAA,WAAW,eAAe,SAAS;AACnC,gBAAA,WAAW,IAAI,YAAY;AAC7BA,cAAAA,cAAa,QAAQ,KAAK,MAAM;AAClCA,0BAAa,QAAQ,IAAI,CAAC;AAAA,UAAA;AAE5B,cAAIA,cAAa,QAAQ,EAAE,QAAQ,KAAK,MAAM;AAC5CA,0BAAa,QAAQ,EAAE,QAAQ,IAAI;AAAA,UAAA;AAAA,QACrC,OACK;AACC,gBAAA,WAAW,cAAc,YAAY;AACvCD,cAAAA,MAAK,QAAQ,KAAK,MAAM;AAC1BA,kBAAK,QAAQ,IAAI;AAAA,UAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEF,YAAQA,KAAI;AACZ,uDAAkBC;AAAAA,KACjB,CAAC,MAAM,WAAW,MAAM,WAAW,CAAC;AAEvCF,iBAAM,UAAU,MAAM;AACpB,QAAI,YAAY,kBAAkB;AAChC,eAAS,UAAU;AAAA,QACjB;AAAA,QACA,UAAU,CAACG,WAAU;AACV,mBAAA,YAAYA,MAAc,CAAC;AAAA,QAAA;AAAA,MAExC;AAAA,IAAA;AAAA,EACF,GACC,CAAC,KAAK,CAAC;AACVH,iBAAM,UAAU,MAAM;AACpB,UAAM,IAAI,MAAM,UAAU,MAAM,QAAQ;AAC/B,aAAA,aAAa,KAAK,EAAE,CAAC;AAAA,EAC7B,GAAA,CAAC,OAAO,MAAM,QAAQ,CAAC;AAC1BA,iBAAM,UAAU,MAAM;;AACpB,KAAAI,MAAA,6CAAc,oBAAd,gBAAAA,IAAA,mBAAgC,IAAI,MAAM,QAAQ;AAAA,EAAC,GAClD,CAAC,MAAM,QAAQ,CAAC;AACnB,QAAM,CAAC,aAAa,cAAc,IAAIJ,eAAM,SAAgC,IAAI;AAChFA,iBAAM,UAAU,MAAM;AACpB,mBAAe,WAAW,OAAO,WAAW,OAAO,CAAC;AAAA,EACtD,GAAG,CAAC,WAAW,SAAS,QAAO,aAAQ,YAAR,mBAAiB,eAAc,aAAQ,YAAR,mBAAiB,WAAW,CAAC;AAErF,QAAA,kBAAkB,mBAAmB,OAAO,EAAE,GAAG,MAAM,GAAG,aAAa,MAAM,SAAS,GAAG;AAE/F,SAEI,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA;AAAA,QAEL,QAAQ;AAAA,MACV;AAAA,MACA,KAAK;AAAA,MACL,cAAc,MAAM;AACT,iBAAA,YAAY,IAAI,CAAC;AAAA,MAC5B;AAAA,MACA,cAAc,MAAM;AACT,iBAAA,YAAY,KAAK,CAAC;AAAA,MAC7B;AAAA,MACA,UAAU,CAAC,MAAM;AACf,uBAAe,WAAW,OAAO,EAAE,aAAa,CAAC;AAAA,MACnD;AAAA,MAEA,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO,MAAM,aAAa;AAAA,YAC1B,QAAQ,MAAM,cAAc;AAAA,UAC9B;AAAA,UAEA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,cACX,OAAO;AAAA,gBACL,OAAO,MAAM;AAAA,cACf;AAAA,cAEA,UAAA;AAAA,gBAAC,oBAAA,SAAA,EAAM,WAAU,YAAW,OAAO,EAAE,QAAQ,aAAA,GAC3C,UAAA,qBAAC,MAAG,EAAA,WAAU,UACZ,UAAA;AAAA,kBAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,UAAU,UAAU,OAAO,aAAa,QAAQ,aAAa;AAAA,sBACtE,SAAS,MAAM;AACb,iCAAS,OAAO,EAAE,GAAG,IAAI,GAAG,GAAA,CAAI,CAAC;AACjC,+BAAO,WAAW,MAAM;AACtB,mCAAS,OAAO,EAAE,GAAG,GAAG,GAAG,EAAA,CAAG,CAAC;AAC/B;AAAA,4BACE,OAAO;AAAA,8BACL,QAAQ;AAAA,8BACR,QAAQ;AAAA,8BACR,MAAM,MAAM,WAAW;AAAA,8BACvB,MAAM,MAAM,WAAW;AAAA,4BACxB,CAAA;AAAA,0BACH;AAAA,2BACC,GAAG;AAAA,sBACR;AAAA,sBAEA,UAAA,oBAAC,OAAI,EAAA,WAAU,cAAc,CAAA;AAAA,oBAAA;AAAA,kBAC/B;AAAA,kBACA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,SAAO,gDAAa,aAAb,mBAAuB,SAAQ,EAAE;AAAA,oBAAA;AAAA,kBAClD;AAAA,mBACA,sDAAa,OAAb,mBAAiB,QAAjB,4BAAuB,CAAC,MAAO,oBAAA,eAAA,EAAc,KAAW,CAAG;AAAA,kBAC5D;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,OAAO,EAAE,QAAO,gDAAa,aAAb,mBAAuB,MAAM;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAC9C,EAAA,CACH,EACF,CAAA;AAAA,oCAEC,SAAM,EAAA,WAAU,0BACf,UAAC,qBAAA,MAAA,EAAG,WAAU,UACZ,UAAA;AAAA,kBAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAW;AAAA,sBACX,OAAO,EAAE,UAAQ,gDAAa,aAAb,mBAAuB,QAAO,EAAE;AAAA,oBAAA;AAAA,kBAClD;AAAA,kBACD,oBAAC,MAAG,EAAA,WAAU,mCAAmC,CAAA;AAAA,mBAChD,gDAAa,OAAb,mBAAiB,IAAI,CAAC,0BAAO,MAAG,EAAA,WAAU,mCAAwC,GAAA,CAAG;AAAA,kBACtF,oBAAC,MAAG,EAAA,WAAW,0DAA2D,CAAA;AAAA,gBAAA,EAAA,CAC5E,EACF,CAAA;AAAA,gBAEA,oBAAC,WAAM,WAAU,sBACd,2DAAa,0BAAI,IAAI,CAAC,MAAM;;AAEzB,yBAAA,qBAAC,MAAW,EAAA,WAAU,UACpB,UAAA;AAAA,oBAAA,oBAAC,kBAAe,GAAM;AAAA,oBACtB,oBAAC,MAAG,EAAA,WAAU,iEAAiE,CAAA;AAAA,qBAC9EI,MAAA,2CAAa,OAAb,gBAAAA,IAAiB,IAAI,CAAC,MACrB,oBAAC,QAAa,GAAM,GAAM,gBAAgB,gBAAgB,IAAI,EAAE,GAAG,EAAA,CAAG,CAAC,EAAA,GAA5D,CAA+D;AAAA,oBAE5E,oBAAC,MAAG,EAAA,WAAU,kEAAkE,CAAA;AAAA,kBAAA,EAAA,GANzE,CAOT;AAAA,gBAAA,GAGN,CAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IACF;AAAA,EAAA,GAEJ;AAEJ;AAEA,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AACxB,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AACvB,MAAM,6BAA6B;AACnC,MAAM,yBAAyB;AAC/B,MAAM,kBAAkB;AAExB,MAAM,qBAAqB,CAAC,OAAkB,SAAyB;AACrE,QAAM,aAAqD,CAAC;AACtD,QAAA,cAAc,CAAC,OAAkB,UAA+B;AAC9D,UAAA,UAAU,IAAI,KAAK;AACzB,eAAW,OAAO,IAAI,WAAW,OAAO,KAAK,CAAC;AAC9C,WAAO,OAAO,WAAW,OAAO,GAAG,KAAK;AAAA,EAC1C;AACM,QAAA,EAAE,UAAU,eAAe,aAAa,SAAS,eAAe,mBAAmB,OAAO,mBAAA,IAC9F;AACF;AAEE,UAAM,EAAE,KAAK,MAAM,QAAQ,MAAM,IAAI,WAAW,aAAa;AAC7D,aAAS,IAAI,KAAK,KAAK,QAAQ,KAAK;AACtB,kBAAA,EAAE,GAAG,GAAG,OAAO,KAAK,EAAE,aAAa,iBAAiB;AACpD,kBAAA,EAAE,GAAG,GAAG,KAAA,GAAQ,EAAE,YAAY,iBAAiB;AAC/C,kBAAA,EAAE,GAAG,GAAG,MAAA,GAAS,EAAE,aAAa,iBAAiB;AACjD,kBAAA,EAAE,GAAG,GAAG,QAAQ,KAAK,EAAE,YAAY,iBAAiB;AAAA,IAAA;AAElE,aAAS,IAAI,MAAM,KAAK,OAAO,KAAK;AACtB,kBAAA,EAAE,GAAG,MAAM,GAAG,KAAK,EAAE,cAAc,iBAAiB;AACpD,kBAAA,EAAE,GAAG,KAAK,EAAA,GAAK,EAAE,WAAW,iBAAiB;AAC7C,kBAAA,EAAE,GAAG,QAAQ,EAAA,GAAK,EAAE,cAAc,iBAAiB;AACnD,kBAAA,EAAE,GAAG,SAAS,GAAG,KAAK,EAAE,WAAW,iBAAiB;AAAA,IAAA;AAAA,EAClE;AAEF,MAAI,oBAAoB;AACtB,UAAM,WAAW,IAAI,SAAS,OAAO,kBAAkB;AACvD,UAAM,EAAE,KAAK,MAAM,QAAQ,MAAA,IAAU,SAAS;AAC9C,aAAS,IAAI,KAAK,KAAK,QAAQ,KAAK;AACtB,kBAAA,EAAE,GAAG,GAAG,OAAO,KAAK,EAAE,aAAa,iBAAiB;AACpD,kBAAA,EAAE,GAAG,GAAG,KAAA,GAAQ,EAAE,YAAY,iBAAiB;AAC/C,kBAAA,EAAE,GAAG,GAAG,MAAA,GAAS,EAAE,aAAa,iBAAiB;AACjD,kBAAA,EAAE,GAAG,GAAG,QAAQ,KAAK,EAAE,YAAY,iBAAiB;AAAA,IAAA;AAElE,aAAS,IAAI,MAAM,KAAK,OAAO,KAAK;AACtB,kBAAA,EAAE,GAAG,MAAM,GAAG,KAAK,EAAE,cAAc,iBAAiB;AACpD,kBAAA,EAAE,GAAG,KAAK,EAAA,GAAK,EAAE,WAAW,iBAAiB;AAC7C,kBAAA,EAAE,GAAG,QAAQ,EAAA,GAAK,EAAE,cAAc,iBAAiB;AACnD,kBAAA,EAAE,GAAG,SAAS,GAAG,KAAK,EAAE,WAAW,iBAAiB;AAAA,IAAA;AAAA,EAClE;AAEF;AAEQ,UAAA,EAAE,GAAG,EAAA,IAAM;AACjB;AAAA,MACE,EAAE,GAAG,EAAE;AAAA,MACP;AAAA,QACE,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc;AAAA,MAAA;AAAA,IAElB;AACY,gBAAA,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,aAAa,gBAAgB;AAChD,gBAAA,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,YAAY,gBAAgB;AAC/C,gBAAA,EAAE,GAAG,IAAI,GAAG,KAAK,EAAE,cAAc,gBAAgB;AACjD,gBAAA,EAAE,GAAG,IAAI,GAAG,KAAK,EAAE,WAAW,gBAAgB;AAAA,EAAA;AAE5D;AAEQ,UAAA,cAAc,UAAU,iBAAiB;AAC/C,UAAM,EAAE,KAAK,MAAM,QAAQ,MAAM,IAAI,WAAW,WAAW;AAC3D,aAAS,IAAI,KAAK,KAAK,QAAQ,KAAK;AACtB,kBAAA,EAAE,GAAG,GAAG,OAAO,KAAK,EAAE,aAAa,aAAa;AAChD,kBAAA,EAAE,GAAG,GAAG,KAAA,GAAQ,EAAE,YAAY,aAAa;AAC3C,kBAAA,EAAE,GAAG,GAAG,MAAA,GAAS,EAAE,aAAa,aAAa;AAC7C,kBAAA,EAAE,GAAG,GAAG,QAAQ,KAAK,EAAE,YAAY,aAAa;AAAA,IAAA;AAE9D,aAAS,IAAI,MAAM,KAAK,OAAO,KAAK;AACtB,kBAAA,EAAE,GAAG,MAAM,GAAG,KAAK,EAAE,cAAc,aAAa;AAChD,kBAAA,EAAE,GAAG,KAAK,EAAA,GAAK,EAAE,WAAW,aAAa;AACzC,kBAAA,EAAE,GAAG,QAAQ,EAAA,GAAK,EAAE,cAAc,aAAa;AAC/C,kBAAA,EAAE,GAAG,SAAS,GAAG,KAAK,EAAE,WAAW,aAAa;AAAA,IAAA;AAAA,EAC9D;AAGK,SAAA,QAAQ,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,MAAM;AACzC,UAAM,UAAU,YAAY,IAAI,YAAY,MAAM;AAC5C,UAAA,cAAc,cAAc,OAAO;AACnC,UAAA,EAAE,KAAK,MAAM,QAAQ,UAAU,MAAM,YAAY,GAAG;AAC1D,aAAS,IAAI,KAAK,KAAK,QAAQ,KAAK;AACtB,kBAAA,EAAE,GAAG,GAAG,OAAO,KAAK,EAAE,aAAa,aAAa;AAChD,kBAAA,EAAE,GAAG,GAAG,KAAA,GAAQ,EAAE,YAAY,aAAa;AAC3C,kBAAA,EAAE,GAAG,GAAG,MAAA,GAAS,EAAE,aAAa,aAAa;AAC7C,kBAAA,EAAE,GAAG,GAAG,QAAQ,KAAK,EAAE,YAAY,aAAa;AAAA,IAAA;AAE9D,aAAS,IAAI,MAAM,KAAK,OAAO,KAAK;AACtB,kBAAA,EAAE,GAAG,MAAM,GAAG,KAAK,EAAE,cAAc,aAAa;AAChD,kBAAA,EAAE,GAAG,KAAK,EAAA,GAAK,EAAE,WAAW,aAAa;AACzC,kBAAA,EAAE,GAAG,QAAQ,EAAA,GAAK,EAAE,cAAc,aAAa;AAC/C,kBAAA,EAAE,GAAG,SAAS,GAAG,KAAK,EAAE,WAAW,aAAa;AAAA,IAAA;AAAA,EAC9D,CACD;AACa,gBAAA,QAAQ,CAAC,YAAY;AACjC,UAAM,EAAE,GAAG,MAAM,IAAI,OAAO;AAC5B,gBAAY,EAAE,GAAG,KAAK,EAAE,iBAAiB,4BAA4B;AAAA,EAAA,CACtE;AACG,MAAA,cAAc,SAAS,GAAG;AAC5B,UAAM,EAAE,GAAG,EAAA,IAAM,IAAI,cAAc,iBAAiB,CAAC;AACrD;AAAA,MACE,EAAE,GAAG,EAAE;AAAA,MACP;AAAA,QACE,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,WAAW;AAAA,QACX,cAAc;AAAA,MAAA;AAAA,IAElB;AACY,gBAAA,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,aAAa,wBAAwB;AACxD,gBAAA,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,YAAY,wBAAwB;AACvD,gBAAA,EAAE,GAAG,IAAI,GAAG,KAAK,EAAE,cAAc,wBAAwB;AACzD,gBAAA,EAAE,GAAG,IAAI,GAAG,KAAK,EAAE,WAAW,wBAAwB;AAAA,EAAA;AAE7D,SAAA;AACT;"}
@@ -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
- constructor(name: string, precedence?: number, args?: Expression[]);
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
- constructor(type: TokenType, entity: any, precedence?: number);
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
- constructor(formula: string);
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":"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"}
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../formula/evaluator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,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;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAY;gBACf,IAAI,EAAE,MAAM,EAAE,UAAU,SAAI,EAAE,IAAI,GAAE,UAAU,EAAO,EAAE,MAAM,CAAC,EAAE,SAAS;IAO9E,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,aAAa,GAAG,GAAG;CAS/C;AAED,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,SAAS,GACT,WAAW,GACX,QAAQ,GACR,aAAa,GACb,cAAc,GACd,kBAAkB,GAClB,gBAAgB,CAAC;AAIrB,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,KAAK,GACL,OAAO,GACP,IAAI,GACJ,UAAU,GACV,UAAU,GACV,iBAAiB,GACjB,gBAAgB,GAChB,kBAAkB,GAClB,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,cAAc,GACd,aAAa,CAAC;AAwBlB,qBAAa,KAAK;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,GAAG,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,MAAM,CAAC,CAAY;gBAEf,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,SAAI,EAAE,MAAM,CAAC,EAAE,SAAS;IAOrE,MAAM;IAON,SAAS;IAYT,OAAO;CAmCf;AAyBD,KAAK,WAAW,GAAG;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACjB,MAAM,EAAE,KAAK,EAAE,CAAM;IACrB,OAAO,EAAE,OAAO,CAAS;IAChC,OAAO,CAAC,MAAM,CAAC,CAAY;gBAEf,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW;IASlD,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,GAAG;IAKX,OAAO,CAAC,QAAQ;IAIT,2BAA2B,CAAC,GAAG,EAAE,MAAM;IAevC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAUjE,SAAS;IAIT,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,SAAI,EAAE,MAAM,SAAI;IA2BlD,cAAc,CAAC,KAAK,EAAE,KAAK;IAmB3B,QAAQ;IAkIf,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,SAAS;CAwBlB;AAED,qBAAa,MAAM;IACV,KAAK,SAAK;IACV,KAAK,SAAK;IACV,MAAM,EAAE,KAAK,EAAE,CAAC;gBACX,MAAM,EAAE,KAAK,EAAE;IAGpB,KAAK;IAKZ,OAAO,CAAC,KAAK;CAqGd;AAED,eAAO,MAAM,iBAAiB,GAAI,mCAK/B;IACD,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,QASA,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,WAAW,MAAM,WAQ/C,CAAC"}
@@ -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":"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"}
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
- constructor({ args, table }: FunctionProps);
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;CACd,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;gBAEX,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,aAAa;IAI1C,SAAS,CAAC,QAAQ;IAEX,IAAI;CAOZ;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,YAAY,CAAA;CAAE,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":"AAQO,MAAM,aAAa;AAAA,EAOxB,YAAY,EAAE,MAAM,SAAwB;AAN5C,SAAO,UAAU;AACV,SAAA,YAAY,CAAC,yBAAyB;AAC7C,SAAO,WAAW,CAAC,EAAE,MAAM,UAAU,aAAa,IAAI;AAK/C,SAAA,WAAW,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACrD,SAAK,QAAQ;AAAA,EAAA;AAAA,EAEL,WAAW;AAAA,EAAA;AAAA,EAEd,OAAO;AACZ,SAAK,SAAS;AAId,WAAO,KAAK,KAAK,GAAG,KAAK,QAAQ;AAAA,EAAA;AAErC;"}
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") {