roosterjs-content-model-core 0.21.2 → 0.21.3
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/formatContentModel.js +3 -2
- package/lib/coreApi/formatContentModel.js.map +1 -1
- package/lib-amd/coreApi/formatContentModel.js +3 -2
- package/lib-amd/coreApi/formatContentModel.js.map +1 -1
- package/lib-mjs/coreApi/formatContentModel.js +3 -2
- package/lib-mjs/coreApi/formatContentModel.js.map +1 -1
- package/package.json +1 -1
|
@@ -22,13 +22,14 @@ var formatContentModel = function (core, formatter, options) {
|
|
|
22
22
|
rawEvent: rawEvent,
|
|
23
23
|
newImages: [],
|
|
24
24
|
};
|
|
25
|
+
var hasFocus = core.api.hasFocus(core);
|
|
25
26
|
var selection;
|
|
26
27
|
if (formatter(model, context)) {
|
|
27
28
|
var writeBack = function () {
|
|
28
29
|
handleImages(core, context);
|
|
29
30
|
selection =
|
|
30
|
-
core.api.setContentModel(core, model, undefined
|
|
31
|
-
|
|
31
|
+
core.api.setContentModel(core, model, hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format
|
|
32
|
+
onNodeCreated) || undefined;
|
|
32
33
|
handlePendingFormat(core, context, selection);
|
|
33
34
|
};
|
|
34
35
|
if (context.skipUndoSnapshot) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":";;;;AAAA,0DAAyD;AAWzD;;;;;;;;;GASG;AACI,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,SAAS,EAAE,OAAO;IACrE,IAAA,KACF,OAAO,IAAI,EAAE,EADT,OAAO,aAAA,EAAE,aAAa,mBAAA,EAAE,aAAa,mBAAA,EAAE,YAAY,kBAAA,EAAE,QAAQ,cAAA,EAAE,iBAAiB,uBACvE,CAAC;IAElB,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACzF,IAAM,OAAO,GAAkC;QAC3C,WAAW,EAAE,EAAE;QACf,eAAe,EAAE,EAAE;QACnB,QAAQ,UAAA;QACR,SAAS,EAAE,EAAE;KAChB,CAAC;IACF,IAAI,SAAmC,CAAC;IAExC,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;QAC3B,IAAM,SAAS,GAAG;YACd,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE5B,SAAS;gBACL,IAAI,CAAC,GAAG,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource } from '../constants/ChangeSource';\nimport { PluginEventType } from 'roosterjs-editor-types';\nimport type {\n ChangedEntity,\n ContentModelContentChangedEvent,\n DOMSelection,\n FormatContentModel,\n FormatWithContentModelContext,\n StandaloneEditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * The general API to do format change with Content Model\n * It will grab a Content Model for current editor content, and invoke a callback function\n * to do format change. Then according to the return value, write back the modified content model into editor.\n * If there is cached model, it will be used and updated.\n * @param core The StandaloneEditorCore object\n * @param formatter Formatter function, see ContentModelFormatter\n * @param options More options, see FormatWithContentModelOptions\n */\nexport const formatContentModel: FormatContentModel = (core, formatter, options) => {\n const { apiName, onNodeCreated, getChangeData, changeSource, rawEvent, selectionOverride } =\n options || {};\n\n const model = core.api.createContentModel(core, undefined /*option*/, selectionOverride);\n const context: FormatWithContentModelContext = {\n newEntities: [],\n deletedEntities: [],\n rawEvent,\n newImages: [],\n };\n const hasFocus = core.api.hasFocus(core);\n let selection: DOMSelection | undefined;\n\n if (formatter(model, context)) {\n const writeBack = () => {\n handleImages(core, context);\n\n selection =\n core.api.setContentModel(\n core,\n model,\n hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format\n onNodeCreated\n ) || undefined;\n\n handlePendingFormat(core, context, selection);\n };\n\n if (context.skipUndoSnapshot) {\n writeBack();\n } else {\n core.api.addUndoSnapshot(\n core,\n writeBack,\n null /*changeSource, passing undefined here to avoid triggering ContentChangedEvent. We will trigger it using it with Content Model below */,\n false /*canUndoByBackspace*/,\n {\n formatApiName: apiName,\n }\n );\n }\n\n const eventData: ContentModelContentChangedEvent = {\n eventType: PluginEventType.ContentChanged,\n contentModel: context.clearModelCache ? undefined : model,\n selection: context.clearModelCache ? undefined : selection,\n source: changeSource || ChangeSource.Format,\n data: getChangeData?.(),\n additionalData: {\n formatApiName: apiName,\n },\n changedEntities: context.newEntities\n .map(\n (entity): ChangedEntity => ({\n entity,\n operation: 'newEntity',\n rawEvent,\n })\n )\n .concat(\n context.deletedEntities.map(entry => ({\n entity: entry.entity,\n operation: entry.operation,\n rawEvent,\n }))\n ),\n };\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n } else {\n if (context.clearModelCache) {\n core.cache.cachedModel = undefined;\n core.cache.cachedSelection = undefined;\n }\n\n handlePendingFormat(core, context, core.api.getDOMSelection(core));\n }\n};\n\nfunction handleImages(core: StandaloneEditorCore, context: FormatWithContentModelContext) {\n if (context.newImages.length > 0) {\n const viewport = core.api.getVisibleViewport(core);\n\n if (viewport) {\n const { left, right } = viewport;\n const minMaxImageSize = 10;\n const maxWidth = Math.max(right - left, minMaxImageSize);\n context.newImages.forEach(image => {\n image.format.maxWidth = `${maxWidth}px`;\n });\n }\n }\n}\n\nfunction handlePendingFormat(\n core: StandaloneEditorCore,\n context: FormatWithContentModelContext,\n selection?: DOMSelection | null\n) {\n const pendingFormat =\n context.newPendingFormat == 'preserve'\n ? core.format.pendingFormat?.format\n : context.newPendingFormat;\n\n if (pendingFormat && selection?.type == 'range' && selection.range.collapsed) {\n core.format.pendingFormat = {\n format: { ...pendingFormat },\n posContainer: selection.range.startContainer,\n posOffset: selection.range.startOffset,\n };\n }\n}\n"]}
|
|
@@ -21,13 +21,14 @@ define(["require", "exports", "tslib", "../constants/ChangeSource"], function (r
|
|
|
21
21
|
rawEvent: rawEvent,
|
|
22
22
|
newImages: [],
|
|
23
23
|
};
|
|
24
|
+
var hasFocus = core.api.hasFocus(core);
|
|
24
25
|
var selection;
|
|
25
26
|
if (formatter(model, context)) {
|
|
26
27
|
var writeBack = function () {
|
|
27
28
|
handleImages(core, context);
|
|
28
29
|
selection =
|
|
29
|
-
core.api.setContentModel(core, model, undefined
|
|
30
|
-
|
|
30
|
+
core.api.setContentModel(core, model, hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format
|
|
31
|
+
onNodeCreated) || undefined;
|
|
31
32
|
handlePendingFormat(core, context, selection);
|
|
32
33
|
};
|
|
33
34
|
if (context.skipUndoSnapshot) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":";;;;IAWA;;;;;;;;;OASG;IACI,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,SAAS,EAAE,OAAO;QACrE,IAAA,KACF,OAAO,IAAI,EAAE,EADT,OAAO,aAAA,EAAE,aAAa,mBAAA,EAAE,aAAa,mBAAA,EAAE,YAAY,kBAAA,EAAE,QAAQ,cAAA,EAAE,iBAAiB,uBACvE,CAAC;QAElB,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QACzF,IAAM,OAAO,GAAkC;YAC3C,WAAW,EAAE,EAAE;YACf,eAAe,EAAE,EAAE;YACnB,QAAQ,UAAA;YACR,SAAS,EAAE,EAAE;SAChB,CAAC;QACF,IAAI,SAAmC,CAAC;QAExC,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;YAC3B,IAAM,SAAS,GAAG;gBACd,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAE5B,SAAS;oBACL,IAAI,CAAC,GAAG,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource } from '../constants/ChangeSource';\nimport { PluginEventType } from 'roosterjs-editor-types';\nimport type {\n ChangedEntity,\n ContentModelContentChangedEvent,\n DOMSelection,\n FormatContentModel,\n FormatWithContentModelContext,\n StandaloneEditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * The general API to do format change with Content Model\n * It will grab a Content Model for current editor content, and invoke a callback function\n * to do format change. Then according to the return value, write back the modified content model into editor.\n * If there is cached model, it will be used and updated.\n * @param core The StandaloneEditorCore object\n * @param formatter Formatter function, see ContentModelFormatter\n * @param options More options, see FormatWithContentModelOptions\n */\nexport const formatContentModel: FormatContentModel = (core, formatter, options) => {\n const { apiName, onNodeCreated, getChangeData, changeSource, rawEvent, selectionOverride } =\n options || {};\n\n const model = core.api.createContentModel(core, undefined /*option*/, selectionOverride);\n const context: FormatWithContentModelContext = {\n newEntities: [],\n deletedEntities: [],\n rawEvent,\n newImages: [],\n };\n const hasFocus = core.api.hasFocus(core);\n let selection: DOMSelection | undefined;\n\n if (formatter(model, context)) {\n const writeBack = () => {\n handleImages(core, context);\n\n selection =\n core.api.setContentModel(\n core,\n model,\n hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format\n onNodeCreated\n ) || undefined;\n\n handlePendingFormat(core, context, selection);\n };\n\n if (context.skipUndoSnapshot) {\n writeBack();\n } else {\n core.api.addUndoSnapshot(\n core,\n writeBack,\n null /*changeSource, passing undefined here to avoid triggering ContentChangedEvent. We will trigger it using it with Content Model below */,\n false /*canUndoByBackspace*/,\n {\n formatApiName: apiName,\n }\n );\n }\n\n const eventData: ContentModelContentChangedEvent = {\n eventType: PluginEventType.ContentChanged,\n contentModel: context.clearModelCache ? undefined : model,\n selection: context.clearModelCache ? undefined : selection,\n source: changeSource || ChangeSource.Format,\n data: getChangeData?.(),\n additionalData: {\n formatApiName: apiName,\n },\n changedEntities: context.newEntities\n .map(\n (entity): ChangedEntity => ({\n entity,\n operation: 'newEntity',\n rawEvent,\n })\n )\n .concat(\n context.deletedEntities.map(entry => ({\n entity: entry.entity,\n operation: entry.operation,\n rawEvent,\n }))\n ),\n };\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n } else {\n if (context.clearModelCache) {\n core.cache.cachedModel = undefined;\n core.cache.cachedSelection = undefined;\n }\n\n handlePendingFormat(core, context, core.api.getDOMSelection(core));\n }\n};\n\nfunction handleImages(core: StandaloneEditorCore, context: FormatWithContentModelContext) {\n if (context.newImages.length > 0) {\n const viewport = core.api.getVisibleViewport(core);\n\n if (viewport) {\n const { left, right } = viewport;\n const minMaxImageSize = 10;\n const maxWidth = Math.max(right - left, minMaxImageSize);\n context.newImages.forEach(image => {\n image.format.maxWidth = `${maxWidth}px`;\n });\n }\n }\n}\n\nfunction handlePendingFormat(\n core: StandaloneEditorCore,\n context: FormatWithContentModelContext,\n selection?: DOMSelection | null\n) {\n const pendingFormat =\n context.newPendingFormat == 'preserve'\n ? core.format.pendingFormat?.format\n : context.newPendingFormat;\n\n if (pendingFormat && selection?.type == 'range' && selection.range.collapsed) {\n core.format.pendingFormat = {\n format: { ...pendingFormat },\n posContainer: selection.range.startContainer,\n posOffset: selection.range.startOffset,\n };\n }\n}\n"]}
|
|
@@ -19,13 +19,14 @@ export var formatContentModel = function (core, formatter, options) {
|
|
|
19
19
|
rawEvent: rawEvent,
|
|
20
20
|
newImages: [],
|
|
21
21
|
};
|
|
22
|
+
var hasFocus = core.api.hasFocus(core);
|
|
22
23
|
var selection;
|
|
23
24
|
if (formatter(model, context)) {
|
|
24
25
|
var writeBack = function () {
|
|
25
26
|
handleImages(core, context);
|
|
26
27
|
selection =
|
|
27
|
-
core.api.setContentModel(core, model, undefined
|
|
28
|
-
|
|
28
|
+
core.api.setContentModel(core, model, hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format
|
|
29
|
+
onNodeCreated) || undefined;
|
|
29
30
|
handlePendingFormat(core, context, selection);
|
|
30
31
|
};
|
|
31
32
|
if (context.skipUndoSnapshot) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAWzD;;;;;;;;;GASG;AACH,MAAM,CAAC,IAAM,kBAAkB,GAAuB,UAAC,IAAI,EAAE,SAAS,EAAE,OAAO;IACrE,IAAA,KACF,OAAO,IAAI,EAAE,EADT,OAAO,aAAA,EAAE,aAAa,mBAAA,EAAE,aAAa,mBAAA,EAAE,YAAY,kBAAA,EAAE,QAAQ,cAAA,EAAE,iBAAiB,uBACvE,CAAC;IAElB,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACzF,IAAM,OAAO,GAAkC;QAC3C,WAAW,EAAE,EAAE;QACf,eAAe,EAAE,EAAE;QACnB,QAAQ,UAAA;QACR,SAAS,EAAE,EAAE;KAChB,CAAC;IACF,IAAI,SAAmC,CAAC;IAExC,IAAI,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;QAC3B,IAAM,SAAS,GAAG;YACd,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE5B,SAAS;gBACL,IAAI,CAAC,GAAG,CAAC,eAAe,
|
|
1
|
+
{"version":3,"file":"formatContentModel.js","sourceRoot":"","sources":["../../../../packages-content-model/roosterjs-content-model-core/lib/coreApi/formatContentModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource } from '../constants/ChangeSource';\nimport { PluginEventType } from 'roosterjs-editor-types';\nimport type {\n ChangedEntity,\n ContentModelContentChangedEvent,\n DOMSelection,\n FormatContentModel,\n FormatWithContentModelContext,\n StandaloneEditorCore,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * The general API to do format change with Content Model\n * It will grab a Content Model for current editor content, and invoke a callback function\n * to do format change. Then according to the return value, write back the modified content model into editor.\n * If there is cached model, it will be used and updated.\n * @param core The StandaloneEditorCore object\n * @param formatter Formatter function, see ContentModelFormatter\n * @param options More options, see FormatWithContentModelOptions\n */\nexport const formatContentModel: FormatContentModel = (core, formatter, options) => {\n const { apiName, onNodeCreated, getChangeData, changeSource, rawEvent, selectionOverride } =\n options || {};\n\n const model = core.api.createContentModel(core, undefined /*option*/, selectionOverride);\n const context: FormatWithContentModelContext = {\n newEntities: [],\n deletedEntities: [],\n rawEvent,\n newImages: [],\n };\n const hasFocus = core.api.hasFocus(core);\n let selection: DOMSelection | undefined;\n\n if (formatter(model, context)) {\n const writeBack = () => {\n handleImages(core, context);\n\n selection =\n core.api.setContentModel(\n core,\n model,\n hasFocus ? undefined : { ignoreSelection: true }, // If editor did not have focus before format, do not set focus after format\n onNodeCreated\n ) || undefined;\n\n handlePendingFormat(core, context, selection);\n };\n\n if (context.skipUndoSnapshot) {\n writeBack();\n } else {\n core.api.addUndoSnapshot(\n core,\n writeBack,\n null /*changeSource, passing undefined here to avoid triggering ContentChangedEvent. We will trigger it using it with Content Model below */,\n false /*canUndoByBackspace*/,\n {\n formatApiName: apiName,\n }\n );\n }\n\n const eventData: ContentModelContentChangedEvent = {\n eventType: PluginEventType.ContentChanged,\n contentModel: context.clearModelCache ? undefined : model,\n selection: context.clearModelCache ? undefined : selection,\n source: changeSource || ChangeSource.Format,\n data: getChangeData?.(),\n additionalData: {\n formatApiName: apiName,\n },\n changedEntities: context.newEntities\n .map(\n (entity): ChangedEntity => ({\n entity,\n operation: 'newEntity',\n rawEvent,\n })\n )\n .concat(\n context.deletedEntities.map(entry => ({\n entity: entry.entity,\n operation: entry.operation,\n rawEvent,\n }))\n ),\n };\n core.api.triggerEvent(core, eventData, true /*broadcast*/);\n } else {\n if (context.clearModelCache) {\n core.cache.cachedModel = undefined;\n core.cache.cachedSelection = undefined;\n }\n\n handlePendingFormat(core, context, core.api.getDOMSelection(core));\n }\n};\n\nfunction handleImages(core: StandaloneEditorCore, context: FormatWithContentModelContext) {\n if (context.newImages.length > 0) {\n const viewport = core.api.getVisibleViewport(core);\n\n if (viewport) {\n const { left, right } = viewport;\n const minMaxImageSize = 10;\n const maxWidth = Math.max(right - left, minMaxImageSize);\n context.newImages.forEach(image => {\n image.format.maxWidth = `${maxWidth}px`;\n });\n }\n }\n}\n\nfunction handlePendingFormat(\n core: StandaloneEditorCore,\n context: FormatWithContentModelContext,\n selection?: DOMSelection | null\n) {\n const pendingFormat =\n context.newPendingFormat == 'preserve'\n ? core.format.pendingFormat?.format\n : context.newPendingFormat;\n\n if (pendingFormat && selection?.type == 'range' && selection.range.collapsed) {\n core.format.pendingFormat = {\n format: { ...pendingFormat },\n posContainer: selection.range.startContainer,\n posOffset: selection.range.startOffset,\n };\n }\n}\n"]}
|
package/package.json
CHANGED