roosterjs-content-model-plugins 9.5.1 → 9.6.1
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/autoFormat/list/getListTypeStyle.js +11 -11
- package/lib/autoFormat/list/getListTypeStyle.js.map +1 -1
- package/lib/autoFormat/numbers/transformFraction.js +8 -7
- package/lib/autoFormat/numbers/transformFraction.js.map +1 -1
- package/lib/watermark/WatermarkPlugin.d.ts +2 -0
- package/lib/watermark/WatermarkPlugin.js +24 -4
- package/lib/watermark/WatermarkPlugin.js.map +1 -1
- package/lib-amd/autoFormat/list/getListTypeStyle.js +11 -11
- package/lib-amd/autoFormat/list/getListTypeStyle.js.map +1 -1
- package/lib-amd/autoFormat/numbers/transformFraction.js +8 -7
- package/lib-amd/autoFormat/numbers/transformFraction.js.map +1 -1
- package/lib-amd/watermark/WatermarkPlugin.d.ts +2 -0
- package/lib-amd/watermark/WatermarkPlugin.js +24 -5
- package/lib-amd/watermark/WatermarkPlugin.js.map +1 -1
- package/lib-mjs/autoFormat/list/getListTypeStyle.js +11 -11
- package/lib-mjs/autoFormat/list/getListTypeStyle.js.map +1 -1
- package/lib-mjs/autoFormat/numbers/transformFraction.js +8 -7
- package/lib-mjs/autoFormat/numbers/transformFraction.js.map +1 -1
- package/lib-mjs/watermark/WatermarkPlugin.d.ts +2 -0
- package/lib-mjs/watermark/WatermarkPlugin.js +25 -5
- package/lib-mjs/watermark/WatermarkPlugin.js.map +1 -1
- package/package.json +5 -5
|
@@ -22,7 +22,7 @@ function getListTypeStyle(model, shouldSearchForBullet, shouldSearchForNumbering
|
|
|
22
22
|
listMarkerSegment &&
|
|
23
23
|
listMarkerSegment.segmentType == 'Text') {
|
|
24
24
|
var listMarker = listMarkerSegment.text.trim();
|
|
25
|
-
var bulletType = bulletListType
|
|
25
|
+
var bulletType = bulletListType.get(listMarker);
|
|
26
26
|
if (bulletType && shouldSearchForBullet) {
|
|
27
27
|
return { listType: 'UL', styleType: bulletType };
|
|
28
28
|
}
|
|
@@ -73,16 +73,16 @@ var getPreviousListStyle = function (list) {
|
|
|
73
73
|
return (_a = (0, roosterjs_content_model_dom_1.updateListMetadata)(list.levels[0])) === null || _a === void 0 ? void 0 : _a.orderedStyleType;
|
|
74
74
|
}
|
|
75
75
|
};
|
|
76
|
-
var bulletListType =
|
|
77
|
-
'*'
|
|
78
|
-
'-'
|
|
79
|
-
'--'
|
|
80
|
-
'->'
|
|
81
|
-
'-->'
|
|
82
|
-
'=>'
|
|
83
|
-
'>'
|
|
84
|
-
'—'
|
|
85
|
-
|
|
76
|
+
var bulletListType = new Map([
|
|
77
|
+
['*', roosterjs_content_model_dom_1.BulletListType.Disc],
|
|
78
|
+
['-', roosterjs_content_model_dom_1.BulletListType.Dash],
|
|
79
|
+
['--', roosterjs_content_model_dom_1.BulletListType.Square],
|
|
80
|
+
['->', roosterjs_content_model_dom_1.BulletListType.LongArrow],
|
|
81
|
+
['-->', roosterjs_content_model_dom_1.BulletListType.DoubleLongArrow],
|
|
82
|
+
['=>', roosterjs_content_model_dom_1.BulletListType.UnfilledArrow],
|
|
83
|
+
['>', roosterjs_content_model_dom_1.BulletListType.ShortArrow],
|
|
84
|
+
['—', roosterjs_content_model_dom_1.BulletListType.Hyphen],
|
|
85
|
+
]);
|
|
86
86
|
var isNewList = function (listMarker) {
|
|
87
87
|
var marker = listMarker.replace(/[^\w\s]/g, '');
|
|
88
88
|
var pattern = /^[1aAiI]$/;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getListTypeStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/list/getListTypeStyle.ts"],"names":[],"mappings":";;;AAAA,2EAAwE;AACxE,iEAAgE;AAOhE,2EAMqC;AAWrC;;GAEG;AACH,SAAgB,gBAAgB,CAC5B,KAAmC,EACnC,qBAAqC,EACrC,wBAAwC;IADxC,sCAAA,EAAA,4BAAqC;IACrC,yCAAA,EAAA,+BAAwC;IAExC,IAAM,6BAA6B,GAAG,IAAA,8DAAgC,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpF,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE;QACnC,OAAO,SAAS,CAAC;KACpB;IACD,IAAM,MAAM,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAM,SAAS,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAM,iBAAiB,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEjD,IACI,MAAM;QACN,MAAM,CAAC,WAAW,IAAI,iBAAiB;QACvC,iBAAiB;QACjB,iBAAiB,CAAC,WAAW,IAAI,MAAM,EACzC;QACE,IAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,IAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"getListTypeStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/list/getListTypeStyle.ts"],"names":[],"mappings":"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","sourcesContent":["import { findListItemsInSameThread } from 'roosterjs-content-model-api';\nimport { getNumberingListStyle } from './getNumberingListStyle';\nimport type {\n ContentModelListItem,\n ReadonlyContentModelDocument,\n ReadonlyContentModelListItem,\n ReadonlyContentModelParagraph,\n} from 'roosterjs-content-model-types';\nimport {\n BulletListType,\n isBlockGroupOfType,\n updateListMetadata,\n getOperationalBlocks,\n getSelectedSegmentsAndParagraphs,\n} from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\ninterface ListTypeStyle {\n listType: 'UL' | 'OL';\n styleType: number;\n index?: number;\n}\n\n/**\n * @internal\n */\nexport function getListTypeStyle(\n model: ReadonlyContentModelDocument,\n shouldSearchForBullet: boolean = true,\n shouldSearchForNumbering: boolean = true\n): ListTypeStyle | undefined {\n const selectedSegmentsAndParagraphs = getSelectedSegmentsAndParagraphs(model, true);\n if (!selectedSegmentsAndParagraphs[0]) {\n return undefined;\n }\n const marker = selectedSegmentsAndParagraphs[0][0];\n const paragraph = selectedSegmentsAndParagraphs[0][1];\n const listMarkerSegment = paragraph?.segments[0];\n\n if (\n marker &&\n marker.segmentType == 'SelectionMarker' &&\n listMarkerSegment &&\n listMarkerSegment.segmentType == 'Text'\n ) {\n const listMarker = listMarkerSegment.text.trim();\n const bulletType = bulletListType.get(listMarker);\n\n if (bulletType && shouldSearchForBullet) {\n return { listType: 'UL', styleType: bulletType };\n } else if (shouldSearchForNumbering) {\n const previousList = getPreviousListLevel(model, paragraph);\n const previousIndex = getPreviousListIndex(model, previousList);\n const previousListStyle = getPreviousListStyle(previousList);\n const numberingType = getNumberingListStyle(\n listMarker,\n previousIndex,\n previousListStyle\n );\n\n if (numberingType) {\n return {\n listType: 'OL',\n styleType: numberingType,\n index:\n !isNewList(listMarker) &&\n previousListStyle === numberingType &&\n previousIndex\n ? previousIndex + 1\n : undefined,\n };\n }\n }\n }\n return undefined;\n}\n\nconst getPreviousListIndex = (\n model: ReadonlyContentModelDocument,\n previousListItem?: ReadonlyContentModelListItem\n) => {\n return previousListItem ? findListItemsInSameThread(model, previousListItem).length : undefined;\n};\n\nconst getPreviousListLevel = (\n model: ReadonlyContentModelDocument,\n paragraph: ReadonlyContentModelParagraph\n) => {\n const blocks = getOperationalBlocks<ContentModelListItem>(\n model,\n ['ListItem'],\n ['TableCell']\n )[0];\n let listItem: ContentModelListItem | undefined = undefined;\n if (blocks) {\n const listBlockIndex = blocks.parent.blocks.indexOf(paragraph);\n\n if (listBlockIndex > -1) {\n for (let i = listBlockIndex - 1; i > -1; i--) {\n const item = blocks.parent.blocks[i];\n if (isBlockGroupOfType<ContentModelListItem>(item, 'ListItem')) {\n listItem = item;\n break;\n }\n }\n }\n }\n\n return listItem;\n};\n\nconst getPreviousListStyle = (list?: ContentModelListItem) => {\n if (list?.levels[0].dataset) {\n return updateListMetadata(list.levels[0])?.orderedStyleType;\n }\n};\n\nconst bulletListType: Map<string, number> = new Map<string, number>([\n ['*', BulletListType.Disc],\n ['-', BulletListType.Dash],\n ['--', BulletListType.Square],\n ['->', BulletListType.LongArrow],\n ['-->', BulletListType.DoubleLongArrow],\n ['=>', BulletListType.UnfilledArrow],\n ['>', BulletListType.ShortArrow],\n ['—', BulletListType.Hyphen],\n]);\n\nconst isNewList = (listMarker: string) => {\n const marker = listMarker.replace(/[^\\w\\s]/g, '');\n const pattern = /^[1aAiI]$/;\n return pattern.test(marker);\n};\n"]}
|
|
@@ -2,22 +2,23 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.transformFraction = void 0;
|
|
4
4
|
var splitTextSegment_1 = require("../../pluginUtils/splitTextSegment");
|
|
5
|
-
var FRACTIONS =
|
|
6
|
-
'1/2'
|
|
7
|
-
'1/4'
|
|
8
|
-
'3/4'
|
|
9
|
-
|
|
5
|
+
var FRACTIONS = new Map([
|
|
6
|
+
['1/2', '½'],
|
|
7
|
+
['1/4', '¼'],
|
|
8
|
+
['3/4', '¾'],
|
|
9
|
+
]);
|
|
10
10
|
/**
|
|
11
11
|
* @internal
|
|
12
12
|
*/
|
|
13
13
|
function transformFraction(previousSegment, paragraph, context) {
|
|
14
14
|
var _a;
|
|
15
15
|
var fraction = (_a = previousSegment.text.split(' ').pop()) === null || _a === void 0 ? void 0 : _a.trim();
|
|
16
|
-
|
|
16
|
+
var text = fraction ? FRACTIONS.get(fraction) : undefined;
|
|
17
|
+
if (fraction && text) {
|
|
17
18
|
var textLength = previousSegment.text.length - 1;
|
|
18
19
|
var textIndex = textLength - fraction.length;
|
|
19
20
|
var textSegment = (0, splitTextSegment_1.splitTextSegment)(previousSegment, paragraph, textIndex, textLength);
|
|
20
|
-
textSegment.text =
|
|
21
|
+
textSegment.text = text;
|
|
21
22
|
context.canUndoByBackspace = true;
|
|
22
23
|
return true;
|
|
23
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformFraction.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformFraction.ts"],"names":[],"mappings":";;;AAAA,uEAAsE;AAOtE,IAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"transformFraction.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformFraction.ts"],"names":[],"mappings":";;;AAAA,uEAAsE;AAOtE,IAAM,SAAS,GAAwB,IAAI,GAAG,CAAiB;IAC3D,CAAC,KAAK,EAAE,GAAG,CAAC;IACZ,CAAC,KAAK,EAAE,GAAG,CAAC;IACZ,CAAC,KAAK,EAAE,GAAG,CAAC;CACf,CAAC,CAAC;AAEH;;GAEG;AACH,SAAgB,iBAAiB,CAC7B,eAAiC,EACjC,SAA8C,EAC9C,OAAkC;;IAElC,IAAM,QAAQ,GAAG,MAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,0CAAE,IAAI,EAAE,CAAC;IAC/D,IAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5D,IAAI,QAAQ,IAAI,IAAI,EAAE;QAClB,IAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACnD,IAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/C,IAAM,WAAW,GAAG,IAAA,mCAAgB,EAAC,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACxF,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QAExB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAClC,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAnBD,8CAmBC","sourcesContent":["import { splitTextSegment } from '../../pluginUtils/splitTextSegment';\nimport type {\n ContentModelText,\n FormatContentModelContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst FRACTIONS: Map<string, string> = new Map<string, string>([\n ['1/2', '½'],\n ['1/4', '¼'],\n ['3/4', '¾'],\n]);\n\n/**\n * @internal\n */\nexport function transformFraction(\n previousSegment: ContentModelText,\n paragraph: ShallowMutableContentModelParagraph,\n context: FormatContentModelContext\n): boolean {\n const fraction = previousSegment.text.split(' ').pop()?.trim();\n const text = fraction ? FRACTIONS.get(fraction) : undefined;\n\n if (fraction && text) {\n const textLength = previousSegment.text.length - 1;\n const textIndex = textLength - fraction.length;\n const textSegment = splitTextSegment(previousSegment, paragraph, textIndex, textLength);\n textSegment.text = text;\n\n context.canUndoByBackspace = true;\n return true;\n }\n\n return false;\n}\n"]}
|
|
@@ -8,6 +8,7 @@ export declare class WatermarkPlugin implements EditorPlugin {
|
|
|
8
8
|
private editor;
|
|
9
9
|
private format;
|
|
10
10
|
private isShowing;
|
|
11
|
+
private darkTextColor;
|
|
11
12
|
/**
|
|
12
13
|
* Create an instance of Watermark plugin
|
|
13
14
|
* @param watermark The watermark string
|
|
@@ -33,5 +34,6 @@ export declare class WatermarkPlugin implements EditorPlugin {
|
|
|
33
34
|
onPluginEvent(event: PluginEvent): void;
|
|
34
35
|
private showHide;
|
|
35
36
|
protected show(editor: IEditor): void;
|
|
37
|
+
private applyWatermarkStyle;
|
|
36
38
|
protected hide(editor: IEditor): void;
|
|
37
39
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WatermarkPlugin = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
4
5
|
var roosterjs_content_model_dom_1 = require("roosterjs-content-model-dom");
|
|
5
6
|
var isModelEmptyFast_1 = require("./isModelEmptyFast");
|
|
6
7
|
var WATERMARK_CONTENT_KEY = '_WatermarkContent';
|
|
@@ -21,6 +22,7 @@ var WatermarkPlugin = /** @class */ (function () {
|
|
|
21
22
|
this.watermark = watermark;
|
|
22
23
|
this.editor = null;
|
|
23
24
|
this.isShowing = false;
|
|
25
|
+
this.darkTextColor = null;
|
|
24
26
|
this.format = format || {
|
|
25
27
|
fontSize: '14px',
|
|
26
28
|
textColor: '#AAAAAA',
|
|
@@ -60,6 +62,21 @@ var WatermarkPlugin = /** @class */ (function () {
|
|
|
60
62
|
// When input text, editor must not be empty, so we can do hide watermark now without checking content model
|
|
61
63
|
this.showHide(editor, false /*isEmpty*/);
|
|
62
64
|
}
|
|
65
|
+
else if (event.eventType == 'contentChanged' &&
|
|
66
|
+
(event.source == roosterjs_content_model_dom_1.ChangeSource.SwitchToDarkMode ||
|
|
67
|
+
event.source == roosterjs_content_model_dom_1.ChangeSource.SwitchToLightMode) &&
|
|
68
|
+
this.isShowing) {
|
|
69
|
+
// When the placeholder is shown and user switches the mode, we need to update watermark style
|
|
70
|
+
if (event.source == roosterjs_content_model_dom_1.ChangeSource.SwitchToDarkMode &&
|
|
71
|
+
!this.darkTextColor &&
|
|
72
|
+
this.format.textColor) {
|
|
73
|
+
// Get the dark color only once when dark mode is enabled for the first time
|
|
74
|
+
this.darkTextColor = editor
|
|
75
|
+
.getColorManager()
|
|
76
|
+
.getDarkColor(this.format.textColor, undefined, 'text');
|
|
77
|
+
}
|
|
78
|
+
this.applyWatermarkStyle(editor);
|
|
79
|
+
}
|
|
63
80
|
else if (event.eventType == 'editorReady' ||
|
|
64
81
|
event.eventType == 'contentChanged' ||
|
|
65
82
|
event.eventType == 'input' ||
|
|
@@ -80,15 +97,18 @@ var WatermarkPlugin = /** @class */ (function () {
|
|
|
80
97
|
}
|
|
81
98
|
};
|
|
82
99
|
WatermarkPlugin.prototype.show = function (editor) {
|
|
83
|
-
|
|
100
|
+
this.applyWatermarkStyle(editor);
|
|
101
|
+
this.isShowing = true;
|
|
102
|
+
};
|
|
103
|
+
WatermarkPlugin.prototype.applyWatermarkStyle = function (editor) {
|
|
84
104
|
var rule = "position: absolute; pointer-events: none; content: \"" + this.watermark + "\";";
|
|
105
|
+
var format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, this.format), { textColor: editor.isDarkMode() ? this.darkTextColor : this.format.textColor });
|
|
85
106
|
(0, roosterjs_content_model_dom_1.getObjectKeys)(styleMap).forEach(function (x) {
|
|
86
|
-
if (
|
|
87
|
-
rule += styleMap[x] + ": " +
|
|
107
|
+
if (format[x]) {
|
|
108
|
+
rule += styleMap[x] + ": " + format[x] + "!important;";
|
|
88
109
|
}
|
|
89
110
|
});
|
|
90
111
|
editor.setEditorStyle(WATERMARK_CONTENT_KEY, rule, 'before');
|
|
91
|
-
this.isShowing = true;
|
|
92
112
|
};
|
|
93
113
|
WatermarkPlugin.prototype.hide = function (editor) {
|
|
94
114
|
editor.setEditorStyle(WATERMARK_CONTENT_KEY, null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WatermarkPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WatermarkPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource, getObjectKeys } from 'roosterjs-content-model-dom';\nimport { isModelEmptyFast } from './isModelEmptyFast';\nimport type { WatermarkFormat } from './WatermarkFormat';\nimport type { EditorPlugin, IEditor, PluginEvent } from 'roosterjs-content-model-types';\n\nconst WATERMARK_CONTENT_KEY = '_WatermarkContent';\nconst styleMap: Record<keyof WatermarkFormat, string> = {\n fontFamily: 'font-family',\n fontSize: 'font-size',\n textColor: 'color',\n};\n\n/**\n * A watermark plugin to manage watermark string for roosterjs\n */\nexport class WatermarkPlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n private format: WatermarkFormat;\n private isShowing = false;\n private darkTextColor: string | null = null;\n\n /**\n * Create an instance of Watermark plugin\n * @param watermark The watermark string\n */\n constructor(protected watermark: string, format?: WatermarkFormat) {\n this.format = format || {\n fontSize: '14px',\n textColor: '#AAAAAA',\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'Watermark';\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\n /**\n * Dispose this plugin\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Handle events triggered from editor\n * @param event PluginEvent object\n */\n onPluginEvent(event: PluginEvent) {\n const editor = this.editor;\n\n if (!editor) {\n return;\n }\n\n if (\n (event.eventType == 'input' && event.rawEvent.inputType == 'insertText') ||\n event.eventType == 'compositionEnd'\n ) {\n // When input text, editor must not be empty, so we can do hide watermark now without checking content model\n this.showHide(editor, false /*isEmpty*/);\n } else if (\n event.eventType == 'contentChanged' &&\n (event.source == ChangeSource.SwitchToDarkMode ||\n event.source == ChangeSource.SwitchToLightMode) &&\n this.isShowing\n ) {\n // When the placeholder is shown and user switches the mode, we need to update watermark style\n if (\n event.source == ChangeSource.SwitchToDarkMode &&\n !this.darkTextColor &&\n this.format.textColor\n ) {\n // Get the dark color only once when dark mode is enabled for the first time\n this.darkTextColor = editor\n .getColorManager()\n .getDarkColor(this.format.textColor, undefined, 'text');\n }\n\n this.applyWatermarkStyle(editor);\n } else if (\n event.eventType == 'editorReady' ||\n event.eventType == 'contentChanged' ||\n event.eventType == 'input' ||\n event.eventType == 'beforeDispose'\n ) {\n editor.formatContentModel(model => {\n const isEmpty = isModelEmptyFast(model);\n\n this.showHide(editor, isEmpty);\n\n return false;\n });\n }\n }\n\n private showHide(editor: IEditor, isEmpty: boolean) {\n if (this.isShowing && !isEmpty) {\n this.hide(editor);\n } else if (!this.isShowing && isEmpty) {\n this.show(editor);\n }\n }\n\n protected show(editor: IEditor) {\n this.applyWatermarkStyle(editor);\n this.isShowing = true;\n }\n\n private applyWatermarkStyle(editor: IEditor) {\n let rule = `position: absolute; pointer-events: none; content: \"${this.watermark}\";`;\n const format = {\n ...this.format,\n textColor: editor.isDarkMode() ? this.darkTextColor : this.format.textColor,\n };\n\n getObjectKeys(styleMap).forEach(x => {\n if (format[x]) {\n rule += `${styleMap[x]}: ${format[x]}!important;`;\n }\n });\n\n editor.setEditorStyle(WATERMARK_CONTENT_KEY, rule, 'before');\n }\n\n protected hide(editor: IEditor) {\n editor.setEditorStyle(WATERMARK_CONTENT_KEY, null);\n this.isShowing = false;\n }\n}\n"]}
|
|
@@ -20,7 +20,7 @@ define(["require", "exports", "roosterjs-content-model-api", "./getNumberingList
|
|
|
20
20
|
listMarkerSegment &&
|
|
21
21
|
listMarkerSegment.segmentType == 'Text') {
|
|
22
22
|
var listMarker = listMarkerSegment.text.trim();
|
|
23
|
-
var bulletType = bulletListType
|
|
23
|
+
var bulletType = bulletListType.get(listMarker);
|
|
24
24
|
if (bulletType && shouldSearchForBullet) {
|
|
25
25
|
return { listType: 'UL', styleType: bulletType };
|
|
26
26
|
}
|
|
@@ -71,16 +71,16 @@ define(["require", "exports", "roosterjs-content-model-api", "./getNumberingList
|
|
|
71
71
|
return (_a = (0, roosterjs_content_model_dom_1.updateListMetadata)(list.levels[0])) === null || _a === void 0 ? void 0 : _a.orderedStyleType;
|
|
72
72
|
}
|
|
73
73
|
};
|
|
74
|
-
var bulletListType =
|
|
75
|
-
'*'
|
|
76
|
-
'-'
|
|
77
|
-
'--'
|
|
78
|
-
'->'
|
|
79
|
-
'-->'
|
|
80
|
-
'=>'
|
|
81
|
-
'>'
|
|
82
|
-
'—'
|
|
83
|
-
|
|
74
|
+
var bulletListType = new Map([
|
|
75
|
+
['*', roosterjs_content_model_dom_1.BulletListType.Disc],
|
|
76
|
+
['-', roosterjs_content_model_dom_1.BulletListType.Dash],
|
|
77
|
+
['--', roosterjs_content_model_dom_1.BulletListType.Square],
|
|
78
|
+
['->', roosterjs_content_model_dom_1.BulletListType.LongArrow],
|
|
79
|
+
['-->', roosterjs_content_model_dom_1.BulletListType.DoubleLongArrow],
|
|
80
|
+
['=>', roosterjs_content_model_dom_1.BulletListType.UnfilledArrow],
|
|
81
|
+
['>', roosterjs_content_model_dom_1.BulletListType.ShortArrow],
|
|
82
|
+
['—', roosterjs_content_model_dom_1.BulletListType.Hyphen],
|
|
83
|
+
]);
|
|
84
84
|
var isNewList = function (listMarker) {
|
|
85
85
|
var marker = listMarker.replace(/[^\w\s]/g, '');
|
|
86
86
|
var pattern = /^[1aAiI]$/;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getListTypeStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/list/getListTypeStyle.ts"],"names":[],"mappings":";;;;IAyBA;;OAEG;IACH,SAAgB,gBAAgB,CAC5B,KAAmC,EACnC,qBAAqC,EACrC,wBAAwC;QADxC,sCAAA,EAAA,4BAAqC;QACrC,yCAAA,EAAA,+BAAwC;QAExC,IAAM,6BAA6B,GAAG,IAAA,8DAAgC,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpF,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE;YACnC,OAAO,SAAS,CAAC;SACpB;QACD,IAAM,MAAM,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAM,SAAS,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAM,iBAAiB,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEjD,IACI,MAAM;YACN,MAAM,CAAC,WAAW,IAAI,iBAAiB;YACvC,iBAAiB;YACjB,iBAAiB,CAAC,WAAW,IAAI,MAAM,EACzC;YACE,IAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACjD,IAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"getListTypeStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/list/getListTypeStyle.ts"],"names":[],"mappings":"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","sourcesContent":["import { findListItemsInSameThread } from 'roosterjs-content-model-api';\nimport { getNumberingListStyle } from './getNumberingListStyle';\nimport type {\n ContentModelListItem,\n ReadonlyContentModelDocument,\n ReadonlyContentModelListItem,\n ReadonlyContentModelParagraph,\n} from 'roosterjs-content-model-types';\nimport {\n BulletListType,\n isBlockGroupOfType,\n updateListMetadata,\n getOperationalBlocks,\n getSelectedSegmentsAndParagraphs,\n} from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\ninterface ListTypeStyle {\n listType: 'UL' | 'OL';\n styleType: number;\n index?: number;\n}\n\n/**\n * @internal\n */\nexport function getListTypeStyle(\n model: ReadonlyContentModelDocument,\n shouldSearchForBullet: boolean = true,\n shouldSearchForNumbering: boolean = true\n): ListTypeStyle | undefined {\n const selectedSegmentsAndParagraphs = getSelectedSegmentsAndParagraphs(model, true);\n if (!selectedSegmentsAndParagraphs[0]) {\n return undefined;\n }\n const marker = selectedSegmentsAndParagraphs[0][0];\n const paragraph = selectedSegmentsAndParagraphs[0][1];\n const listMarkerSegment = paragraph?.segments[0];\n\n if (\n marker &&\n marker.segmentType == 'SelectionMarker' &&\n listMarkerSegment &&\n listMarkerSegment.segmentType == 'Text'\n ) {\n const listMarker = listMarkerSegment.text.trim();\n const bulletType = bulletListType.get(listMarker);\n\n if (bulletType && shouldSearchForBullet) {\n return { listType: 'UL', styleType: bulletType };\n } else if (shouldSearchForNumbering) {\n const previousList = getPreviousListLevel(model, paragraph);\n const previousIndex = getPreviousListIndex(model, previousList);\n const previousListStyle = getPreviousListStyle(previousList);\n const numberingType = getNumberingListStyle(\n listMarker,\n previousIndex,\n previousListStyle\n );\n\n if (numberingType) {\n return {\n listType: 'OL',\n styleType: numberingType,\n index:\n !isNewList(listMarker) &&\n previousListStyle === numberingType &&\n previousIndex\n ? previousIndex + 1\n : undefined,\n };\n }\n }\n }\n return undefined;\n}\n\nconst getPreviousListIndex = (\n model: ReadonlyContentModelDocument,\n previousListItem?: ReadonlyContentModelListItem\n) => {\n return previousListItem ? findListItemsInSameThread(model, previousListItem).length : undefined;\n};\n\nconst getPreviousListLevel = (\n model: ReadonlyContentModelDocument,\n paragraph: ReadonlyContentModelParagraph\n) => {\n const blocks = getOperationalBlocks<ContentModelListItem>(\n model,\n ['ListItem'],\n ['TableCell']\n )[0];\n let listItem: ContentModelListItem | undefined = undefined;\n if (blocks) {\n const listBlockIndex = blocks.parent.blocks.indexOf(paragraph);\n\n if (listBlockIndex > -1) {\n for (let i = listBlockIndex - 1; i > -1; i--) {\n const item = blocks.parent.blocks[i];\n if (isBlockGroupOfType<ContentModelListItem>(item, 'ListItem')) {\n listItem = item;\n break;\n }\n }\n }\n }\n\n return listItem;\n};\n\nconst getPreviousListStyle = (list?: ContentModelListItem) => {\n if (list?.levels[0].dataset) {\n return updateListMetadata(list.levels[0])?.orderedStyleType;\n }\n};\n\nconst bulletListType: Map<string, number> = new Map<string, number>([\n ['*', BulletListType.Disc],\n ['-', BulletListType.Dash],\n ['--', BulletListType.Square],\n ['->', BulletListType.LongArrow],\n ['-->', BulletListType.DoubleLongArrow],\n ['=>', BulletListType.UnfilledArrow],\n ['>', BulletListType.ShortArrow],\n ['—', BulletListType.Hyphen],\n]);\n\nconst isNewList = (listMarker: string) => {\n const marker = listMarker.replace(/[^\\w\\s]/g, '');\n const pattern = /^[1aAiI]$/;\n return pattern.test(marker);\n};\n"]}
|
|
@@ -2,22 +2,23 @@ define(["require", "exports", "../../pluginUtils/splitTextSegment"], function (r
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.transformFraction = void 0;
|
|
5
|
-
var FRACTIONS =
|
|
6
|
-
'1/2'
|
|
7
|
-
'1/4'
|
|
8
|
-
'3/4'
|
|
9
|
-
|
|
5
|
+
var FRACTIONS = new Map([
|
|
6
|
+
['1/2', '½'],
|
|
7
|
+
['1/4', '¼'],
|
|
8
|
+
['3/4', '¾'],
|
|
9
|
+
]);
|
|
10
10
|
/**
|
|
11
11
|
* @internal
|
|
12
12
|
*/
|
|
13
13
|
function transformFraction(previousSegment, paragraph, context) {
|
|
14
14
|
var _a;
|
|
15
15
|
var fraction = (_a = previousSegment.text.split(' ').pop()) === null || _a === void 0 ? void 0 : _a.trim();
|
|
16
|
-
|
|
16
|
+
var text = fraction ? FRACTIONS.get(fraction) : undefined;
|
|
17
|
+
if (fraction && text) {
|
|
17
18
|
var textLength = previousSegment.text.length - 1;
|
|
18
19
|
var textIndex = textLength - fraction.length;
|
|
19
20
|
var textSegment = (0, splitTextSegment_1.splitTextSegment)(previousSegment, paragraph, textIndex, textLength);
|
|
20
|
-
textSegment.text =
|
|
21
|
+
textSegment.text = text;
|
|
21
22
|
context.canUndoByBackspace = true;
|
|
22
23
|
return true;
|
|
23
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformFraction.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformFraction.ts"],"names":[],"mappings":";;;;IAOA,IAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"transformFraction.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformFraction.ts"],"names":[],"mappings":";;;;IAOA,IAAM,SAAS,GAAwB,IAAI,GAAG,CAAiB;QAC3D,CAAC,KAAK,EAAE,GAAG,CAAC;QACZ,CAAC,KAAK,EAAE,GAAG,CAAC;QACZ,CAAC,KAAK,EAAE,GAAG,CAAC;KACf,CAAC,CAAC;IAEH;;OAEG;IACH,SAAgB,iBAAiB,CAC7B,eAAiC,EACjC,SAA8C,EAC9C,OAAkC;;QAElC,IAAM,QAAQ,GAAG,MAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,0CAAE,IAAI,EAAE,CAAC;QAC/D,IAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5D,IAAI,QAAQ,IAAI,IAAI,EAAE;YAClB,IAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACnD,IAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC/C,IAAM,WAAW,GAAG,IAAA,mCAAgB,EAAC,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACxF,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;YAExB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAClC,OAAO,IAAI,CAAC;SACf;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAnBD,8CAmBC","sourcesContent":["import { splitTextSegment } from '../../pluginUtils/splitTextSegment';\nimport type {\n ContentModelText,\n FormatContentModelContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst FRACTIONS: Map<string, string> = new Map<string, string>([\n ['1/2', '½'],\n ['1/4', '¼'],\n ['3/4', '¾'],\n]);\n\n/**\n * @internal\n */\nexport function transformFraction(\n previousSegment: ContentModelText,\n paragraph: ShallowMutableContentModelParagraph,\n context: FormatContentModelContext\n): boolean {\n const fraction = previousSegment.text.split(' ').pop()?.trim();\n const text = fraction ? FRACTIONS.get(fraction) : undefined;\n\n if (fraction && text) {\n const textLength = previousSegment.text.length - 1;\n const textIndex = textLength - fraction.length;\n const textSegment = splitTextSegment(previousSegment, paragraph, textIndex, textLength);\n textSegment.text = text;\n\n context.canUndoByBackspace = true;\n return true;\n }\n\n return false;\n}\n"]}
|
|
@@ -8,6 +8,7 @@ export declare class WatermarkPlugin implements EditorPlugin {
|
|
|
8
8
|
private editor;
|
|
9
9
|
private format;
|
|
10
10
|
private isShowing;
|
|
11
|
+
private darkTextColor;
|
|
11
12
|
/**
|
|
12
13
|
* Create an instance of Watermark plugin
|
|
13
14
|
* @param watermark The watermark string
|
|
@@ -33,5 +34,6 @@ export declare class WatermarkPlugin implements EditorPlugin {
|
|
|
33
34
|
onPluginEvent(event: PluginEvent): void;
|
|
34
35
|
private showHide;
|
|
35
36
|
protected show(editor: IEditor): void;
|
|
37
|
+
private applyWatermarkStyle;
|
|
36
38
|
protected hide(editor: IEditor): void;
|
|
37
39
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
define(["require", "exports", "roosterjs-content-model-dom", "./isModelEmptyFast"], function (require, exports, roosterjs_content_model_dom_1, isModelEmptyFast_1) {
|
|
1
|
+
define(["require", "exports", "tslib", "roosterjs-content-model-dom", "./isModelEmptyFast"], function (require, exports, tslib_1, roosterjs_content_model_dom_1, isModelEmptyFast_1) {
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.WatermarkPlugin = void 0;
|
|
@@ -20,6 +20,7 @@ define(["require", "exports", "roosterjs-content-model-dom", "./isModelEmptyFast
|
|
|
20
20
|
this.watermark = watermark;
|
|
21
21
|
this.editor = null;
|
|
22
22
|
this.isShowing = false;
|
|
23
|
+
this.darkTextColor = null;
|
|
23
24
|
this.format = format || {
|
|
24
25
|
fontSize: '14px',
|
|
25
26
|
textColor: '#AAAAAA',
|
|
@@ -59,6 +60,21 @@ define(["require", "exports", "roosterjs-content-model-dom", "./isModelEmptyFast
|
|
|
59
60
|
// When input text, editor must not be empty, so we can do hide watermark now without checking content model
|
|
60
61
|
this.showHide(editor, false /*isEmpty*/);
|
|
61
62
|
}
|
|
63
|
+
else if (event.eventType == 'contentChanged' &&
|
|
64
|
+
(event.source == roosterjs_content_model_dom_1.ChangeSource.SwitchToDarkMode ||
|
|
65
|
+
event.source == roosterjs_content_model_dom_1.ChangeSource.SwitchToLightMode) &&
|
|
66
|
+
this.isShowing) {
|
|
67
|
+
// When the placeholder is shown and user switches the mode, we need to update watermark style
|
|
68
|
+
if (event.source == roosterjs_content_model_dom_1.ChangeSource.SwitchToDarkMode &&
|
|
69
|
+
!this.darkTextColor &&
|
|
70
|
+
this.format.textColor) {
|
|
71
|
+
// Get the dark color only once when dark mode is enabled for the first time
|
|
72
|
+
this.darkTextColor = editor
|
|
73
|
+
.getColorManager()
|
|
74
|
+
.getDarkColor(this.format.textColor, undefined, 'text');
|
|
75
|
+
}
|
|
76
|
+
this.applyWatermarkStyle(editor);
|
|
77
|
+
}
|
|
62
78
|
else if (event.eventType == 'editorReady' ||
|
|
63
79
|
event.eventType == 'contentChanged' ||
|
|
64
80
|
event.eventType == 'input' ||
|
|
@@ -79,15 +95,18 @@ define(["require", "exports", "roosterjs-content-model-dom", "./isModelEmptyFast
|
|
|
79
95
|
}
|
|
80
96
|
};
|
|
81
97
|
WatermarkPlugin.prototype.show = function (editor) {
|
|
82
|
-
|
|
98
|
+
this.applyWatermarkStyle(editor);
|
|
99
|
+
this.isShowing = true;
|
|
100
|
+
};
|
|
101
|
+
WatermarkPlugin.prototype.applyWatermarkStyle = function (editor) {
|
|
83
102
|
var rule = "position: absolute; pointer-events: none; content: \"" + this.watermark + "\";";
|
|
103
|
+
var format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, this.format), { textColor: editor.isDarkMode() ? this.darkTextColor : this.format.textColor });
|
|
84
104
|
(0, roosterjs_content_model_dom_1.getObjectKeys)(styleMap).forEach(function (x) {
|
|
85
|
-
if (
|
|
86
|
-
rule += styleMap[x] + ": " +
|
|
105
|
+
if (format[x]) {
|
|
106
|
+
rule += styleMap[x] + ": " + format[x] + "!important;";
|
|
87
107
|
}
|
|
88
108
|
});
|
|
89
109
|
editor.setEditorStyle(WATERMARK_CONTENT_KEY, rule, 'before');
|
|
90
|
-
this.isShowing = true;
|
|
91
110
|
};
|
|
92
111
|
WatermarkPlugin.prototype.hide = function (editor) {
|
|
93
112
|
editor.setEditorStyle(WATERMARK_CONTENT_KEY, null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WatermarkPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts"],"names":[],"mappings":";;;;IAKA,IAAM,qBAAqB,GAAG,mBAAmB,CAAC;IAClD,IAAM,QAAQ,GAA0C;QACpD,UAAU,EAAE,aAAa;QACzB,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,OAAO;KACrB,CAAC;IAEF;;OAEG;IACH;
|
|
1
|
+
{"version":3,"file":"WatermarkPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource, getObjectKeys } from 'roosterjs-content-model-dom';\nimport { isModelEmptyFast } from './isModelEmptyFast';\nimport type { WatermarkFormat } from './WatermarkFormat';\nimport type { EditorPlugin, IEditor, PluginEvent } from 'roosterjs-content-model-types';\n\nconst WATERMARK_CONTENT_KEY = '_WatermarkContent';\nconst styleMap: Record<keyof WatermarkFormat, string> = {\n fontFamily: 'font-family',\n fontSize: 'font-size',\n textColor: 'color',\n};\n\n/**\n * A watermark plugin to manage watermark string for roosterjs\n */\nexport class WatermarkPlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n private format: WatermarkFormat;\n private isShowing = false;\n private darkTextColor: string | null = null;\n\n /**\n * Create an instance of Watermark plugin\n * @param watermark The watermark string\n */\n constructor(protected watermark: string, format?: WatermarkFormat) {\n this.format = format || {\n fontSize: '14px',\n textColor: '#AAAAAA',\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'Watermark';\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\n /**\n * Dispose this plugin\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Handle events triggered from editor\n * @param event PluginEvent object\n */\n onPluginEvent(event: PluginEvent) {\n const editor = this.editor;\n\n if (!editor) {\n return;\n }\n\n if (\n (event.eventType == 'input' && event.rawEvent.inputType == 'insertText') ||\n event.eventType == 'compositionEnd'\n ) {\n // When input text, editor must not be empty, so we can do hide watermark now without checking content model\n this.showHide(editor, false /*isEmpty*/);\n } else if (\n event.eventType == 'contentChanged' &&\n (event.source == ChangeSource.SwitchToDarkMode ||\n event.source == ChangeSource.SwitchToLightMode) &&\n this.isShowing\n ) {\n // When the placeholder is shown and user switches the mode, we need to update watermark style\n if (\n event.source == ChangeSource.SwitchToDarkMode &&\n !this.darkTextColor &&\n this.format.textColor\n ) {\n // Get the dark color only once when dark mode is enabled for the first time\n this.darkTextColor = editor\n .getColorManager()\n .getDarkColor(this.format.textColor, undefined, 'text');\n }\n\n this.applyWatermarkStyle(editor);\n } else if (\n event.eventType == 'editorReady' ||\n event.eventType == 'contentChanged' ||\n event.eventType == 'input' ||\n event.eventType == 'beforeDispose'\n ) {\n editor.formatContentModel(model => {\n const isEmpty = isModelEmptyFast(model);\n\n this.showHide(editor, isEmpty);\n\n return false;\n });\n }\n }\n\n private showHide(editor: IEditor, isEmpty: boolean) {\n if (this.isShowing && !isEmpty) {\n this.hide(editor);\n } else if (!this.isShowing && isEmpty) {\n this.show(editor);\n }\n }\n\n protected show(editor: IEditor) {\n this.applyWatermarkStyle(editor);\n this.isShowing = true;\n }\n\n private applyWatermarkStyle(editor: IEditor) {\n let rule = `position: absolute; pointer-events: none; content: \"${this.watermark}\";`;\n const format = {\n ...this.format,\n textColor: editor.isDarkMode() ? this.darkTextColor : this.format.textColor,\n };\n\n getObjectKeys(styleMap).forEach(x => {\n if (format[x]) {\n rule += `${styleMap[x]}: ${format[x]}!important;`;\n }\n });\n\n editor.setEditorStyle(WATERMARK_CONTENT_KEY, rule, 'before');\n }\n\n protected hide(editor: IEditor) {\n editor.setEditorStyle(WATERMARK_CONTENT_KEY, null);\n this.isShowing = false;\n }\n}\n"]}
|
|
@@ -19,7 +19,7 @@ export function getListTypeStyle(model, shouldSearchForBullet, shouldSearchForNu
|
|
|
19
19
|
listMarkerSegment &&
|
|
20
20
|
listMarkerSegment.segmentType == 'Text') {
|
|
21
21
|
var listMarker = listMarkerSegment.text.trim();
|
|
22
|
-
var bulletType = bulletListType
|
|
22
|
+
var bulletType = bulletListType.get(listMarker);
|
|
23
23
|
if (bulletType && shouldSearchForBullet) {
|
|
24
24
|
return { listType: 'UL', styleType: bulletType };
|
|
25
25
|
}
|
|
@@ -69,16 +69,16 @@ var getPreviousListStyle = function (list) {
|
|
|
69
69
|
return (_a = updateListMetadata(list.levels[0])) === null || _a === void 0 ? void 0 : _a.orderedStyleType;
|
|
70
70
|
}
|
|
71
71
|
};
|
|
72
|
-
var bulletListType =
|
|
73
|
-
'*'
|
|
74
|
-
'-'
|
|
75
|
-
'--'
|
|
76
|
-
'->'
|
|
77
|
-
'-->'
|
|
78
|
-
'=>'
|
|
79
|
-
'>'
|
|
80
|
-
'—'
|
|
81
|
-
|
|
72
|
+
var bulletListType = new Map([
|
|
73
|
+
['*', BulletListType.Disc],
|
|
74
|
+
['-', BulletListType.Dash],
|
|
75
|
+
['--', BulletListType.Square],
|
|
76
|
+
['->', BulletListType.LongArrow],
|
|
77
|
+
['-->', BulletListType.DoubleLongArrow],
|
|
78
|
+
['=>', BulletListType.UnfilledArrow],
|
|
79
|
+
['>', BulletListType.ShortArrow],
|
|
80
|
+
['—', BulletListType.Hyphen],
|
|
81
|
+
]);
|
|
82
82
|
var isNewList = function (listMarker) {
|
|
83
83
|
var marker = listMarker.replace(/[^\w\s]/g, '');
|
|
84
84
|
var pattern = /^[1aAiI]$/;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getListTypeStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/list/getListTypeStyle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAOhE,OAAO,EACH,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,gCAAgC,GACnC,MAAM,6BAA6B,CAAC;AAWrC;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC5B,KAAmC,EACnC,qBAAqC,EACrC,wBAAwC;IADxC,sCAAA,EAAA,4BAAqC;IACrC,yCAAA,EAAA,+BAAwC;IAExC,IAAM,6BAA6B,GAAG,gCAAgC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpF,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE;QACnC,OAAO,SAAS,CAAC;KACpB;IACD,IAAM,MAAM,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAM,SAAS,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAM,iBAAiB,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEjD,IACI,MAAM;QACN,MAAM,CAAC,WAAW,IAAI,iBAAiB;QACvC,iBAAiB;QACjB,iBAAiB,CAAC,WAAW,IAAI,MAAM,EACzC;QACE,IAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACjD,IAAM,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"getListTypeStyle.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/list/getListTypeStyle.ts"],"names":[],"mappings":"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","sourcesContent":["import { findListItemsInSameThread } from 'roosterjs-content-model-api';\nimport { getNumberingListStyle } from './getNumberingListStyle';\nimport type {\n ContentModelListItem,\n ReadonlyContentModelDocument,\n ReadonlyContentModelListItem,\n ReadonlyContentModelParagraph,\n} from 'roosterjs-content-model-types';\nimport {\n BulletListType,\n isBlockGroupOfType,\n updateListMetadata,\n getOperationalBlocks,\n getSelectedSegmentsAndParagraphs,\n} from 'roosterjs-content-model-dom';\n\n/**\n * @internal\n */\ninterface ListTypeStyle {\n listType: 'UL' | 'OL';\n styleType: number;\n index?: number;\n}\n\n/**\n * @internal\n */\nexport function getListTypeStyle(\n model: ReadonlyContentModelDocument,\n shouldSearchForBullet: boolean = true,\n shouldSearchForNumbering: boolean = true\n): ListTypeStyle | undefined {\n const selectedSegmentsAndParagraphs = getSelectedSegmentsAndParagraphs(model, true);\n if (!selectedSegmentsAndParagraphs[0]) {\n return undefined;\n }\n const marker = selectedSegmentsAndParagraphs[0][0];\n const paragraph = selectedSegmentsAndParagraphs[0][1];\n const listMarkerSegment = paragraph?.segments[0];\n\n if (\n marker &&\n marker.segmentType == 'SelectionMarker' &&\n listMarkerSegment &&\n listMarkerSegment.segmentType == 'Text'\n ) {\n const listMarker = listMarkerSegment.text.trim();\n const bulletType = bulletListType.get(listMarker);\n\n if (bulletType && shouldSearchForBullet) {\n return { listType: 'UL', styleType: bulletType };\n } else if (shouldSearchForNumbering) {\n const previousList = getPreviousListLevel(model, paragraph);\n const previousIndex = getPreviousListIndex(model, previousList);\n const previousListStyle = getPreviousListStyle(previousList);\n const numberingType = getNumberingListStyle(\n listMarker,\n previousIndex,\n previousListStyle\n );\n\n if (numberingType) {\n return {\n listType: 'OL',\n styleType: numberingType,\n index:\n !isNewList(listMarker) &&\n previousListStyle === numberingType &&\n previousIndex\n ? previousIndex + 1\n : undefined,\n };\n }\n }\n }\n return undefined;\n}\n\nconst getPreviousListIndex = (\n model: ReadonlyContentModelDocument,\n previousListItem?: ReadonlyContentModelListItem\n) => {\n return previousListItem ? findListItemsInSameThread(model, previousListItem).length : undefined;\n};\n\nconst getPreviousListLevel = (\n model: ReadonlyContentModelDocument,\n paragraph: ReadonlyContentModelParagraph\n) => {\n const blocks = getOperationalBlocks<ContentModelListItem>(\n model,\n ['ListItem'],\n ['TableCell']\n )[0];\n let listItem: ContentModelListItem | undefined = undefined;\n if (blocks) {\n const listBlockIndex = blocks.parent.blocks.indexOf(paragraph);\n\n if (listBlockIndex > -1) {\n for (let i = listBlockIndex - 1; i > -1; i--) {\n const item = blocks.parent.blocks[i];\n if (isBlockGroupOfType<ContentModelListItem>(item, 'ListItem')) {\n listItem = item;\n break;\n }\n }\n }\n }\n\n return listItem;\n};\n\nconst getPreviousListStyle = (list?: ContentModelListItem) => {\n if (list?.levels[0].dataset) {\n return updateListMetadata(list.levels[0])?.orderedStyleType;\n }\n};\n\nconst bulletListType: Map<string, number> = new Map<string, number>([\n ['*', BulletListType.Disc],\n ['-', BulletListType.Dash],\n ['--', BulletListType.Square],\n ['->', BulletListType.LongArrow],\n ['-->', BulletListType.DoubleLongArrow],\n ['=>', BulletListType.UnfilledArrow],\n ['>', BulletListType.ShortArrow],\n ['—', BulletListType.Hyphen],\n]);\n\nconst isNewList = (listMarker: string) => {\n const marker = listMarker.replace(/[^\\w\\s]/g, '');\n const pattern = /^[1aAiI]$/;\n return pattern.test(marker);\n};\n"]}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { splitTextSegment } from '../../pluginUtils/splitTextSegment';
|
|
2
|
-
var FRACTIONS =
|
|
3
|
-
'1/2'
|
|
4
|
-
'1/4'
|
|
5
|
-
'3/4'
|
|
6
|
-
|
|
2
|
+
var FRACTIONS = new Map([
|
|
3
|
+
['1/2', '½'],
|
|
4
|
+
['1/4', '¼'],
|
|
5
|
+
['3/4', '¾'],
|
|
6
|
+
]);
|
|
7
7
|
/**
|
|
8
8
|
* @internal
|
|
9
9
|
*/
|
|
10
10
|
export function transformFraction(previousSegment, paragraph, context) {
|
|
11
11
|
var _a;
|
|
12
12
|
var fraction = (_a = previousSegment.text.split(' ').pop()) === null || _a === void 0 ? void 0 : _a.trim();
|
|
13
|
-
|
|
13
|
+
var text = fraction ? FRACTIONS.get(fraction) : undefined;
|
|
14
|
+
if (fraction && text) {
|
|
14
15
|
var textLength = previousSegment.text.length - 1;
|
|
15
16
|
var textIndex = textLength - fraction.length;
|
|
16
17
|
var textSegment = splitTextSegment(previousSegment, paragraph, textIndex, textLength);
|
|
17
|
-
textSegment.text =
|
|
18
|
+
textSegment.text = text;
|
|
18
19
|
context.canUndoByBackspace = true;
|
|
19
20
|
return true;
|
|
20
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformFraction.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformFraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAOtE,IAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"transformFraction.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/numbers/transformFraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAOtE,IAAM,SAAS,GAAwB,IAAI,GAAG,CAAiB;IAC3D,CAAC,KAAK,EAAE,GAAG,CAAC;IACZ,CAAC,KAAK,EAAE,GAAG,CAAC;IACZ,CAAC,KAAK,EAAE,GAAG,CAAC;CACf,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC7B,eAAiC,EACjC,SAA8C,EAC9C,OAAkC;;IAElC,IAAM,QAAQ,GAAG,MAAA,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,0CAAE,IAAI,EAAE,CAAC;IAC/D,IAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5D,IAAI,QAAQ,IAAI,IAAI,EAAE;QAClB,IAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QACnD,IAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/C,IAAM,WAAW,GAAG,gBAAgB,CAAC,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QACxF,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;QAExB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAClC,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import { splitTextSegment } from '../../pluginUtils/splitTextSegment';\nimport type {\n ContentModelText,\n FormatContentModelContext,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\nconst FRACTIONS: Map<string, string> = new Map<string, string>([\n ['1/2', '½'],\n ['1/4', '¼'],\n ['3/4', '¾'],\n]);\n\n/**\n * @internal\n */\nexport function transformFraction(\n previousSegment: ContentModelText,\n paragraph: ShallowMutableContentModelParagraph,\n context: FormatContentModelContext\n): boolean {\n const fraction = previousSegment.text.split(' ').pop()?.trim();\n const text = fraction ? FRACTIONS.get(fraction) : undefined;\n\n if (fraction && text) {\n const textLength = previousSegment.text.length - 1;\n const textIndex = textLength - fraction.length;\n const textSegment = splitTextSegment(previousSegment, paragraph, textIndex, textLength);\n textSegment.text = text;\n\n context.canUndoByBackspace = true;\n return true;\n }\n\n return false;\n}\n"]}
|
|
@@ -8,6 +8,7 @@ export declare class WatermarkPlugin implements EditorPlugin {
|
|
|
8
8
|
private editor;
|
|
9
9
|
private format;
|
|
10
10
|
private isShowing;
|
|
11
|
+
private darkTextColor;
|
|
11
12
|
/**
|
|
12
13
|
* Create an instance of Watermark plugin
|
|
13
14
|
* @param watermark The watermark string
|
|
@@ -33,5 +34,6 @@ export declare class WatermarkPlugin implements EditorPlugin {
|
|
|
33
34
|
onPluginEvent(event: PluginEvent): void;
|
|
34
35
|
private showHide;
|
|
35
36
|
protected show(editor: IEditor): void;
|
|
37
|
+
private applyWatermarkStyle;
|
|
36
38
|
protected hide(editor: IEditor): void;
|
|
37
39
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { __assign } from "tslib";
|
|
2
|
+
import { ChangeSource, getObjectKeys } from 'roosterjs-content-model-dom';
|
|
2
3
|
import { isModelEmptyFast } from './isModelEmptyFast';
|
|
3
4
|
var WATERMARK_CONTENT_KEY = '_WatermarkContent';
|
|
4
5
|
var styleMap = {
|
|
@@ -18,6 +19,7 @@ var WatermarkPlugin = /** @class */ (function () {
|
|
|
18
19
|
this.watermark = watermark;
|
|
19
20
|
this.editor = null;
|
|
20
21
|
this.isShowing = false;
|
|
22
|
+
this.darkTextColor = null;
|
|
21
23
|
this.format = format || {
|
|
22
24
|
fontSize: '14px',
|
|
23
25
|
textColor: '#AAAAAA',
|
|
@@ -57,6 +59,21 @@ var WatermarkPlugin = /** @class */ (function () {
|
|
|
57
59
|
// When input text, editor must not be empty, so we can do hide watermark now without checking content model
|
|
58
60
|
this.showHide(editor, false /*isEmpty*/);
|
|
59
61
|
}
|
|
62
|
+
else if (event.eventType == 'contentChanged' &&
|
|
63
|
+
(event.source == ChangeSource.SwitchToDarkMode ||
|
|
64
|
+
event.source == ChangeSource.SwitchToLightMode) &&
|
|
65
|
+
this.isShowing) {
|
|
66
|
+
// When the placeholder is shown and user switches the mode, we need to update watermark style
|
|
67
|
+
if (event.source == ChangeSource.SwitchToDarkMode &&
|
|
68
|
+
!this.darkTextColor &&
|
|
69
|
+
this.format.textColor) {
|
|
70
|
+
// Get the dark color only once when dark mode is enabled for the first time
|
|
71
|
+
this.darkTextColor = editor
|
|
72
|
+
.getColorManager()
|
|
73
|
+
.getDarkColor(this.format.textColor, undefined, 'text');
|
|
74
|
+
}
|
|
75
|
+
this.applyWatermarkStyle(editor);
|
|
76
|
+
}
|
|
60
77
|
else if (event.eventType == 'editorReady' ||
|
|
61
78
|
event.eventType == 'contentChanged' ||
|
|
62
79
|
event.eventType == 'input' ||
|
|
@@ -77,15 +94,18 @@ var WatermarkPlugin = /** @class */ (function () {
|
|
|
77
94
|
}
|
|
78
95
|
};
|
|
79
96
|
WatermarkPlugin.prototype.show = function (editor) {
|
|
80
|
-
|
|
97
|
+
this.applyWatermarkStyle(editor);
|
|
98
|
+
this.isShowing = true;
|
|
99
|
+
};
|
|
100
|
+
WatermarkPlugin.prototype.applyWatermarkStyle = function (editor) {
|
|
81
101
|
var rule = "position: absolute; pointer-events: none; content: \"" + this.watermark + "\";";
|
|
102
|
+
var format = __assign(__assign({}, this.format), { textColor: editor.isDarkMode() ? this.darkTextColor : this.format.textColor });
|
|
82
103
|
getObjectKeys(styleMap).forEach(function (x) {
|
|
83
|
-
if (
|
|
84
|
-
rule += styleMap[x] + ": " +
|
|
104
|
+
if (format[x]) {
|
|
105
|
+
rule += styleMap[x] + ": " + format[x] + "!important;";
|
|
85
106
|
}
|
|
86
107
|
});
|
|
87
108
|
editor.setEditorStyle(WATERMARK_CONTENT_KEY, rule, 'before');
|
|
88
|
-
this.isShowing = true;
|
|
89
109
|
};
|
|
90
110
|
WatermarkPlugin.prototype.hide = function (editor) {
|
|
91
111
|
editor.setEditorStyle(WATERMARK_CONTENT_KEY, null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WatermarkPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"WatermarkPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource, getObjectKeys } from 'roosterjs-content-model-dom';\nimport { isModelEmptyFast } from './isModelEmptyFast';\nimport type { WatermarkFormat } from './WatermarkFormat';\nimport type { EditorPlugin, IEditor, PluginEvent } from 'roosterjs-content-model-types';\n\nconst WATERMARK_CONTENT_KEY = '_WatermarkContent';\nconst styleMap: Record<keyof WatermarkFormat, string> = {\n fontFamily: 'font-family',\n fontSize: 'font-size',\n textColor: 'color',\n};\n\n/**\n * A watermark plugin to manage watermark string for roosterjs\n */\nexport class WatermarkPlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n private format: WatermarkFormat;\n private isShowing = false;\n private darkTextColor: string | null = null;\n\n /**\n * Create an instance of Watermark plugin\n * @param watermark The watermark string\n */\n constructor(protected watermark: string, format?: WatermarkFormat) {\n this.format = format || {\n fontSize: '14px',\n textColor: '#AAAAAA',\n };\n }\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'Watermark';\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\n /**\n * Dispose this plugin\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Handle events triggered from editor\n * @param event PluginEvent object\n */\n onPluginEvent(event: PluginEvent) {\n const editor = this.editor;\n\n if (!editor) {\n return;\n }\n\n if (\n (event.eventType == 'input' && event.rawEvent.inputType == 'insertText') ||\n event.eventType == 'compositionEnd'\n ) {\n // When input text, editor must not be empty, so we can do hide watermark now without checking content model\n this.showHide(editor, false /*isEmpty*/);\n } else if (\n event.eventType == 'contentChanged' &&\n (event.source == ChangeSource.SwitchToDarkMode ||\n event.source == ChangeSource.SwitchToLightMode) &&\n this.isShowing\n ) {\n // When the placeholder is shown and user switches the mode, we need to update watermark style\n if (\n event.source == ChangeSource.SwitchToDarkMode &&\n !this.darkTextColor &&\n this.format.textColor\n ) {\n // Get the dark color only once when dark mode is enabled for the first time\n this.darkTextColor = editor\n .getColorManager()\n .getDarkColor(this.format.textColor, undefined, 'text');\n }\n\n this.applyWatermarkStyle(editor);\n } else if (\n event.eventType == 'editorReady' ||\n event.eventType == 'contentChanged' ||\n event.eventType == 'input' ||\n event.eventType == 'beforeDispose'\n ) {\n editor.formatContentModel(model => {\n const isEmpty = isModelEmptyFast(model);\n\n this.showHide(editor, isEmpty);\n\n return false;\n });\n }\n }\n\n private showHide(editor: IEditor, isEmpty: boolean) {\n if (this.isShowing && !isEmpty) {\n this.hide(editor);\n } else if (!this.isShowing && isEmpty) {\n this.show(editor);\n }\n }\n\n protected show(editor: IEditor) {\n this.applyWatermarkStyle(editor);\n this.isShowing = true;\n }\n\n private applyWatermarkStyle(editor: IEditor) {\n let rule = `position: absolute; pointer-events: none; content: \"${this.watermark}\";`;\n const format = {\n ...this.format,\n textColor: editor.isDarkMode() ? this.darkTextColor : this.format.textColor,\n };\n\n getObjectKeys(styleMap).forEach(x => {\n if (format[x]) {\n rule += `${styleMap[x]}: ${format[x]}!important;`;\n }\n });\n\n editor.setEditorStyle(WATERMARK_CONTENT_KEY, rule, 'before');\n }\n\n protected hide(editor: IEditor) {\n editor.setEditorStyle(WATERMARK_CONTENT_KEY, null);\n this.isShowing = false;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"description": "Plugins for roosterjs",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"tslib": "^2.3.1",
|
|
6
|
-
"roosterjs-content-model-core": "^9.
|
|
7
|
-
"roosterjs-content-model-dom": "^9.
|
|
8
|
-
"roosterjs-content-model-types": "^9.
|
|
9
|
-
"roosterjs-content-model-api": "^9.
|
|
6
|
+
"roosterjs-content-model-core": "^9.6.0",
|
|
7
|
+
"roosterjs-content-model-dom": "^9.6.0",
|
|
8
|
+
"roosterjs-content-model-types": "^9.6.0",
|
|
9
|
+
"roosterjs-content-model-api": "^9.6.0"
|
|
10
10
|
},
|
|
11
|
-
"version": "9.
|
|
11
|
+
"version": "9.6.1",
|
|
12
12
|
"main": "./lib/index.js",
|
|
13
13
|
"typings": "./lib/index.d.ts",
|
|
14
14
|
"module": "./lib-mjs/index.js",
|