@ui5/webcomponents-base 0.0.0-0fcda382e → 0.0.0-11d529e8a
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/.eslintignore +2 -0
- package/CHANGELOG.md +137 -0
- package/README.md +26 -1
- package/bundle.esm.js +17 -7
- package/dist/AssetRegistry.js +8 -6
- package/dist/Boot.js +43 -0
- package/dist/CustomElementsRegistry.js +24 -8
- package/dist/CustomElementsScope.js +108 -0
- package/dist/DOMObserver.js +65 -0
- package/dist/Device.js +58 -779
- package/dist/EventProvider.js +38 -26
- package/dist/FontFace.js +52 -7
- package/dist/InitialConfiguration.js +32 -8
- package/dist/Keys.js +89 -2
- package/dist/MediaRange.js +109 -0
- package/dist/PropertiesFileFormat.js +95 -0
- package/dist/Render.js +173 -0
- package/dist/RenderQueue.js +41 -17
- package/dist/RenderScheduler.js +24 -126
- package/dist/StaticArea.js +1 -39
- package/dist/StaticAreaItem.js +64 -62
- package/dist/SystemCSSVars.js +31 -0
- package/dist/Theming.js +2 -1
- package/dist/UI5Element.js +427 -299
- package/dist/UI5ElementMetadata.js +157 -19
- package/dist/asset-registries/Icons.js +118 -14
- package/dist/asset-registries/Illustrations.js +30 -0
- package/dist/asset-registries/LocaleData.js +90 -65
- package/dist/asset-registries/Themes.js +23 -32
- package/dist/asset-registries/i18n.js +72 -30
- package/dist/config/AnimationMode.js +11 -1
- package/dist/config/Language.js +58 -2
- package/dist/delegate/ItemNavigation.js +244 -171
- package/dist/delegate/ResizeHandler.js +78 -38
- package/dist/delegate/ScrollEnablement.js +49 -20
- package/dist/features/OpenUI5Support.js +42 -7
- package/dist/generated/AssetParameters.js +1 -1
- package/dist/getSharedResource.js +30 -0
- package/dist/i18nBundle.js +27 -4
- package/dist/isLegacyBrowser.js +3 -0
- package/dist/locale/RTLAwareRegistry.js +14 -0
- package/dist/locale/applyDirection.js +17 -0
- package/dist/locale/directionChange.js +32 -0
- package/dist/locale/getEffectiveDir.js +28 -0
- package/dist/locale/getLocale.js +12 -2
- package/dist/locale/languageChange.js +22 -0
- package/dist/renderer/LitRenderer.js +21 -4
- package/dist/renderer/executeTemplate.js +17 -0
- package/dist/resources/bundle.esm.js +17 -109
- package/dist/resources/bundle.esm.js.map +1 -1
- package/dist/sap/base/Log.js +241 -0
- package/dist/sap/base/assert.js +8 -0
- package/dist/sap/base/security/URLListValidator.js +148 -0
- package/dist/sap/base/security/sanitizeHTML.js +16 -0
- package/dist/sap/base/util/now.js +7 -0
- package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
- package/dist/test-resources/assets/Themes.js +10 -6
- package/dist/test-resources/elements/Parent.js +6 -2
- package/dist/test-resources/elements/WithStaticArea.js +2 -1
- package/dist/test-resources/pages/AllTestElements.html +3 -3
- package/dist/test-resources/pages/Configuration.html +0 -2
- package/dist/test-resources/pages/ConfigurationScript.html +1 -3
- package/dist/test-resources/pages/assets/messagebundle_de.properties +1 -0
- package/dist/test-resources/pages/assets/messagebundle_en.properties +1 -0
- package/dist/test-resources/pages/assets/messagebundle_es.properties +1 -0
- package/dist/test-resources/pages/assets/messagebundle_fr.properties +1 -0
- package/dist/test-resources/pages/i18n.html +35 -0
- package/dist/test-resources/specs/ConfigurationChange.spec.js +11 -9
- package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
- package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
- package/dist/test-resources/specs/CustomTheme.spec.js +7 -5
- package/dist/test-resources/specs/EventProvider.spec.js +63 -0
- package/dist/test-resources/specs/StaticArea.spec.js +56 -12
- package/dist/test-resources/specs/Theming.spec.js +9 -7
- package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
- package/dist/test-resources/specs/UI5ElementLifecycle.js +19 -14
- package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
- package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
- package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
- package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
- package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
- package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
- package/dist/theming/CustomStyle.js +28 -7
- package/dist/theming/ThemeLoaded.js +22 -0
- package/dist/theming/applyTheme.js +2 -5
- package/dist/theming/getConstructableStyle.js +15 -10
- package/dist/theming/getEffectiveStyle.js +23 -8
- package/dist/theming/getStylesString.js +13 -0
- package/dist/types/CSSColor.js +9 -0
- package/dist/types/CalendarType.js +1 -1
- package/dist/types/DataType.js +13 -1
- package/dist/types/Float.js +14 -0
- package/dist/types/Integer.js +4 -0
- package/dist/types/InvisibleMessageMode.js +30 -0
- package/dist/types/ItemNavigationBehavior.js +2 -7
- package/dist/types/NavigationMode.js +1 -0
- package/dist/types/PopupState.js +1 -1
- package/dist/types/ValueState.js +1 -1
- package/dist/updateShadowRoot.js +26 -0
- package/dist/util/AriaLabelHelper.js +41 -0
- package/dist/util/Caret.js +45 -0
- package/dist/util/ColorConversion.js +370 -0
- package/dist/util/FocusableElements.js +25 -8
- package/dist/util/HTMLSanitizer.js +7 -0
- package/dist/util/InvisibleMessage.js +58 -0
- package/dist/util/PopupUtils.js +93 -0
- package/dist/util/SlotsHelper.js +43 -0
- package/dist/util/TabbableElements.js +1 -1
- package/dist/util/arraysAreEqual.js +15 -0
- package/dist/util/clamp.js +12 -0
- package/dist/util/debounce.js +17 -0
- package/dist/util/encodeCSS.js +24 -0
- package/dist/util/getActiveElement.js +11 -0
- package/dist/util/getClassCopy.js +10 -0
- package/dist/util/getEffectiveContentDensity.js +5 -0
- package/dist/util/getSingletonElementInstance.js +13 -0
- package/dist/util/isElementInView.js +15 -0
- package/dist/util/isNodeHidden.js +1 -5
- package/dist/util/isNodeTabbable.js +4 -4
- package/dist/util/isValidPropertyName.js +9 -3
- package/dist/util/setToArray.js +10 -0
- package/hash.txt +1 -0
- package/index.js +1 -1
- package/package-scripts.js +33 -18
- package/package.json +20 -11
- package/src/AssetRegistry.js +8 -6
- package/src/Boot.js +43 -0
- package/src/CustomElementsRegistry.js +24 -8
- package/src/CustomElementsScope.js +108 -0
- package/src/DOMObserver.js +65 -0
- package/src/Device.js +58 -779
- package/src/EventProvider.js +38 -26
- package/src/FontFace.js +52 -7
- package/src/InitialConfiguration.js +32 -8
- package/src/Keys.js +89 -2
- package/src/MediaRange.js +109 -0
- package/src/PropertiesFileFormat.js +95 -0
- package/src/Render.js +173 -0
- package/src/RenderQueue.js +41 -17
- package/src/RenderScheduler.js +24 -126
- package/src/StaticArea.js +1 -39
- package/src/StaticAreaItem.js +64 -62
- package/src/SystemCSSVars.js +31 -0
- package/src/Theming.js +2 -1
- package/src/UI5Element.js +427 -299
- package/src/UI5ElementMetadata.js +157 -19
- package/src/asset-registries/Icons.js +118 -14
- package/src/asset-registries/Illustrations.js +30 -0
- package/src/asset-registries/LocaleData.js +90 -65
- package/src/asset-registries/Themes.js +23 -32
- package/src/asset-registries/i18n.js +72 -30
- package/src/config/AnimationMode.js +11 -1
- package/src/config/Language.js +58 -2
- package/src/delegate/ItemNavigation.js +244 -171
- package/src/delegate/ResizeHandler.js +78 -38
- package/src/delegate/ScrollEnablement.js +49 -20
- package/src/features/OpenUI5Support.js +42 -7
- package/src/getSharedResource.js +30 -0
- package/src/i18nBundle.js +27 -4
- package/src/isLegacyBrowser.js +3 -0
- package/src/locale/RTLAwareRegistry.js +14 -0
- package/src/locale/applyDirection.js +17 -0
- package/src/locale/directionChange.js +32 -0
- package/src/locale/getEffectiveDir.js +28 -0
- package/src/locale/getLocale.js +12 -2
- package/src/locale/languageChange.js +22 -0
- package/src/renderer/LitRenderer.js +21 -4
- package/src/renderer/executeTemplate.js +17 -0
- package/src/theming/CustomStyle.js +28 -7
- package/src/theming/ThemeLoaded.js +22 -0
- package/src/theming/applyTheme.js +2 -5
- package/src/theming/getConstructableStyle.js +15 -10
- package/src/theming/getEffectiveStyle.js +23 -8
- package/src/theming/getStylesString.js +13 -0
- package/src/types/CSSColor.js +9 -0
- package/src/types/CalendarType.js +1 -1
- package/src/types/DataType.js +13 -1
- package/src/types/Float.js +14 -0
- package/src/types/Integer.js +4 -0
- package/src/types/InvisibleMessageMode.js +30 -0
- package/src/types/ItemNavigationBehavior.js +2 -7
- package/src/types/NavigationMode.js +1 -0
- package/src/types/PopupState.js +1 -1
- package/src/types/ValueState.js +1 -1
- package/src/updateShadowRoot.js +26 -0
- package/src/util/AriaLabelHelper.js +41 -0
- package/src/util/Caret.js +45 -0
- package/src/util/ColorConversion.js +370 -0
- package/src/util/FocusableElements.js +25 -8
- package/src/util/HTMLSanitizer.js +7 -0
- package/src/util/InvisibleMessage.js +58 -0
- package/src/util/PopupUtils.js +93 -0
- package/src/util/SlotsHelper.js +43 -0
- package/src/util/TabbableElements.js +1 -1
- package/src/util/arraysAreEqual.js +15 -0
- package/src/util/clamp.js +12 -0
- package/src/util/debounce.js +17 -0
- package/src/util/encodeCSS.js +24 -0
- package/src/util/getActiveElement.js +11 -0
- package/src/util/getClassCopy.js +10 -0
- package/src/util/getEffectiveContentDensity.js +5 -0
- package/src/util/getSingletonElementInstance.js +13 -0
- package/src/util/isElementInView.js +15 -0
- package/src/util/isNodeHidden.js +1 -5
- package/src/util/isNodeTabbable.js +4 -4
- package/src/util/isValidPropertyName.js +9 -3
- package/src/util/setToArray.js +10 -0
- package/used-modules.txt +7 -0
- package/bundle.es5.js +0 -28
- package/dist/SVGIconRegistry.js +0 -60
- package/dist/boot.js +0 -32
- package/dist/compatibility/DOMObserver.js +0 -62
- package/dist/compatibility/patchNodeValue.js +0 -24
- package/dist/compatibility/whenPolyfillLoaded.js +0 -26
- package/dist/delegate/CustomResize.js +0 -78
- package/dist/delegate/NativeResize.js +0 -44
- package/dist/features/browsersupport/Edge.js +0 -6
- package/dist/features/browsersupport/IE11.js +0 -41
- package/dist/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
- package/dist/renderer/ifDefined.js +0 -21
- package/dist/resources/bundle.es5.js +0 -212
- package/dist/resources/bundle.es5.js.map +0 -1
- package/dist/theming/CSSVarsPonyfill.js +0 -24
- package/dist/theming/adaptCSSForIE.js +0 -90
- package/dist/theming/createComponentStyleTag.js +0 -49
- package/dist/thirdparty/Array.from.js +0 -16
- package/dist/thirdparty/Array.prototype.fill.js +0 -44
- package/dist/thirdparty/Array.prototype.find.js +0 -46
- package/dist/thirdparty/Array.prototype.includes.js +0 -51
- package/dist/thirdparty/Element.prototype.closest.js +0 -11
- package/dist/thirdparty/Element.prototype.matches.js +0 -6
- package/dist/thirdparty/Map.prototype.keys.js +0 -9
- package/dist/thirdparty/Number.isInteger.js +0 -5
- package/dist/thirdparty/Number.isNaN.js +0 -1
- package/dist/thirdparty/Number.parseInt.js +0 -1
- package/dist/thirdparty/Object.assign.js +0 -31
- package/dist/thirdparty/Object.entries.js +0 -11
- package/dist/thirdparty/Symbol.js +0 -2
- package/dist/thirdparty/WeakSet.js +0 -27
- package/dist/thirdparty/es6-string-methods.js +0 -182
- package/dist/thirdparty/events-polyfills.js +0 -89
- package/dist/thirdparty/fetch.js +0 -1
- package/dist/thirdparty/template.js +0 -600
- package/dist/thirdparty/webcomponents-sd-ce-pf.js +0 -318
- package/dist/webcomponentsjs/LICENSE.md +0 -19
- package/dist/webcomponentsjs/README.md +0 -229
- package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
- package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
- package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
- package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
- package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
- package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
- package/dist/webcomponentsjs/package.json +0 -46
- package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
- package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
- package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
- package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
- package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
- package/src/SVGIconRegistry.js +0 -60
- package/src/boot.js +0 -32
- package/src/compatibility/DOMObserver.js +0 -62
- package/src/compatibility/patchNodeValue.js +0 -24
- package/src/compatibility/whenPolyfillLoaded.js +0 -26
- package/src/delegate/CustomResize.js +0 -78
- package/src/delegate/NativeResize.js +0 -44
- package/src/features/browsersupport/Edge.js +0 -6
- package/src/features/browsersupport/IE11.js +0 -41
- package/src/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
- package/src/renderer/ifDefined.js +0 -21
- package/src/theming/CSSVarsPonyfill.js +0 -24
- package/src/theming/adaptCSSForIE.js +0 -90
- package/src/theming/createComponentStyleTag.js +0 -49
- package/src/thirdparty/Array.from.js +0 -16
- package/src/thirdparty/Array.prototype.fill.js +0 -44
- package/src/thirdparty/Array.prototype.find.js +0 -46
- package/src/thirdparty/Array.prototype.includes.js +0 -51
- package/src/thirdparty/Element.prototype.closest.js +0 -11
- package/src/thirdparty/Element.prototype.matches.js +0 -6
- package/src/thirdparty/Map.prototype.keys.js +0 -9
- package/src/thirdparty/Number.isInteger.js +0 -5
- package/src/thirdparty/Number.isNaN.js +0 -1
- package/src/thirdparty/Number.parseInt.js +0 -1
- package/src/thirdparty/Object.assign.js +0 -31
- package/src/thirdparty/Object.entries.js +0 -11
- package/src/thirdparty/Symbol.js +0 -2
- package/src/thirdparty/WeakSet.js +0 -27
- package/src/thirdparty/es6-string-methods.js +0 -182
- package/src/thirdparty/events-polyfills.js +0 -89
- package/src/thirdparty/fetch.js +0 -1
- package/src/thirdparty/template.js +0 -600
- package/src/thirdparty/webcomponents-sd-ce-pf.js +0 -318
package/dist/EventProvider.js
CHANGED
|
@@ -1,72 +1,84 @@
|
|
|
1
1
|
class EventProvider {
|
|
2
2
|
constructor() {
|
|
3
|
-
this._eventRegistry =
|
|
3
|
+
this._eventRegistry = new Map();
|
|
4
4
|
}
|
|
5
5
|
|
|
6
6
|
attachEvent(eventName, fnFunction) {
|
|
7
7
|
const eventRegistry = this._eventRegistry;
|
|
8
|
-
|
|
8
|
+
const eventListeners = eventRegistry.get(eventName);
|
|
9
9
|
|
|
10
10
|
if (!Array.isArray(eventListeners)) {
|
|
11
|
-
eventRegistry
|
|
12
|
-
|
|
11
|
+
eventRegistry.set(eventName, [fnFunction]);
|
|
12
|
+
return;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
eventListeners.
|
|
16
|
-
|
|
17
|
-
}
|
|
15
|
+
if (!eventListeners.includes(fnFunction)) {
|
|
16
|
+
eventListeners.push(fnFunction);
|
|
17
|
+
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
detachEvent(eventName, fnFunction) {
|
|
21
21
|
const eventRegistry = this._eventRegistry;
|
|
22
|
-
|
|
22
|
+
const eventListeners = eventRegistry.get(eventName);
|
|
23
23
|
|
|
24
24
|
if (!eventListeners) {
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
+
const indexOfFnToDetach = eventListeners.indexOf(fnFunction);
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
29
|
+
if (indexOfFnToDetach !== -1) {
|
|
30
|
+
eventListeners.splice(indexOfFnToDetach, 1);
|
|
31
|
+
}
|
|
31
32
|
|
|
32
33
|
if (eventListeners.length === 0) {
|
|
33
|
-
delete
|
|
34
|
+
eventRegistry.delete(eventName);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Fires an event and returns the results of all event listeners as an array.
|
|
40
|
+
*
|
|
41
|
+
* @param eventName the event to fire
|
|
42
|
+
* @param data optional data to pass to each event listener
|
|
43
|
+
* @returns {Array} an array with the results of all event listeners
|
|
44
|
+
*/
|
|
37
45
|
fireEvent(eventName, data) {
|
|
38
46
|
const eventRegistry = this._eventRegistry;
|
|
39
|
-
const eventListeners = eventRegistry
|
|
47
|
+
const eventListeners = eventRegistry.get(eventName);
|
|
40
48
|
|
|
41
49
|
if (!eventListeners) {
|
|
42
|
-
return;
|
|
50
|
+
return [];
|
|
43
51
|
}
|
|
44
52
|
|
|
45
|
-
eventListeners.
|
|
46
|
-
|
|
53
|
+
return eventListeners.map(fn => {
|
|
54
|
+
return fn.call(this, data); // eslint-disable-line
|
|
47
55
|
});
|
|
48
56
|
}
|
|
49
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Fires an event and returns a promise that will resolve once all listeners have resolved.
|
|
60
|
+
*
|
|
61
|
+
* @param eventName the event to fire
|
|
62
|
+
* @param data optional data to pass to each event listener
|
|
63
|
+
* @returns {Promise} a promise that will resolve when all listeners have resolved
|
|
64
|
+
*/
|
|
65
|
+
fireEventAsync(eventName, data) {
|
|
66
|
+
return Promise.all(this.fireEvent(eventName, data));
|
|
67
|
+
}
|
|
68
|
+
|
|
50
69
|
isHandlerAttached(eventName, fnFunction) {
|
|
51
70
|
const eventRegistry = this._eventRegistry;
|
|
52
|
-
const eventListeners = eventRegistry
|
|
71
|
+
const eventListeners = eventRegistry.get(eventName);
|
|
53
72
|
|
|
54
73
|
if (!eventListeners) {
|
|
55
74
|
return false;
|
|
56
75
|
}
|
|
57
76
|
|
|
58
|
-
|
|
59
|
-
const event = eventListeners[i];
|
|
60
|
-
if (event["function"] === fnFunction) { // eslint-disable-line
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return false;
|
|
77
|
+
return eventListeners.includes(fnFunction);
|
|
66
78
|
}
|
|
67
79
|
|
|
68
80
|
hasListeners(eventName) {
|
|
69
|
-
return !!this._eventRegistry
|
|
81
|
+
return !!this._eventRegistry.get(eventName);
|
|
70
82
|
}
|
|
71
83
|
}
|
|
72
84
|
|
package/dist/FontFace.js
CHANGED
|
@@ -56,18 +56,63 @@ const fontFaceCSS = `
|
|
|
56
56
|
}
|
|
57
57
|
`;
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Some diacritics are supported by the 72 font:
|
|
61
|
+
* * Grave
|
|
62
|
+
* * Acute
|
|
63
|
+
* * Circumflex
|
|
64
|
+
* * Tilde
|
|
65
|
+
*
|
|
66
|
+
* However, the following diacritics and the combination of multiple diacritics (including the supported ones) are not supported:
|
|
67
|
+
* * Breve
|
|
68
|
+
* * Horn
|
|
69
|
+
* * Dot below
|
|
70
|
+
* * Hook above
|
|
71
|
+
*
|
|
72
|
+
*
|
|
73
|
+
* Override for the characters that aren't covered by the '72' font to other system fonts
|
|
74
|
+
*
|
|
75
|
+
* U+0102-0103: A and a with Breve
|
|
76
|
+
* U+01A0-01A1: O and o with Horn
|
|
77
|
+
* U+01AF-01B0: U and u with Horn
|
|
78
|
+
* U+1EA0-1EB7: A and a with diacritics that are not supported by the font and combination of multiple diacritics
|
|
79
|
+
* U+1EB8-1EC7: E and e with diacritics that are not supported by the font and combination of multiple diacritics
|
|
80
|
+
* U+1EC8-1ECB: I and i with diacritics that are not supported by the font and combination of multiple diacritics
|
|
81
|
+
* U+1ECC-1EE3: O and o with diacritics that are not supported by the font and combination of multiple diacritics
|
|
82
|
+
* U+1EE4-1EF1: U and u with diacritics that are not supported by the font and combination of multiple diacritics
|
|
83
|
+
* U+1EF4-1EF7: Y and y with diacritics that are not supported by the font and combination of multiple diacritics
|
|
84
|
+
*
|
|
85
|
+
*/
|
|
86
|
+
const overrideFontFaceCSS = `
|
|
87
|
+
@font-face {
|
|
88
|
+
font-family: '72override';
|
|
89
|
+
unicode-range: U+0102-0103, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EB7, U+1EB8-1EC7, U+1EC8-1ECB, U+1ECC-1EE3, U+1EE4-1EF1, U+1EF4-1EF7;
|
|
90
|
+
src: local('Arial'), local('Helvetica'), local('sans-serif');
|
|
62
91
|
}
|
|
92
|
+
`;
|
|
63
93
|
|
|
64
|
-
|
|
94
|
+
const insertFontFace = () => {
|
|
65
95
|
const OpenUI5Support = getFeature("OpenUI5Support");
|
|
66
|
-
|
|
67
|
-
|
|
96
|
+
|
|
97
|
+
// Only set the main font if there is no OpenUI5 support, or there is, but OpenUI5 is not loaded
|
|
98
|
+
if (!OpenUI5Support || !OpenUI5Support.isLoaded()) {
|
|
99
|
+
insertMainFontFace();
|
|
68
100
|
}
|
|
69
101
|
|
|
70
|
-
|
|
102
|
+
// Always set the override font - OpenUI5 in CSS Vars mode does not set it, unlike the main font
|
|
103
|
+
insertOverrideFontFace();
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const insertMainFontFace = () => {
|
|
107
|
+
if (!document.querySelector(`head>style[data-ui5-font-face]`)) {
|
|
108
|
+
createStyleInHead(fontFaceCSS, { "data-ui5-font-face": "" });
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const insertOverrideFontFace = () => {
|
|
113
|
+
if (!document.querySelector(`head>style[data-ui5-font-face-override]`)) {
|
|
114
|
+
createStyleInHead(overrideFontFaceCSS, { "data-ui5-font-face-override": "" });
|
|
115
|
+
}
|
|
71
116
|
};
|
|
72
117
|
|
|
73
118
|
export default insertFontFace;
|
|
@@ -12,6 +12,7 @@ let initialConfig = {
|
|
|
12
12
|
calendarType: null,
|
|
13
13
|
noConflict: false, // no URL
|
|
14
14
|
formatSettings: {},
|
|
15
|
+
fetchDefaultLanguage: false,
|
|
15
16
|
};
|
|
16
17
|
|
|
17
18
|
/* General settings */
|
|
@@ -35,6 +36,16 @@ const getLanguage = () => {
|
|
|
35
36
|
return initialConfig.language;
|
|
36
37
|
};
|
|
37
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Returns if the default language, that is inlined at build time,
|
|
41
|
+
* should be fetched over the network instead.
|
|
42
|
+
* @returns {Boolean}
|
|
43
|
+
*/
|
|
44
|
+
const getFetchDefaultLanguage = () => {
|
|
45
|
+
initConfiguration();
|
|
46
|
+
return initialConfig.fetchDefaultLanguage;
|
|
47
|
+
};
|
|
48
|
+
|
|
38
49
|
const getNoConflict = () => {
|
|
39
50
|
initConfiguration();
|
|
40
51
|
return initialConfig.noConflict;
|
|
@@ -75,23 +86,36 @@ const parseConfigurationScript = () => {
|
|
|
75
86
|
const parseURLParameters = () => {
|
|
76
87
|
const params = new URLSearchParams(window.location.search);
|
|
77
88
|
|
|
89
|
+
// Process "sap-*" params first
|
|
78
90
|
params.forEach((value, key) => {
|
|
79
|
-
|
|
91
|
+
const parts = key.split("sap-").length;
|
|
92
|
+
if (parts === 0 || parts === key.split("sap-ui-").length) {
|
|
80
93
|
return;
|
|
81
94
|
}
|
|
82
95
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const param = key.split("sap-ui-")[1];
|
|
96
|
+
applyURLParam(key, value, "sap");
|
|
97
|
+
});
|
|
86
98
|
|
|
87
|
-
|
|
88
|
-
|
|
99
|
+
// Process "sap-ui-*" params
|
|
100
|
+
params.forEach((value, key) => {
|
|
101
|
+
if (!key.startsWith("sap-ui")) {
|
|
102
|
+
return;
|
|
89
103
|
}
|
|
90
104
|
|
|
91
|
-
|
|
105
|
+
applyURLParam(key, value, "sap-ui");
|
|
92
106
|
});
|
|
93
107
|
};
|
|
94
108
|
|
|
109
|
+
const applyURLParam = (key, value, paramType) => {
|
|
110
|
+
const lowerCaseValue = value.toLowerCase();
|
|
111
|
+
const param = key.split(`${paramType}-`)[1];
|
|
112
|
+
|
|
113
|
+
if (booleanMapping.has(value)) {
|
|
114
|
+
value = booleanMapping.get(lowerCaseValue);
|
|
115
|
+
}
|
|
116
|
+
initialConfig[param] = value;
|
|
117
|
+
};
|
|
118
|
+
|
|
95
119
|
const applyOpenUI5Configuration = () => {
|
|
96
120
|
const OpenUI5Support = getFeature("OpenUI5Support");
|
|
97
121
|
if (!OpenUI5Support || !OpenUI5Support.isLoaded()) {
|
|
@@ -102,7 +126,6 @@ const applyOpenUI5Configuration = () => {
|
|
|
102
126
|
initialConfig = merge(initialConfig, OpenUI5Config);
|
|
103
127
|
};
|
|
104
128
|
|
|
105
|
-
|
|
106
129
|
const initConfiguration = () => {
|
|
107
130
|
if (initialized) {
|
|
108
131
|
return;
|
|
@@ -125,6 +148,7 @@ export {
|
|
|
125
148
|
getTheme,
|
|
126
149
|
getRTL,
|
|
127
150
|
getLanguage,
|
|
151
|
+
getFetchDefaultLanguage,
|
|
128
152
|
getNoConflict,
|
|
129
153
|
getCalendarType,
|
|
130
154
|
getFormatSettings,
|
package/dist/Keys.js
CHANGED
|
@@ -105,8 +105,12 @@ const KeyCodes = {
|
|
|
105
105
|
|
|
106
106
|
const isEnter = event => (event.key ? event.key === "Enter" : event.keyCode === KeyCodes.ENTER) && !hasModifierKeys(event);
|
|
107
107
|
|
|
108
|
+
const isEnterShift = event => (event.key ? event.key === "Enter" : event.keyCode === KeyCodes.ENTER) && checkModifierKeys(event, false, false, true);
|
|
109
|
+
|
|
108
110
|
const isSpace = event => (event.key ? (event.key === "Spacebar" || event.key === " ") : event.keyCode === KeyCodes.SPACE) && !hasModifierKeys(event);
|
|
109
111
|
|
|
112
|
+
const isSpaceShift = event => (event.key ? (event.key === "Spacebar" || event.key === " ") : event.keyCode === KeyCodes.SPACE) && checkModifierKeys(event, false, false, true);
|
|
113
|
+
|
|
110
114
|
const isLeft = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && !hasModifierKeys(event);
|
|
111
115
|
|
|
112
116
|
const isRight = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && !hasModifierKeys(event);
|
|
@@ -115,10 +119,34 @@ const isUp = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up
|
|
|
115
119
|
|
|
116
120
|
const isDown = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && !hasModifierKeys(event);
|
|
117
121
|
|
|
122
|
+
const isLeftCtrl = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, true, false, false);
|
|
123
|
+
|
|
124
|
+
const isRightCtrl = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, true, false, false);
|
|
125
|
+
|
|
126
|
+
const isUpCtrl = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, true, false, false);
|
|
127
|
+
|
|
128
|
+
const isDownCtrl = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, false, false);
|
|
129
|
+
|
|
130
|
+
const isUpShift = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, false, false, true);
|
|
131
|
+
|
|
132
|
+
const isDownShift = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, false, false, true);
|
|
133
|
+
|
|
134
|
+
const isLeftShift = event => (event.key ? (event.key === "ArrowLeft" || event.key === "Left") : event.keyCode === KeyCodes.ARROW_LEFT) && checkModifierKeys(event, false, false, true);
|
|
135
|
+
|
|
136
|
+
const isRightShift = event => (event.key ? (event.key === "ArrowRight" || event.key === "Right") : event.keyCode === KeyCodes.ARROW_RIGHT) && checkModifierKeys(event, false, false, true);
|
|
137
|
+
|
|
138
|
+
const isUpShiftCtrl = event => (event.key ? (event.key === "ArrowUp" || event.key === "Up") : event.keyCode === KeyCodes.ARROW_UP) && checkModifierKeys(event, true, false, true);
|
|
139
|
+
|
|
140
|
+
const isDownShiftCtrl = event => (event.key ? (event.key === "ArrowDown" || event.key === "Down") : event.keyCode === KeyCodes.ARROW_DOWN) && checkModifierKeys(event, true, false, true);
|
|
141
|
+
|
|
118
142
|
const isHome = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && !hasModifierKeys(event);
|
|
119
143
|
|
|
120
144
|
const isEnd = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && !hasModifierKeys(event);
|
|
121
145
|
|
|
146
|
+
const isHomeCtrl = event => (event.key ? event.key === "Home" : event.keyCode === KeyCodes.HOME) && checkModifierKeys(event, true, false, false);
|
|
147
|
+
|
|
148
|
+
const isEndCtrl = event => (event.key ? event.key === "End" : event.keyCode === KeyCodes.END) && checkModifierKeys(event, true, false, false);
|
|
149
|
+
|
|
122
150
|
const isEscape = event => (event.key ? event.key === "Escape" || event.key === "Esc" : event.keyCode === KeyCodes.ESCAPE) && !hasModifierKeys(event);
|
|
123
151
|
|
|
124
152
|
const isTabNext = event => (event.key ? event.key === "Tab" : event.keyCode === KeyCodes.TAB) && !hasModifierKeys(event);
|
|
@@ -129,33 +157,92 @@ const isBackSpace = event => (event.key ? event.key === "Backspace" : event.keyC
|
|
|
129
157
|
|
|
130
158
|
const isDelete = event => (event.key ? event.key === "Delete" : event.keyCode === KeyCodes.DELETE) && !hasModifierKeys(event);
|
|
131
159
|
|
|
160
|
+
const isPageUp = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && !hasModifierKeys(event);
|
|
161
|
+
|
|
162
|
+
const isPageDown = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && !hasModifierKeys(event);
|
|
163
|
+
|
|
164
|
+
const isPageUpShift = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, false, true);
|
|
165
|
+
|
|
166
|
+
const isPageUpAlt = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, false, true, false);
|
|
167
|
+
|
|
168
|
+
const isPageDownShift = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, false, true);
|
|
169
|
+
|
|
170
|
+
const isPageDownAlt = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, false, true, false);
|
|
171
|
+
|
|
172
|
+
const isPageUpShiftCtrl = event => (event.key ? event.key === "PageUp" : event.keyCode === KeyCodes.PAGE_UP) && checkModifierKeys(event, true, false, true);
|
|
173
|
+
|
|
174
|
+
const isPageDownShiftCtrl = event => (event.key ? event.key === "PageDown" : event.keyCode === KeyCodes.PAGE_DOWN) && checkModifierKeys(event, true, false, true);
|
|
175
|
+
|
|
176
|
+
const isPlus = event => (event.key ? event.key === "+" : event.keyCode === KeyCodes.PLUS) || (event.keyCode === KeyCodes.NUMPAD_PLUS && !hasModifierKeys(event));
|
|
177
|
+
|
|
178
|
+
const isMinus = event => (event.key ? event.key === "-" : event.keyCode === KeyCodes.MINUS) || (event.keyCode === KeyCodes.NUMPAD_MINUS && !hasModifierKeys(event));
|
|
179
|
+
|
|
132
180
|
const isShow = event => {
|
|
133
181
|
if (event.key) {
|
|
134
|
-
return (event
|
|
182
|
+
return isF4(event) || isShowByArrows(event);
|
|
135
183
|
}
|
|
136
184
|
|
|
137
185
|
return (event.keyCode === KeyCodes.F4 && !hasModifierKeys(event)) || (event.keyCode === KeyCodes.ARROW_DOWN && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false));
|
|
138
186
|
};
|
|
139
187
|
|
|
188
|
+
const isF4 = event => {
|
|
189
|
+
return event.key === "F4" && !hasModifierKeys(event);
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
const isF4Shift = event => (event.key ? event.key === "F4" : event.keyCode === KeyCodes.F4) && checkModifierKeys(event, false, false, true);
|
|
193
|
+
|
|
194
|
+
const isF7 = event => (event.key ? event.key === "F7" : event.keyCode === KeyCodes.F7) && !hasModifierKeys(event);
|
|
195
|
+
|
|
196
|
+
const isShowByArrows = event => {
|
|
197
|
+
return ((event.key === "ArrowDown" || event.key === "Down") || (event.key === "ArrowUp" || event.key === "Up")) && checkModifierKeys(event, /* Ctrl */ false, /* Alt */ true, /* Shift */ false);
|
|
198
|
+
};
|
|
199
|
+
|
|
140
200
|
const hasModifierKeys = event => event.shiftKey || event.altKey || getCtrlKey(event);
|
|
141
201
|
|
|
142
202
|
const getCtrlKey = event => !!(event.metaKey || event.ctrlKey); // double negation doesn't have effect on boolean but ensures null and undefined are equivalent to false.
|
|
143
203
|
|
|
144
|
-
const checkModifierKeys = (
|
|
204
|
+
const checkModifierKeys = (event, bCtrlKey, bAltKey, bShiftKey) => event.shiftKey === bShiftKey && event.altKey === bAltKey && getCtrlKey(event) === bCtrlKey;
|
|
145
205
|
|
|
146
206
|
export {
|
|
147
207
|
isEnter,
|
|
208
|
+
isEnterShift,
|
|
148
209
|
isSpace,
|
|
210
|
+
isSpaceShift,
|
|
149
211
|
isLeft,
|
|
150
212
|
isRight,
|
|
151
213
|
isUp,
|
|
152
214
|
isDown,
|
|
215
|
+
isLeftCtrl,
|
|
216
|
+
isRightCtrl,
|
|
217
|
+
isUpCtrl,
|
|
218
|
+
isDownCtrl,
|
|
219
|
+
isUpShift,
|
|
220
|
+
isDownShift,
|
|
221
|
+
isLeftShift,
|
|
222
|
+
isRightShift,
|
|
223
|
+
isUpShiftCtrl,
|
|
224
|
+
isDownShiftCtrl,
|
|
153
225
|
isHome,
|
|
154
226
|
isEnd,
|
|
227
|
+
isPlus,
|
|
228
|
+
isMinus,
|
|
229
|
+
isHomeCtrl,
|
|
230
|
+
isEndCtrl,
|
|
155
231
|
isEscape,
|
|
156
232
|
isTabNext,
|
|
157
233
|
isTabPrevious,
|
|
158
234
|
isBackSpace,
|
|
159
235
|
isDelete,
|
|
160
236
|
isShow,
|
|
237
|
+
isF4,
|
|
238
|
+
isF4Shift,
|
|
239
|
+
isF7,
|
|
240
|
+
isPageUp,
|
|
241
|
+
isPageDown,
|
|
242
|
+
isPageUpShift,
|
|
243
|
+
isPageUpAlt,
|
|
244
|
+
isPageDownShift,
|
|
245
|
+
isPageDownAlt,
|
|
246
|
+
isPageUpShiftCtrl,
|
|
247
|
+
isPageDownShiftCtrl,
|
|
161
248
|
};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const querySets = {};
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Initializes a screen width media query range set.
|
|
5
|
+
*
|
|
6
|
+
* This initialization step makes the range set ready to be used for one of the other functions in namespace <code>MediaRange</code>.
|
|
7
|
+
*
|
|
8
|
+
* A range set can be defined as shown in the following example:
|
|
9
|
+
* <pre>
|
|
10
|
+
* MediaRange.initRangeSet("MyRangeSet", [200, 400], ["Small", "Medium", "Large"]);
|
|
11
|
+
* </pre>
|
|
12
|
+
* This example defines the following named ranges:
|
|
13
|
+
* <ul>
|
|
14
|
+
* <li><code>"Small"</code>: For screens smaller than 200 pixels.</li>
|
|
15
|
+
* <li><code>"Medium"</code>: For screens greater than or equal to 200 pixels and smaller than 400 pixels.</li>
|
|
16
|
+
* <li><code>"Large"</code>: For screens greater than or equal to 400 pixels.</li>
|
|
17
|
+
* </ul>
|
|
18
|
+
*
|
|
19
|
+
* @param {string} name The name of the range set to be initialized.
|
|
20
|
+
* The name must be a valid id and consist only of letters and numeric digits.
|
|
21
|
+
*
|
|
22
|
+
* @param {int[]} [borders] The range borders
|
|
23
|
+
*
|
|
24
|
+
* @param {string[]} [names] The names of the ranges. The names must be a valid id and consist only of letters and digits.
|
|
25
|
+
*
|
|
26
|
+
* @name MediaRange.initRangeSet
|
|
27
|
+
* @function
|
|
28
|
+
* @public
|
|
29
|
+
*/
|
|
30
|
+
const _initRangeSet = (name, borders, names) => {
|
|
31
|
+
querySets[name] = {
|
|
32
|
+
borders,
|
|
33
|
+
names,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Returns information about the current active range of the range set with the given name.
|
|
39
|
+
*
|
|
40
|
+
* If the optional parameter <code>width</code> is given, the active range will be determined for that width,
|
|
41
|
+
* otherwise it is determined for the current window size.
|
|
42
|
+
*
|
|
43
|
+
* @param {string} name The name of the range set. The range set must be initialized beforehand ({@link MediaRange.initRangeSet})
|
|
44
|
+
* @param {int} [width] An optional width, based on which the range should be determined;
|
|
45
|
+
* If <code>width</code> is not provided, the window size will be used.
|
|
46
|
+
* @returns {string} The name of the current active interval of the range set.
|
|
47
|
+
*
|
|
48
|
+
* @name MediaRange.getCurrentRange
|
|
49
|
+
* @function
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
52
|
+
const _getCurrentRange = (name, width = window.innerWidth) => {
|
|
53
|
+
const querySet = querySets[name];
|
|
54
|
+
let i = 0;
|
|
55
|
+
|
|
56
|
+
if (!querySet) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
for (; i < querySet.borders.length; i++) {
|
|
61
|
+
if (width < querySet.borders[i]) {
|
|
62
|
+
return querySet.names[i];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return querySet.names[i];
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Enumeration containing the names and settings of predefined screen width media query range sets.
|
|
71
|
+
*
|
|
72
|
+
* @namespace
|
|
73
|
+
* @name MediaRange.RANGESETS
|
|
74
|
+
* @public
|
|
75
|
+
*/
|
|
76
|
+
const RANGESETS = {
|
|
77
|
+
/**
|
|
78
|
+
* A 4-step range set (S-M-L-XL).
|
|
79
|
+
*
|
|
80
|
+
* The ranges of this set are:
|
|
81
|
+
* <ul>
|
|
82
|
+
* <li><code>"S"</code>: For screens smaller than 600 pixels.</li>
|
|
83
|
+
* <li><code>"M"</code>: For screens greater than or equal to 600 pixels and smaller than 1024 pixels.</li>
|
|
84
|
+
* <li><code>"L"</code>: For screens greater than or equal to 1024 pixels and smaller than 1440 pixels.</li>
|
|
85
|
+
* <li><code>"XL"</code>: For screens greater than or equal to 1440 pixels.</li>
|
|
86
|
+
* </ul>
|
|
87
|
+
*
|
|
88
|
+
* @name MediaRange.RANGESETS.RANGE_4STEPS
|
|
89
|
+
* @public
|
|
90
|
+
*/
|
|
91
|
+
RANGE_4STEPS: "4Step",
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* API for screen width changes.
|
|
96
|
+
*
|
|
97
|
+
* @namespace
|
|
98
|
+
* @name MediaRange
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
const MediaRange = {
|
|
102
|
+
RANGESETS,
|
|
103
|
+
initRangeSet: _initRangeSet,
|
|
104
|
+
getCurrentRange: _getCurrentRange,
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
MediaRange.initRangeSet(MediaRange.RANGESETS.RANGE_4STEPS, [600, 1024, 1440], ["S", "M", "L", "XL"]);
|
|
108
|
+
|
|
109
|
+
export default MediaRange;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const flatstr = typeof chrome === "object" || typeof v8 === "object" ? (s, iConcatOps) => {
|
|
2
|
+
if (iConcatOps > 2 && 40 * iConcatOps > s.length) {
|
|
3
|
+
Number(s);
|
|
4
|
+
}
|
|
5
|
+
return s;
|
|
6
|
+
} : s => s;
|
|
7
|
+
|
|
8
|
+
const rLines = /(?:\r\n|\r|\n|^)[ \t\f]*/;
|
|
9
|
+
const rEscapesOrSeparator = /(\\u[0-9a-fA-F]{0,4})|(\\.)|(\\$)|([ \t\f]*[ \t\f:=][ \t\f]*)/g;
|
|
10
|
+
const rEscapes = /(\\u[0-9a-fA-F]{0,4})|(\\.)|(\\$)/g;
|
|
11
|
+
const mEscapes = {
|
|
12
|
+
"\\f": "\f",
|
|
13
|
+
"\\n": "\n",
|
|
14
|
+
"\\r": "\r",
|
|
15
|
+
"\\t": "\t",
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Parses a .properties format
|
|
20
|
+
* @param {string} sText the contents a of a .properties file
|
|
21
|
+
* @returns a object with key/value pairs parsed from the .properties file format
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
const parseProperties = sText => {
|
|
25
|
+
const properties = {},
|
|
26
|
+
aLines = sText.split(rLines);
|
|
27
|
+
|
|
28
|
+
let sLine,
|
|
29
|
+
rMatcher,
|
|
30
|
+
sKey,
|
|
31
|
+
sValue,
|
|
32
|
+
i,
|
|
33
|
+
m,
|
|
34
|
+
iLastIndex,
|
|
35
|
+
iConcatOps;
|
|
36
|
+
|
|
37
|
+
const append = s => {
|
|
38
|
+
if (sValue) {
|
|
39
|
+
sValue = `${sValue}${s}`;
|
|
40
|
+
iConcatOps++;
|
|
41
|
+
} else {
|
|
42
|
+
sValue = s;
|
|
43
|
+
iConcatOps = 0;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
for (i = 0; i < aLines.length; i++) {
|
|
48
|
+
sLine = aLines[i];
|
|
49
|
+
const skipLine = sLine === "" || sLine.charAt(0) === "#" || sLine.charAt(0) === "!";
|
|
50
|
+
|
|
51
|
+
if (!skipLine) {
|
|
52
|
+
rMatcher = rEscapesOrSeparator;
|
|
53
|
+
iLastIndex = 0;
|
|
54
|
+
rMatcher.lastIndex = iLastIndex;
|
|
55
|
+
sKey = null;
|
|
56
|
+
sValue = "";
|
|
57
|
+
m = rMatcher.exec(sLine);
|
|
58
|
+
while (m !== null) {
|
|
59
|
+
if (iLastIndex < m.index) {
|
|
60
|
+
append(sLine.slice(iLastIndex, m.index));
|
|
61
|
+
}
|
|
62
|
+
iLastIndex = rMatcher.lastIndex;
|
|
63
|
+
if (m[1]) {
|
|
64
|
+
if (m[1].length !== 6) {
|
|
65
|
+
throw new Error(`Incomplete Unicode Escape '${m[1]}'`);
|
|
66
|
+
}
|
|
67
|
+
append(String.fromCharCode(parseInt(m[1].slice(2), 16)));
|
|
68
|
+
} else if (m[2]) {
|
|
69
|
+
append(mEscapes[m[2]] || m[2].slice(1));
|
|
70
|
+
} else if (m[3]) {
|
|
71
|
+
sLine = aLines[++i];
|
|
72
|
+
iLastIndex = 0;
|
|
73
|
+
rMatcher.lastIndex = iLastIndex;
|
|
74
|
+
} else if (m[4]) {
|
|
75
|
+
sKey = sValue;
|
|
76
|
+
sValue = "";
|
|
77
|
+
rMatcher = rEscapes;
|
|
78
|
+
rMatcher.lastIndex = iLastIndex;
|
|
79
|
+
}
|
|
80
|
+
m = rMatcher.exec(sLine);
|
|
81
|
+
}
|
|
82
|
+
if (iLastIndex < sLine.length) {
|
|
83
|
+
append(sLine.slice(iLastIndex));
|
|
84
|
+
}
|
|
85
|
+
if (sKey == null) {
|
|
86
|
+
sKey = sValue;
|
|
87
|
+
sValue = "";
|
|
88
|
+
}
|
|
89
|
+
properties[sKey] = flatstr(sValue, sValue ? iConcatOps : 0);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return properties;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export default parseProperties;
|