@schukai/monster 3.4.2 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/example/i18n/providers/embed.mjs +5 -0
- package/package.json +1 -1
- package/source/constants.mjs +4 -9
- package/source/constraints/abstract.mjs +4 -6
- package/source/constraints/abstractoperator.mjs +6 -12
- package/source/constraints/andoperator.mjs +3 -6
- package/source/constraints/invalid.mjs +3 -6
- package/source/constraints/isarray.mjs +6 -9
- package/source/constraints/isobject.mjs +4 -7
- package/source/constraints/namespace.mjs +1 -3
- package/source/constraints/oroperator.mjs +26 -25
- package/source/constraints/valid.mjs +3 -6
- package/source/data/buildmap.mjs +20 -36
- package/source/data/buildtree.mjs +29 -29
- package/source/data/datasource/namespace.mjs +1 -1
- package/source/data/datasource/server/restapi/writeerror.mjs +6 -6
- package/source/data/datasource/server/restapi.mjs +51 -65
- package/source/data/datasource/server/webconnect.mjs +26 -35
- package/source/data/datasource/server.mjs +17 -21
- package/source/data/datasource/storage/localstorage.mjs +8 -11
- package/source/data/datasource/storage/sessionstorage.mjs +8 -10
- package/source/data/datasource/storage.mjs +18 -22
- package/source/data/datasource.mjs +27 -43
- package/source/data/diff.mjs +20 -32
- package/source/data/extend.mjs +20 -14
- package/source/data/namespace.mjs +1 -3
- package/source/data/pathfinder.mjs +40 -67
- package/source/data/pipe.mjs +6 -10
- package/source/data/transformer.mjs +141 -157
- package/source/dom/assembler.mjs +6 -9
- package/source/dom/attributes.mjs +36 -48
- package/source/dom/constants.mjs +55 -71
- package/source/dom/customcontrol.mjs +16 -21
- package/source/dom/customelement.mjs +140 -164
- package/source/dom/events.mjs +17 -24
- package/source/dom/focusmanager.mjs +30 -48
- package/source/dom/locale.mjs +41 -10
- package/source/dom/namespace.mjs +1 -1
- package/source/dom/ready.mjs +7 -10
- package/source/dom/resource/data.mjs +38 -46
- package/source/dom/resource/link/namespace.mjs +1 -3
- package/source/dom/resource/link/stylesheet.mjs +7 -11
- package/source/dom/resource/link.mjs +36 -17
- package/source/dom/resource/namespace.mjs +1 -1
- package/source/dom/resource/script.mjs +23 -13
- package/source/dom/resource.mjs +47 -60
- package/source/dom/resourcemanager.mjs +36 -43
- package/source/dom/template.mjs +17 -24
- package/source/dom/theme.mjs +8 -12
- package/source/dom/updater.mjs +150 -196
- package/source/dom/util.mjs +11 -12
- package/source/dom/worker/factory.mjs +21 -25
- package/source/dom/worker/namespace.mjs +1 -1
- package/source/i18n/formatter.mjs +20 -24
- package/source/i18n/locale.mjs +40 -42
- package/source/i18n/namespace.mjs +1 -1
- package/source/i18n/provider.mjs +4 -7
- package/source/i18n/providers/embed.mjs +115 -0
- package/source/i18n/providers/fetch.mjs +33 -38
- package/source/i18n/translations.mjs +16 -20
- package/source/logging/handler/console.mjs +6 -10
- package/source/logging/handler.mjs +15 -18
- package/source/logging/logentry.mjs +8 -9
- package/source/logging/logger.mjs +73 -55
- package/source/logging/namespace.mjs +1 -1
- package/source/math/namespace.mjs +1 -1
- package/source/math/random.mjs +13 -14
- package/source/monster.mjs +132 -100
- package/source/net/namespace.mjs +1 -3
- package/source/net/webconnect/message.mjs +6 -8
- package/source/net/webconnect/namespace.mjs +1 -3
- package/source/net/webconnect.mjs +28 -39
- package/source/text/formatter.mjs +44 -55
- package/source/types/base.mjs +16 -26
- package/source/types/basewithoptions.mjs +8 -14
- package/source/types/binary.mjs +4 -5
- package/source/types/dataurl.mjs +19 -27
- package/source/types/global.mjs +14 -26
- package/source/types/id.mjs +4 -6
- package/source/types/is.mjs +11 -16
- package/source/types/mediatype.mjs +29 -44
- package/source/types/namespace.mjs +0 -1
- package/source/types/node.mjs +16 -22
- package/source/types/nodelist.mjs +10 -14
- package/source/types/noderecursiveiterator.mjs +11 -14
- package/source/types/observablequeue.mjs +13 -16
- package/source/types/observer.mjs +16 -23
- package/source/types/observerlist.mjs +18 -21
- package/source/types/proxyobserver.mjs +24 -37
- package/source/types/queue.mjs +8 -13
- package/source/types/randomid.mjs +10 -10
- package/source/types/regex.mjs +3 -5
- package/source/types/stack.mjs +4 -8
- package/source/types/tokenlist.mjs +24 -31
- package/source/types/typeof.mjs +5 -7
- package/source/types/uniquequeue.mjs +8 -13
- package/source/types/uuid.mjs +18 -25
- package/source/types/validate.mjs +26 -27
- package/source/types/version.mjs +17 -25
- package/source/util/clone.mjs +23 -32
- package/source/util/comparator.mjs +7 -15
- package/source/util/deadmansswitch.mjs +16 -23
- package/source/util/freeze.mjs +5 -7
- package/source/util/namespace.mjs +1 -1
- package/source/util/processing.mjs +33 -39
- package/source/util/trimspaces.mjs +17 -24
- package/test/cases/dom/locale.mjs +15 -0
- package/test/cases/i18n/providers/embed.mjs +72 -0
- package/test/cases/monster.mjs +1 -1
package/source/dom/util.mjs
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {getGlobal} from "../types/global.mjs";
|
|
9
|
-
import {validateString} from "../types/validate.mjs";
|
|
8
|
+
import { getGlobal } from "../types/global.mjs";
|
|
9
|
+
import { validateString } from "../types/validate.mjs";
|
|
10
10
|
|
|
11
|
-
export {getDocument, getWindow, getDocumentFragmentFromString}
|
|
11
|
+
export { getDocument, getWindow, getDocumentFragmentFromString };
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* This method fetches the document object
|
|
@@ -48,9 +48,9 @@ export {getDocument, getWindow, getDocumentFragmentFromString}
|
|
|
48
48
|
* @throws {Error} not supported environment
|
|
49
49
|
*/
|
|
50
50
|
function getDocument() {
|
|
51
|
-
let document = getGlobal()?.[
|
|
52
|
-
if (typeof document !==
|
|
53
|
-
throw new Error("not supported environment")
|
|
51
|
+
let document = getGlobal()?.["document"];
|
|
52
|
+
if (typeof document !== "object") {
|
|
53
|
+
throw new Error("not supported environment");
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
return document;
|
|
@@ -70,7 +70,7 @@ function getDocument() {
|
|
|
70
70
|
* });
|
|
71
71
|
*
|
|
72
72
|
* getGlobal()['window']=window;
|
|
73
|
-
*
|
|
73
|
+
*
|
|
74
74
|
* [
|
|
75
75
|
* 'self',
|
|
76
76
|
* 'document',
|
|
@@ -96,15 +96,14 @@ function getDocument() {
|
|
|
96
96
|
* @throws {Error} not supported environment
|
|
97
97
|
*/
|
|
98
98
|
function getWindow() {
|
|
99
|
-
let window = getGlobal()?.[
|
|
100
|
-
if (typeof window !==
|
|
101
|
-
throw new Error("not supported environment")
|
|
99
|
+
let window = getGlobal()?.["window"];
|
|
100
|
+
if (typeof window !== "object") {
|
|
101
|
+
throw new Error("not supported environment");
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
return window;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
|
|
108
107
|
/**
|
|
109
108
|
* This method fetches the document object
|
|
110
109
|
*
|
|
@@ -147,7 +146,7 @@ function getDocumentFragmentFromString(html) {
|
|
|
147
146
|
validateString(html);
|
|
148
147
|
|
|
149
148
|
const document = getDocument();
|
|
150
|
-
const template = document.createElement(
|
|
149
|
+
const template = document.createElement("template");
|
|
151
150
|
template.innerHTML = html;
|
|
152
151
|
|
|
153
152
|
return template.content;
|
|
@@ -5,17 +5,17 @@
|
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {internalSymbol} from "../../constants.mjs";
|
|
9
|
-
import {Base} from "../../types/base.mjs";
|
|
10
|
-
import {getGlobal, getGlobalFunction} from "../../types/global.mjs";
|
|
11
|
-
import {isFunction} from "../../types/is.mjs";
|
|
12
|
-
import {validateInstance, validateString} from "../../types/validate.mjs";
|
|
8
|
+
import { internalSymbol } from "../../constants.mjs";
|
|
9
|
+
import { Base } from "../../types/base.mjs";
|
|
10
|
+
import { getGlobal, getGlobalFunction } from "../../types/global.mjs";
|
|
11
|
+
import { isFunction } from "../../types/is.mjs";
|
|
12
|
+
import { validateInstance, validateString } from "../../types/validate.mjs";
|
|
13
13
|
|
|
14
|
-
export {Factory}
|
|
14
|
+
export { Factory };
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* A factory for creating worker instances.
|
|
18
|
-
*
|
|
18
|
+
*
|
|
19
19
|
* @license AGPLv3
|
|
20
20
|
* @since 1.25.0
|
|
21
21
|
* @copyright schukai GmbH
|
|
@@ -23,15 +23,14 @@ export {Factory}
|
|
|
23
23
|
* @summary A small factory to create worker
|
|
24
24
|
*/
|
|
25
25
|
class Factory extends Base {
|
|
26
|
-
|
|
27
26
|
/**
|
|
28
27
|
*
|
|
29
28
|
*/
|
|
30
29
|
constructor() {
|
|
31
30
|
super();
|
|
32
31
|
this[internalSymbol] = {
|
|
33
|
-
worker: new WeakMap
|
|
34
|
-
}
|
|
32
|
+
worker: new WeakMap(),
|
|
33
|
+
};
|
|
35
34
|
}
|
|
36
35
|
|
|
37
36
|
/**
|
|
@@ -43,24 +42,23 @@ class Factory extends Base {
|
|
|
43
42
|
* @return {Worker}
|
|
44
43
|
*/
|
|
45
44
|
createFromURL = function (url, messageHandler, errorHandler) {
|
|
46
|
-
|
|
47
45
|
if (url instanceof URL) {
|
|
48
46
|
url = url.toString();
|
|
49
47
|
}
|
|
50
48
|
|
|
51
|
-
const workerClass = getGlobalFunction(
|
|
49
|
+
const workerClass = getGlobalFunction("Worker");
|
|
52
50
|
var worker = new workerClass(validateString(url));
|
|
53
51
|
|
|
54
52
|
if (isFunction(messageHandler)) {
|
|
55
53
|
worker.onmessage = (event) => {
|
|
56
54
|
messageHandler.call(worker, event);
|
|
57
|
-
}
|
|
55
|
+
};
|
|
58
56
|
}
|
|
59
57
|
|
|
60
58
|
if (isFunction(errorHandler)) {
|
|
61
59
|
worker.onerror = (event) => {
|
|
62
60
|
errorHandler.call(worker, event);
|
|
63
|
-
}
|
|
61
|
+
};
|
|
64
62
|
}
|
|
65
63
|
|
|
66
64
|
return worker;
|
|
@@ -76,16 +74,17 @@ class Factory extends Base {
|
|
|
76
74
|
* @see https://developer.mozilla.org/de/docs/Web/API/URL/createObjectURL
|
|
77
75
|
*/
|
|
78
76
|
createFromScript = function (content, messageHandler, errorHandler) {
|
|
79
|
-
const blobFunction = new getGlobalFunction(
|
|
80
|
-
const blob = new blobFunction([validateString(content)], {
|
|
77
|
+
const blobFunction = new getGlobalFunction("Blob");
|
|
78
|
+
const blob = new blobFunction([validateString(content)], {
|
|
79
|
+
type: "script/javascript",
|
|
80
|
+
});
|
|
81
81
|
|
|
82
|
-
const url = getGlobalFunction(
|
|
82
|
+
const url = getGlobalFunction("URL").createObjectURL(blob);
|
|
83
83
|
const worker = this.createFromURL(url, messageHandler, errorHandler);
|
|
84
84
|
|
|
85
|
-
this[internalSymbol][
|
|
85
|
+
this[internalSymbol]["worker"].set(worker, url);
|
|
86
86
|
|
|
87
87
|
return worker;
|
|
88
|
-
|
|
89
88
|
};
|
|
90
89
|
|
|
91
90
|
/**
|
|
@@ -95,19 +94,16 @@ class Factory extends Base {
|
|
|
95
94
|
* @return {Monster.DOM.Worker.Factory}
|
|
96
95
|
*/
|
|
97
96
|
terminate(worker) {
|
|
98
|
-
|
|
99
|
-
const workerClass = getGlobalFunction('Worker');
|
|
97
|
+
const workerClass = getGlobalFunction("Worker");
|
|
100
98
|
validateInstance(worker, workerClass);
|
|
101
99
|
|
|
102
100
|
worker.terminate();
|
|
103
101
|
|
|
104
|
-
if (this[internalSymbol][
|
|
105
|
-
const url = this[internalSymbol][
|
|
102
|
+
if (this[internalSymbol]["worker"].has(worker)) {
|
|
103
|
+
const url = this[internalSymbol]["worker"].get(worker);
|
|
106
104
|
URL.revokeObjectURL(url);
|
|
107
105
|
}
|
|
108
106
|
|
|
109
107
|
return this;
|
|
110
108
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
109
|
}
|
|
@@ -5,20 +5,20 @@
|
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {internalSymbol} from "../constants.mjs";
|
|
9
|
-
import {extend} from "../data/extend.mjs";
|
|
8
|
+
import { internalSymbol } from "../constants.mjs";
|
|
9
|
+
import { extend } from "../data/extend.mjs";
|
|
10
10
|
|
|
11
|
-
import {Formatter as TextFormatter} from "../text/formatter.mjs";
|
|
12
|
-
import {validateInstance, validateString} from "../types/validate.mjs";
|
|
13
|
-
import {Translations} from "./translations.mjs";
|
|
11
|
+
import { Formatter as TextFormatter } from "../text/formatter.mjs";
|
|
12
|
+
import { validateInstance, validateString } from "../types/validate.mjs";
|
|
13
|
+
import { Translations } from "./translations.mjs";
|
|
14
14
|
|
|
15
|
-
export {Formatter}
|
|
15
|
+
export { Formatter };
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* @private
|
|
19
19
|
* @type {symbol}
|
|
20
20
|
*/
|
|
21
|
-
const internalTranslationSymbol = Symbol(
|
|
21
|
+
const internalTranslationSymbol = Symbol("internalTranslation");
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* The Formatter extends the Text.Formatter with the possibility to replace the key by a translation.
|
|
@@ -30,7 +30,6 @@ const internalTranslationSymbol = Symbol('internalTranslation')
|
|
|
30
30
|
* @memberOf Monster.I18n
|
|
31
31
|
*/
|
|
32
32
|
class Formatter extends TextFormatter {
|
|
33
|
-
|
|
34
33
|
/**
|
|
35
34
|
* Default values for the markers are `${` and `}`
|
|
36
35
|
*
|
|
@@ -58,13 +57,13 @@ class Formatter extends TextFormatter {
|
|
|
58
57
|
callbacks: {
|
|
59
58
|
i18n: (value) => {
|
|
60
59
|
return self[internalTranslationSymbol].getText(validateString(value));
|
|
61
|
-
}
|
|
60
|
+
},
|
|
62
61
|
},
|
|
63
62
|
marker: {
|
|
64
|
-
open: [
|
|
65
|
-
close: [
|
|
63
|
+
open: ["i18n{", "${"],
|
|
64
|
+
close: ["}"],
|
|
66
65
|
},
|
|
67
|
-
})
|
|
66
|
+
});
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
/**
|
|
@@ -77,10 +76,10 @@ class Formatter extends TextFormatter {
|
|
|
77
76
|
* @throws {Error} the closing marker is missing
|
|
78
77
|
*/
|
|
79
78
|
format(text) {
|
|
80
|
-
validateString(text)
|
|
79
|
+
validateString(text);
|
|
81
80
|
|
|
82
|
-
const openMarker = this[internalSymbol][
|
|
83
|
-
const closeMarker = this[internalSymbol][
|
|
81
|
+
const openMarker = this[internalSymbol]["marker"]["open"]?.[0];
|
|
82
|
+
const closeMarker = this[internalSymbol]["marker"]["close"]?.[0];
|
|
84
83
|
|
|
85
84
|
if (text.indexOf(openMarker) === 0) {
|
|
86
85
|
text = text.substring(openMarker.length);
|
|
@@ -88,22 +87,19 @@ class Formatter extends TextFormatter {
|
|
|
88
87
|
if (text.indexOf(closeMarker) === text.length - closeMarker.length) {
|
|
89
88
|
text = text.substring(0, text.length - closeMarker.length);
|
|
90
89
|
} else {
|
|
91
|
-
throw new Error("the closing marker is missing")
|
|
90
|
+
throw new Error("the closing marker is missing");
|
|
92
91
|
}
|
|
93
92
|
}
|
|
94
|
-
|
|
95
|
-
const parts = validateString(text).split('::')
|
|
96
|
-
const translationKey = parts.shift().trim(); // key value delimiter
|
|
97
|
-
const parameter = parts.join('::').trim();
|
|
98
93
|
|
|
94
|
+
const parts = validateString(text).split("::");
|
|
95
|
+
const translationKey = parts.shift().trim(); // key value delimiter
|
|
96
|
+
const parameter = parts.join("::").trim();
|
|
99
97
|
|
|
100
|
-
let assembledText = openMarker
|
|
98
|
+
let assembledText = `${openMarker}static:${translationKey} | call:i18n`;
|
|
101
99
|
if (parameter.length > 0) {
|
|
102
|
-
assembledText +=
|
|
100
|
+
assembledText += `::${parameter}`;
|
|
103
101
|
}
|
|
104
102
|
assembledText += closeMarker;
|
|
105
103
|
return super.format(assembledText);
|
|
106
104
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
105
|
}
|
package/source/i18n/locale.mjs
CHANGED
|
@@ -5,23 +5,23 @@
|
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {Base} from "../types/base.mjs";
|
|
9
|
-
import {validateString} from "../types/validate.mjs";
|
|
10
|
-
import {clone} from "../util/clone.mjs";
|
|
8
|
+
import { Base } from "../types/base.mjs";
|
|
9
|
+
import { validateString } from "../types/validate.mjs";
|
|
10
|
+
import { clone } from "../util/clone.mjs";
|
|
11
11
|
|
|
12
|
-
export {Locale, parseLocale}
|
|
12
|
+
export { Locale, parseLocale };
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* @memberOf Monster.I18n
|
|
16
16
|
* @type {symbol}
|
|
17
17
|
*/
|
|
18
|
-
const propertiesSymbol = Symbol(
|
|
18
|
+
const propertiesSymbol = Symbol("properties");
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* @type {symbol}
|
|
22
22
|
* @memberOf Monster.I18n
|
|
23
23
|
*/
|
|
24
|
-
const localeStringSymbol = Symbol(
|
|
24
|
+
const localeStringSymbol = Symbol("localeString");
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* The Locale class is a base class for the language classes.
|
|
@@ -64,7 +64,6 @@ const localeStringSymbol = Symbol('localeString');
|
|
|
64
64
|
* @see https://datatracker.ietf.org/doc/html/rfc3066
|
|
65
65
|
*/
|
|
66
66
|
class Locale extends Base {
|
|
67
|
-
|
|
68
67
|
/**
|
|
69
68
|
* @param {string} language
|
|
70
69
|
* @param {string} [region]
|
|
@@ -78,12 +77,12 @@ class Locale extends Base {
|
|
|
78
77
|
super();
|
|
79
78
|
|
|
80
79
|
this[propertiesSymbol] = {
|
|
81
|
-
language:
|
|
82
|
-
script:
|
|
83
|
-
region:
|
|
84
|
-
variants:
|
|
85
|
-
extlang:
|
|
86
|
-
privateUse:
|
|
80
|
+
language: language === undefined ? undefined : validateString(language),
|
|
81
|
+
script: script === undefined ? undefined : validateString(script),
|
|
82
|
+
region: region === undefined ? undefined : validateString(region),
|
|
83
|
+
variants: variants === undefined ? undefined : validateString(variants),
|
|
84
|
+
extlang: extlang === undefined ? undefined : validateString(extlang),
|
|
85
|
+
privateUse: privateUse === undefined ? undefined : validateString(privateUse),
|
|
87
86
|
};
|
|
88
87
|
|
|
89
88
|
let s = [];
|
|
@@ -95,11 +94,10 @@ class Locale extends Base {
|
|
|
95
94
|
if (privateUse !== undefined) s.push(privateUse);
|
|
96
95
|
|
|
97
96
|
if (s.length === 0) {
|
|
98
|
-
throw new Error(
|
|
97
|
+
throw new Error("unsupported locale");
|
|
99
98
|
}
|
|
100
99
|
|
|
101
|
-
this[localeStringSymbol] = s.join(
|
|
102
|
-
|
|
100
|
+
this[localeStringSymbol] = s.join("-");
|
|
103
101
|
}
|
|
104
102
|
|
|
105
103
|
/**
|
|
@@ -151,12 +149,11 @@ class Locale extends Base {
|
|
|
151
149
|
return this[propertiesSymbol].privateValue;
|
|
152
150
|
}
|
|
153
151
|
|
|
154
|
-
|
|
155
152
|
/**
|
|
156
153
|
* @return {string}
|
|
157
154
|
*/
|
|
158
155
|
toString() {
|
|
159
|
-
return
|
|
156
|
+
return `${this.localeString}`;
|
|
160
157
|
}
|
|
161
158
|
|
|
162
159
|
/**
|
|
@@ -165,10 +162,8 @@ class Locale extends Base {
|
|
|
165
162
|
* @return {Monster.I18n.LocaleMap}
|
|
166
163
|
*/
|
|
167
164
|
getMap() {
|
|
168
|
-
return clone(this[propertiesSymbol])
|
|
165
|
+
return clone(this[propertiesSymbol]);
|
|
169
166
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
167
|
}
|
|
173
168
|
|
|
174
169
|
/**
|
|
@@ -263,25 +258,30 @@ class Locale extends Base {
|
|
|
263
258
|
* @throws {Error} unsupported locale
|
|
264
259
|
*/
|
|
265
260
|
function parseLocale(locale) {
|
|
266
|
-
|
|
267
261
|
locale = validateString(locale).replace(/_/g, "-");
|
|
268
262
|
|
|
269
|
-
let language
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
263
|
+
let language;
|
|
264
|
+
let region;
|
|
265
|
+
let variants;
|
|
266
|
+
let parts;
|
|
267
|
+
let script;
|
|
268
|
+
let extlang;
|
|
269
|
+
let regexRegular = "(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)";
|
|
270
|
+
let regexIrregular =
|
|
271
|
+
"(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)";
|
|
272
|
+
let regexGrandfathered = `(${regexIrregular}|${regexRegular})`;
|
|
273
|
+
let regexPrivateUse = "(x(-[A-Za-z0-9]{1,8})+)";
|
|
274
|
+
let regexSingleton = "[0-9A-WY-Za-wy-z]";
|
|
275
|
+
let regexExtension = `(${regexSingleton}(-[A-Za-z0-9]{2,8})+)`;
|
|
276
|
+
let regexVariant = "([A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})";
|
|
277
|
+
let regexRegion = "([A-Za-z]{2}|[0-9]{3})";
|
|
278
|
+
let regexScript = "([A-Za-z]{4})";
|
|
279
|
+
let regexExtlang = "([A-Za-z]{3}(-[A-Za-z]{3}){0,2})";
|
|
280
|
+
let regexLanguage = `(([A-Za-z]{2,3}(-${regexExtlang})?)|[A-Za-z]{4}|[A-Za-z]{5,8})`;
|
|
281
|
+
let regexLangtag = `(${regexLanguage}(-${regexScript})?(-${regexRegion})?(-${regexVariant})*(-${regexExtension})*(-${regexPrivateUse})?)`;
|
|
282
|
+
let regexLanguageTag = `^(${regexGrandfathered}|${regexLangtag}|${regexPrivateUse})$`;
|
|
283
|
+
let regex = new RegExp(regexLanguageTag);
|
|
284
|
+
let match;
|
|
285
285
|
|
|
286
286
|
if ((match = regex.exec(locale)) !== null) {
|
|
287
287
|
if (match.index === regex.lastIndex) {
|
|
@@ -290,18 +290,17 @@ function parseLocale(locale) {
|
|
|
290
290
|
}
|
|
291
291
|
|
|
292
292
|
if (match === undefined || match === null) {
|
|
293
|
-
throw new Error(
|
|
293
|
+
throw new Error("unsupported locale");
|
|
294
294
|
}
|
|
295
295
|
|
|
296
296
|
if (match[6] !== undefined) {
|
|
297
297
|
language = match[6];
|
|
298
298
|
|
|
299
|
-
parts = language.split(
|
|
299
|
+
parts = language.split("-");
|
|
300
300
|
if (parts.length > 1) {
|
|
301
301
|
language = parts[0];
|
|
302
302
|
extlang = parts[1];
|
|
303
303
|
}
|
|
304
|
-
|
|
305
304
|
}
|
|
306
305
|
|
|
307
306
|
if (match[14] !== undefined) {
|
|
@@ -317,5 +316,4 @@ function parseLocale(locale) {
|
|
|
317
316
|
}
|
|
318
317
|
|
|
319
318
|
return new Locale(language, region, script, variants, extlang);
|
|
320
|
-
|
|
321
319
|
}
|
package/source/i18n/provider.mjs
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {BaseWithOptions} from "../types/basewithoptions.mjs";
|
|
9
|
-
import {Locale} from "./locale.mjs"
|
|
10
|
-
import {Translations} from "./translations.mjs"
|
|
8
|
+
import { BaseWithOptions } from "../types/basewithoptions.mjs";
|
|
9
|
+
import { Locale } from "./locale.mjs";
|
|
10
|
+
import { Translations } from "./translations.mjs";
|
|
11
11
|
|
|
12
|
-
export {Provider}
|
|
12
|
+
export { Provider };
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* A provider makes a translation object available.
|
|
@@ -21,7 +21,6 @@ export {Provider}
|
|
|
21
21
|
* @see {@link https://datatracker.ietf.org/doc/html/rfc3066}
|
|
22
22
|
*/
|
|
23
23
|
class Provider extends BaseWithOptions {
|
|
24
|
-
|
|
25
24
|
/**
|
|
26
25
|
* @param {Locale|string} locale
|
|
27
26
|
* @return {Promise}
|
|
@@ -33,8 +32,6 @@ class Provider extends BaseWithOptions {
|
|
|
33
32
|
} catch (e) {
|
|
34
33
|
reject(e);
|
|
35
34
|
}
|
|
36
|
-
|
|
37
35
|
});
|
|
38
36
|
}
|
|
39
|
-
|
|
40
37
|
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright schukai GmbH and contributors 2022. All Rights Reserved.
|
|
3
|
+
* Node module: @schukai/monster
|
|
4
|
+
* This file is licensed under the AGPLv3 License.
|
|
5
|
+
* License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { internalSymbol } from "../../constants.mjs";
|
|
9
|
+
import { extend } from "../../data/extend.mjs";
|
|
10
|
+
import { getGlobalObject } from "../../types/global.mjs";
|
|
11
|
+
import { isString } from "../../types/is.mjs";
|
|
12
|
+
import { validateObject, validateString } from "../../types/validate.mjs";
|
|
13
|
+
import { parseLocale } from "../locale.mjs";
|
|
14
|
+
import { Provider } from "../provider.mjs";
|
|
15
|
+
import { Translations } from "../translations.mjs";
|
|
16
|
+
|
|
17
|
+
export { Embed };
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The Embed provider retrieves a JSON file from the given Script Tag.
|
|
21
|
+
*
|
|
22
|
+
* @externalExample ../../../example/i18n/providers/embed.mjs
|
|
23
|
+
* @license AGPLv3
|
|
24
|
+
* @since 1.13.0
|
|
25
|
+
* @copyright schukai GmbH
|
|
26
|
+
* @memberOf Monster.I18n.Providers
|
|
27
|
+
* @see {@link https://datatracker.ietf.org/doc/html/rfc3066}
|
|
28
|
+
* @tutorial i18n-locale-and-formatter
|
|
29
|
+
*/
|
|
30
|
+
class Embed extends Provider {
|
|
31
|
+
/**
|
|
32
|
+
* ```html
|
|
33
|
+
* <script id="translations" type="application/json">
|
|
34
|
+
* {
|
|
35
|
+
* "hello": "Hallo"
|
|
36
|
+
* }
|
|
37
|
+
* </script>
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
*
|
|
41
|
+
* ```javascript
|
|
42
|
+
* new Embed('translations')
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @param {string} id
|
|
46
|
+
* @param {Object} options
|
|
47
|
+
*/
|
|
48
|
+
constructor(id, options) {
|
|
49
|
+
super(options);
|
|
50
|
+
|
|
51
|
+
if (options === undefined) {
|
|
52
|
+
options = {};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
validateString(id);
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @property {string}
|
|
59
|
+
*/
|
|
60
|
+
this.textId = id;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @private
|
|
64
|
+
* @property {Object} options
|
|
65
|
+
*/
|
|
66
|
+
this[internalSymbol] = extend({}, super.defaults, this.defaults, validateObject(options));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Defaults
|
|
71
|
+
*
|
|
72
|
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API}
|
|
73
|
+
*/
|
|
74
|
+
get defaults() {
|
|
75
|
+
return extend({}, super.defaults);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
*
|
|
80
|
+
* @param {Locale|string} locale
|
|
81
|
+
* @return {Promise}
|
|
82
|
+
*/
|
|
83
|
+
getTranslations(locale) {
|
|
84
|
+
if (isString(locale)) {
|
|
85
|
+
locale = parseLocale(locale);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
let text = getGlobalObject("document").getElementById(this.textId);
|
|
90
|
+
|
|
91
|
+
if (text === null) {
|
|
92
|
+
reject(new Error("Text not found"));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
let translations = null;
|
|
97
|
+
try {
|
|
98
|
+
translations = JSON.parse(text.innerHTML);
|
|
99
|
+
} catch (e) {
|
|
100
|
+
reject(e);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (translations === null) {
|
|
105
|
+
reject(new Error("Translations not found or invalid"));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const t = new Translations(locale);
|
|
110
|
+
t.assignTranslations(translations);
|
|
111
|
+
|
|
112
|
+
resolve(t);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|