roosterjs-content-model-core 9.7.0 → 9.8.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/lib/coreApi/announce/announce.js +9 -20
- package/lib/coreApi/announce/announce.js.map +1 -1
- package/lib/coreApi/setEditorStyle/ensureUniqueId.js +1 -1
- package/lib/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
- package/lib/corePlugin/lifecycle/LifecyclePlugin.js +3 -0
- package/lib/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
- package/lib/utils/createAriaLiveElement.d.ts +4 -0
- package/lib/utils/createAriaLiveElement.js +21 -0
- package/lib/utils/createAriaLiveElement.js.map +1 -0
- package/lib-amd/coreApi/announce/announce.js +9 -21
- package/lib-amd/coreApi/announce/announce.js.map +1 -1
- package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js +1 -1
- package/lib-amd/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
- package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js +3 -1
- package/lib-amd/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
- package/lib-amd/utils/createAriaLiveElement.d.ts +4 -0
- package/lib-amd/utils/createAriaLiveElement.js +23 -0
- package/lib-amd/utils/createAriaLiveElement.js.map +1 -0
- package/lib-mjs/coreApi/announce/announce.js +9 -20
- package/lib-mjs/coreApi/announce/announce.js.map +1 -1
- package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js +1 -1
- package/lib-mjs/coreApi/setEditorStyle/ensureUniqueId.js.map +1 -1
- package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js +3 -0
- package/lib-mjs/corePlugin/lifecycle/LifecyclePlugin.js.map +1 -1
- package/lib-mjs/utils/createAriaLiveElement.d.ts +4 -0
- package/lib-mjs/utils/createAriaLiveElement.js +17 -0
- package/lib-mjs/utils/createAriaLiveElement.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.announce = void 0;
|
|
4
|
+
var createAriaLiveElement_1 = require("../../utils/createAriaLiveElement");
|
|
5
|
+
var DOT_STRING = '.';
|
|
4
6
|
/**
|
|
5
7
|
* @internal
|
|
6
8
|
* Announce the given data
|
|
@@ -8,17 +10,17 @@ exports.announce = void 0;
|
|
|
8
10
|
* @param announceData Data to announce
|
|
9
11
|
*/
|
|
10
12
|
var announce = function (core, announceData) {
|
|
11
|
-
var _a;
|
|
12
|
-
var text = announceData.text, defaultStrings = announceData.defaultStrings, _b = announceData.formatStrings, formatStrings = _b === void 0 ? [] : _b;
|
|
13
|
+
var text = announceData.text, defaultStrings = announceData.defaultStrings, _a = announceData.formatStrings, formatStrings = _a === void 0 ? [] : _a;
|
|
13
14
|
var announcerStringGetter = core.lifecycle.announcerStringGetter;
|
|
14
15
|
var template = defaultStrings && (announcerStringGetter === null || announcerStringGetter === void 0 ? void 0 : announcerStringGetter(defaultStrings));
|
|
15
16
|
var textToAnnounce = formatString(template || text, formatStrings);
|
|
16
|
-
if (
|
|
17
|
+
if (!core.lifecycle.announceContainer) {
|
|
18
|
+
core.lifecycle.announceContainer = (0, createAriaLiveElement_1.createAriaLiveElement)(core.physicalRoot.ownerDocument);
|
|
19
|
+
}
|
|
20
|
+
if (textToAnnounce && core.lifecycle.announceContainer) {
|
|
17
21
|
var announceContainer = core.lifecycle.announceContainer;
|
|
18
|
-
if (
|
|
19
|
-
|
|
20
|
-
announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);
|
|
21
|
-
core.lifecycle.announceContainer = announceContainer;
|
|
22
|
+
if (textToAnnounce == announceContainer.textContent) {
|
|
23
|
+
textToAnnounce += DOT_STRING;
|
|
22
24
|
}
|
|
23
25
|
if (announceContainer) {
|
|
24
26
|
announceContainer.textContent = textToAnnounce;
|
|
@@ -37,17 +39,4 @@ function formatString(text, formatStrings) {
|
|
|
37
39
|
});
|
|
38
40
|
return text;
|
|
39
41
|
}
|
|
40
|
-
function createAriaLiveElement(document) {
|
|
41
|
-
var div = document.createElement('div');
|
|
42
|
-
div.style.clip = 'rect(0px, 0px, 0px, 0px)';
|
|
43
|
-
div.style.clipPath = 'inset(100%)';
|
|
44
|
-
div.style.height = '1px';
|
|
45
|
-
div.style.overflow = 'hidden';
|
|
46
|
-
div.style.position = 'absolute';
|
|
47
|
-
div.style.whiteSpace = 'nowrap';
|
|
48
|
-
div.style.width = '1px';
|
|
49
|
-
div.ariaLive = 'assertive';
|
|
50
|
-
document.body.appendChild(div);
|
|
51
|
-
return div;
|
|
52
|
-
}
|
|
53
42
|
//# sourceMappingURL=announce.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts"],"names":[],"mappings":";;;AAAA,2EAA0E;AAG1E,IAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;;;GAKG;AACI,IAAM,QAAQ,GAAa,UAAC,IAAI,EAAE,YAAY;IACzC,IAAA,IAAI,GAAyC,YAAY,KAArD,EAAE,cAAc,GAAyB,YAAY,eAArC,EAAE,KAAuB,YAAY,cAAjB,EAAlB,aAAa,mBAAG,EAAE,KAAA,CAAkB;IAC1D,IAAA,qBAAqB,GAAK,IAAI,CAAC,SAAS,sBAAnB,CAAoB;IACjD,IAAM,QAAQ,GAAG,cAAc,KAAI,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAG,cAAc,CAAC,CAAA,CAAC;IAC3E,IAAI,cAAc,GAAG,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC;IAEnE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QACnC,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAA,6CAAqB,EAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;KAC7F;IAED,IAAI,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QAC5C,IAAA,iBAAiB,GAAK,IAAI,CAAC,SAAS,kBAAnB,CAAoB;QAC7C,IAAI,cAAc,IAAI,iBAAiB,CAAC,WAAW,EAAE;YACjD,cAAc,IAAI,UAAU,CAAC;SAChC;QAED,IAAI,iBAAiB,EAAE;YACnB,iBAAiB,CAAC,WAAW,GAAG,cAAc,CAAC;SAClD;KACJ;AACL,CAAC,CAAC;AApBW,QAAA,QAAQ,YAoBnB;AAEF,SAAS,YAAY,CAAC,IAAwB,EAAE,aAAuB;IACnE,IAAI,IAAI,IAAI,SAAS,EAAE;QACnB,OAAO,IAAI,CAAC;KACf;IAED,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,UAAC,CAAC,EAAE,GAAW;QAC7C,IAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type { Announce } from 'roosterjs-content-model-types';\n\nconst DOT_STRING = '.';\n\n/**\n * @internal\n * Announce the given data\n * @param core The EditorCore object\n * @param announceData Data to announce\n */\nexport const announce: Announce = (core, announceData) => {\n const { text, defaultStrings, formatStrings = [] } = announceData;\n const { announcerStringGetter } = core.lifecycle;\n const template = defaultStrings && announcerStringGetter?.(defaultStrings);\n let textToAnnounce = formatString(template || text, formatStrings);\n\n if (!core.lifecycle.announceContainer) {\n core.lifecycle.announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);\n }\n\n if (textToAnnounce && core.lifecycle.announceContainer) {\n const { announceContainer } = core.lifecycle;\n if (textToAnnounce == announceContainer.textContent) {\n textToAnnounce += DOT_STRING;\n }\n\n if (announceContainer) {\n announceContainer.textContent = textToAnnounce;\n }\n }\n};\n\nfunction formatString(text: string | undefined, formatStrings: string[]) {\n if (text == undefined) {\n return text;\n }\n\n text = text.replace(/\\{(\\d+)\\}/g, (_, sub: string) => {\n const index = parseInt(sub);\n const replace = formatStrings[index];\n return replace ?? '';\n });\n\n return text;\n}\n"]}
|
|
@@ -8,7 +8,7 @@ function ensureUniqueId(element, idPrefix) {
|
|
|
8
8
|
idPrefix = element.id || idPrefix;
|
|
9
9
|
var doc = element.ownerDocument;
|
|
10
10
|
var i = 0;
|
|
11
|
-
while (!element.id || doc.querySelectorAll(
|
|
11
|
+
while (!element.id || doc.querySelectorAll("[id=\"" + element.id + "\"]").length > 1) {
|
|
12
12
|
element.id = idPrefix + '_' + i++;
|
|
13
13
|
}
|
|
14
14
|
return element.id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensureUniqueId.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,SAAgB,cAAc,CAAC,OAAoB,EAAE,QAAgB;IACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;IAElC,IAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"ensureUniqueId.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,SAAgB,cAAc,CAAC,OAAoB,EAAE,QAAgB;IACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;IAElC,IAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,WAAQ,OAAO,CAAC,EAAE,QAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QAC3E,OAAO,CAAC,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;KACrC;IAED,OAAO,OAAO,CAAC,EAAE,CAAC;AACtB,CAAC;AAXD,wCAWC","sourcesContent":["/**\n * @internal\n */\nexport function ensureUniqueId(element: HTMLElement, idPrefix: string): string {\n idPrefix = element.id || idPrefix;\n\n const doc = element.ownerDocument;\n let i = 0;\n\n while (!element.id || doc.querySelectorAll(`[id=\"${element.id}\"]`).length > 1) {\n element.id = idPrefix + '_' + i++;\n }\n\n return element.id;\n}\n"]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createLifecyclePlugin = void 0;
|
|
4
4
|
var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
|
|
5
|
+
var createAriaLiveElement_1 = require("../../utils/createAriaLiveElement");
|
|
5
6
|
var ContentEditableAttributeName = 'contenteditable';
|
|
6
7
|
var DefaultTextColor = '#000000';
|
|
7
8
|
var DefaultBackColor = '#ffffff';
|
|
@@ -61,6 +62,8 @@ var LifecyclePlugin = /** @class */ (function () {
|
|
|
61
62
|
this.adjustColor();
|
|
62
63
|
// Let other plugins know that we are ready
|
|
63
64
|
this.editor.triggerEvent('editorReady', {}, true /*broadcast*/);
|
|
65
|
+
// Initialize the Announce container.
|
|
66
|
+
this.state.announceContainer = (0, createAriaLiveElement_1.createAriaLiveElement)(editor.getDocument());
|
|
64
67
|
};
|
|
65
68
|
/**
|
|
66
69
|
* Dispose this plugin
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LifecyclePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/lifecycle/LifecyclePlugin.ts"],"names":[],"mappings":";;;AAAA,2EAAoF;
|
|
1
|
+
{"version":3,"file":"LifecyclePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/lifecycle/LifecyclePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource, getObjectKeys, setColor } from 'roosterjs-content-model-dom';\nimport { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type {\n IEditor,\n LifecyclePluginState,\n PluginEvent,\n PluginWithState,\n EditorOptions,\n} from 'roosterjs-content-model-types';\n\nconst ContentEditableAttributeName = 'contenteditable';\nconst DefaultTextColor = '#000000';\nconst DefaultBackColor = '#ffffff';\n\n/**\n * Lifecycle plugin handles editor initialization and disposing\n */\nclass LifecyclePlugin implements PluginWithState<LifecyclePluginState> {\n private editor: IEditor | null = null;\n private state: LifecyclePluginState;\n private initializer: (() => void) | null = null;\n private disposer: (() => void) | null = null;\n private adjustColor: () => void;\n\n /**\n * Construct a new instance of LifecyclePlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n // Make the container editable and set its selection styles\n if (contentDiv.getAttribute(ContentEditableAttributeName) === null) {\n this.initializer = () => {\n contentDiv.contentEditable = 'true';\n contentDiv.style.userSelect = 'text';\n };\n this.disposer = () => {\n contentDiv.style.userSelect = '';\n contentDiv.removeAttribute(ContentEditableAttributeName);\n };\n }\n this.adjustColor = options.doNotAdjustEditorColor\n ? () => {}\n : () => {\n this.adjustContainerColor(contentDiv);\n };\n\n this.state = {\n isDarkMode: !!options.inDarkMode,\n shadowEditFragment: null,\n styleElements: {},\n announcerStringGetter: options.announcerStringGetter,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'Lifecycle';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n // Set content DIV to be editable\n this.initializer?.();\n\n // Set editor background color for dark mode\n this.adjustColor();\n\n // Let other plugins know that we are ready\n this.editor.triggerEvent('editorReady', {}, true /*broadcast*/);\n\n // Initialize the Announce container.\n this.state.announceContainer = createAriaLiveElement(editor.getDocument());\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.editor?.triggerEvent('beforeDispose', {}, true /*broadcast*/);\n\n getObjectKeys(this.state.styleElements).forEach(key => {\n const element = this.state.styleElements[key];\n\n element.parentElement?.removeChild(element);\n delete this.state.styleElements[key];\n });\n\n const announceContainer = this.state.announceContainer;\n\n if (announceContainer) {\n announceContainer.parentElement?.removeChild(announceContainer);\n delete this.state.announceContainer;\n }\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n this.initializer = null;\n }\n\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n /**\n * Handle events triggered from editor\n * @param event PluginEvent object\n */\n onPluginEvent(event: PluginEvent) {\n if (\n event.eventType == 'contentChanged' &&\n (event.source == ChangeSource.SwitchToDarkMode ||\n event.source == ChangeSource.SwitchToLightMode)\n ) {\n this.adjustColor();\n }\n }\n\n private adjustContainerColor(contentDiv: HTMLElement) {\n if (this.editor) {\n const { isDarkMode } = this.state;\n const darkColorHandler = this.editor.getColorManager();\n\n setColor(\n contentDiv,\n DefaultTextColor,\n false /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n setColor(\n contentDiv,\n DefaultBackColor,\n true /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of LifecyclePlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createLifecyclePlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<LifecyclePluginState> {\n return new LifecyclePlugin(option, contentDiv);\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAriaLiveElement = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
function createAriaLiveElement(document) {
|
|
8
|
+
var div = document.createElement('div');
|
|
9
|
+
div.style.clip = 'rect(0px, 0px, 0px, 0px)';
|
|
10
|
+
div.style.clipPath = 'inset(100%)';
|
|
11
|
+
div.style.height = '1px';
|
|
12
|
+
div.style.overflow = 'hidden';
|
|
13
|
+
div.style.position = 'absolute';
|
|
14
|
+
div.style.whiteSpace = 'nowrap';
|
|
15
|
+
div.style.width = '1px';
|
|
16
|
+
div.ariaLive = 'assertive';
|
|
17
|
+
document.body.appendChild(div);
|
|
18
|
+
return div;
|
|
19
|
+
}
|
|
20
|
+
exports.createAriaLiveElement = createAriaLiveElement;
|
|
21
|
+
//# sourceMappingURL=createAriaLiveElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAriaLiveElement.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,SAAgB,qBAAqB,CAAC,QAAkB;IACpD,IAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1C,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,0BAA0B,CAAC;IAC5C,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;IACnC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACxB,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;IAE3B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE/B,OAAO,GAAG,CAAC;AACf,CAAC;AAfD,sDAeC","sourcesContent":["/**\n * @internal\n */\nexport function createAriaLiveElement(document: Document): HTMLDivElement {\n const div = document.createElement('div');\n\n div.style.clip = 'rect(0px, 0px, 0px, 0px)';\n div.style.clipPath = 'inset(100%)';\n div.style.height = '1px';\n div.style.overflow = 'hidden';\n div.style.position = 'absolute';\n div.style.whiteSpace = 'nowrap';\n div.style.width = '1px';\n div.ariaLive = 'assertive';\n\n document.body.appendChild(div);\n\n return div;\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
define(["require", "exports"], function (require, exports) {
|
|
1
|
+
define(["require", "exports", "../../utils/createAriaLiveElement"], function (require, exports, createAriaLiveElement_1) {
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.announce = void 0;
|
|
5
|
+
var DOT_STRING = '.';
|
|
5
6
|
/**
|
|
6
7
|
* @internal
|
|
7
8
|
* Announce the given data
|
|
@@ -9,17 +10,17 @@ define(["require", "exports"], function (require, exports) {
|
|
|
9
10
|
* @param announceData Data to announce
|
|
10
11
|
*/
|
|
11
12
|
var announce = function (core, announceData) {
|
|
12
|
-
var _a;
|
|
13
|
-
var text = announceData.text, defaultStrings = announceData.defaultStrings, _b = announceData.formatStrings, formatStrings = _b === void 0 ? [] : _b;
|
|
13
|
+
var text = announceData.text, defaultStrings = announceData.defaultStrings, _a = announceData.formatStrings, formatStrings = _a === void 0 ? [] : _a;
|
|
14
14
|
var announcerStringGetter = core.lifecycle.announcerStringGetter;
|
|
15
15
|
var template = defaultStrings && (announcerStringGetter === null || announcerStringGetter === void 0 ? void 0 : announcerStringGetter(defaultStrings));
|
|
16
16
|
var textToAnnounce = formatString(template || text, formatStrings);
|
|
17
|
-
if (
|
|
17
|
+
if (!core.lifecycle.announceContainer) {
|
|
18
|
+
core.lifecycle.announceContainer = (0, createAriaLiveElement_1.createAriaLiveElement)(core.physicalRoot.ownerDocument);
|
|
19
|
+
}
|
|
20
|
+
if (textToAnnounce && core.lifecycle.announceContainer) {
|
|
18
21
|
var announceContainer = core.lifecycle.announceContainer;
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);
|
|
22
|
-
core.lifecycle.announceContainer = announceContainer;
|
|
22
|
+
if (textToAnnounce == announceContainer.textContent) {
|
|
23
|
+
textToAnnounce += DOT_STRING;
|
|
23
24
|
}
|
|
24
25
|
if (announceContainer) {
|
|
25
26
|
announceContainer.textContent = textToAnnounce;
|
|
@@ -38,18 +39,5 @@ define(["require", "exports"], function (require, exports) {
|
|
|
38
39
|
});
|
|
39
40
|
return text;
|
|
40
41
|
}
|
|
41
|
-
function createAriaLiveElement(document) {
|
|
42
|
-
var div = document.createElement('div');
|
|
43
|
-
div.style.clip = 'rect(0px, 0px, 0px, 0px)';
|
|
44
|
-
div.style.clipPath = 'inset(100%)';
|
|
45
|
-
div.style.height = '1px';
|
|
46
|
-
div.style.overflow = 'hidden';
|
|
47
|
-
div.style.position = 'absolute';
|
|
48
|
-
div.style.whiteSpace = 'nowrap';
|
|
49
|
-
div.style.width = '1px';
|
|
50
|
-
div.ariaLive = 'assertive';
|
|
51
|
-
document.body.appendChild(div);
|
|
52
|
-
return div;
|
|
53
|
-
}
|
|
54
42
|
});
|
|
55
43
|
//# sourceMappingURL=announce.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts"],"names":[],"mappings":";;;;IAGA,IAAM,UAAU,GAAG,GAAG,CAAC;IAEvB;;;;;OAKG;IACI,IAAM,QAAQ,GAAa,UAAC,IAAI,EAAE,YAAY;QACzC,IAAA,IAAI,GAAyC,YAAY,KAArD,EAAE,cAAc,GAAyB,YAAY,eAArC,EAAE,KAAuB,YAAY,cAAjB,EAAlB,aAAa,mBAAG,EAAE,KAAA,CAAkB;QAC1D,IAAA,qBAAqB,GAAK,IAAI,CAAC,SAAS,sBAAnB,CAAoB;QACjD,IAAM,QAAQ,GAAG,cAAc,KAAI,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAG,cAAc,CAAC,CAAA,CAAC;QAC3E,IAAI,cAAc,GAAG,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC;QAEnE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;YACnC,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,IAAA,6CAAqB,EAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;SAC7F;QAED,IAAI,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;YAC5C,IAAA,iBAAiB,GAAK,IAAI,CAAC,SAAS,kBAAnB,CAAoB;YAC7C,IAAI,cAAc,IAAI,iBAAiB,CAAC,WAAW,EAAE;gBACjD,cAAc,IAAI,UAAU,CAAC;aAChC;YAED,IAAI,iBAAiB,EAAE;gBACnB,iBAAiB,CAAC,WAAW,GAAG,cAAc,CAAC;aAClD;SACJ;IACL,CAAC,CAAC;IApBW,QAAA,QAAQ,YAoBnB;IAEF,SAAS,YAAY,CAAC,IAAwB,EAAE,aAAuB;QACnE,IAAI,IAAI,IAAI,SAAS,EAAE;YACnB,OAAO,IAAI,CAAC;SACf;QAED,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,UAAC,CAAC,EAAE,GAAW;YAC7C,IAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC","sourcesContent":["import { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type { Announce } from 'roosterjs-content-model-types';\n\nconst DOT_STRING = '.';\n\n/**\n * @internal\n * Announce the given data\n * @param core The EditorCore object\n * @param announceData Data to announce\n */\nexport const announce: Announce = (core, announceData) => {\n const { text, defaultStrings, formatStrings = [] } = announceData;\n const { announcerStringGetter } = core.lifecycle;\n const template = defaultStrings && announcerStringGetter?.(defaultStrings);\n let textToAnnounce = formatString(template || text, formatStrings);\n\n if (!core.lifecycle.announceContainer) {\n core.lifecycle.announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);\n }\n\n if (textToAnnounce && core.lifecycle.announceContainer) {\n const { announceContainer } = core.lifecycle;\n if (textToAnnounce == announceContainer.textContent) {\n textToAnnounce += DOT_STRING;\n }\n\n if (announceContainer) {\n announceContainer.textContent = textToAnnounce;\n }\n }\n};\n\nfunction formatString(text: string | undefined, formatStrings: string[]) {\n if (text == undefined) {\n return text;\n }\n\n text = text.replace(/\\{(\\d+)\\}/g, (_, sub: string) => {\n const index = parseInt(sub);\n const replace = formatStrings[index];\n return replace ?? '';\n });\n\n return text;\n}\n"]}
|
|
@@ -9,7 +9,7 @@ define(["require", "exports"], function (require, exports) {
|
|
|
9
9
|
idPrefix = element.id || idPrefix;
|
|
10
10
|
var doc = element.ownerDocument;
|
|
11
11
|
var i = 0;
|
|
12
|
-
while (!element.id || doc.querySelectorAll(
|
|
12
|
+
while (!element.id || doc.querySelectorAll("[id=\"" + element.id + "\"]").length > 1) {
|
|
13
13
|
element.id = idPrefix + '_' + i++;
|
|
14
14
|
}
|
|
15
15
|
return element.id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensureUniqueId.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts"],"names":[],"mappings":";;;;IAAA;;OAEG;IACH,SAAgB,cAAc,CAAC,OAAoB,EAAE,QAAgB;QACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;QAElC,IAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"ensureUniqueId.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts"],"names":[],"mappings":";;;;IAAA;;OAEG;IACH,SAAgB,cAAc,CAAC,OAAoB,EAAE,QAAgB;QACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;QAElC,IAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,WAAQ,OAAO,CAAC,EAAE,QAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3E,OAAO,CAAC,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;SACrC;QAED,OAAO,OAAO,CAAC,EAAE,CAAC;IACtB,CAAC;IAXD,wCAWC","sourcesContent":["/**\n * @internal\n */\nexport function ensureUniqueId(element: HTMLElement, idPrefix: string): string {\n idPrefix = element.id || idPrefix;\n\n const doc = element.ownerDocument;\n let i = 0;\n\n while (!element.id || doc.querySelectorAll(`[id=\"${element.id}\"]`).length > 1) {\n element.id = idPrefix + '_' + i++;\n }\n\n return element.id;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
define(["require", "exports", "roosterjs-content-model-dom"], function (require, exports, roosterjs_content_model_dom_1) {
|
|
1
|
+
define(["require", "exports", "roosterjs-content-model-dom", "../../utils/createAriaLiveElement"], function (require, exports, roosterjs_content_model_dom_1, createAriaLiveElement_1) {
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.createLifecyclePlugin = void 0;
|
|
@@ -61,6 +61,8 @@ define(["require", "exports", "roosterjs-content-model-dom"], function (require,
|
|
|
61
61
|
this.adjustColor();
|
|
62
62
|
// Let other plugins know that we are ready
|
|
63
63
|
this.editor.triggerEvent('editorReady', {}, true /*broadcast*/);
|
|
64
|
+
// Initialize the Announce container.
|
|
65
|
+
this.state.announceContainer = (0, createAriaLiveElement_1.createAriaLiveElement)(editor.getDocument());
|
|
64
66
|
};
|
|
65
67
|
/**
|
|
66
68
|
* Dispose this plugin
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LifecyclePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/lifecycle/LifecyclePlugin.ts"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"LifecyclePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/lifecycle/LifecyclePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource, getObjectKeys, setColor } from 'roosterjs-content-model-dom';\nimport { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type {\n IEditor,\n LifecyclePluginState,\n PluginEvent,\n PluginWithState,\n EditorOptions,\n} from 'roosterjs-content-model-types';\n\nconst ContentEditableAttributeName = 'contenteditable';\nconst DefaultTextColor = '#000000';\nconst DefaultBackColor = '#ffffff';\n\n/**\n * Lifecycle plugin handles editor initialization and disposing\n */\nclass LifecyclePlugin implements PluginWithState<LifecyclePluginState> {\n private editor: IEditor | null = null;\n private state: LifecyclePluginState;\n private initializer: (() => void) | null = null;\n private disposer: (() => void) | null = null;\n private adjustColor: () => void;\n\n /**\n * Construct a new instance of LifecyclePlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n // Make the container editable and set its selection styles\n if (contentDiv.getAttribute(ContentEditableAttributeName) === null) {\n this.initializer = () => {\n contentDiv.contentEditable = 'true';\n contentDiv.style.userSelect = 'text';\n };\n this.disposer = () => {\n contentDiv.style.userSelect = '';\n contentDiv.removeAttribute(ContentEditableAttributeName);\n };\n }\n this.adjustColor = options.doNotAdjustEditorColor\n ? () => {}\n : () => {\n this.adjustContainerColor(contentDiv);\n };\n\n this.state = {\n isDarkMode: !!options.inDarkMode,\n shadowEditFragment: null,\n styleElements: {},\n announcerStringGetter: options.announcerStringGetter,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'Lifecycle';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n // Set content DIV to be editable\n this.initializer?.();\n\n // Set editor background color for dark mode\n this.adjustColor();\n\n // Let other plugins know that we are ready\n this.editor.triggerEvent('editorReady', {}, true /*broadcast*/);\n\n // Initialize the Announce container.\n this.state.announceContainer = createAriaLiveElement(editor.getDocument());\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.editor?.triggerEvent('beforeDispose', {}, true /*broadcast*/);\n\n getObjectKeys(this.state.styleElements).forEach(key => {\n const element = this.state.styleElements[key];\n\n element.parentElement?.removeChild(element);\n delete this.state.styleElements[key];\n });\n\n const announceContainer = this.state.announceContainer;\n\n if (announceContainer) {\n announceContainer.parentElement?.removeChild(announceContainer);\n delete this.state.announceContainer;\n }\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n this.initializer = null;\n }\n\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n /**\n * Handle events triggered from editor\n * @param event PluginEvent object\n */\n onPluginEvent(event: PluginEvent) {\n if (\n event.eventType == 'contentChanged' &&\n (event.source == ChangeSource.SwitchToDarkMode ||\n event.source == ChangeSource.SwitchToLightMode)\n ) {\n this.adjustColor();\n }\n }\n\n private adjustContainerColor(contentDiv: HTMLElement) {\n if (this.editor) {\n const { isDarkMode } = this.state;\n const darkColorHandler = this.editor.getColorManager();\n\n setColor(\n contentDiv,\n DefaultTextColor,\n false /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n setColor(\n contentDiv,\n DefaultBackColor,\n true /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of LifecyclePlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createLifecyclePlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<LifecyclePluginState> {\n return new LifecyclePlugin(option, contentDiv);\n}\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
define(["require", "exports"], function (require, exports) {
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.createAriaLiveElement = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
function createAriaLiveElement(document) {
|
|
9
|
+
var div = document.createElement('div');
|
|
10
|
+
div.style.clip = 'rect(0px, 0px, 0px, 0px)';
|
|
11
|
+
div.style.clipPath = 'inset(100%)';
|
|
12
|
+
div.style.height = '1px';
|
|
13
|
+
div.style.overflow = 'hidden';
|
|
14
|
+
div.style.position = 'absolute';
|
|
15
|
+
div.style.whiteSpace = 'nowrap';
|
|
16
|
+
div.style.width = '1px';
|
|
17
|
+
div.ariaLive = 'assertive';
|
|
18
|
+
document.body.appendChild(div);
|
|
19
|
+
return div;
|
|
20
|
+
}
|
|
21
|
+
exports.createAriaLiveElement = createAriaLiveElement;
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=createAriaLiveElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAriaLiveElement.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts"],"names":[],"mappings":";;;;IAAA;;OAEG;IACH,SAAgB,qBAAqB,CAAC,QAAkB;QACpD,IAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAE1C,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,0BAA0B,CAAC;QAC5C,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;QACnC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;QACzB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;QAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACxB,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;QAE3B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAE/B,OAAO,GAAG,CAAC;IACf,CAAC;IAfD,sDAeC","sourcesContent":["/**\n * @internal\n */\nexport function createAriaLiveElement(document: Document): HTMLDivElement {\n const div = document.createElement('div');\n\n div.style.clip = 'rect(0px, 0px, 0px, 0px)';\n div.style.clipPath = 'inset(100%)';\n div.style.height = '1px';\n div.style.overflow = 'hidden';\n div.style.position = 'absolute';\n div.style.whiteSpace = 'nowrap';\n div.style.width = '1px';\n div.ariaLive = 'assertive';\n\n document.body.appendChild(div);\n\n return div;\n}\n"]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { createAriaLiveElement } from '../../utils/createAriaLiveElement';
|
|
2
|
+
var DOT_STRING = '.';
|
|
1
3
|
/**
|
|
2
4
|
* @internal
|
|
3
5
|
* Announce the given data
|
|
@@ -5,17 +7,17 @@
|
|
|
5
7
|
* @param announceData Data to announce
|
|
6
8
|
*/
|
|
7
9
|
export var announce = function (core, announceData) {
|
|
8
|
-
var _a;
|
|
9
|
-
var text = announceData.text, defaultStrings = announceData.defaultStrings, _b = announceData.formatStrings, formatStrings = _b === void 0 ? [] : _b;
|
|
10
|
+
var text = announceData.text, defaultStrings = announceData.defaultStrings, _a = announceData.formatStrings, formatStrings = _a === void 0 ? [] : _a;
|
|
10
11
|
var announcerStringGetter = core.lifecycle.announcerStringGetter;
|
|
11
12
|
var template = defaultStrings && (announcerStringGetter === null || announcerStringGetter === void 0 ? void 0 : announcerStringGetter(defaultStrings));
|
|
12
13
|
var textToAnnounce = formatString(template || text, formatStrings);
|
|
13
|
-
if (
|
|
14
|
+
if (!core.lifecycle.announceContainer) {
|
|
15
|
+
core.lifecycle.announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);
|
|
16
|
+
}
|
|
17
|
+
if (textToAnnounce && core.lifecycle.announceContainer) {
|
|
14
18
|
var announceContainer = core.lifecycle.announceContainer;
|
|
15
|
-
if (
|
|
16
|
-
|
|
17
|
-
announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);
|
|
18
|
-
core.lifecycle.announceContainer = announceContainer;
|
|
19
|
+
if (textToAnnounce == announceContainer.textContent) {
|
|
20
|
+
textToAnnounce += DOT_STRING;
|
|
19
21
|
}
|
|
20
22
|
if (announceContainer) {
|
|
21
23
|
announceContainer.textContent = textToAnnounce;
|
|
@@ -33,17 +35,4 @@ function formatString(text, formatStrings) {
|
|
|
33
35
|
});
|
|
34
36
|
return text;
|
|
35
37
|
}
|
|
36
|
-
function createAriaLiveElement(document) {
|
|
37
|
-
var div = document.createElement('div');
|
|
38
|
-
div.style.clip = 'rect(0px, 0px, 0px, 0px)';
|
|
39
|
-
div.style.clipPath = 'inset(100%)';
|
|
40
|
-
div.style.height = '1px';
|
|
41
|
-
div.style.overflow = 'hidden';
|
|
42
|
-
div.style.position = 'absolute';
|
|
43
|
-
div.style.whiteSpace = 'nowrap';
|
|
44
|
-
div.style.width = '1px';
|
|
45
|
-
div.ariaLive = 'assertive';
|
|
46
|
-
document.body.appendChild(div);
|
|
47
|
-
return div;
|
|
48
|
-
}
|
|
49
38
|
//# sourceMappingURL=announce.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"announce.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/announce/announce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,IAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;;;GAKG;AACH,MAAM,CAAC,IAAM,QAAQ,GAAa,UAAC,IAAI,EAAE,YAAY;IACzC,IAAA,IAAI,GAAyC,YAAY,KAArD,EAAE,cAAc,GAAyB,YAAY,eAArC,EAAE,KAAuB,YAAY,cAAjB,EAAlB,aAAa,mBAAG,EAAE,KAAA,CAAkB;IAC1D,IAAA,qBAAqB,GAAK,IAAI,CAAC,SAAS,sBAAnB,CAAoB;IACjD,IAAM,QAAQ,GAAG,cAAc,KAAI,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAAG,cAAc,CAAC,CAAA,CAAC;IAC3E,IAAI,cAAc,GAAG,YAAY,CAAC,QAAQ,IAAI,IAAI,EAAE,aAAa,CAAC,CAAC;IAEnE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QACnC,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;KAC7F;IAED,IAAI,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE;QAC5C,IAAA,iBAAiB,GAAK,IAAI,CAAC,SAAS,kBAAnB,CAAoB;QAC7C,IAAI,cAAc,IAAI,iBAAiB,CAAC,WAAW,EAAE;YACjD,cAAc,IAAI,UAAU,CAAC;SAChC;QAED,IAAI,iBAAiB,EAAE;YACnB,iBAAiB,CAAC,WAAW,GAAG,cAAc,CAAC;SAClD;KACJ;AACL,CAAC,CAAC;AAEF,SAAS,YAAY,CAAC,IAAwB,EAAE,aAAuB;IACnE,IAAI,IAAI,IAAI,SAAS,EAAE;QACnB,OAAO,IAAI,CAAC;KACf;IAED,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,UAAC,CAAC,EAAE,GAAW;QAC7C,IAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACrC,OAAO,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type { Announce } from 'roosterjs-content-model-types';\n\nconst DOT_STRING = '.';\n\n/**\n * @internal\n * Announce the given data\n * @param core The EditorCore object\n * @param announceData Data to announce\n */\nexport const announce: Announce = (core, announceData) => {\n const { text, defaultStrings, formatStrings = [] } = announceData;\n const { announcerStringGetter } = core.lifecycle;\n const template = defaultStrings && announcerStringGetter?.(defaultStrings);\n let textToAnnounce = formatString(template || text, formatStrings);\n\n if (!core.lifecycle.announceContainer) {\n core.lifecycle.announceContainer = createAriaLiveElement(core.physicalRoot.ownerDocument);\n }\n\n if (textToAnnounce && core.lifecycle.announceContainer) {\n const { announceContainer } = core.lifecycle;\n if (textToAnnounce == announceContainer.textContent) {\n textToAnnounce += DOT_STRING;\n }\n\n if (announceContainer) {\n announceContainer.textContent = textToAnnounce;\n }\n }\n};\n\nfunction formatString(text: string | undefined, formatStrings: string[]) {\n if (text == undefined) {\n return text;\n }\n\n text = text.replace(/\\{(\\d+)\\}/g, (_, sub: string) => {\n const index = parseInt(sub);\n const replace = formatStrings[index];\n return replace ?? '';\n });\n\n return text;\n}\n"]}
|
|
@@ -5,7 +5,7 @@ export function ensureUniqueId(element, idPrefix) {
|
|
|
5
5
|
idPrefix = element.id || idPrefix;
|
|
6
6
|
var doc = element.ownerDocument;
|
|
7
7
|
var i = 0;
|
|
8
|
-
while (!element.id || doc.querySelectorAll(
|
|
8
|
+
while (!element.id || doc.querySelectorAll("[id=\"" + element.id + "\"]").length > 1) {
|
|
9
9
|
element.id = idPrefix + '_' + i++;
|
|
10
10
|
}
|
|
11
11
|
return element.id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensureUniqueId.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAoB,EAAE,QAAgB;IACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;IAElC,IAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"ensureUniqueId.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/coreApi/setEditorStyle/ensureUniqueId.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAoB,EAAE,QAAgB;IACjE,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,QAAQ,CAAC;IAElC,IAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC,WAAQ,OAAO,CAAC,EAAE,QAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;QAC3E,OAAO,CAAC,EAAE,GAAG,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;KACrC;IAED,OAAO,OAAO,CAAC,EAAE,CAAC;AACtB,CAAC","sourcesContent":["/**\n * @internal\n */\nexport function ensureUniqueId(element: HTMLElement, idPrefix: string): string {\n idPrefix = element.id || idPrefix;\n\n const doc = element.ownerDocument;\n let i = 0;\n\n while (!element.id || doc.querySelectorAll(`[id=\"${element.id}\"]`).length > 1) {\n element.id = idPrefix + '_' + i++;\n }\n\n return element.id;\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ChangeSource, getObjectKeys, setColor } from 'roosterjs-content-model-dom';
|
|
2
|
+
import { createAriaLiveElement } from '../../utils/createAriaLiveElement';
|
|
2
3
|
var ContentEditableAttributeName = 'contenteditable';
|
|
3
4
|
var DefaultTextColor = '#000000';
|
|
4
5
|
var DefaultBackColor = '#ffffff';
|
|
@@ -58,6 +59,8 @@ var LifecyclePlugin = /** @class */ (function () {
|
|
|
58
59
|
this.adjustColor();
|
|
59
60
|
// Let other plugins know that we are ready
|
|
60
61
|
this.editor.triggerEvent('editorReady', {}, true /*broadcast*/);
|
|
62
|
+
// Initialize the Announce container.
|
|
63
|
+
this.state.announceContainer = createAriaLiveElement(editor.getDocument());
|
|
61
64
|
};
|
|
62
65
|
/**
|
|
63
66
|
* Dispose this plugin
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LifecyclePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/lifecycle/LifecyclePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"LifecyclePlugin.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-core/lib/corePlugin/lifecycle/LifecyclePlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource, getObjectKeys, setColor } from 'roosterjs-content-model-dom';\nimport { createAriaLiveElement } from '../../utils/createAriaLiveElement';\nimport type {\n IEditor,\n LifecyclePluginState,\n PluginEvent,\n PluginWithState,\n EditorOptions,\n} from 'roosterjs-content-model-types';\n\nconst ContentEditableAttributeName = 'contenteditable';\nconst DefaultTextColor = '#000000';\nconst DefaultBackColor = '#ffffff';\n\n/**\n * Lifecycle plugin handles editor initialization and disposing\n */\nclass LifecyclePlugin implements PluginWithState<LifecyclePluginState> {\n private editor: IEditor | null = null;\n private state: LifecyclePluginState;\n private initializer: (() => void) | null = null;\n private disposer: (() => void) | null = null;\n private adjustColor: () => void;\n\n /**\n * Construct a new instance of LifecyclePlugin\n * @param options The editor options\n * @param contentDiv The editor content DIV\n */\n constructor(options: EditorOptions, contentDiv: HTMLDivElement) {\n // Make the container editable and set its selection styles\n if (contentDiv.getAttribute(ContentEditableAttributeName) === null) {\n this.initializer = () => {\n contentDiv.contentEditable = 'true';\n contentDiv.style.userSelect = 'text';\n };\n this.disposer = () => {\n contentDiv.style.userSelect = '';\n contentDiv.removeAttribute(ContentEditableAttributeName);\n };\n }\n this.adjustColor = options.doNotAdjustEditorColor\n ? () => {}\n : () => {\n this.adjustContainerColor(contentDiv);\n };\n\n this.state = {\n isDarkMode: !!options.inDarkMode,\n shadowEditFragment: null,\n styleElements: {},\n announcerStringGetter: options.announcerStringGetter,\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'Lifecycle';\n }\n\n /**\n * Initialize this plugin. This should only be called from Editor\n * @param editor Editor instance\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n\n // Set content DIV to be editable\n this.initializer?.();\n\n // Set editor background color for dark mode\n this.adjustColor();\n\n // Let other plugins know that we are ready\n this.editor.triggerEvent('editorReady', {}, true /*broadcast*/);\n\n // Initialize the Announce container.\n this.state.announceContainer = createAriaLiveElement(editor.getDocument());\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.editor?.triggerEvent('beforeDispose', {}, true /*broadcast*/);\n\n getObjectKeys(this.state.styleElements).forEach(key => {\n const element = this.state.styleElements[key];\n\n element.parentElement?.removeChild(element);\n delete this.state.styleElements[key];\n });\n\n const announceContainer = this.state.announceContainer;\n\n if (announceContainer) {\n announceContainer.parentElement?.removeChild(announceContainer);\n delete this.state.announceContainer;\n }\n\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n this.initializer = null;\n }\n\n this.editor = null;\n }\n\n /**\n * Get plugin state object\n */\n getState() {\n return this.state;\n }\n\n /**\n * Handle events triggered from editor\n * @param event PluginEvent object\n */\n onPluginEvent(event: PluginEvent) {\n if (\n event.eventType == 'contentChanged' &&\n (event.source == ChangeSource.SwitchToDarkMode ||\n event.source == ChangeSource.SwitchToLightMode)\n ) {\n this.adjustColor();\n }\n }\n\n private adjustContainerColor(contentDiv: HTMLElement) {\n if (this.editor) {\n const { isDarkMode } = this.state;\n const darkColorHandler = this.editor.getColorManager();\n\n setColor(\n contentDiv,\n DefaultTextColor,\n false /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n setColor(\n contentDiv,\n DefaultBackColor,\n true /*isBackground*/,\n isDarkMode,\n darkColorHandler\n );\n }\n }\n}\n\n/**\n * @internal\n * Create a new instance of LifecyclePlugin.\n * @param option The editor option\n * @param contentDiv The editor content DIV element\n */\nexport function createLifecyclePlugin(\n option: EditorOptions,\n contentDiv: HTMLDivElement\n): PluginWithState<LifecyclePluginState> {\n return new LifecyclePlugin(option, contentDiv);\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal
|
|
3
|
+
*/
|
|
4
|
+
export function createAriaLiveElement(document) {
|
|
5
|
+
var div = document.createElement('div');
|
|
6
|
+
div.style.clip = 'rect(0px, 0px, 0px, 0px)';
|
|
7
|
+
div.style.clipPath = 'inset(100%)';
|
|
8
|
+
div.style.height = '1px';
|
|
9
|
+
div.style.overflow = 'hidden';
|
|
10
|
+
div.style.position = 'absolute';
|
|
11
|
+
div.style.whiteSpace = 'nowrap';
|
|
12
|
+
div.style.width = '1px';
|
|
13
|
+
div.ariaLive = 'assertive';
|
|
14
|
+
document.body.appendChild(div);
|
|
15
|
+
return div;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=createAriaLiveElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAriaLiveElement.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-core/lib/utils/createAriaLiveElement.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAkB;IACpD,IAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAE1C,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,0BAA0B,CAAC;IAC5C,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,aAAa,CAAC;IACnC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IACzB,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;IAChC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;IACxB,GAAG,CAAC,QAAQ,GAAG,WAAW,CAAC;IAE3B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE/B,OAAO,GAAG,CAAC;AACf,CAAC","sourcesContent":["/**\n * @internal\n */\nexport function createAriaLiveElement(document: Document): HTMLDivElement {\n const div = document.createElement('div');\n\n div.style.clip = 'rect(0px, 0px, 0px, 0px)';\n div.style.clipPath = 'inset(100%)';\n div.style.height = '1px';\n div.style.overflow = 'hidden';\n div.style.position = 'absolute';\n div.style.whiteSpace = 'nowrap';\n div.style.width = '1px';\n div.ariaLive = 'assertive';\n\n document.body.appendChild(div);\n\n return div;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"description": "Core editor for roosterjs",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"tslib": "^2.3.1",
|
|
6
|
-
"roosterjs-content-model-dom": "^9.
|
|
7
|
-
"roosterjs-content-model-types": "^9.
|
|
6
|
+
"roosterjs-content-model-dom": "^9.8.0",
|
|
7
|
+
"roosterjs-content-model-types": "^9.8.0"
|
|
8
8
|
},
|
|
9
|
-
"version": "9.
|
|
9
|
+
"version": "9.8.0",
|
|
10
10
|
"main": "./lib/index.js",
|
|
11
11
|
"typings": "./lib/index.d.ts",
|
|
12
12
|
"module": "./lib-mjs/index.js",
|