@rowsncolumns/utils 9.5.7 → 9.6.1

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.
@@ -39,11 +39,17 @@ export declare const getExtendedValueError: (extValue?: Record<string, any> | nu
39
39
  * state hooks' row auto-height so both agree on which cells wrap.
40
40
  */
41
41
  export declare const alignmentImpliesWrap: (align: HorizontalAlign | string | null | undefined) => boolean;
42
+ /**
43
+ * Excel's vertical `justify` and `distributed` wrap the text too: the lines
44
+ * are spread over the cell height, so there must be lines to spread.
45
+ */
46
+ export declare const verticalAlignmentImpliesWrap: (align: string | null | undefined) => boolean;
42
47
  /**
43
48
  * Whether a cell format wraps its text — explicit `wrapStrategy: "wrap"` or
44
- * an alignment that wraps implicitly ({@link alignmentImpliesWrap}).
49
+ * an alignment that wraps implicitly ({@link alignmentImpliesWrap},
50
+ * {@link verticalAlignmentImpliesWrap}).
45
51
  */
46
- export declare const cellFormatWrapsText: (format: Pick<CellFormat, "wrapStrategy" | "horizontalAlignment"> | null | undefined) => boolean;
52
+ export declare const cellFormatWrapsText: (format: Pick<CellFormat, "wrapStrategy" | "horizontalAlignment" | "verticalAlignment"> | null | undefined) => boolean;
47
53
  export declare const resolveDefaultHorizontalAlignment: ({ errorValue, userEnteredValue, effectiveValue, dataValidation, }: {
48
54
  errorValue: unknown;
49
55
  userEnteredValue: Record<string, any> | null | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"cell-data-helpers.d.ts","sourceRoot":"","sources":["../../cell-data-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,cAAc,EACf,MAAM,4BAA4B,CAAC;AAEpC,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,QAAQ,EACxD,OAAO,CAAC,GAAG,IAAI,KACd,CAAC,CAAC,IAAI,CAER,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,QAAQ,EACtD,OAAO,CAAC,GAAG,IAAI,KACd,CAAC,CAAC,IAAI,CAER,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,QAAQ,EACzD,OAAO,CAAC,GAAG,IAAI,KACd,CAAC,CAAC,IAAI,CAER,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,QAAQ,EACvD,OAAO,CAAC,GAAG,IAAI,KACd,UAAU,GAAG,cAAc,GAAG,IAAI,GAAG,SAEvC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,QAAQ,EACtD,OAAO,CAAC,GAAG,IAAI,KACd,MAAM,GAAG,SAAS,GAAG,IAEvB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,MAE1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,MAAM,GAAG,SAEX,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,MAAM,GAAG,SAEX,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,OAAO,GAAG,SAEZ,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,MAAM,GAAG,SAEX,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,GAAG,GAAG,SAER,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KACjD,OAAyD,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,QACI,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,qBAAqB,CAAC,GACxD,IAAI,GACJ,SAAS,KACZ,OAEgD,CAAC;AAEpD,eAAO,MAAM,iCAAiC,GAAI,mEAK/C;IACD,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACzD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1E,KAAG,eAAe,GAAG,SASrB,CAAC"}
1
+ {"version":3,"file":"cell-data-helpers.d.ts","sourceRoot":"","sources":["../../cell-data-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,cAAc,EACf,MAAM,4BAA4B,CAAC;AAEpC,eAAO,MAAM,uBAAuB,GAAI,CAAC,SAAS,QAAQ,EACxD,OAAO,CAAC,GAAG,IAAI,KACd,CAAC,CAAC,IAAI,CAER,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,QAAQ,EACtD,OAAO,CAAC,GAAG,IAAI,KACd,CAAC,CAAC,IAAI,CAER,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,CAAC,SAAS,QAAQ,EACzD,OAAO,CAAC,GAAG,IAAI,KACd,CAAC,CAAC,IAAI,CAER,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,QAAQ,EACvD,OAAO,CAAC,GAAG,IAAI,KACd,UAAU,GAAG,cAAc,GAAG,IAAI,GAAG,SAEvC,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,QAAQ,EACtD,OAAO,CAAC,GAAG,IAAI,KACd,MAAM,GAAG,SAAS,GAAG,IAEvB,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAG,MAE1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,MAAM,GAAG,SAEX,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,MAAM,GAAG,SAEX,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,OAAO,GAAG,SAEZ,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,MAAM,GAAG,SAEX,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,KACpC,GAAG,GAAG,SAER,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KACjD,OAAyD,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,4BAA4B,GACvC,OAAO,MAAM,GAAG,IAAI,GAAG,SAAS,KAC/B,OAAyD,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAC9B,QACI,IAAI,CACF,UAAU,EACV,cAAc,GAAG,qBAAqB,GAAG,mBAAmB,CAC7D,GACD,IAAI,GACJ,SAAS,KACZ,OAGsD,CAAC;AAE1D,eAAO,MAAM,iCAAiC,GAAI,mEAK/C;IACD,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACzD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CAC1E,KAAG,eAAe,GAAG,SASrB,CAAC"}
@@ -6,7 +6,7 @@
6
6
  * Note: These functions use generic types to avoid circular dependencies
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.resolveDefaultHorizontalAlignment = exports.cellFormatWrapsText = exports.alignmentImpliesWrap = exports.getExtendedValueError = exports.getExtendedValueFormula = exports.getExtendedValueBool = exports.getExtendedValueString = exports.getExtendedValueNumber = exports.getStyleId = exports.getCellFormattedValue = exports.getCellEffectiveFormat = exports.getCellUserEnteredFormat = exports.getCellEffectiveValue = exports.getCellUserEnteredValue = void 0;
9
+ exports.resolveDefaultHorizontalAlignment = exports.cellFormatWrapsText = exports.verticalAlignmentImpliesWrap = exports.alignmentImpliesWrap = exports.getExtendedValueError = exports.getExtendedValueFormula = exports.getExtendedValueBool = exports.getExtendedValueString = exports.getExtendedValueNumber = exports.getStyleId = exports.getCellFormattedValue = exports.getCellEffectiveFormat = exports.getCellUserEnteredFormat = exports.getCellEffectiveValue = exports.getCellUserEnteredValue = void 0;
10
10
  var getCellUserEnteredValue = function (cell) {
11
11
  var _a;
12
12
  return (_a = cell === null || cell === void 0 ? void 0 : cell.ue) !== null && _a !== void 0 ? _a : cell === null || cell === void 0 ? void 0 : cell.userEnteredValue;
@@ -86,13 +86,21 @@ exports.getExtendedValueError = getExtendedValueError;
86
86
  */
87
87
  var alignmentImpliesWrap = function (align) { return align === "justify" || align === "distributed"; };
88
88
  exports.alignmentImpliesWrap = alignmentImpliesWrap;
89
+ /**
90
+ * Excel's vertical `justify` and `distributed` wrap the text too: the lines
91
+ * are spread over the cell height, so there must be lines to spread.
92
+ */
93
+ var verticalAlignmentImpliesWrap = function (align) { return align === "justify" || align === "distributed"; };
94
+ exports.verticalAlignmentImpliesWrap = verticalAlignmentImpliesWrap;
89
95
  /**
90
96
  * Whether a cell format wraps its text — explicit `wrapStrategy: "wrap"` or
91
- * an alignment that wraps implicitly ({@link alignmentImpliesWrap}).
97
+ * an alignment that wraps implicitly ({@link alignmentImpliesWrap},
98
+ * {@link verticalAlignmentImpliesWrap}).
92
99
  */
93
100
  var cellFormatWrapsText = function (format) {
94
101
  return (format === null || format === void 0 ? void 0 : format.wrapStrategy) === "wrap" ||
95
- (0, exports.alignmentImpliesWrap)(format === null || format === void 0 ? void 0 : format.horizontalAlignment);
102
+ (0, exports.alignmentImpliesWrap)(format === null || format === void 0 ? void 0 : format.horizontalAlignment) ||
103
+ (0, exports.verticalAlignmentImpliesWrap)(format === null || format === void 0 ? void 0 : format.verticalAlignment);
96
104
  };
97
105
  exports.cellFormatWrapsText = cellFormatWrapsText;
98
106
  var resolveDefaultHorizontalAlignment = function (_a) {
@@ -0,0 +1,11 @@
1
+ export type CjkLang = "ja" | "zh-Hans" | "zh-Hant" | "ko";
2
+ export interface CjkPreparedFormat {
3
+ /** The rewritten code for the base formatter. */
4
+ code: string;
5
+ /** Converts the rendered text's digits into the `[DBNumN]` numeral system, if any. */
6
+ finish: (out: string) => string;
7
+ }
8
+ export declare const prepareCjkNumberFormat: (code: string, value: number, workbookLocale?: string) => CjkPreparedFormat | undefined;
9
+ /** Language of an LCID (hex, low 16 bits) or a BCP-47 tag, for the CJK locales. */
10
+ export declare const cjkLangOfTag: (input: string) => CjkLang | undefined;
11
+ //# sourceMappingURL=cjk-number-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cjk-number-format.d.ts","sourceRoot":"","sources":["../../cjk-number-format.ts"],"names":[],"mappings":"AAuBA,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;AAS1D,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACjC;AAgBD,eAAO,MAAM,sBAAsB,GACjC,MAAM,MAAM,EACZ,OAAO,MAAM,EACb,iBAAiB,MAAM,KACtB,iBAAiB,GAAG,SAsEtB,CAAC;AAqLF,mFAAmF;AACnF,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OAAO,GAAG,SA8BtD,CAAC"}
@@ -0,0 +1,533 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cjkLangOfTag = exports.prepareCjkNumberFormat = void 0;
4
+ var tslib_1 = require("tslib");
5
+ /**
6
+ * East Asian number-format tokens `numfmt` does not render: the `[DBNum1]`–`[DBNum4]` numeral
7
+ * systems, the Japanese emperor-era tokens (`g`/`gg`/`ggg`, and `e`/`ee` under a Japanese locale)
8
+ * and the `aaa`/`aaaa` weekday tokens. TypeScript twin of the engine's Rust
9
+ * `rnc-cellmodel/src/cjk_format.rs` — keep the two in step.
10
+ *
11
+ * {@link prepareCjkNumberFormat} rewrites a format code so the base formatter can render it (era
12
+ * names, era years and weekday names become quoted literals computed from the date serial,
13
+ * `[DBNumN]` is removed, and under `[DBNumN]` a date's year becomes a quoted literal in that numeral
14
+ * system); `finish` then turns the remaining ASCII digits into the numeral system:
15
+ *
16
+ * - `General` and date fields read as a number with units (`123` → `百二十三`, `15日` → `十五日`);
17
+ * - digit placeholders (`0`, `#`) and years read digit by digit (`[DBNum1]0` → `一二三`).
18
+ *
19
+ * The language comes from the code's `[$-LCID]` / `[$-tag]` token, then the workbook locale, and
20
+ * defaults to Japanese.
21
+ */
22
+ var excel_number_format_1 = require("./excel-number-format");
23
+ var DBNUM_TOKEN = /^\[dbnum([1-4])\]$/i;
24
+ /** Cheap pre-filter: a `DBNum` token, a `g` (era name or `General`), `aaa`, or an `e` beside a locale token. */
25
+ var mightContainTokens = function (code) {
26
+ return /[gG]|dbnum|aaa/i.test(code) || (/[eE]/.test(code) && code.includes("[$"));
27
+ };
28
+ var prepareCjkNumberFormat = function (code, value, workbookLocale) {
29
+ var e_1, _a;
30
+ var _b;
31
+ if (!mightContainTokens(code))
32
+ return undefined;
33
+ var tag = localeTag(code);
34
+ var tagLang = tag ? (0, exports.cjkLangOfTag)(tag) : undefined;
35
+ var lang = (_b = tagLang !== null && tagLang !== void 0 ? tagLang : (workbookLocale ? (0, exports.cjkLangOfTag)(workbookLocale) : undefined)) !== null && _b !== void 0 ? _b : "ja";
36
+ var gannen = !!tag && tag.toLowerCase().includes("-x-gannen");
37
+ var date = serialToDate(value);
38
+ var sections = (0, excel_number_format_1.splitFormatSections)(code);
39
+ var rewritten = [];
40
+ var levels = [];
41
+ var dated = [];
42
+ var changed = false;
43
+ try {
44
+ for (var sections_1 = tslib_1.__values(sections), sections_1_1 = sections_1.next(); !sections_1_1.done; sections_1_1 = sections_1.next()) {
45
+ var section = sections_1_1.value;
46
+ var level_1 = dbnumLevel(section);
47
+ var result = rewriteSection(section, {
48
+ dbnum: level_1 === undefined ? undefined : { level: level_1, lang: lang },
49
+ weekdayLang: lang,
50
+ eraYears: tagLang === "ja" || hasEraNameToken(section),
51
+ gannen: gannen,
52
+ date: date,
53
+ });
54
+ changed || (changed = result.changed || level_1 !== undefined);
55
+ rewritten.push(result.text);
56
+ levels.push(level_1);
57
+ dated.push(result.dateToken);
58
+ }
59
+ }
60
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
61
+ finally {
62
+ try {
63
+ if (sections_1_1 && !sections_1_1.done && (_a = sections_1.return)) _a.call(sections_1);
64
+ }
65
+ finally { if (e_1) throw e_1.error; }
66
+ }
67
+ if (!changed)
68
+ return undefined;
69
+ var anyCondition = sections.some(function (s) { return (0, excel_number_format_1.analyzeFormatSection)(s).hasCondition; });
70
+ var index = anyCondition
71
+ ? 0
72
+ : Math.min((0, excel_number_format_1.pickNumberSection)(sections.length, value).index, sections.length - 1);
73
+ var level = levels[index];
74
+ var dbnum = level !== undefined && (level <= 3 || (level === 4 && lang === "ko"))
75
+ ? { level: level, lang: lang }
76
+ : undefined;
77
+ var mode;
78
+ if (dated[index]) {
79
+ mode = "date";
80
+ }
81
+ else {
82
+ switch ((0, excel_number_format_1.analyzeFormatSection)(stripDbNum(sections[index])).kind) {
83
+ case "general":
84
+ mode = "general";
85
+ break;
86
+ case "date":
87
+ mode = "date";
88
+ break;
89
+ case "number":
90
+ case "other":
91
+ mode = "digits";
92
+ break;
93
+ default:
94
+ mode = "unchanged";
95
+ }
96
+ }
97
+ return {
98
+ code: rewritten.join(";"),
99
+ finish: function (out) {
100
+ return dbnum && mode !== "unchanged" ? convertDigits(out, dbnum, mode) : out;
101
+ },
102
+ };
103
+ };
104
+ exports.prepareCjkNumberFormat = prepareCjkNumberFormat;
105
+ var runLength = function (chars, from, letter) {
106
+ var n = 0;
107
+ while (from + n < chars.length && chars[from + n].toLowerCase() === letter)
108
+ n += 1;
109
+ return n;
110
+ };
111
+ var startsWithCi = function (chars, from, word) {
112
+ return chars
113
+ .slice(from, from + word.length)
114
+ .join("")
115
+ .toLowerCase() === word;
116
+ };
117
+ var quote = function (text) { return "\"".concat(text, "\""); };
118
+ var rewriteSection = function (section, ctx) {
119
+ var chars = Array.from(section);
120
+ var out = "";
121
+ var changed = false;
122
+ var dateToken = false;
123
+ var i = 0;
124
+ while (i < chars.length) {
125
+ var c = chars[i];
126
+ var lower = c.toLowerCase();
127
+ if (c === '"') {
128
+ var close_1 = chars.indexOf('"', i + 1);
129
+ var end = close_1 === -1 ? chars.length : close_1 + 1;
130
+ out += chars.slice(i, end).join("");
131
+ i = end;
132
+ }
133
+ else if (c === "\\" || c === "_" || c === "*") {
134
+ out += chars.slice(i, i + 2).join("");
135
+ i += 2;
136
+ }
137
+ else if (c === "[") {
138
+ var close_2 = chars.indexOf("]", i);
139
+ var end = close_2 === -1 ? chars.length : close_2 + 1;
140
+ var token = chars.slice(i, end).join("");
141
+ if (DBNUM_TOKEN.test(token))
142
+ changed = true;
143
+ else
144
+ out += token;
145
+ i = end;
146
+ }
147
+ else if (lower === "g" && startsWithCi(chars, i, "general")) {
148
+ out += chars.slice(i, i + 7).join("");
149
+ i += 7;
150
+ }
151
+ else if (lower === "g") {
152
+ var run = runLength(chars, i, "g");
153
+ if (ctx.date) {
154
+ var era = eraOf(ctx.date);
155
+ out += quote(run === 1 ? era.letter : run === 2 ? era.short : era.name);
156
+ }
157
+ changed = true;
158
+ dateToken = true;
159
+ i += run;
160
+ }
161
+ else if (lower === "e" && chars[i + 1] !== "+" && chars[i + 1] !== "-") {
162
+ var run = runLength(chars, i, "e");
163
+ if (ctx.date && ctx.eraYears) {
164
+ var eraYear = ctx.date.year - eraOf(ctx.date).start[0] + 1;
165
+ var text = eraYear === 1 && ctx.gannen
166
+ ? "元"
167
+ : run >= 2
168
+ ? String(eraYear).padStart(2, "0")
169
+ : String(eraYear);
170
+ out += quote(text);
171
+ changed = true;
172
+ dateToken = true;
173
+ }
174
+ else if (ctx.date && ctx.dbnum) {
175
+ out += quote(perDigit(String(ctx.date.year), ctx.dbnum));
176
+ changed = true;
177
+ dateToken = true;
178
+ }
179
+ else {
180
+ out += chars.slice(i, i + run).join("");
181
+ }
182
+ i += run;
183
+ }
184
+ else if (lower === "a" && startsWithCi(chars, i, "am/pm")) {
185
+ out += chars.slice(i, i + 5).join("");
186
+ i += 5;
187
+ }
188
+ else if (lower === "a" && startsWithCi(chars, i, "a/p")) {
189
+ out += chars.slice(i, i + 3).join("");
190
+ i += 3;
191
+ }
192
+ else if (lower === "a" && runLength(chars, i, "a") >= 3) {
193
+ var run = runLength(chars, i, "a");
194
+ if (ctx.date)
195
+ out += quote(weekdayName(ctx.weekdayLang, ctx.date.weekday, run >= 4));
196
+ changed = true;
197
+ dateToken = true;
198
+ i += run;
199
+ }
200
+ else if (lower === "y" && ctx.dbnum && ctx.date) {
201
+ var run = runLength(chars, i, "y");
202
+ var digits = run <= 2
203
+ ? String(ctx.date.year % 100).padStart(2, "0")
204
+ : String(ctx.date.year);
205
+ out += quote(perDigit(digits, ctx.dbnum));
206
+ changed = true;
207
+ dateToken = true;
208
+ i += run;
209
+ }
210
+ else {
211
+ out += c;
212
+ i += 1;
213
+ }
214
+ }
215
+ return { text: out, changed: changed, dateToken: dateToken };
216
+ };
217
+ /** `[...]` tokens outside quoted literals and escapes. */
218
+ var bracketTokens = function (section) {
219
+ var tokens = [];
220
+ var inQuotes = false;
221
+ for (var i = 0; i < section.length; i += 1) {
222
+ var c = section[i];
223
+ if (c === '"')
224
+ inQuotes = !inQuotes;
225
+ else if (!inQuotes && (c === "\\" || c === "_" || c === "*"))
226
+ i += 1;
227
+ else if (!inQuotes && c === "[") {
228
+ var end = section.indexOf("]", i);
229
+ if (end !== -1) {
230
+ tokens.push(section.slice(i, end + 1));
231
+ i = end;
232
+ }
233
+ }
234
+ }
235
+ return tokens;
236
+ };
237
+ var dbnumLevel = function (section) {
238
+ var e_2, _a;
239
+ try {
240
+ for (var _b = tslib_1.__values(bracketTokens(section)), _c = _b.next(); !_c.done; _c = _b.next()) {
241
+ var token = _c.value;
242
+ var m = DBNUM_TOKEN.exec(token);
243
+ if (m)
244
+ return Number(m[1]);
245
+ }
246
+ }
247
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
248
+ finally {
249
+ try {
250
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
251
+ }
252
+ finally { if (e_2) throw e_2.error; }
253
+ }
254
+ return undefined;
255
+ };
256
+ var stripDbNum = function (section) {
257
+ return bracketTokens(section)
258
+ .filter(function (t) { return DBNUM_TOKEN.test(t); })
259
+ .reduce(function (s, t) { return s.replace(t, ""); }, section);
260
+ };
261
+ /** Whether a section names an era (`g`) outside quotes, brackets and `General`. */
262
+ var hasEraNameToken = function (section) {
263
+ var inQuotes = false;
264
+ var inBrackets = false;
265
+ for (var i = 0; i < section.length; i += 1) {
266
+ var c = section[i];
267
+ if (inQuotes)
268
+ inQuotes = c !== '"';
269
+ else if (inBrackets)
270
+ inBrackets = c !== "]";
271
+ else if (c === '"')
272
+ inQuotes = true;
273
+ else if (c === "[")
274
+ inBrackets = true;
275
+ else if (c === "\\" || c === "_" || c === "*")
276
+ i += 1;
277
+ else if (c.toLowerCase() === "g") {
278
+ if (section.slice(i, i + 7).toLowerCase() === "general")
279
+ i += 6;
280
+ else
281
+ return true;
282
+ }
283
+ }
284
+ return false;
285
+ };
286
+ /** The locale spec of the code's first `[$…-spec]` token (`411`, `ja-JP`, `ja-JP-x-gannen`). */
287
+ var localeTag = function (code) {
288
+ var start = code.indexOf("[$");
289
+ if (start === -1)
290
+ return undefined;
291
+ var end = code.indexOf("]", start);
292
+ if (end === -1)
293
+ return undefined;
294
+ var inner = code.slice(start + 2, end);
295
+ var dash = inner.indexOf("-");
296
+ if (dash === -1)
297
+ return undefined;
298
+ var spec = inner.slice(dash + 1);
299
+ return spec || undefined;
300
+ };
301
+ /** Language of an LCID (hex, low 16 bits) or a BCP-47 tag, for the CJK locales. */
302
+ var cjkLangOfTag = function (input) {
303
+ var spec = input.split(",")[0].trim();
304
+ if (/^[0-9a-f]+$/i.test(spec)) {
305
+ switch (parseInt(spec, 16) & 0xffff) {
306
+ case 0x0411:
307
+ return "ja";
308
+ case 0x0804:
309
+ case 0x1004:
310
+ return "zh-Hans";
311
+ case 0x0404:
312
+ case 0x0c04:
313
+ case 0x1404:
314
+ return "zh-Hant";
315
+ case 0x0412:
316
+ return "ko";
317
+ default:
318
+ return undefined;
319
+ }
320
+ }
321
+ var _a = tslib_1.__read(spec.toLowerCase().split(/[-_]/)), primary = _a[0], rest = _a.slice(1);
322
+ if (primary === "ja")
323
+ return "ja";
324
+ if (primary === "ko")
325
+ return "ko";
326
+ if (primary === "zh") {
327
+ return rest.some(function (p) { return p === "hant" || p === "tw" || p === "hk" || p === "mo"; })
328
+ ? "zh-Hant"
329
+ : "zh-Hans";
330
+ }
331
+ return undefined;
332
+ };
333
+ exports.cjkLangOfTag = cjkLangOfTag;
334
+ // ---- dates ------------------------------------------------------------------------------------
335
+ /**
336
+ * Excel 1900-system serial → calendar date, keeping Excel's fictitious 1900-02-29 (serial 60)
337
+ * and its weekday numbering (serial 1 is a Sunday). The time of day rounds to the nearest second.
338
+ */
339
+ var serialToDate = function (value) {
340
+ if (!Number.isFinite(value) || value < 0 || value >= 2958466)
341
+ return undefined;
342
+ var days = Math.floor(Math.round(value * 86400) / 86400);
343
+ var weekday = (days + 6) % 7;
344
+ if (days === 60)
345
+ return { year: 1900, month: 2, day: 29, weekday: weekday };
346
+ var offset = days < 60 ? days : days - 1;
347
+ var d = new Date(Date.UTC(1899, 11, 31) + offset * 86400000);
348
+ return {
349
+ year: d.getUTCFullYear(),
350
+ month: d.getUTCMonth() + 1,
351
+ day: d.getUTCDate(),
352
+ weekday: weekday,
353
+ };
354
+ };
355
+ /** Japanese eras with the start dates Windows' Japanese calendar (and so Excel) uses. */
356
+ var ERAS = [
357
+ { start: [1868, 1, 1], letter: "M", short: "明", name: "明治" },
358
+ { start: [1912, 7, 30], letter: "T", short: "大", name: "大正" },
359
+ { start: [1926, 12, 25], letter: "S", short: "昭", name: "昭和" },
360
+ { start: [1989, 1, 8], letter: "H", short: "平", name: "平成" },
361
+ { start: [2019, 5, 1], letter: "R", short: "令", name: "令和" },
362
+ ];
363
+ var eraOf = function (date) {
364
+ var key = date.year * 10000 + date.month * 100 + date.day;
365
+ for (var i = ERAS.length - 1; i >= 0; i -= 1) {
366
+ var _a = tslib_1.__read(ERAS[i].start, 3), y = _a[0], m = _a[1], d = _a[2];
367
+ if (key >= y * 10000 + m * 100 + d)
368
+ return ERAS[i];
369
+ }
370
+ return ERAS[0];
371
+ };
372
+ var weekdayName = function (lang, weekday, long) {
373
+ var w = weekday % 7;
374
+ switch (lang) {
375
+ case "ja": {
376
+ var short = "日月火水木金土"[w];
377
+ return long ? "".concat(short, "\u66DC\u65E5") : short;
378
+ }
379
+ case "ko": {
380
+ var short = "일월화수목금토"[w];
381
+ return long ? "".concat(short, "\uC694\uC77C") : short;
382
+ }
383
+ default: {
384
+ var short = "日一二三四五六"[w];
385
+ return long ? "\u661F\u671F".concat(short) : short;
386
+ }
387
+ }
388
+ };
389
+ var KANJI = Array.from("〇一二三四五六七八九");
390
+ var FULL_WIDTH = Array.from("0123456789");
391
+ var BIG_HANS = ["万", "亿", "兆"];
392
+ var BIG_TRAD = ["萬", "億", "兆"];
393
+ var BIG_JA = ["万", "億", "兆"];
394
+ var numerals = function (_a) {
395
+ var level = _a.level, lang = _a.lang;
396
+ var zh = lang === "zh-Hans" || lang === "zh-Hant";
397
+ var level1Big = lang === "ja" ? BIG_JA : lang === "zh-Hans" ? BIG_HANS : BIG_TRAD;
398
+ if (level === 2) {
399
+ switch (lang) {
400
+ case "ja":
401
+ return {
402
+ digits: Array.from("〇壱弐参四伍六七八九"),
403
+ small: ["拾", "百", "阡"],
404
+ big: BIG_TRAD,
405
+ omitOne: false,
406
+ fillZero: false,
407
+ };
408
+ case "zh-Hans":
409
+ return {
410
+ digits: Array.from("零壹贰叁肆伍陆柒捌玖"),
411
+ small: ["拾", "佰", "仟"],
412
+ big: BIG_HANS,
413
+ omitOne: false,
414
+ fillZero: true,
415
+ };
416
+ case "zh-Hant":
417
+ return {
418
+ digits: Array.from("零壹貳參肆伍陸柒捌玖"),
419
+ small: ["拾", "佰", "仟"],
420
+ big: BIG_TRAD,
421
+ omitOne: false,
422
+ fillZero: true,
423
+ };
424
+ case "ko":
425
+ return {
426
+ digits: Array.from("零壹貳參四伍六七八九"),
427
+ small: ["拾", "百", "阡"],
428
+ big: BIG_TRAD,
429
+ omitOne: false,
430
+ fillZero: false,
431
+ };
432
+ }
433
+ }
434
+ if (level === 3) {
435
+ return {
436
+ digits: FULL_WIDTH,
437
+ small: ["十", "百", "千"],
438
+ big: level1Big,
439
+ omitOne: false,
440
+ fillZero: zh,
441
+ };
442
+ }
443
+ if (level === 4 && lang === "ko") {
444
+ return {
445
+ digits: Array.from("영일이삼사오육칠팔구"),
446
+ small: ["십", "백", "천"],
447
+ big: ["만", "억", "조"],
448
+ omitOne: true,
449
+ fillZero: false,
450
+ };
451
+ }
452
+ return {
453
+ digits: KANJI,
454
+ small: ["十", "百", "千"],
455
+ big: level1Big,
456
+ omitOne: !zh,
457
+ fillZero: zh,
458
+ };
459
+ };
460
+ var perDigit = function (digits, dbnum) {
461
+ var table = numerals(dbnum).digits;
462
+ return Array.from(digits)
463
+ .map(function (c) { return (c >= "0" && c <= "9" ? table[Number(c)] : c); })
464
+ .join("");
465
+ };
466
+ /** `digits` read as a number with units; past 兆 (≥ 10^16) digit by digit. */
467
+ var withUnits = function (digits, dbnum) {
468
+ var n = numerals(dbnum);
469
+ var trimmed = digits.replace(/^0+/, "");
470
+ if (!trimmed)
471
+ return n.digits[0];
472
+ if (trimmed.length > 16)
473
+ return perDigit(digits, dbnum);
474
+ var values = Array.from(trimmed, Number);
475
+ var groups = Math.ceil(values.length / 4);
476
+ var out = "";
477
+ var pendingZero = false;
478
+ var _loop_1 = function (g) {
479
+ var groupIndex = groups - 1 - g;
480
+ var end = values.length - groupIndex * 4;
481
+ var group = values.slice(Math.max(0, end - 4), end);
482
+ var wrote = false;
483
+ group.forEach(function (d, k) {
484
+ var pos = group.length - 1 - k;
485
+ if (d === 0) {
486
+ pendingZero || (pendingZero = out.length > 0 || wrote);
487
+ return;
488
+ }
489
+ if (pendingZero && n.fillZero)
490
+ out += "零";
491
+ pendingZero = false;
492
+ if (!(d === 1 && pos > 0 && n.omitOne))
493
+ out += n.digits[d];
494
+ if (pos > 0)
495
+ out += n.small[pos - 1];
496
+ wrote = true;
497
+ });
498
+ if (wrote && groupIndex > 0)
499
+ out += n.big[groupIndex - 1];
500
+ };
501
+ for (var g = 0; g < groups; g += 1) {
502
+ _loop_1(g);
503
+ }
504
+ return out;
505
+ };
506
+ var isAsciiDigit = function (c) { return !!c && c >= "0" && c <= "9"; };
507
+ var convertDigits = function (text, dbnum, mode) {
508
+ var chars = Array.from(text);
509
+ var out = "";
510
+ var i = 0;
511
+ while (i < chars.length) {
512
+ if (!isAsciiDigit(chars[i])) {
513
+ out += chars[i];
514
+ i += 1;
515
+ continue;
516
+ }
517
+ var end = i;
518
+ while (end < chars.length && isAsciiDigit(chars[end]))
519
+ end += 1;
520
+ var run = chars.slice(i, end).join("");
521
+ var fraction = i >= 2 &&
522
+ (chars[i - 1] === "." || chars[i - 1] === ",") &&
523
+ isAsciiDigit(chars[i - 2]);
524
+ var units = mode === "date"
525
+ ? dbnum.level !== 3
526
+ : mode === "general"
527
+ ? !fraction
528
+ : false;
529
+ out += units ? withUnits(run, dbnum) : perDigit(run, dbnum);
530
+ i = end;
531
+ }
532
+ return out;
533
+ };
@@ -10,6 +10,15 @@ export declare const rgbaToArgbHex: ({ r, g, b, a }: RGBA) => string;
10
10
  export declare const isSameColor: (colorA: string | undefined, colorB: string | undefined) => boolean | undefined;
11
11
  export declare const colorStringToHex: (color: string | undefined) => string | undefined;
12
12
  export declare const lightenColor: (unit: number | undefined, color: string) => string | undefined;
13
+ /**
14
+ * Excel's tint (ECMA-376 Part 1, §18.8.19 `CT_Color@tint`) — what a `{ theme, tint }` colour paints
15
+ * as. Unlike `lightenColor`, which blends each channel toward black or white, the colour moves to
16
+ * HLS and only its luminance changes: `L·(1+tint)` for a negative tint, `L·(1−tint) + tint` for a
17
+ * positive one. Hue and saturation stay, so accent1 `#4472C4` at −25 % is Excel's `#2F5597` (not
18
+ * `#335693`) and accent2 `#ED7D31` at −25 % is `#C55A11`. The engine's `rnc_model::apply_tint`
19
+ * is the same rule. Returns `#rrggbb` (as `rgbToHex`); `undefined` for a colour it cannot read.
20
+ */
21
+ export declare const applyTint: (tint: number, color: string) => string | undefined;
13
22
  export declare const hexToRgb: (hex: string) => {
14
23
  r: number;
15
24
  g: number;
@@ -1 +1 @@
1
- {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../color.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,GAAI,KAAK,MAAM,WAoCnD,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAYnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAkBzD;AAED,eAAO,MAAM,aAAa,GAAI,gBAAoB,IAAI,WAUrD,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,GAAG,SAAS,EAC1B,QAAQ,MAAM,GAAG,SAAS,wBAiB3B,CAAC;AAQF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,GAAG,SAAS,uBAczD,CAAC;AAGF,eAAO,MAAM,YAAY,GAAI,wBAAU,EAAE,OAAO,MAAM,uBAGrD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM;;;;CAOnC,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,WAGvD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAAa,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAUA,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,QAAQ,MAAM,KACb,MAUF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,SAAS,MAAM,EAAE,EAC1B,OAAO,MAAM,KACZ,MAMF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,SAAS,MAAM,EAAE,KAAG,MAAM,EAInE,CAAC;AAEJ,eAAO,MAAM,gBAAgB,GAC3B,iBAAiB,MAAM,EACvB,YAAY,MAAM,EAClB,WAAW,MAAM,uBAUlB,CAAC"}
1
+ {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../color.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,GAAI,KAAK,MAAM,WAoCnD,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAYnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAkBzD;AAED,eAAO,MAAM,aAAa,GAAI,gBAAoB,IAAI,WAUrD,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,GAAG,SAAS,EAC1B,QAAQ,MAAM,GAAG,SAAS,wBAiB3B,CAAC;AAQF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,GAAG,SAAS,uBAczD,CAAC;AAGF,eAAO,MAAM,YAAY,GAAI,wBAAU,EAAE,OAAO,MAAM,uBAGrD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,MAAM,GAAG,SAYhE,CAAC;AA8BF,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM;;;;CAOnC,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,WAGvD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,EAAE,aAAa,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAUA,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,QAAQ,MAAM,KACb,MAUF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,SAAS,MAAM,EAAE,EAC1B,OAAO,MAAM,KACZ,MAMF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,SAAS,MAAM,EAAE,KAAG,MAAM,EAInE,CAAC;AAEJ,eAAO,MAAM,gBAAgB,GAC3B,iBAAiB,MAAM,EACvB,YAAY,MAAM,EAClB,WAAW,MAAM,uBAUlB,CAAC"}