@rowsncolumns/utils 9.2.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +100 -0
- package/dist/cjs/array.d.ts +3 -0
- package/dist/cjs/array.d.ts.map +1 -0
- package/dist/cjs/array.js +19 -0
- package/dist/cjs/cell-data-helpers.d.ts +19 -0
- package/dist/cjs/cell-data-helpers.d.ts.map +1 -0
- package/dist/cjs/cell-data-helpers.js +64 -0
- package/dist/cjs/color.d.ts +20 -0
- package/dist/cjs/color.d.ts.map +1 -0
- package/dist/cjs/color.js +168 -0
- package/dist/cjs/colors.d.ts +2 -0
- package/dist/cjs/colors.d.ts.map +1 -0
- package/dist/cjs/colors.js +78 -0
- package/dist/cjs/conditional-format.d.ts +49 -0
- package/dist/cjs/conditional-format.d.ts.map +1 -0
- package/dist/cjs/conditional-format.js +227 -0
- package/dist/cjs/content-hash.d.ts +16 -0
- package/dist/cjs/content-hash.d.ts.map +1 -0
- package/dist/cjs/content-hash.js +72 -0
- package/dist/cjs/data-validation.d.ts +54 -0
- package/dist/cjs/data-validation.d.ts.map +1 -0
- package/dist/cjs/data-validation.js +249 -0
- package/dist/cjs/date.d.ts +15 -0
- package/dist/cjs/date.d.ts.map +1 -0
- package/dist/cjs/date.js +56 -0
- package/dist/cjs/dom.d.ts +10 -0
- package/dist/cjs/dom.d.ts.map +1 -0
- package/dist/cjs/dom.js +97 -0
- package/dist/cjs/formatter.d.ts +22 -0
- package/dist/cjs/formatter.d.ts.map +1 -0
- package/dist/cjs/formatter.js +264 -0
- package/dist/cjs/formula-refs.d.ts +7 -0
- package/dist/cjs/formula-refs.d.ts.map +1 -0
- package/dist/cjs/formula-refs.js +54 -0
- package/dist/cjs/formula.d.ts +80 -0
- package/dist/cjs/formula.d.ts.map +1 -0
- package/dist/cjs/formula.js +401 -0
- package/dist/cjs/index.d.ts +24 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +26 -0
- package/dist/cjs/locale.d.ts +34 -0
- package/dist/cjs/locale.d.ts.map +1 -0
- package/dist/cjs/locale.js +260 -0
- package/dist/cjs/log.d.ts +4 -0
- package/dist/cjs/log.d.ts.map +1 -0
- package/dist/cjs/log.js +28 -0
- package/dist/cjs/memoize.d.ts +18 -0
- package/dist/cjs/memoize.d.ts.map +1 -0
- package/dist/cjs/memoize.js +128 -0
- package/dist/cjs/numbers.d.ts +19 -0
- package/dist/cjs/numbers.d.ts.map +1 -0
- package/dist/cjs/numbers.js +47 -0
- package/dist/cjs/selection.d.ts +88 -0
- package/dist/cjs/selection.d.ts.map +1 -0
- package/dist/cjs/selection.js +368 -0
- package/dist/cjs/shared-string-canonical.d.ts +18 -0
- package/dist/cjs/shared-string-canonical.d.ts.map +1 -0
- package/dist/cjs/shared-string-canonical.js +74 -0
- package/dist/cjs/sort.d.ts +15 -0
- package/dist/cjs/sort.d.ts.map +1 -0
- package/dist/cjs/sort.js +44 -0
- package/dist/cjs/string.d.ts +74 -0
- package/dist/cjs/string.d.ts.map +1 -0
- package/dist/cjs/string.js +237 -0
- package/dist/cjs/table-styles.d.ts +56 -0
- package/dist/cjs/table-styles.d.ts.map +1 -0
- package/dist/cjs/table-styles.js +362 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/typeguards.d.ts +4 -0
- package/dist/cjs/typeguards.d.ts.map +1 -0
- package/dist/cjs/typeguards.js +15 -0
- package/dist/cjs/uuid.d.ts +8 -0
- package/dist/cjs/uuid.d.ts.map +1 -0
- package/dist/cjs/uuid.js +30 -0
- package/dist/cjs/vitest.config.d.ts +3 -0
- package/dist/cjs/vitest.config.d.ts.map +1 -0
- package/dist/cjs/vitest.config.js +9 -0
- package/dist/esm/array.d.ts +3 -0
- package/dist/esm/array.d.ts.map +1 -0
- package/dist/esm/array.js +14 -0
- package/dist/esm/cell-data-helpers.d.ts +19 -0
- package/dist/esm/cell-data-helpers.d.ts.map +1 -0
- package/dist/esm/cell-data-helpers.js +39 -0
- package/dist/esm/color.d.ts +20 -0
- package/dist/esm/color.d.ts.map +1 -0
- package/dist/esm/color.js +152 -0
- package/dist/esm/colors.d.ts +2 -0
- package/dist/esm/colors.d.ts.map +1 -0
- package/dist/esm/colors.js +75 -0
- package/dist/esm/conditional-format.d.ts +49 -0
- package/dist/esm/conditional-format.d.ts.map +1 -0
- package/dist/esm/conditional-format.js +219 -0
- package/dist/esm/content-hash.d.ts +16 -0
- package/dist/esm/content-hash.d.ts.map +1 -0
- package/dist/esm/content-hash.js +68 -0
- package/dist/esm/data-validation.d.ts +54 -0
- package/dist/esm/data-validation.d.ts.map +1 -0
- package/dist/esm/data-validation.js +237 -0
- package/dist/esm/date.d.ts +15 -0
- package/dist/esm/date.d.ts.map +1 -0
- package/dist/esm/date.js +46 -0
- package/dist/esm/dom.d.ts +10 -0
- package/dist/esm/dom.d.ts.map +1 -0
- package/dist/esm/dom.js +90 -0
- package/dist/esm/formatter.d.ts +22 -0
- package/dist/esm/formatter.d.ts.map +1 -0
- package/dist/esm/formatter.js +253 -0
- package/dist/esm/formula-refs.d.ts +7 -0
- package/dist/esm/formula-refs.d.ts.map +1 -0
- package/dist/esm/formula-refs.js +49 -0
- package/dist/esm/formula.d.ts +80 -0
- package/dist/esm/formula.d.ts.map +1 -0
- package/dist/esm/formula.js +298 -0
- package/dist/esm/index.d.ts +24 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +23 -0
- package/dist/esm/locale.d.ts +34 -0
- package/dist/esm/locale.d.ts.map +1 -0
- package/dist/esm/locale.js +223 -0
- package/dist/esm/log.d.ts +4 -0
- package/dist/esm/log.d.ts.map +1 -0
- package/dist/esm/log.js +3 -0
- package/dist/esm/memoize.d.ts +18 -0
- package/dist/esm/memoize.d.ts.map +1 -0
- package/dist/esm/memoize.js +95 -0
- package/dist/esm/numbers.d.ts +19 -0
- package/dist/esm/numbers.d.ts.map +1 -0
- package/dist/esm/numbers.js +40 -0
- package/dist/esm/selection.d.ts +88 -0
- package/dist/esm/selection.d.ts.map +1 -0
- package/dist/esm/selection.js +311 -0
- package/dist/esm/shared-string-canonical.d.ts +18 -0
- package/dist/esm/shared-string-canonical.d.ts.map +1 -0
- package/dist/esm/shared-string-canonical.js +68 -0
- package/dist/esm/sort.d.ts +15 -0
- package/dist/esm/sort.d.ts.map +1 -0
- package/dist/esm/sort.js +39 -0
- package/dist/esm/string.d.ts +74 -0
- package/dist/esm/string.d.ts.map +1 -0
- package/dist/esm/string.js +213 -0
- package/dist/esm/table-styles.d.ts +56 -0
- package/dist/esm/table-styles.d.ts.map +1 -0
- package/dist/esm/table-styles.js +367 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/typeguards.d.ts +4 -0
- package/dist/esm/typeguards.d.ts.map +1 -0
- package/dist/esm/typeguards.js +7 -0
- package/dist/esm/uuid.d.ts +8 -0
- package/dist/esm/uuid.d.ts.map +1 -0
- package/dist/esm/uuid.js +25 -0
- package/dist/esm/vitest.config.d.ts +3 -0
- package/dist/esm/vitest.config.d.ts.map +1 -0
- package/dist/esm/vitest.config.js +7 -0
- package/package.json +49 -0
package/dist/esm/sort.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sort sheets by index
|
|
3
|
+
* @param sheets
|
|
4
|
+
* @returns
|
|
5
|
+
*/
|
|
6
|
+
export const sortSheetsByIndex = (sheets, includeHidden) => {
|
|
7
|
+
const filtered = sheets
|
|
8
|
+
.filter(Boolean)
|
|
9
|
+
.filter((sheet) => includeHidden ? sheet.title : !sheet.hidden && sheet.title);
|
|
10
|
+
// Remove duplicate sheets with the same sheetId, keeping only the first occurrence
|
|
11
|
+
const seen = new Set();
|
|
12
|
+
const deduplicated = filtered.filter((sheet) => {
|
|
13
|
+
if (seen.has(sheet.sheetId)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
seen.add(sheet.sheetId);
|
|
17
|
+
return true;
|
|
18
|
+
});
|
|
19
|
+
// Collect indices that are already defined
|
|
20
|
+
const usedIndices = new Set(deduplicated
|
|
21
|
+
.map((sheet) => sheet.index)
|
|
22
|
+
.filter((index) => index !== undefined && index !== null));
|
|
23
|
+
// Assign indices to sheets without one, starting from 0 and skipping used indices
|
|
24
|
+
let nextIndex = 0;
|
|
25
|
+
const getNextAvailableIndex = () => {
|
|
26
|
+
while (usedIndices.has(nextIndex)) {
|
|
27
|
+
nextIndex++;
|
|
28
|
+
}
|
|
29
|
+
return nextIndex++;
|
|
30
|
+
};
|
|
31
|
+
return deduplicated
|
|
32
|
+
.map((sheet) => {
|
|
33
|
+
return {
|
|
34
|
+
...sheet,
|
|
35
|
+
index: sheet.index ?? getNextAvailableIndex(),
|
|
36
|
+
};
|
|
37
|
+
})
|
|
38
|
+
.sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
|
|
39
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { CellInterface, GridRange } from "@rowsncolumns/common-types";
|
|
2
|
+
/**
|
|
3
|
+
* Convert cell to bounds.
|
|
4
|
+
* Its better to use gridref.current.getCellBounds() instead as it caters
|
|
5
|
+
* to merged cells
|
|
6
|
+
* @param cell
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
9
|
+
export declare const convertCellToRange: (cell: CellInterface) => GridRange;
|
|
10
|
+
/**
|
|
11
|
+
* Converts address string to CellInterface
|
|
12
|
+
* @param address
|
|
13
|
+
*/
|
|
14
|
+
export declare const addressToCell: (address: string, options?: {
|
|
15
|
+
position?: "start" | "end";
|
|
16
|
+
rowCount?: number;
|
|
17
|
+
columnCount?: number;
|
|
18
|
+
}) => CellInterface | null;
|
|
19
|
+
/**
|
|
20
|
+
* Gets column from address $G => G
|
|
21
|
+
* @param address
|
|
22
|
+
*/
|
|
23
|
+
export declare const getColumnNameFromAddress: (address: string) => string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Gets rowIndex from address $1 => 1
|
|
26
|
+
* @param address
|
|
27
|
+
*/
|
|
28
|
+
export declare const getRowIndexFromAddress: (address: string) => string | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Convert cellInterface to address string
|
|
31
|
+
* @param cell
|
|
32
|
+
*/
|
|
33
|
+
export declare const cellToAddress: (cell: CellInterface | null, isAbsoluteColumn?: boolean, isAbsoluteRow?: boolean, isFullColumn?: boolean, isFullRow?: boolean) => string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Convert a cell range to address
|
|
36
|
+
* @param sheetName
|
|
37
|
+
* @param range
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
40
|
+
export declare const cellRangeToAddress: (sheetName: string | undefined, range: GridRange) => string;
|
|
41
|
+
export declare const sanitizeSheetName: (name: string | undefined) => string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Remove single quotes from sheetname
|
|
44
|
+
* 'Sheet Space!A4' => Sheet Space
|
|
45
|
+
* @param name
|
|
46
|
+
* @returns
|
|
47
|
+
*/
|
|
48
|
+
export declare const desanitizeSheetName: (name: string | undefined) => string | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Escape special characters
|
|
51
|
+
* @param str
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
export declare const escapeCharacters: (str: string) => string;
|
|
55
|
+
/**
|
|
56
|
+
* Get selection from start and end cell
|
|
57
|
+
* @param start
|
|
58
|
+
* @param end
|
|
59
|
+
* @param sheetName
|
|
60
|
+
* @returns
|
|
61
|
+
*/
|
|
62
|
+
export declare const selectionBoundsFromCells: (start: CellInterface, end?: CellInterface | null) => GridRange;
|
|
63
|
+
export declare const supplant: (s: string, o: Record<string, any>) => string;
|
|
64
|
+
/**
|
|
65
|
+
* Normalize an external hyperlink target for the browser. A stored URL
|
|
66
|
+
* without a scheme ("paradigm.xyz") would otherwise be resolved relative to
|
|
67
|
+
* the current page. Prefixes https:// unless the URL already has a scheme
|
|
68
|
+
* (https:, mailto:, tel:, …), is protocol-relative ("//host"), or is a
|
|
69
|
+
* fragment/path reference.
|
|
70
|
+
* @param url
|
|
71
|
+
* @returns
|
|
72
|
+
*/
|
|
73
|
+
export declare const normalizeExternalUrl: (url: string) => string;
|
|
74
|
+
//# sourceMappingURL=string.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../string.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAK3E;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,aAAa,KAAG,SAKvD,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,MAAM,EACf,UAAS;IACP,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACjB,KACL,aAAa,GAAG,IAuDlB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,SAAS,MAAM,uBAEvD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,SAAS,MAAM,uBAErD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,MAAM,aAAa,GAAG,IAAI,EAC1B,0BAAwB,EACxB,uBAAqB,EACrB,sBAAoB,EACpB,mBAAiB,KAChB,MAAM,GAAG,IAiBX,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,WAAW,MAAM,GAAG,SAAS,EAC7B,OAAO,SAAS,WAUjB,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,GAAG,SAAS,uBASzD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,GAAG,SAAS,uBAgB3D,CAAC;AAKF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,WAI3C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,GACnC,OAAO,aAAa,EACpB,MAAK,aAAa,GAAG,IAAY,KAChC,SAQF,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,WAKzD,CAAC;AAKF;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,GAAI,KAAK,MAAM,WAY/C,CAAC"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { isNil } from "./typeguards";
|
|
2
|
+
import { alpha2number, number2Alpha } from "./numbers";
|
|
3
|
+
import { MAX_COLUMN_COUNT, MAX_ROW_COUNT } from "./selection";
|
|
4
|
+
/**
|
|
5
|
+
* Convert cell to bounds.
|
|
6
|
+
* Its better to use gridref.current.getCellBounds() instead as it caters
|
|
7
|
+
* to merged cells
|
|
8
|
+
* @param cell
|
|
9
|
+
* @returns
|
|
10
|
+
*/
|
|
11
|
+
export const convertCellToRange = (cell) => ({
|
|
12
|
+
startRowIndex: cell.rowIndex,
|
|
13
|
+
startColumnIndex: cell.columnIndex,
|
|
14
|
+
endRowIndex: cell.rowIndex,
|
|
15
|
+
endColumnIndex: cell.columnIndex,
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Converts address string to CellInterface
|
|
19
|
+
* @param address
|
|
20
|
+
*/
|
|
21
|
+
export const addressToCell = (address, options = {}) => {
|
|
22
|
+
const { position, rowCount, columnCount } = options;
|
|
23
|
+
const maxRow = typeof rowCount === "number"
|
|
24
|
+
? Math.min(rowCount, MAX_ROW_COUNT)
|
|
25
|
+
: MAX_ROW_COUNT;
|
|
26
|
+
const maxColumn = typeof columnCount === "number"
|
|
27
|
+
? Math.min(columnCount, MAX_COLUMN_COUNT)
|
|
28
|
+
: MAX_COLUMN_COUNT;
|
|
29
|
+
const regex = /\$?([A-Z]+)\$?(\d+)/gim;
|
|
30
|
+
let m;
|
|
31
|
+
const matches = [];
|
|
32
|
+
while ((m = regex.exec(address)) !== null) {
|
|
33
|
+
// This is necessary to avoid infinite loops with zero-width matches
|
|
34
|
+
if (m.index === regex.lastIndex) {
|
|
35
|
+
regex.lastIndex++;
|
|
36
|
+
}
|
|
37
|
+
// The result can be accessed through the `m`-variable.
|
|
38
|
+
m.forEach((match, groupIndex) => {
|
|
39
|
+
if (groupIndex > 0)
|
|
40
|
+
matches.push(match);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (matches.length) {
|
|
44
|
+
const [columnAlpha, rowIndex] = matches;
|
|
45
|
+
return {
|
|
46
|
+
rowIndex: Math.min(parseInt(rowIndex), maxRow),
|
|
47
|
+
columnIndex: Math.min(alpha2number(columnAlpha), maxColumn),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Column range
|
|
51
|
+
if (/^\$?([A-Z]+)$/gim.test(address) && rowCount !== undefined) {
|
|
52
|
+
const column = getColumnNameFromAddress(address);
|
|
53
|
+
if (!column) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
rowIndex: position === "start" ? 1 : maxRow,
|
|
58
|
+
columnIndex: Math.min(alpha2number(column), maxColumn),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Row range
|
|
62
|
+
if (/^\$?(\d+)$/gim.test(address) && columnCount !== undefined) {
|
|
63
|
+
const rowIndexString = getRowIndexFromAddress(address);
|
|
64
|
+
return {
|
|
65
|
+
rowIndex: Math.min(Number(rowIndexString), maxRow),
|
|
66
|
+
columnIndex: position === "start" ? 1 : maxColumn,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Gets column from address $G => G
|
|
73
|
+
* @param address
|
|
74
|
+
*/
|
|
75
|
+
export const getColumnNameFromAddress = (address) => {
|
|
76
|
+
return /^\$?([A-Z]+)$/gim.exec(address)?.[1];
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Gets rowIndex from address $1 => 1
|
|
80
|
+
* @param address
|
|
81
|
+
*/
|
|
82
|
+
export const getRowIndexFromAddress = (address) => {
|
|
83
|
+
return /^\$?(\d+)$/gim.exec(address)?.[1];
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Convert cellInterface to address string
|
|
87
|
+
* @param cell
|
|
88
|
+
*/
|
|
89
|
+
export const cellToAddress = (cell, isAbsoluteColumn = false, isAbsoluteRow = false, isFullColumn = false, isFullRow = false) => {
|
|
90
|
+
if (!cell)
|
|
91
|
+
return null;
|
|
92
|
+
if (cell.columnIndex <= 0) {
|
|
93
|
+
// return null;
|
|
94
|
+
}
|
|
95
|
+
let columnAlpha = number2Alpha(Math.max(0, cell.columnIndex - 1));
|
|
96
|
+
let rowNumber = Math.max(0, cell.rowIndex);
|
|
97
|
+
if (isFullColumn) {
|
|
98
|
+
return columnAlpha;
|
|
99
|
+
}
|
|
100
|
+
if (isFullRow) {
|
|
101
|
+
return String(rowNumber);
|
|
102
|
+
}
|
|
103
|
+
return `${isAbsoluteColumn ? "$" : ""}${columnAlpha}${isAbsoluteRow ? "$" : ""}${rowNumber}`;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Convert a cell range to address
|
|
107
|
+
* @param sheetName
|
|
108
|
+
* @param range
|
|
109
|
+
* @returns
|
|
110
|
+
*/
|
|
111
|
+
export const cellRangeToAddress = (sheetName, range) => {
|
|
112
|
+
const sheetNameStr = sheetName ? sanitizeSheetName(sheetName) + "!" : "";
|
|
113
|
+
return `${sheetNameStr}${cellToAddress({
|
|
114
|
+
rowIndex: range.startRowIndex,
|
|
115
|
+
columnIndex: range.startColumnIndex,
|
|
116
|
+
})}:${cellToAddress({
|
|
117
|
+
rowIndex: range.endRowIndex,
|
|
118
|
+
columnIndex: range.endColumnIndex,
|
|
119
|
+
})}`;
|
|
120
|
+
};
|
|
121
|
+
/* Sanitize sheet names */
|
|
122
|
+
export const sanitizeSheetName = (name) => {
|
|
123
|
+
if (name === void 0)
|
|
124
|
+
return void 0;
|
|
125
|
+
if (typeof name === "number")
|
|
126
|
+
return name;
|
|
127
|
+
if (/\s+|[^a-z|A-Z|0-9]/.test(name)) {
|
|
128
|
+
// Escape single quotes by doubling them for valid sheet references.
|
|
129
|
+
const escaped = name.replace(/'/g, "''");
|
|
130
|
+
return `'${escaped}'`;
|
|
131
|
+
}
|
|
132
|
+
return name;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* Remove single quotes from sheetname
|
|
136
|
+
* 'Sheet Space!A4' => Sheet Space
|
|
137
|
+
* @param name
|
|
138
|
+
* @returns
|
|
139
|
+
*/
|
|
140
|
+
export const desanitizeSheetName = (name) => {
|
|
141
|
+
if (isNil(name)) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
if (typeof name === "number") {
|
|
145
|
+
return name;
|
|
146
|
+
}
|
|
147
|
+
let result = name;
|
|
148
|
+
const hasTrailingBang = result.endsWith("!");
|
|
149
|
+
if (hasTrailingBang) {
|
|
150
|
+
result = result.slice(0, -1);
|
|
151
|
+
}
|
|
152
|
+
if (result.startsWith("'") && result.endsWith("'")) {
|
|
153
|
+
result = result.slice(1, -1).replace(/''/g, "'");
|
|
154
|
+
}
|
|
155
|
+
return hasTrailingBang ? `${result}!` : result;
|
|
156
|
+
};
|
|
157
|
+
// Special character
|
|
158
|
+
const SPECIAL_CHARACTERS = /([\\^$.*+?()[\]{}|])/gm;
|
|
159
|
+
/**
|
|
160
|
+
* Escape special characters
|
|
161
|
+
* @param str
|
|
162
|
+
* @returns
|
|
163
|
+
*/
|
|
164
|
+
export const escapeCharacters = (str) => {
|
|
165
|
+
return SPECIAL_CHARACTERS.test(str)
|
|
166
|
+
? str.replace(SPECIAL_CHARACTERS, "\\$1")
|
|
167
|
+
: str || "";
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* Get selection from start and end cell
|
|
171
|
+
* @param start
|
|
172
|
+
* @param end
|
|
173
|
+
* @param sheetName
|
|
174
|
+
* @returns
|
|
175
|
+
*/
|
|
176
|
+
export const selectionBoundsFromCells = (start, end = start) => {
|
|
177
|
+
if (!end)
|
|
178
|
+
end = start;
|
|
179
|
+
return {
|
|
180
|
+
startRowIndex: Math.min(start.rowIndex, end.rowIndex),
|
|
181
|
+
startColumnIndex: Math.min(start.columnIndex, end.columnIndex),
|
|
182
|
+
endColumnIndex: Math.max(start.columnIndex, end.columnIndex),
|
|
183
|
+
endRowIndex: Math.max(start.rowIndex, end.rowIndex),
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
export const supplant = (s, o) => {
|
|
187
|
+
return s.replace(/{([^{}]*)}/g, (a, b) => {
|
|
188
|
+
const r = o[b];
|
|
189
|
+
return typeof r === "string" ? r : a;
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
// RFC 3986 scheme: ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) ":"
|
|
193
|
+
const URL_SCHEME = /^[a-zA-Z][a-zA-Z0-9+.-]*:/;
|
|
194
|
+
/**
|
|
195
|
+
* Normalize an external hyperlink target for the browser. A stored URL
|
|
196
|
+
* without a scheme ("paradigm.xyz") would otherwise be resolved relative to
|
|
197
|
+
* the current page. Prefixes https:// unless the URL already has a scheme
|
|
198
|
+
* (https:, mailto:, tel:, …), is protocol-relative ("//host"), or is a
|
|
199
|
+
* fragment/path reference.
|
|
200
|
+
* @param url
|
|
201
|
+
* @returns
|
|
202
|
+
*/
|
|
203
|
+
export const normalizeExternalUrl = (url) => {
|
|
204
|
+
const trimmed = url.trim();
|
|
205
|
+
if (!trimmed ||
|
|
206
|
+
URL_SCHEME.test(trimmed) ||
|
|
207
|
+
trimmed.startsWith("//") ||
|
|
208
|
+
trimmed.startsWith("#") ||
|
|
209
|
+
trimmed.startsWith("/")) {
|
|
210
|
+
return trimmed;
|
|
211
|
+
}
|
|
212
|
+
return `https://${trimmed}`;
|
|
213
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Table styles and banded range utilities
|
|
3
|
+
* Shared between toolkit (import) and app (rendering)
|
|
4
|
+
*/
|
|
5
|
+
import type { ColorIndex } from "@rowsncolumns/common-types";
|
|
6
|
+
export type Maybe<T> = T | null | undefined;
|
|
7
|
+
export type ColorTheme = {
|
|
8
|
+
theme: ColorIndex;
|
|
9
|
+
tint?: Maybe<number>;
|
|
10
|
+
};
|
|
11
|
+
export type Color = string | ColorTheme;
|
|
12
|
+
export type BorderStyle = "dotted" | "dashed" | "solid" | "thin" | "solid_medium" | "solid_thick" | "double";
|
|
13
|
+
export type Border = {
|
|
14
|
+
style: BorderStyle;
|
|
15
|
+
width: number;
|
|
16
|
+
color?: Maybe<Color>;
|
|
17
|
+
};
|
|
18
|
+
export type Borders = {
|
|
19
|
+
top?: Maybe<Border>;
|
|
20
|
+
bottom?: Maybe<Border>;
|
|
21
|
+
left?: Maybe<Border>;
|
|
22
|
+
right?: Maybe<Border>;
|
|
23
|
+
};
|
|
24
|
+
export type BandingProperties = {
|
|
25
|
+
headerColor?: Maybe<Color>;
|
|
26
|
+
footerColor?: Maybe<Color>;
|
|
27
|
+
firstBandColor?: Maybe<Color>;
|
|
28
|
+
secondBandColor?: Maybe<Color>;
|
|
29
|
+
headerBorder?: Maybe<Borders>;
|
|
30
|
+
footerBorder?: Maybe<Borders>;
|
|
31
|
+
firstBandBorder?: Maybe<Borders>;
|
|
32
|
+
secondBandBorder?: Maybe<Borders>;
|
|
33
|
+
totalRowColor?: Maybe<Color>;
|
|
34
|
+
totalRowBorder?: Maybe<Borders>;
|
|
35
|
+
};
|
|
36
|
+
export type BandedDefinition = {
|
|
37
|
+
rowProperties?: Maybe<BandingProperties>;
|
|
38
|
+
columnProperties?: Maybe<BandingProperties>;
|
|
39
|
+
};
|
|
40
|
+
export type TableTheme = "None" | "TableStyleLight1" | "TableStyleLight2" | "TableStyleLight3" | "TableStyleLight4" | "TableStyleLight5" | "TableStyleLight6" | "TableStyleLight7" | "TableStyleLight8" | "TableStyleLight9" | "TableStyleLight10" | "TableStyleLight11" | "TableStyleLight12" | "TableStyleLight13" | "TableStyleLight14" | "TableStyleLight15" | "TableStyleLight16" | "TableStyleLight17" | "TableStyleLight18" | "TableStyleLight19" | "TableStyleLight20" | "TableStyleLight21" | "TableStyleMedium1" | "TableStyleMedium2" | "TableStyleMedium3" | "TableStyleMedium4" | "TableStyleMedium5" | "TableStyleMedium6" | "TableStyleMedium7" | "TableStyleMedium8" | "TableStyleMedium9" | "TableStyleMedium10" | "TableStyleMedium11" | "TableStyleMedium12" | "TableStyleMedium13" | "TableStyleMedium14" | "TableStyleMedium15" | "TableStyleMedium16" | "TableStyleMedium17" | "TableStyleMedium18" | "TableStyleMedium19" | "TableStyleMedium20" | "TableStyleMedium21" | "TableStyleMedium22" | "TableStyleMedium23" | "TableStyleMedium24" | "TableStyleMedium25" | "TableStyleMedium26" | "TableStyleMedium27" | "TableStyleMedium28" | "TableStyleDark1" | "TableStyleDark2" | "TableStyleDark3" | "TableStyleDark4" | "TableStyleDark5" | "TableStyleDark6" | "TableStyleDark7" | "TableStyleDark8" | "TableStyleDark9" | "TableStyleDark10" | "TableStyleDark11";
|
|
41
|
+
type TableStyleEntry = [
|
|
42
|
+
theme: TableTheme,
|
|
43
|
+
firstBandStripeTint: number | undefined,
|
|
44
|
+
secondBandTint: number | undefined,
|
|
45
|
+
bandDefinition: BandedDefinition | undefined
|
|
46
|
+
];
|
|
47
|
+
/**
|
|
48
|
+
* Get table border styles map with all table themes and their banded definitions
|
|
49
|
+
*/
|
|
50
|
+
export declare const getTableBorderStyles: (showRowStripes: boolean | undefined, showColumnStripes: boolean | undefined) => Map<string, TableStyleEntry[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Find the banded definition for a given table theme
|
|
53
|
+
*/
|
|
54
|
+
export declare const findMatchingBandProperty: (tableTheme: TableTheme, showRowStripes: boolean | undefined, showColumnStripes: boolean | undefined) => BandedDefinition | undefined;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=table-styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-styles.d.ts","sourceRoot":"","sources":["../../table-styles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;AAG5C,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,UAAU,CAAC;AAExC,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,MAAM,GACN,cAAc,GACd,aAAa,GACb,QAAQ,CAAC;AAGb,MAAM,MAAM,MAAM,GAAG;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,WAAW,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,cAAc,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,gBAAgB,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,UAAU;IACjB,mBAAmB,EAAE,MAAM,GAAG,SAAS;IACvC,cAAc,EAAE,MAAM,GAAG,SAAS;IAClC,cAAc,EAAE,gBAAgB,GAAG,SAAS;CAC7C,CAAC;AAKF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,gBAAgB,OAAO,GAAG,SAAS,EACnC,mBAAmB,OAAO,GAAG,SAAS,KACrC,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,CAmV/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,GACnC,YAAY,UAAU,EACtB,gBAAgB,OAAO,GAAG,SAAS,EACnC,mBAAmB,OAAO,GAAG,SAAS,KACrC,gBAAgB,GAAG,SAcrB,CAAC"}
|