cx 24.3.8 → 24.3.10

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.
@@ -1,85 +1,92 @@
1
- import { expression } from "./Expression";
2
-
3
- import { quoteStr } from "../util/quote";
4
-
5
- function plus(str) {
6
- return str.length ? str + " + " : str;
7
- }
8
-
9
- let tplCache = {};
10
-
11
- export function stringTemplate(str) {
12
- let expr = tplCache[str];
13
- if (expr) return expr;
14
-
15
- expr = "";
16
-
17
- let termStart = -1,
18
- quoteStart = 0,
19
- term,
20
- bracketsOpen = 0,
21
- percentSign;
22
-
23
- for (let i = 0; i < str.length; i++) {
24
- let c = str[i];
25
- switch (c) {
26
- case "{":
27
- if (termStart < 0) {
28
- if (str[i + 1] == "{" && str[i - 1] != "%") {
29
- expr = plus(expr) + quoteStr(str.substring(quoteStart, i) + "{");
30
- i++;
31
- quoteStart = i + 1;
32
- } else {
33
- termStart = i + 1;
34
- percentSign = str[i - 1] == "%";
35
- if (i > quoteStart) expr = plus(expr) + quoteStr(str.substring(quoteStart, percentSign ? i - 1 : i));
36
- bracketsOpen = 1;
37
- }
38
- } else bracketsOpen++;
39
- break;
40
-
41
- case "}":
42
- if (termStart >= 0) {
43
- if (--bracketsOpen == 0) {
44
- term = str.substring(termStart, i);
45
- if (term.indexOf(":") == -1) {
46
- let nullSepIndex = term.indexOf("|");
47
- if (nullSepIndex == -1) term += ":s";
48
- else term = term.substring(0, nullSepIndex) + ":s" + term.substring(nullSepIndex);
49
- }
50
- expr = plus(expr) + (percentSign ? "%{" : "{") + term + "}";
51
- termStart = -1;
52
- quoteStart = i + 1;
53
- bracketsOpen = 0;
54
- }
55
- } else if (str[i + 1] == "}") {
56
- expr = plus(expr) + quoteStr(str.substring(quoteStart, i) + "}");
57
- i++;
58
- quoteStart = i + 1;
59
- }
60
- break;
61
- }
62
- }
63
-
64
- if (quoteStart < str.length) expr = plus(expr) + quoteStr(str.substring(quoteStart));
65
-
66
- return (tplCache[str] = expression(expr));
67
- }
68
-
69
- export const StringTemplate = {
70
- get: function (str) {
71
- return stringTemplate(str);
72
- },
73
-
74
- compile: function (str) {
75
- return stringTemplate(str).memoize();
76
- },
77
-
78
- format: function (format, ...args) {
79
- return stringTemplate(format)(args);
80
- },
81
- };
82
-
83
- export function invalidateStringTemplateCache() {
84
- tplCache = {};
85
- }
1
+ import { expression } from "./Expression";
2
+
3
+ import { quoteStr } from "../util/quote";
4
+
5
+ function plus(str) {
6
+ return str.length ? str + " + " : str;
7
+ }
8
+
9
+ export function stringTemplate(str) {
10
+ let tplCache = getTplCache();
11
+ let expr = tplCache[str];
12
+ if (expr) return expr;
13
+
14
+ expr = "";
15
+
16
+ let termStart = -1,
17
+ quoteStart = 0,
18
+ term,
19
+ bracketsOpen = 0,
20
+ percentSign;
21
+
22
+ for (let i = 0; i < str.length; i++) {
23
+ let c = str[i];
24
+ switch (c) {
25
+ case "{":
26
+ if (termStart < 0) {
27
+ if (str[i + 1] == "{" && str[i - 1] != "%") {
28
+ expr = plus(expr) + quoteStr(str.substring(quoteStart, i) + "{");
29
+ i++;
30
+ quoteStart = i + 1;
31
+ } else {
32
+ termStart = i + 1;
33
+ percentSign = str[i - 1] == "%";
34
+ if (i > quoteStart) expr = plus(expr) + quoteStr(str.substring(quoteStart, percentSign ? i - 1 : i));
35
+ bracketsOpen = 1;
36
+ }
37
+ } else bracketsOpen++;
38
+ break;
39
+
40
+ case "}":
41
+ if (termStart >= 0) {
42
+ if (--bracketsOpen == 0) {
43
+ term = str.substring(termStart, i);
44
+ if (term.indexOf(":") == -1) {
45
+ let nullSepIndex = term.indexOf("|");
46
+ if (nullSepIndex == -1) term += ":s";
47
+ else term = term.substring(0, nullSepIndex) + ":s" + term.substring(nullSepIndex);
48
+ }
49
+ expr = plus(expr) + (percentSign ? "%{" : "{") + term + "}";
50
+ termStart = -1;
51
+ quoteStart = i + 1;
52
+ bracketsOpen = 0;
53
+ }
54
+ } else if (str[i + 1] == "}") {
55
+ expr = plus(expr) + quoteStr(str.substring(quoteStart, i) + "}");
56
+ i++;
57
+ quoteStart = i + 1;
58
+ }
59
+ break;
60
+ }
61
+ }
62
+
63
+ if (quoteStart < str.length) expr = plus(expr) + quoteStr(str.substring(quoteStart));
64
+
65
+ return (tplCache[str] = expression(expr));
66
+ }
67
+
68
+ export const StringTemplate = {
69
+ get: function (str) {
70
+ return stringTemplate(str);
71
+ },
72
+
73
+ compile: function (str) {
74
+ return stringTemplate(str).memoize();
75
+ },
76
+
77
+ format: function (format, ...args) {
78
+ return stringTemplate(format)(args);
79
+ },
80
+ };
81
+
82
+ let tplCache = {};
83
+
84
+ let getTplCache = () => tplCache;
85
+
86
+ export function invalidateStringTemplateCache() {
87
+ tplCache = {};
88
+ }
89
+
90
+ export function setGetStringTemplateCacheCallback(callback) {
91
+ getTplCache = callback;
92
+ }
@@ -1,23 +1,47 @@
1
- declare type DateEncoding = (date: Date) => any;
2
-
3
- export class Culture {
4
- static setCulture(cultureCode: string): void;
5
-
6
- static setDefaultCurrency(currencyCode: string): void;
7
-
8
- static readonly defaultCurrency: string;
9
-
10
- static readonly culture: string;
11
-
12
- static setNumberCulture(cultureCode: string): void;
13
-
14
- static getNumberCulture(): any;
15
-
16
- static setDateTimeCulture(cultureCode: string): void;
17
-
18
- static getDateTimeCulture(): any;
19
-
20
- static getDefaultDateEncoding(): DateEncoding;
21
-
22
- static setDefaultDateEncoding(encoding: DateEncoding): void;
23
- }
1
+ declare type DateEncoding = (date: Date) => any;
2
+
3
+ export class Culture {
4
+ static setCulture(cultureCode: string): void;
5
+
6
+ static setDefaultCurrency(currencyCode: string): void;
7
+
8
+ static readonly defaultCurrency: string;
9
+
10
+ static readonly culture: string;
11
+
12
+ static setNumberCulture(cultureCode: string): void;
13
+
14
+ static getNumberCulture(): any;
15
+
16
+ static setDateTimeCulture(cultureCode: string): void;
17
+
18
+ static getDateTimeCulture(): any;
19
+
20
+ static getDefaultDateEncoding(): DateEncoding;
21
+
22
+ static setDefaultDateEncoding(encoding: DateEncoding): void;
23
+ }
24
+
25
+ export interface CultureSpecs {
26
+ culture?: string;
27
+ numberCulture?: string;
28
+ dateCulture?: string;
29
+ defaultCurrency?: string;
30
+ dateEncoding?: DateEncoding;
31
+ }
32
+
33
+ export interface CultureInfo {
34
+ culture: string;
35
+ numberCulture?: string;
36
+ dateCulture?: string;
37
+ defaultCurrency: string;
38
+ dateEncoding: DateEncoding;
39
+ }
40
+
41
+ export function createCulture(cultureSpecs: CultureSpecs): CultureInfo;
42
+
43
+ export function pushCulture(cultureSpecs: CultureInfo): void;
44
+
45
+ export function popCulture(): CultureInfo;
46
+
47
+ export function getCurrentCultureCache(): any;
package/src/ui/Culture.js CHANGED
@@ -1,76 +1,132 @@
1
- import { NumberCulture, DateTimeCulture } from "intl-io";
2
- import { Localization } from "./Localization";
3
- import { GlobalCacheIdentifier } from "../util/GlobalCacheIdentifier";
4
- import { invalidateExpressionCache } from "../data/Expression";
5
- import { invalidateStringTemplateCache } from "../data/StringTemplate";
6
- import { defaultCompare } from "../data/defaultCompare";
7
-
8
- let culture = "en";
9
- let numberCulture = null;
10
- let dateTimeCulture = null;
11
- let cultureCache = {};
12
- let defaultCurrency = "USD";
13
- let dateEncoding = (date) => date.toISOString();
14
-
15
- export class Culture {
16
- static setCulture(cultureCode) {
17
- culture = cultureCode;
18
- cultureCache = {};
19
- Localization.setCulture(cultureCode);
20
- this.invalidateCache();
21
- }
22
-
23
- static setNumberCulture(cultureCode) {
24
- numberCulture = cultureCode;
25
- delete cultureCache.numberCulture;
26
- this.invalidateCache();
27
- }
28
-
29
- static setDateTimeCulture(cultureCode) {
30
- dateTimeCulture = cultureCode;
31
- delete cultureCache.dateTimeCulture;
32
- this.invalidateCache();
33
- }
34
-
35
- static setDefaultCurrency(currencyCode) {
36
- defaultCurrency = currencyCode;
37
- this.invalidateCache();
38
- }
39
-
40
- static invalidateCache() {
41
- GlobalCacheIdentifier.change();
42
- invalidateExpressionCache();
43
- invalidateStringTemplateCache();
44
- }
45
-
46
- static get defaultCurrency() {
47
- return defaultCurrency;
48
- }
49
-
50
- static get culture() {
51
- return culture;
52
- }
53
-
54
- static getNumberCulture() {
55
- if (!cultureCache.numberCulture) cultureCache.numberCulture = new NumberCulture(numberCulture ?? culture);
56
- return cultureCache.numberCulture;
57
- }
58
-
59
- static getDateTimeCulture() {
60
- if (!cultureCache.dateTimeCulture) cultureCache.dateTimeCulture = new DateTimeCulture(dateTimeCulture ?? culture);
61
- return cultureCache.dateTimeCulture;
62
- }
63
-
64
- static getDefaultDateEncoding() {
65
- return dateEncoding;
66
- }
67
-
68
- static setDefaultDateEncoding(encoding) {
69
- dateEncoding = encoding;
70
- }
71
-
72
- static getComparer(options) {
73
- if (typeof Intl.Collator != "undefined") return new Intl.Collator(culture, options).compare;
74
- return defaultCompare;
75
- }
76
- }
1
+ import { NumberCulture, DateTimeCulture } from "intl-io";
2
+ import { Localization } from "./Localization";
3
+ import { GlobalCacheIdentifier } from "../util/GlobalCacheIdentifier";
4
+ import { invalidateExpressionCache } from "../data/Expression";
5
+ import { invalidateStringTemplateCache } from "../data/StringTemplate";
6
+ import { defaultCompare } from "../data/defaultCompare";
7
+
8
+ // let culture = "en";
9
+ // let numberCulture = null;
10
+ // let dateTimeCulture = null;
11
+ // let cache = {};
12
+ // let defaultCurrency = "USD";
13
+ // let dateEncoding = (date) => date.toISOString();
14
+
15
+ let stack = [
16
+ {
17
+ culture: "en",
18
+ numberCulture: null,
19
+ dateTimeCulture: null,
20
+ cache: {},
21
+ defaultCurrency: "USD",
22
+ dateEncoding: (date) => date.toISOString(),
23
+ },
24
+ ];
25
+
26
+ function getRootCultureSpecs() {
27
+ return stack[0];
28
+ }
29
+
30
+ function getCurrentCultureSpecs() {
31
+ return stack[stack.length - 1];
32
+ }
33
+
34
+ export function getCurrentCultureCache() {
35
+ return getCurrentCultureSpecs().cache;
36
+ }
37
+
38
+ export function pushCulture(cultureInfo) {
39
+ stack.push(cultureInfo);
40
+ }
41
+
42
+ export function createCulture(cultureSpecs) {
43
+ let current = getCurrentCultureSpecs();
44
+ let info = {
45
+ culture: current.culture,
46
+ dateEncoding: current.dateEncoding,
47
+ defaultCurrency: current.defaultCurrency,
48
+ cache: {},
49
+ };
50
+ for (let key in cultureSpecs) {
51
+ if (!cultureSpecs[key]) continue;
52
+ info[key] = cultureSpecs[key];
53
+ }
54
+ return info;
55
+ }
56
+
57
+ export function popCulture() {
58
+ if (stack.length == 1) throw new Error("Cannot pop the last culture object.");
59
+ return stack.pop();
60
+ }
61
+
62
+ export class Culture {
63
+ static setCulture(cultureCode) {
64
+ let cultureSpecs = getRootCultureSpecs();
65
+ cultureSpecs.culture = cultureCode;
66
+ cultureSpecs.cache = {};
67
+ Localization.setCulture(cultureCode);
68
+ this.invalidateCache();
69
+ }
70
+
71
+ static setNumberCulture(cultureCode) {
72
+ let cultureSpecs = getRootCultureSpecs();
73
+ cultureSpecs.numberCulture = cultureCode;
74
+ delete cultureSpecs.cache.numberCulture;
75
+ this.invalidateCache();
76
+ }
77
+
78
+ static setDateTimeCulture(cultureCode) {
79
+ let cultureSpecs = getRootCultureSpecs();
80
+ cultureSpecs.dateTimeCulture = cultureCode;
81
+ delete cultureSpecs.cache.dateTimeCulture;
82
+ this.invalidateCache();
83
+ }
84
+
85
+ static setDefaultCurrency(currencyCode) {
86
+ let cultureSpecs = getRootCultureSpecs();
87
+ cultureSpecs.defaultCurrency = currencyCode;
88
+ this.invalidateCache();
89
+ }
90
+
91
+ static setDefaultDateEncoding(encoding) {
92
+ let cultureSpecs = getRootCultureSpecs();
93
+ cultureSpecs.dateEncoding = encoding;
94
+ this.invalidateCache();
95
+ }
96
+
97
+ static invalidateCache() {
98
+ GlobalCacheIdentifier.change();
99
+ invalidateExpressionCache();
100
+ invalidateStringTemplateCache();
101
+ }
102
+
103
+ static get defaultCurrency() {
104
+ return getCurrentCultureSpecs().defaultCurrency;
105
+ }
106
+
107
+ static get culture() {
108
+ return getCurrentCultureSpecs().culture;
109
+ }
110
+
111
+ static getNumberCulture() {
112
+ let { cache, numberCulture, culture } = getCurrentCultureSpecs();
113
+ if (!cache.numberCulture) cache.numberCulture = new NumberCulture(numberCulture ?? culture);
114
+ return cache.numberCulture;
115
+ }
116
+
117
+ static getDateTimeCulture() {
118
+ let { cache, dateTimeCulture, culture } = getCurrentCultureSpecs();
119
+ if (!cache.dateTimeCulture) cache.dateTimeCulture = new DateTimeCulture(dateTimeCulture ?? culture);
120
+ return cache.dateTimeCulture;
121
+ }
122
+
123
+ static getDefaultDateEncoding() {
124
+ return getCurrentCultureSpecs().dateEncoding;
125
+ }
126
+
127
+ static getComparer(options) {
128
+ let { culture } = getCurrentCultureSpecs();
129
+ if (typeof Intl.Collator != "undefined") return new Intl.Collator(culture, options).compare;
130
+ return defaultCompare;
131
+ }
132
+ }
@@ -0,0 +1,10 @@
1
+ import * as Cx from "../core";
2
+
3
+ interface CultureScopeProps extends Cx.PureContainerProps {
4
+ culture: Cx.StringProp;
5
+ numberCulture: Cx.StringProp;
6
+ dateTimeCulture: Cx.StringProp;
7
+ defaultCurrency: Cx.StringProp;
8
+ }
9
+
10
+ export class CultureScope extends Cx.Widget<CultureScopeProps> {}
@@ -0,0 +1,55 @@
1
+ import { createCulture, popCulture, pushCulture } from "./Culture";
2
+ import { PureContainer } from "./PureContainer";
3
+
4
+ export class CultureScope extends PureContainer {
5
+ init() {
6
+ this.initialItems = this.items ?? this.children;
7
+ delete this.items;
8
+ delete this.children;
9
+ super.init();
10
+ }
11
+
12
+ declareData(...args) {
13
+ super.declareData(...args, {
14
+ culture: undefined,
15
+ numberCulture: undefined,
16
+ dateTimeCulture: undefined,
17
+ defaultCurrency: undefined,
18
+ });
19
+ }
20
+
21
+ prepareData(context, instance) {
22
+ super.prepareData(context, instance);
23
+ this.clear();
24
+ let { data } = instance;
25
+
26
+ if (this.onCreateCulture) instance.culture = instance.invoke("onCreateCulture", data, instance);
27
+ else
28
+ instance.culture = createCulture({
29
+ culture: data.culture,
30
+ numberCulture: data.numberCulture,
31
+ dateTimeCulture: data.dateTimeCulture,
32
+ defaultCurrency: data.defaultCurrency,
33
+ dateEncoding: this.dateEncoding,
34
+ });
35
+ }
36
+
37
+ explore(context, instance) {
38
+ let { culture } = instance;
39
+ pushCulture(culture);
40
+ if (this.items.length == 0 && this.initialItems) this.add(this.initialItems);
41
+ context.push("cultureInfo", culture);
42
+ super.explore(context, instance);
43
+ }
44
+
45
+ exploreCleanup(context, instance) {
46
+ context.pop("cultureInfo");
47
+ popCulture();
48
+ }
49
+ }
50
+
51
+ CultureScope.prototype.culture = null;
52
+ CultureScope.prototype.numberCulture = null;
53
+ CultureScope.prototype.dateTimeCulture = null;
54
+ CultureScope.prototype.defaultCurrency = null;
55
+ CultureScope.prototype.dateEncoding = null;