roosterjs-content-model-plugins 9.26.0 → 9.27.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/autoFormat/AutoFormatPlugin.d.ts +4 -1
- package/lib/autoFormat/AutoFormatPlugin.js +94 -96
- package/lib/autoFormat/AutoFormatPlugin.js.map +1 -1
- package/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.d.ts +3 -3
- package/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js +14 -21
- package/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js.map +1 -1
- package/lib/edit/EditPlugin.d.ts +9 -0
- package/lib/edit/EditPlugin.js +19 -3
- package/lib/edit/EditPlugin.js.map +1 -1
- package/lib/edit/utils/splitParagraph.d.ts +3 -2
- package/lib/edit/utils/splitParagraph.js +41 -2
- package/lib/edit/utils/splitParagraph.js.map +1 -1
- package/lib/imageEdit/ImageEditPlugin.js +9 -9
- package/lib/imageEdit/ImageEditPlugin.js.map +1 -1
- package/lib/imageEdit/utils/findEditingImage.d.ts +4 -0
- package/lib/imageEdit/utils/findEditingImage.js +7 -2
- package/lib/imageEdit/utils/findEditingImage.js.map +1 -1
- package/lib/paste/PastePlugin.js +3 -3
- package/lib/paste/PastePlugin.js.map +1 -1
- package/lib/paste/PowerPoint/processPastedContentFromPowerPoint.js +132 -1
- package/lib/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
- package/lib/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
- package/lib/paste/WordDesktop/getStyleMetadata.js +22 -5
- package/lib/paste/WordDesktop/getStyleMetadata.js.map +1 -1
- package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
- package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js +5 -5
- package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
- package/lib/paste/WordDesktop/processWordLists.js +25 -60
- package/lib/paste/WordDesktop/processWordLists.js.map +1 -1
- package/lib/paste/parsers/deprecatedColorParser.js.map +1 -0
- package/lib/paste/parsers/linkParser.js.map +1 -0
- package/lib/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.js +1 -1
- package/lib/paste/parsers/removeNegativeTextIndentParser.js.map +1 -0
- package/lib/paste/utils/customListUtils.d.ts +9 -0
- package/lib/paste/utils/customListUtils.js +63 -0
- package/lib/paste/utils/customListUtils.js.map +1 -0
- package/lib/watermark/WatermarkPlugin.js +1 -1
- package/lib/watermark/WatermarkPlugin.js.map +1 -1
- package/lib-amd/autoFormat/AutoFormatPlugin.d.ts +4 -1
- package/lib-amd/autoFormat/AutoFormatPlugin.js +94 -96
- package/lib-amd/autoFormat/AutoFormatPlugin.js.map +1 -1
- package/lib-amd/autoFormat/horizontalLine/checkAndInsertHorizontalLine.d.ts +3 -3
- package/lib-amd/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js +15 -21
- package/lib-amd/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js.map +1 -1
- package/lib-amd/edit/EditPlugin.d.ts +9 -0
- package/lib-amd/edit/EditPlugin.js +19 -3
- package/lib-amd/edit/EditPlugin.js.map +1 -1
- package/lib-amd/edit/utils/splitParagraph.d.ts +3 -2
- package/lib-amd/edit/utils/splitParagraph.js +41 -2
- package/lib-amd/edit/utils/splitParagraph.js.map +1 -1
- package/lib-amd/imageEdit/ImageEditPlugin.js +9 -9
- package/lib-amd/imageEdit/ImageEditPlugin.js.map +1 -1
- package/lib-amd/imageEdit/utils/findEditingImage.d.ts +4 -0
- package/lib-amd/imageEdit/utils/findEditingImage.js +7 -2
- package/lib-amd/imageEdit/utils/findEditingImage.js.map +1 -1
- package/lib-amd/paste/PastePlugin.js +2 -2
- package/lib-amd/paste/PastePlugin.js.map +1 -1
- package/lib-amd/paste/PowerPoint/processPastedContentFromPowerPoint.js +128 -2
- package/lib-amd/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
- package/lib-amd/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
- package/lib-amd/paste/WordDesktop/getStyleMetadata.js +22 -5
- package/lib-amd/paste/WordDesktop/getStyleMetadata.js.map +1 -1
- package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
- package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js +5 -5
- package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
- package/lib-amd/paste/WordDesktop/processWordLists.js +25 -60
- package/lib-amd/paste/WordDesktop/processWordLists.js.map +1 -1
- package/lib-amd/paste/parsers/deprecatedColorParser.js.map +1 -0
- package/lib-amd/paste/parsers/linkParser.js.map +1 -0
- package/lib-amd/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.js +1 -1
- package/lib-amd/paste/parsers/removeNegativeTextIndentParser.js.map +1 -0
- package/lib-amd/paste/utils/customListUtils.d.ts +9 -0
- package/lib-amd/paste/utils/customListUtils.js +63 -0
- package/lib-amd/paste/utils/customListUtils.js.map +1 -0
- package/lib-amd/watermark/WatermarkPlugin.js +1 -1
- package/lib-amd/watermark/WatermarkPlugin.js.map +1 -1
- package/lib-mjs/autoFormat/AutoFormatPlugin.d.ts +4 -1
- package/lib-mjs/autoFormat/AutoFormatPlugin.js +95 -97
- package/lib-mjs/autoFormat/AutoFormatPlugin.js.map +1 -1
- package/lib-mjs/autoFormat/horizontalLine/checkAndInsertHorizontalLine.d.ts +3 -3
- package/lib-mjs/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js +15 -22
- package/lib-mjs/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js.map +1 -1
- package/lib-mjs/edit/EditPlugin.d.ts +9 -0
- package/lib-mjs/edit/EditPlugin.js +19 -3
- package/lib-mjs/edit/EditPlugin.js.map +1 -1
- package/lib-mjs/edit/utils/splitParagraph.d.ts +3 -2
- package/lib-mjs/edit/utils/splitParagraph.js +42 -3
- package/lib-mjs/edit/utils/splitParagraph.js.map +1 -1
- package/lib-mjs/imageEdit/ImageEditPlugin.js +11 -11
- package/lib-mjs/imageEdit/ImageEditPlugin.js.map +1 -1
- package/lib-mjs/imageEdit/utils/findEditingImage.d.ts +4 -0
- package/lib-mjs/imageEdit/utils/findEditingImage.js +6 -1
- package/lib-mjs/imageEdit/utils/findEditingImage.js.map +1 -1
- package/lib-mjs/paste/PastePlugin.js +3 -3
- package/lib-mjs/paste/PastePlugin.js.map +1 -1
- package/lib-mjs/paste/PowerPoint/processPastedContentFromPowerPoint.js +133 -2
- package/lib-mjs/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
- package/lib-mjs/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
- package/lib-mjs/paste/WordDesktop/getStyleMetadata.js +22 -5
- package/lib-mjs/paste/WordDesktop/getStyleMetadata.js.map +1 -1
- package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
- package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js +5 -5
- package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
- package/lib-mjs/paste/WordDesktop/processWordLists.js +26 -61
- package/lib-mjs/paste/WordDesktop/processWordLists.js.map +1 -1
- package/lib-mjs/paste/parsers/deprecatedColorParser.js.map +1 -0
- package/lib-mjs/paste/parsers/linkParser.js.map +1 -0
- package/lib-mjs/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.js +1 -1
- package/lib-mjs/paste/parsers/removeNegativeTextIndentParser.js.map +1 -0
- package/lib-mjs/paste/utils/customListUtils.d.ts +9 -0
- package/lib-mjs/paste/utils/customListUtils.js +58 -0
- package/lib-mjs/paste/utils/customListUtils.js.map +1 -0
- package/lib-mjs/watermark/WatermarkPlugin.js +1 -1
- package/lib-mjs/watermark/WatermarkPlugin.js.map +1 -1
- package/package.json +5 -5
- package/lib/paste/WordDesktop/removeNegativeTextIndentParser.js.map +0 -1
- package/lib/paste/utils/deprecatedColorParser.js.map +0 -1
- package/lib/paste/utils/linkParser.js.map +0 -1
- package/lib-amd/paste/WordDesktop/removeNegativeTextIndentParser.js.map +0 -1
- package/lib-amd/paste/utils/deprecatedColorParser.js.map +0 -1
- package/lib-amd/paste/utils/linkParser.js.map +0 -1
- package/lib-mjs/paste/WordDesktop/removeNegativeTextIndentParser.js.map +0 -1
- package/lib-mjs/paste/utils/deprecatedColorParser.js.map +0 -1
- package/lib-mjs/paste/utils/linkParser.js.map +0 -1
- /package/lib/paste/{utils → parsers}/deprecatedColorParser.d.ts +0 -0
- /package/lib/paste/{utils → parsers}/deprecatedColorParser.js +0 -0
- /package/lib/paste/{utils → parsers}/linkParser.d.ts +0 -0
- /package/lib/paste/{utils → parsers}/linkParser.js +0 -0
- /package/lib/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.d.ts +0 -0
- /package/lib-amd/paste/{utils → parsers}/deprecatedColorParser.d.ts +0 -0
- /package/lib-amd/paste/{utils → parsers}/deprecatedColorParser.js +0 -0
- /package/lib-amd/paste/{utils → parsers}/linkParser.d.ts +0 -0
- /package/lib-amd/paste/{utils → parsers}/linkParser.js +0 -0
- /package/lib-amd/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.d.ts +0 -0
- /package/lib-mjs/paste/{utils → parsers}/deprecatedColorParser.d.ts +0 -0
- /package/lib-mjs/paste/{utils → parsers}/deprecatedColorParser.js +0 -0
- /package/lib-mjs/paste/{utils → parsers}/linkParser.d.ts +0 -0
- /package/lib-mjs/paste/{utils → parsers}/linkParser.js +0 -0
- /package/lib-mjs/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deprecatedColorParser.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/parsers/deprecatedColorParser.ts"],"names":[],"mappings":";;;;IAGA;;OAEG;IACI,IAAM,2BAA2B,GAA+B,UACnE,MAAoB;QAEpB,wCAAU,CAAC,OAAO,CAAC,UAAA,GAAG;YAClB,IAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,KAAK,GAAW,EAAE,CAAC;YACvB,IACI,KAAK;gBACL,8CAAgB,CAAC,IAAI,CAAC,UAAA,MAAM,IAAI,OAAA,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,EAA9C,CAA8C,CAAC,EACjF;gBACE,IAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;gBACtD,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;aAC1B;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAdW,QAAA,2BAA2B,+BActC","sourcesContent":["import { BorderKeys, DeprecatedColors } from 'roosterjs-content-model-dom';\nimport type { BorderFormat, FormatParser } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deprecatedBorderColorParser: FormatParser<BorderFormat> = (\n format: BorderFormat\n): void => {\n BorderKeys.forEach(key => {\n const value = format[key];\n let color: string = '';\n if (\n value &&\n DeprecatedColors.some(dColor => value.indexOf(dColor) > -1 && (color = dColor))\n ) {\n const newValue = value.replace(color, '').trimRight();\n format[key] = newValue;\n }\n });\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linkParser.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/parsers/linkParser.ts"],"names":[],"mappings":";;;;IAGA,IAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACjF,IAAM,mBAAmB,GAAG,yBAAyB,CAAC;IAEtD;;OAEG;IACI,IAAM,SAAS,GAA8C,UAAC,MAAM,EAAE,OAAO;QAChF,IAAI,CAAC,IAAA,6CAAe,EAAC,OAAO,EAAE,GAAG,CAAC,EAAE;YAChC,OAAO;SACV;QAED,IAAI,GAAoB,CAAC;QACzB,IAAI;YACA,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC/B;QAAC,WAAM;YACJ,GAAG,GAAG,SAAS,CAAC;SACnB;QAED,IACI,CAAC,GAAG,IAAI,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YACzD,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EACxC;YACE,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;SACpB;IACL,CAAC,CAAC;IAnBW,QAAA,SAAS,aAmBpB","sourcesContent":["import { isElementOfType } from 'roosterjs-content-model-dom';\nimport type { ContentModelHyperLinkFormat, FormatParser } from 'roosterjs-content-model-types';\n\nconst SUPPORTED_PROTOCOLS = ['http:', 'https:', 'notes:', 'mailto:', 'onenote:'];\nconst INVALID_LINKS_REGEX = /^file:\\/\\/\\/[a-zA-Z\\/]/i;\n\n/**\n * @internal\n */\nexport const parseLink: FormatParser<ContentModelHyperLinkFormat> = (format, element) => {\n if (!isElementOfType(element, 'a')) {\n return;\n }\n\n let url: URL | undefined;\n try {\n url = new URL(element.href);\n } catch {\n url = undefined;\n }\n\n if (\n (url && SUPPORTED_PROTOCOLS.indexOf(url.protocol) === -1) ||\n INVALID_LINKS_REGEX.test(element.href)\n ) {\n element.removeAttribute('href');\n format.href = '';\n }\n};\n"]}
|
|
@@ -5,7 +5,7 @@ define(["require", "exports"], function (require, exports) {
|
|
|
5
5
|
/**
|
|
6
6
|
* @internal
|
|
7
7
|
*/
|
|
8
|
-
var removeNegativeTextIndentParser = function (format
|
|
8
|
+
var removeNegativeTextIndentParser = function (format) {
|
|
9
9
|
var _a;
|
|
10
10
|
if ((_a = format.textIndent) === null || _a === void 0 ? void 0 : _a.startsWith('-')) {
|
|
11
11
|
delete format.textIndent;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeNegativeTextIndentParser.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/parsers/removeNegativeTextIndentParser.ts"],"names":[],"mappings":";;;;IAEA;;OAEG;IACI,IAAM,8BAA8B,GAAmC,UAAA,MAAM;;QAChF,IAAI,MAAA,MAAM,CAAC,UAAU,0CAAE,UAAU,CAAC,GAAG,CAAC,EAAE;YACpC,OAAO,MAAM,CAAC,UAAU,CAAC;SAC5B;IACL,CAAC,CAAC;IAJW,QAAA,8BAA8B,kCAIzC","sourcesContent":["import type { FormatParser, TextIndentFormat } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const removeNegativeTextIndentParser: FormatParser<TextIndentFormat> = format => {\n if (format.textIndent?.startsWith('-')) {\n delete format.textIndent;\n }\n};\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DomToModelContext, DomToModelListFormat, ContentModelBlockGroup, ListMetadataFormat, ContentModelListItem, ContentModelListItemLevelFormat, FormatParser } from 'roosterjs-content-model-types';
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export declare function setupListFormat(listType: 'OL' | 'UL', element: HTMLElement, context: DomToModelContext, listDepth: number, listFormat: DomToModelListFormat, group: ContentModelBlockGroup, additionalParsers?: FormatParser<ContentModelListItemLevelFormat>[]): void;
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare function processAsListItem(context: DomToModelContext, element: HTMLElement, group: ContentModelBlockGroup, listFormatMetadata: ListMetadataFormat | undefined, beforeProcessingChildren?: (listItem: ContentModelListItem) => void): void;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
define(["require", "exports", "../parsers/removeNegativeTextIndentParser", "roosterjs-content-model-dom"], function (require, exports, removeNegativeTextIndentParser_1, roosterjs_content_model_dom_1) {
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.processAsListItem = exports.setupListFormat = void 0;
|
|
5
|
+
var removeMargin = function (format) {
|
|
6
|
+
delete format.marginLeft;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
function setupListFormat(listType, element, context, listDepth, listFormat, group, additionalParsers) {
|
|
12
|
+
if (additionalParsers === void 0) { additionalParsers = []; }
|
|
13
|
+
var newLevel = (0, roosterjs_content_model_dom_1.createListLevel)(listType);
|
|
14
|
+
(0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listLevel, newLevel.format, context);
|
|
15
|
+
(0, roosterjs_content_model_dom_1.parseFormat)(element, additionalParsers.concat(removeMargin), newLevel.format, context);
|
|
16
|
+
// If the list format is in a different level, update the array so we get the new item
|
|
17
|
+
// To be in the same level as the provided level metadata.
|
|
18
|
+
if (listDepth > listFormat.levels.length) {
|
|
19
|
+
while (listDepth != listFormat.levels.length) {
|
|
20
|
+
listFormat.levels.push(newLevel);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
listFormat.levels.splice(listDepth, listFormat.levels.length - 1);
|
|
25
|
+
listFormat.levels[listDepth - 1] = newLevel;
|
|
26
|
+
}
|
|
27
|
+
listFormat.listParent = group;
|
|
28
|
+
}
|
|
29
|
+
exports.setupListFormat = setupListFormat;
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
function processAsListItem(context, element, group, listFormatMetadata, beforeProcessingChildren) {
|
|
34
|
+
var listFormat = context.listFormat;
|
|
35
|
+
if (listFormatMetadata) {
|
|
36
|
+
(0, roosterjs_content_model_dom_1.updateListMetadata)(listFormat.levels[listFormat.levels.length - 1], function (metadata) {
|
|
37
|
+
return Object.assign({}, metadata, listFormatMetadata);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
var listItem = (0, roosterjs_content_model_dom_1.createListItem)(listFormat.levels, context.segmentFormat);
|
|
41
|
+
(0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);
|
|
42
|
+
(0, roosterjs_content_model_dom_1.parseFormat)(element, context.formatParsers.listItemElement, listItem.format, context);
|
|
43
|
+
(0, roosterjs_content_model_dom_1.parseFormat)(element, [removeNegativeTextIndentParser_1.removeNegativeTextIndentParser, nonListElementParser], listItem.format, context);
|
|
44
|
+
beforeProcessingChildren === null || beforeProcessingChildren === void 0 ? void 0 : beforeProcessingChildren(listItem);
|
|
45
|
+
context.elementProcessors.child(listItem, element, context);
|
|
46
|
+
(0, roosterjs_content_model_dom_1.addBlock)(group, listItem);
|
|
47
|
+
}
|
|
48
|
+
exports.processAsListItem = processAsListItem;
|
|
49
|
+
var nonListElementParser = function (format, element, _context, defaultStyle) {
|
|
50
|
+
if (!(0, roosterjs_content_model_dom_1.isElementOfType)(element, 'li')) {
|
|
51
|
+
Object.keys(defaultStyle).forEach(function (keyInput) {
|
|
52
|
+
var key = keyInput;
|
|
53
|
+
var formatKey = keyInput;
|
|
54
|
+
if (key != 'display' &&
|
|
55
|
+
format[formatKey] != undefined &&
|
|
56
|
+
format[formatKey] == defaultStyle[key]) {
|
|
57
|
+
delete format[formatKey];
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=customListUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customListUtils.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/paste/utils/customListUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import { removeNegativeTextIndentParser } from '../parsers/removeNegativeTextIndentParser';\nimport {\n createListLevel,\n parseFormat,\n updateListMetadata,\n createListItem,\n addBlock,\n isElementOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n DomToModelContext,\n DomToModelListFormat,\n ContentModelBlockGroup,\n ContentModelListLevel,\n ListMetadataFormat,\n ContentModelListItem,\n ContentModelListItemLevelFormat,\n ContentModelListItemFormat,\n FormatParser,\n} from 'roosterjs-content-model-types';\n\nconst removeMargin = (format: ContentModelListItemFormat): void => {\n delete format.marginLeft;\n};\n\n/**\n * @internal\n */\nexport function setupListFormat(\n listType: 'OL' | 'UL',\n element: HTMLElement,\n context: DomToModelContext,\n listDepth: number,\n listFormat: DomToModelListFormat,\n group: ContentModelBlockGroup,\n additionalParsers: FormatParser<ContentModelListItemLevelFormat>[] = []\n) {\n const newLevel: ContentModelListLevel = createListLevel(listType);\n parseFormat(element, context.formatParsers.listLevel, newLevel.format, context);\n parseFormat(element, additionalParsers.concat(removeMargin), newLevel.format, context);\n\n // If the list format is in a different level, update the array so we get the new item\n // To be in the same level as the provided level metadata.\n if (listDepth > listFormat.levels.length) {\n while (listDepth != listFormat.levels.length) {\n listFormat.levels.push(newLevel);\n }\n } else {\n listFormat.levels.splice(listDepth, listFormat.levels.length - 1);\n listFormat.levels[listDepth - 1] = newLevel;\n }\n\n listFormat.listParent = group;\n}\n\n/**\n * @internal\n */\nexport function processAsListItem(\n context: DomToModelContext,\n element: HTMLElement,\n group: ContentModelBlockGroup,\n listFormatMetadata: ListMetadataFormat | undefined,\n beforeProcessingChildren?: (listItem: ContentModelListItem) => void\n) {\n const listFormat = context.listFormat;\n if (listFormatMetadata) {\n updateListMetadata(listFormat.levels[listFormat.levels.length - 1], metadata =>\n Object.assign({}, metadata, listFormatMetadata)\n );\n }\n\n const listItem = createListItem(listFormat.levels, context.segmentFormat);\n\n parseFormat(element, context.formatParsers.segmentOnBlock, context.segmentFormat, context);\n parseFormat(element, context.formatParsers.listItemElement, listItem.format, context);\n parseFormat(\n element,\n [removeNegativeTextIndentParser, nonListElementParser],\n listItem.format,\n context\n );\n\n beforeProcessingChildren?.(listItem);\n\n context.elementProcessors.child(listItem, element, context);\n addBlock(group, listItem);\n}\n\nconst nonListElementParser: FormatParser<ContentModelListItemFormat> = (\n format,\n element,\n _context,\n defaultStyle\n): void => {\n if (!isElementOfType(element, 'li')) {\n Object.keys(defaultStyle).forEach(keyInput => {\n const key = keyInput as keyof CSSStyleDeclaration;\n const formatKey = keyInput as keyof ContentModelListItemFormat;\n if (\n key != 'display' &&\n format[formatKey] != undefined &&\n format[formatKey] == defaultStyle[key]\n ) {\n delete format[formatKey];\n }\n });\n }\n};\n"]}
|
|
@@ -117,7 +117,7 @@ define(["require", "exports", "tslib", "roosterjs-content-model-dom", "./isModel
|
|
|
117
117
|
this.isShowing = true;
|
|
118
118
|
};
|
|
119
119
|
WatermarkPlugin.prototype.applyWatermarkStyle = function (editor) {
|
|
120
|
-
var rule = "position: absolute; pointer-events: none; content: \"" + this.watermark + "\";";
|
|
120
|
+
var rule = "position: absolute; pointer-events: none; margin-inline-start: 1px; content: \"" + this.watermark + "\";";
|
|
121
121
|
var format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, this.format), { textColor: editor.isDarkMode() ? this.darkTextColor : this.format.textColor });
|
|
122
122
|
(0, roosterjs_content_model_dom_1.getObjectKeys)(styleMap).forEach(function (x) {
|
|
123
123
|
if (format[x]) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WatermarkPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/watermark/WatermarkPlugin.ts"],"names":[],"mappings":"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
|
|
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 private disposer: (() => void) | 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 this.disposer = this.editor.attachDomEvent({\n compositionstart: {\n beforeDispatch: this.onCompositionStart,\n },\n });\n }\n\n /**\n * Dispose this plugin\n */\n dispose() {\n this.disposer?.();\n this.disposer = null;\n\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 (event.eventType == 'input' && event.rawEvent.inputType == 'insertText') {\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 event.eventType == 'compositionEnd'\n ) {\n this.update(editor);\n }\n }\n\n private onCompositionStart = () => {\n if (this.editor) {\n this.showHide(this.editor, false /*isEmpty*/);\n }\n };\n\n private update(editor: IEditor) {\n editor.formatContentModel(model => {\n const isEmpty = isModelEmptyFast(model);\n\n this.showHide(editor, isEmpty);\n\n return false;\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; margin-inline-start: 1px; 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"]}
|
|
@@ -46,9 +46,12 @@ export declare class AutoFormatPlugin implements EditorPlugin {
|
|
|
46
46
|
* @param event The event to handle:
|
|
47
47
|
*/
|
|
48
48
|
onPluginEvent(event: PluginEvent): void;
|
|
49
|
+
private autoLink;
|
|
50
|
+
private tabFeatures;
|
|
49
51
|
private features;
|
|
52
|
+
private enterFeatures;
|
|
53
|
+
private handleKeyboardEvents;
|
|
50
54
|
private handleEditorInputEvent;
|
|
51
55
|
private handleKeyDownEvent;
|
|
52
|
-
private handleEnterKey;
|
|
53
56
|
private handleContentChangedEvent;
|
|
54
57
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __values } from "tslib";
|
|
1
|
+
import { __read, __spreadArray, __values } from "tslib";
|
|
2
2
|
import { ChangeSource } from 'roosterjs-content-model-dom';
|
|
3
3
|
import { checkAndInsertHorizontalLine } from './horizontalLine/checkAndInsertHorizontalLine';
|
|
4
4
|
import { createLink } from './link/createLink';
|
|
@@ -46,52 +46,71 @@ var AutoFormatPlugin = /** @class */ (function () {
|
|
|
46
46
|
if (options === void 0) { options = DefaultOptions; }
|
|
47
47
|
this.options = options;
|
|
48
48
|
this.editor = null;
|
|
49
|
-
this.
|
|
49
|
+
this.autoLink = {
|
|
50
|
+
enabled: !!(this.options.autoLink || this.options.autoTel || this.options.autoMailto),
|
|
51
|
+
transformFunction: function (_model, previousSegment, paragraph, context) {
|
|
52
|
+
var _a;
|
|
53
|
+
var _b = _this.options, autoLink = _b.autoLink, autoTel = _b.autoTel, autoMailto = _b.autoMailto;
|
|
54
|
+
var linkSegment = promoteLink(previousSegment, paragraph, {
|
|
55
|
+
autoLink: autoLink,
|
|
56
|
+
autoTel: autoTel,
|
|
57
|
+
autoMailto: autoMailto,
|
|
58
|
+
});
|
|
59
|
+
if (linkSegment) {
|
|
60
|
+
return createAnchor(((_a = linkSegment.link) === null || _a === void 0 ? void 0 : _a.format.href) || '', linkSegment.text);
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
},
|
|
64
|
+
apiName: 'autoLink',
|
|
65
|
+
changeSource: ChangeSource.AutoLink,
|
|
66
|
+
};
|
|
67
|
+
this.tabFeatures = [
|
|
50
68
|
{
|
|
51
|
-
autoFormat: 'list',
|
|
52
69
|
enabled: !!(this.options.autoBullet || this.options.autoNumbering),
|
|
53
70
|
transformFunction: function (model, _previousSegment, paragraph, context) {
|
|
54
71
|
return keyboardListTrigger(model, paragraph, context, _this.options.autoBullet, _this.options.autoNumbering, _this.options.removeListMargins);
|
|
55
72
|
},
|
|
73
|
+
apiName: 'autoToggleList',
|
|
74
|
+
changeSource: ChangeSource.AutoFormat,
|
|
56
75
|
},
|
|
76
|
+
this.autoLink,
|
|
77
|
+
];
|
|
78
|
+
this.features = __spreadArray(__spreadArray([], __read(this.tabFeatures), false), [
|
|
57
79
|
{
|
|
58
|
-
autoFormat: 'link',
|
|
59
|
-
enabled: !!(this.options.autoLink || this.options.autoTel || this.options.autoMailto),
|
|
60
|
-
transformFunction: function (_model, previousSegment, paragraph, context) {
|
|
61
|
-
var _a;
|
|
62
|
-
var _b = _this.options, autoLink = _b.autoLink, autoTel = _b.autoTel, autoMailto = _b.autoMailto;
|
|
63
|
-
var linkSegment = promoteLink(previousSegment, paragraph, {
|
|
64
|
-
autoLink: autoLink,
|
|
65
|
-
autoTel: autoTel,
|
|
66
|
-
autoMailto: autoMailto,
|
|
67
|
-
});
|
|
68
|
-
if (linkSegment) {
|
|
69
|
-
return createAnchor(((_a = linkSegment.link) === null || _a === void 0 ? void 0 : _a.format.href) || '', linkSegment.text);
|
|
70
|
-
}
|
|
71
|
-
return false;
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
autoFormat: 'hyphen',
|
|
76
80
|
enabled: !!this.options.autoHyphen,
|
|
81
|
+
apiName: 'autoHyphen',
|
|
82
|
+
changeSource: ChangeSource.Format,
|
|
77
83
|
transformFunction: function (_model, previousSegment, paragraph, context) {
|
|
78
84
|
return transformHyphen(previousSegment, paragraph, context);
|
|
79
85
|
},
|
|
80
86
|
},
|
|
81
87
|
{
|
|
82
|
-
autoFormat: 'fraction',
|
|
83
88
|
enabled: !!this.options.autoFraction,
|
|
89
|
+
apiName: 'autoFraction',
|
|
90
|
+
changeSource: ChangeSource.Format,
|
|
84
91
|
transformFunction: function (_model, previousSegment, paragraph, context) {
|
|
85
92
|
return transformFraction(previousSegment, paragraph, context);
|
|
86
93
|
},
|
|
87
94
|
},
|
|
88
95
|
{
|
|
89
|
-
autoFormat: 'ordinal',
|
|
90
96
|
enabled: !!this.options.autoOrdinals,
|
|
97
|
+
apiName: 'autoOrdinal',
|
|
98
|
+
changeSource: ChangeSource.Format,
|
|
91
99
|
transformFunction: function (_model, previousSegment, paragraph, context) {
|
|
92
100
|
return transformOrdinals(previousSegment, paragraph, context);
|
|
93
101
|
},
|
|
94
102
|
},
|
|
103
|
+
], false);
|
|
104
|
+
this.enterFeatures = [
|
|
105
|
+
{
|
|
106
|
+
enabled: !!this.options.autoHorizontalLine,
|
|
107
|
+
transformFunction: function (model, _previousSegment, paragraph, context) {
|
|
108
|
+
return checkAndInsertHorizontalLine(model, paragraph, context);
|
|
109
|
+
},
|
|
110
|
+
apiName: 'autoHorizontalLine',
|
|
111
|
+
changeSource: ChangeSource.AutoFormat,
|
|
112
|
+
},
|
|
113
|
+
this.autoLink,
|
|
95
114
|
];
|
|
96
115
|
}
|
|
97
116
|
/**
|
|
@@ -138,8 +157,51 @@ var AutoFormatPlugin = /** @class */ (function () {
|
|
|
138
157
|
}
|
|
139
158
|
}
|
|
140
159
|
};
|
|
160
|
+
AutoFormatPlugin.prototype.handleKeyboardEvents = function (editor, features) {
|
|
161
|
+
var formatOptions = {
|
|
162
|
+
changeSource: '',
|
|
163
|
+
apiName: '',
|
|
164
|
+
getChangeData: undefined,
|
|
165
|
+
};
|
|
166
|
+
formatTextSegmentBeforeSelectionMarker(editor, function (model, previousSegment, paragraph, _markerFormat, context) {
|
|
167
|
+
var e_1, _a;
|
|
168
|
+
var featureApplied = undefined;
|
|
169
|
+
var _loop_1 = function (feature) {
|
|
170
|
+
if (feature.enabled) {
|
|
171
|
+
var result_1 = feature.transformFunction(model, previousSegment, paragraph, context);
|
|
172
|
+
if (result_1) {
|
|
173
|
+
if (typeof result_1 !== 'boolean') {
|
|
174
|
+
formatOptions.getChangeData = function () { return result_1; };
|
|
175
|
+
}
|
|
176
|
+
featureApplied = feature;
|
|
177
|
+
return "break";
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
try {
|
|
182
|
+
for (var features_1 = __values(features), features_1_1 = features_1.next(); !features_1_1.done; features_1_1 = features_1.next()) {
|
|
183
|
+
var feature = features_1_1.value;
|
|
184
|
+
var state_1 = _loop_1(feature);
|
|
185
|
+
if (state_1 === "break")
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
190
|
+
finally {
|
|
191
|
+
try {
|
|
192
|
+
if (features_1_1 && !features_1_1.done && (_a = features_1.return)) _a.call(features_1);
|
|
193
|
+
}
|
|
194
|
+
finally { if (e_1) throw e_1.error; }
|
|
195
|
+
}
|
|
196
|
+
if (featureApplied) {
|
|
197
|
+
formatOptions.changeSource = featureApplied.changeSource;
|
|
198
|
+
formatOptions.apiName = featureApplied.apiName;
|
|
199
|
+
}
|
|
200
|
+
return !!featureApplied;
|
|
201
|
+
}, formatOptions);
|
|
202
|
+
return formatOptions;
|
|
203
|
+
};
|
|
141
204
|
AutoFormatPlugin.prototype.handleEditorInputEvent = function (editor, event) {
|
|
142
|
-
var _this = this;
|
|
143
205
|
var rawEvent = event.rawEvent;
|
|
144
206
|
var selection = editor.getDOMSelection();
|
|
145
207
|
if (rawEvent.inputType === 'insertText' &&
|
|
@@ -148,53 +210,12 @@ var AutoFormatPlugin = /** @class */ (function () {
|
|
|
148
210
|
selection.range.collapsed) {
|
|
149
211
|
switch (rawEvent.data) {
|
|
150
212
|
case ' ':
|
|
151
|
-
|
|
152
|
-
changeSource: '',
|
|
153
|
-
apiName: '',
|
|
154
|
-
getChangeData: undefined,
|
|
155
|
-
};
|
|
156
|
-
formatTextSegmentBeforeSelectionMarker(editor, function (model, previousSegment, paragraph, _markerFormat, context) {
|
|
157
|
-
var e_1, _a;
|
|
158
|
-
var formatApplied = undefined;
|
|
159
|
-
var _loop_1 = function (feature) {
|
|
160
|
-
if (feature.enabled) {
|
|
161
|
-
var result_1 = feature.transformFunction(model, previousSegment, paragraph, context);
|
|
162
|
-
if (result_1) {
|
|
163
|
-
if (typeof result_1 !== 'boolean') {
|
|
164
|
-
formatOptions_1.getChangeData = function () { return result_1; };
|
|
165
|
-
}
|
|
166
|
-
formatApplied = feature.autoFormat;
|
|
167
|
-
return "break";
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
try {
|
|
172
|
-
for (var _b = __values(_this.features), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
173
|
-
var feature = _c.value;
|
|
174
|
-
var state_1 = _loop_1(feature);
|
|
175
|
-
if (state_1 === "break")
|
|
176
|
-
break;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
180
|
-
finally {
|
|
181
|
-
try {
|
|
182
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
183
|
-
}
|
|
184
|
-
finally { if (e_1) throw e_1.error; }
|
|
185
|
-
}
|
|
186
|
-
if (formatApplied) {
|
|
187
|
-
formatOptions_1.changeSource = getChangeSource(formatApplied);
|
|
188
|
-
formatOptions_1.apiName = getApiName(formatApplied);
|
|
189
|
-
}
|
|
190
|
-
return !!formatApplied;
|
|
191
|
-
}, formatOptions_1);
|
|
213
|
+
this.handleKeyboardEvents(editor, this.features);
|
|
192
214
|
break;
|
|
193
215
|
}
|
|
194
216
|
}
|
|
195
217
|
};
|
|
196
218
|
AutoFormatPlugin.prototype.handleKeyDownEvent = function (editor, event) {
|
|
197
|
-
var _this = this;
|
|
198
219
|
var rawEvent = event.rawEvent;
|
|
199
220
|
if (!rawEvent.defaultPrevented && !event.handledByEditFeature) {
|
|
200
221
|
switch (rawEvent.key) {
|
|
@@ -205,34 +226,21 @@ var AutoFormatPlugin = /** @class */ (function () {
|
|
|
205
226
|
break;
|
|
206
227
|
case 'Tab':
|
|
207
228
|
if (!rawEvent.shiftKey) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
shouldList = keyboardListTrigger(model, paragraph, context, autoBullet, autoNumbering, removeListMargins);
|
|
213
|
-
context.canUndoByBackspace = shouldList;
|
|
214
|
-
}
|
|
215
|
-
if (shouldList) {
|
|
216
|
-
event.rawEvent.preventDefault();
|
|
217
|
-
}
|
|
218
|
-
return shouldList;
|
|
219
|
-
}, {
|
|
220
|
-
changeSource: ChangeSource.AutoFormat,
|
|
221
|
-
apiName: 'autoToggleList',
|
|
222
|
-
});
|
|
229
|
+
var eventHandled_1 = this.handleKeyboardEvents(editor, this.tabFeatures);
|
|
230
|
+
if (eventHandled_1.apiName == 'autoToggleList') {
|
|
231
|
+
event.rawEvent.preventDefault();
|
|
232
|
+
}
|
|
223
233
|
}
|
|
224
234
|
break;
|
|
225
235
|
case 'Enter':
|
|
226
|
-
this.
|
|
236
|
+
var eventHandled = this.handleKeyboardEvents(editor, this.enterFeatures);
|
|
237
|
+
if (eventHandled.apiName == 'autoHorizontalLine') {
|
|
238
|
+
event.rawEvent.preventDefault();
|
|
239
|
+
}
|
|
227
240
|
break;
|
|
228
241
|
}
|
|
229
242
|
}
|
|
230
243
|
};
|
|
231
|
-
AutoFormatPlugin.prototype.handleEnterKey = function (editor, event) {
|
|
232
|
-
if (this.options.autoHorizontalLine) {
|
|
233
|
-
checkAndInsertHorizontalLine(editor, event);
|
|
234
|
-
}
|
|
235
|
-
};
|
|
236
244
|
AutoFormatPlugin.prototype.handleContentChangedEvent = function (editor, event) {
|
|
237
245
|
var _a = this.options, autoLink = _a.autoLink, autoTel = _a.autoTel, autoMailto = _a.autoMailto;
|
|
238
246
|
if (event.source == 'Paste' && (autoLink || autoTel || autoMailto)) {
|
|
@@ -246,16 +254,6 @@ var AutoFormatPlugin = /** @class */ (function () {
|
|
|
246
254
|
return AutoFormatPlugin;
|
|
247
255
|
}());
|
|
248
256
|
export { AutoFormatPlugin };
|
|
249
|
-
var getApiName = function (autoFormat) {
|
|
250
|
-
return autoFormat == 'list' ? 'autoToggleList' : autoFormat == 'hyphen' ? 'autoHyphen' : '';
|
|
251
|
-
};
|
|
252
|
-
var getChangeSource = function (autoFormat) {
|
|
253
|
-
return autoFormat == 'list' || autoFormat == 'hyphen'
|
|
254
|
-
? ChangeSource.AutoFormat
|
|
255
|
-
: autoFormat == 'link'
|
|
256
|
-
? ChangeSource.AutoLink
|
|
257
|
-
: '';
|
|
258
|
-
};
|
|
259
257
|
var createAnchor = function (url, text) {
|
|
260
258
|
var anchor = document.createElement('a');
|
|
261
259
|
anchor.href = url;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoFormatPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/AutoFormatPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource } from 'roosterjs-content-model-dom';\nimport { checkAndInsertHorizontalLine } from './horizontalLine/checkAndInsertHorizontalLine';\nimport { createLink } from './link/createLink';\nimport { formatTextSegmentBeforeSelectionMarker, promoteLink } from 'roosterjs-content-model-api';\nimport { keyboardListTrigger } from './list/keyboardListTrigger';\nimport { transformFraction } from './numbers/transformFraction';\nimport { transformHyphen } from './hyphen/transformHyphen';\nimport { transformOrdinals } from './numbers/transformOrdinals';\nimport { unlink } from './link/unlink';\nimport type { AutoFormatOptions } from './interface/AutoFormatOptions';\nimport type {\n ContentChangedEvent,\n ContentModelText,\n EditorInputEvent,\n EditorPlugin,\n FormatContentModelContext,\n FormatContentModelOptions,\n IEditor,\n KeyDownEvent,\n PluginEvent,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\ntype AutoFormatFeature = 'list' | 'link' | 'hyphen' | 'fraction' | 'ordinal';\n\n/**\n * @internal\n */\ninterface Feature {\n autoFormat: AutoFormatFeature;\n enabled: boolean;\n transformFunction: (\n model: ReadonlyContentModelDocument,\n previousSegment: ContentModelText,\n paragraph: ShallowMutableContentModelParagraph,\n context: FormatContentModelContext\n ) => boolean | HTMLElement;\n}\n\n/**\n * @internal\n */\nconst DefaultOptions: Partial<AutoFormatOptions> = {\n autoBullet: false,\n autoNumbering: false,\n autoUnlink: false,\n autoLink: false,\n autoHyphen: false,\n autoFraction: false,\n autoOrdinals: false,\n removeListMargins: false,\n autoHorizontalLine: false,\n};\n\n/**\n * Auto Format plugin handles auto formatting, such as transforming * characters into a bullet list.\n * It can be customized with options to enable or disable auto list features.\n */\nexport class AutoFormatPlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n /**\n * @param options An optional parameter that takes in an object of type AutoFormatOptions, which includes the following properties:\n * - autoBullet: A boolean that enables or disables automatic bullet list formatting. Defaults to false.\n * - autoNumbering: A boolean that enables or disables automatic numbering formatting. Defaults to false.\n * - removeListMargins: A boolean to remove list margins when it is automatically triggered. Defaults to false.\n * - autoHyphen: A boolean that enables or disables automatic hyphen transformation. Defaults to false.\n * - autoFraction: A boolean that enables or disables automatic fraction transformation. Defaults to false.\n * - autoOrdinals: A boolean that enables or disables automatic ordinal number transformation. Defaults to false.\n * - autoLink: A boolean that enables or disables automatic hyperlink url address creation when pasting or typing content. Defaults to false.\n * - autoUnlink: A boolean that enables or disables automatic hyperlink removal when pressing backspace. Defaults to false.\n * - autoTel: A boolean that enables or disables automatic hyperlink telephone numbers transformation. Defaults to false.\n * - autoMailto: A boolean that enables or disables automatic hyperlink email address transformation. Defaults to false.\n * - autoHorizontalLine: A boolean that enables or disables automatic horizontal line creation. Defaults to false.\n */\n constructor(private options: AutoFormatOptions = DefaultOptions) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'AutoFormat';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (this.editor) {\n switch (event.eventType) {\n case 'input':\n this.handleEditorInputEvent(this.editor, event);\n break;\n case 'keyDown':\n this.handleKeyDownEvent(this.editor, event);\n break;\n case 'contentChanged':\n this.handleContentChangedEvent(this.editor, event);\n break;\n }\n }\n }\n\n private features: Feature[] = [\n {\n autoFormat: 'list',\n enabled: !!(this.options.autoBullet || this.options.autoNumbering),\n transformFunction: (model, _previousSegment, paragraph, context) =>\n keyboardListTrigger(\n model,\n paragraph,\n context,\n this.options.autoBullet,\n this.options.autoNumbering,\n this.options.removeListMargins\n ),\n },\n {\n autoFormat: 'link',\n enabled: !!(this.options.autoLink || this.options.autoTel || this.options.autoMailto),\n transformFunction: (_model, previousSegment, paragraph, context) => {\n const { autoLink, autoTel, autoMailto } = this.options;\n const linkSegment = promoteLink(previousSegment, paragraph, {\n autoLink,\n autoTel,\n autoMailto,\n });\n\n if (linkSegment) {\n return createAnchor(linkSegment.link?.format.href || '', linkSegment.text);\n }\n return false;\n },\n },\n {\n autoFormat: 'hyphen',\n enabled: !!this.options.autoHyphen,\n transformFunction: (_model, previousSegment, paragraph, context) =>\n transformHyphen(previousSegment, paragraph, context),\n },\n {\n autoFormat: 'fraction',\n enabled: !!this.options.autoFraction,\n transformFunction: (_model, previousSegment, paragraph, context) =>\n transformFraction(previousSegment, paragraph, context),\n },\n {\n autoFormat: 'ordinal',\n enabled: !!this.options.autoOrdinals,\n transformFunction: (_model, previousSegment, paragraph, context) =>\n transformOrdinals(previousSegment, paragraph, context),\n },\n ];\n\n private handleEditorInputEvent(editor: IEditor, event: EditorInputEvent) {\n const rawEvent = event.rawEvent;\n const selection = editor.getDOMSelection();\n if (\n rawEvent.inputType === 'insertText' &&\n selection &&\n selection.type === 'range' &&\n selection.range.collapsed\n ) {\n switch (rawEvent.data) {\n case ' ':\n const formatOptions: FormatContentModelOptions = {\n changeSource: '',\n apiName: '',\n getChangeData: undefined,\n };\n formatTextSegmentBeforeSelectionMarker(\n editor,\n (model, previousSegment, paragraph, _markerFormat, context) => {\n let formatApplied: AutoFormatFeature | undefined = undefined;\n\n for (const feature of this.features) {\n if (feature.enabled) {\n const result = feature.transformFunction(\n model,\n previousSegment,\n paragraph,\n context\n );\n if (result) {\n if (typeof result !== 'boolean') {\n formatOptions.getChangeData = () => result;\n }\n formatApplied = feature.autoFormat;\n break;\n }\n }\n }\n\n if (formatApplied) {\n formatOptions.changeSource = getChangeSource(formatApplied);\n formatOptions.apiName = getApiName(formatApplied);\n }\n\n return !!formatApplied;\n },\n formatOptions\n );\n\n break;\n }\n }\n }\n\n private handleKeyDownEvent(editor: IEditor, event: KeyDownEvent) {\n const rawEvent = event.rawEvent;\n if (!rawEvent.defaultPrevented && !event.handledByEditFeature) {\n switch (rawEvent.key) {\n case 'Backspace':\n if (this.options.autoUnlink) {\n unlink(editor, rawEvent);\n }\n break;\n case 'Tab':\n if (!rawEvent.shiftKey) {\n formatTextSegmentBeforeSelectionMarker(\n editor,\n (model, _previousSegment, paragraph, _markerFormat, context) => {\n const {\n autoBullet,\n autoNumbering,\n removeListMargins,\n } = this.options;\n let shouldList = false;\n if (autoBullet || autoNumbering) {\n shouldList = keyboardListTrigger(\n model,\n paragraph,\n context,\n autoBullet,\n autoNumbering,\n removeListMargins\n );\n context.canUndoByBackspace = shouldList;\n }\n if (shouldList) {\n event.rawEvent.preventDefault();\n }\n return shouldList;\n },\n {\n changeSource: ChangeSource.AutoFormat,\n apiName: 'autoToggleList',\n }\n );\n }\n break;\n case 'Enter':\n this.handleEnterKey(editor, event);\n break;\n }\n }\n }\n\n private handleEnterKey(editor: IEditor, event: KeyDownEvent) {\n if (this.options.autoHorizontalLine) {\n checkAndInsertHorizontalLine(editor, event);\n }\n }\n\n private handleContentChangedEvent(editor: IEditor, event: ContentChangedEvent) {\n const { autoLink, autoTel, autoMailto } = this.options;\n if (event.source == 'Paste' && (autoLink || autoTel || autoMailto)) {\n createLink(editor, {\n autoLink,\n autoTel,\n autoMailto,\n });\n }\n }\n}\n\nconst getApiName = (autoFormat: AutoFormatFeature) => {\n return autoFormat == 'list' ? 'autoToggleList' : autoFormat == 'hyphen' ? 'autoHyphen' : '';\n};\n\nconst getChangeSource = (autoFormat: AutoFormatFeature) => {\n return autoFormat == 'list' || autoFormat == 'hyphen'\n ? ChangeSource.AutoFormat\n : autoFormat == 'link'\n ? ChangeSource.AutoLink\n : '';\n};\n\nconst createAnchor = (url: string, text: string) => {\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.textContent = text;\n return anchor;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"AutoFormatPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/AutoFormatPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeSource } from 'roosterjs-content-model-dom';\nimport { checkAndInsertHorizontalLine } from './horizontalLine/checkAndInsertHorizontalLine';\nimport { createLink } from './link/createLink';\nimport { formatTextSegmentBeforeSelectionMarker, promoteLink } from 'roosterjs-content-model-api';\nimport { keyboardListTrigger } from './list/keyboardListTrigger';\nimport { transformFraction } from './numbers/transformFraction';\nimport { transformHyphen } from './hyphen/transformHyphen';\nimport { transformOrdinals } from './numbers/transformOrdinals';\nimport { unlink } from './link/unlink';\nimport type { AutoFormatOptions } from './interface/AutoFormatOptions';\nimport type {\n ContentChangedEvent,\n ContentModelText,\n EditorInputEvent,\n EditorPlugin,\n FormatContentModelContext,\n FormatContentModelOptions,\n IEditor,\n KeyDownEvent,\n PluginEvent,\n ReadonlyContentModelDocument,\n ShallowMutableContentModelParagraph,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\ninterface Feature {\n enabled: boolean;\n transformFunction: (\n model: ReadonlyContentModelDocument,\n previousSegment: ContentModelText,\n paragraph: ShallowMutableContentModelParagraph,\n context: FormatContentModelContext\n ) => boolean | HTMLElement;\n changeSource: string;\n apiName: string;\n}\n\n/**\n * @internal\n */\nconst DefaultOptions: Partial<AutoFormatOptions> = {\n autoBullet: false,\n autoNumbering: false,\n autoUnlink: false,\n autoLink: false,\n autoHyphen: false,\n autoFraction: false,\n autoOrdinals: false,\n removeListMargins: false,\n autoHorizontalLine: false,\n};\n\n/**\n * Auto Format plugin handles auto formatting, such as transforming * characters into a bullet list.\n * It can be customized with options to enable or disable auto list features.\n */\nexport class AutoFormatPlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n /**\n * @param options An optional parameter that takes in an object of type AutoFormatOptions, which includes the following properties:\n * - autoBullet: A boolean that enables or disables automatic bullet list formatting. Defaults to false.\n * - autoNumbering: A boolean that enables or disables automatic numbering formatting. Defaults to false.\n * - removeListMargins: A boolean to remove list margins when it is automatically triggered. Defaults to false.\n * - autoHyphen: A boolean that enables or disables automatic hyphen transformation. Defaults to false.\n * - autoFraction: A boolean that enables or disables automatic fraction transformation. Defaults to false.\n * - autoOrdinals: A boolean that enables or disables automatic ordinal number transformation. Defaults to false.\n * - autoLink: A boolean that enables or disables automatic hyperlink url address creation when pasting or typing content. Defaults to false.\n * - autoUnlink: A boolean that enables or disables automatic hyperlink removal when pressing backspace. Defaults to false.\n * - autoTel: A boolean that enables or disables automatic hyperlink telephone numbers transformation. Defaults to false.\n * - autoMailto: A boolean that enables or disables automatic hyperlink email address transformation. Defaults to false.\n * - autoHorizontalLine: A boolean that enables or disables automatic horizontal line creation. Defaults to false.\n */\n constructor(private options: AutoFormatOptions = DefaultOptions) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'AutoFormat';\n }\n\n /**\n * The first method that editor will call to a plugin when editor is initializing.\n * It will pass in the editor instance, plugin should take this chance to save the\n * editor reference so that it can call to any editor method or format API later.\n * @param editor The editor object\n */\n initialize(editor: IEditor) {\n this.editor = editor;\n }\n\n /**\n * The last method that editor will call to a plugin before it is disposed.\n * Plugin can take this chance to clear the reference to editor. After this method is\n * called, plugin should not call to any editor method since it will result in error.\n */\n dispose() {\n this.editor = null;\n }\n\n /**\n * Core method for a plugin. Once an event happens in editor, editor will call this\n * method of each plugin to handle the event as long as the event is not handled\n * exclusively by another plugin.\n * @param event The event to handle:\n */\n onPluginEvent(event: PluginEvent) {\n if (this.editor) {\n switch (event.eventType) {\n case 'input':\n this.handleEditorInputEvent(this.editor, event);\n break;\n case 'keyDown':\n this.handleKeyDownEvent(this.editor, event);\n break;\n case 'contentChanged':\n this.handleContentChangedEvent(this.editor, event);\n break;\n }\n }\n }\n\n private autoLink: Feature = {\n enabled: !!(this.options.autoLink || this.options.autoTel || this.options.autoMailto),\n transformFunction: (_model, previousSegment, paragraph, context) => {\n const { autoLink, autoTel, autoMailto } = this.options;\n const linkSegment = promoteLink(previousSegment, paragraph, {\n autoLink,\n autoTel,\n autoMailto,\n });\n\n if (linkSegment) {\n return createAnchor(linkSegment.link?.format.href || '', linkSegment.text);\n }\n return false;\n },\n apiName: 'autoLink',\n changeSource: ChangeSource.AutoLink,\n };\n\n private tabFeatures: Feature[] = [\n {\n enabled: !!(this.options.autoBullet || this.options.autoNumbering),\n transformFunction: (model, _previousSegment, paragraph, context) =>\n keyboardListTrigger(\n model,\n paragraph,\n context,\n this.options.autoBullet,\n this.options.autoNumbering,\n this.options.removeListMargins\n ),\n apiName: 'autoToggleList',\n changeSource: ChangeSource.AutoFormat,\n },\n this.autoLink,\n ];\n\n private features: Feature[] = [\n ...this.tabFeatures,\n {\n enabled: !!this.options.autoHyphen,\n apiName: 'autoHyphen',\n changeSource: ChangeSource.Format,\n transformFunction: (_model, previousSegment, paragraph, context) =>\n transformHyphen(previousSegment, paragraph, context),\n },\n {\n enabled: !!this.options.autoFraction,\n apiName: 'autoFraction',\n changeSource: ChangeSource.Format,\n transformFunction: (_model, previousSegment, paragraph, context) =>\n transformFraction(previousSegment, paragraph, context),\n },\n {\n enabled: !!this.options.autoOrdinals,\n apiName: 'autoOrdinal',\n changeSource: ChangeSource.Format,\n transformFunction: (_model, previousSegment, paragraph, context) =>\n transformOrdinals(previousSegment, paragraph, context),\n },\n ];\n\n private enterFeatures: Feature[] = [\n {\n enabled: !!this.options.autoHorizontalLine,\n transformFunction: (model, _previousSegment, paragraph, context) =>\n checkAndInsertHorizontalLine(model, paragraph, context),\n apiName: 'autoHorizontalLine',\n changeSource: ChangeSource.AutoFormat,\n },\n this.autoLink,\n ];\n\n private handleKeyboardEvents(editor: IEditor, features: Feature[]): FormatContentModelOptions {\n const formatOptions: FormatContentModelOptions = {\n changeSource: '',\n apiName: '',\n getChangeData: undefined,\n };\n\n formatTextSegmentBeforeSelectionMarker(\n editor,\n (model, previousSegment, paragraph, _markerFormat, context) => {\n let featureApplied: Feature | undefined = undefined;\n for (const feature of features) {\n if (feature.enabled) {\n const result = feature.transformFunction(\n model,\n previousSegment,\n paragraph,\n context\n );\n if (result) {\n if (typeof result !== 'boolean') {\n formatOptions.getChangeData = () => result;\n }\n featureApplied = feature;\n break;\n }\n }\n }\n\n if (featureApplied) {\n formatOptions.changeSource = featureApplied.changeSource;\n formatOptions.apiName = featureApplied.apiName;\n }\n\n return !!featureApplied;\n },\n formatOptions\n );\n return formatOptions;\n }\n\n private handleEditorInputEvent(editor: IEditor, event: EditorInputEvent) {\n const rawEvent = event.rawEvent;\n const selection = editor.getDOMSelection();\n if (\n rawEvent.inputType === 'insertText' &&\n selection &&\n selection.type === 'range' &&\n selection.range.collapsed\n ) {\n switch (rawEvent.data) {\n case ' ':\n this.handleKeyboardEvents(editor, this.features);\n break;\n }\n }\n }\n\n private handleKeyDownEvent(editor: IEditor, event: KeyDownEvent) {\n const rawEvent = event.rawEvent;\n if (!rawEvent.defaultPrevented && !event.handledByEditFeature) {\n switch (rawEvent.key) {\n case 'Backspace':\n if (this.options.autoUnlink) {\n unlink(editor, rawEvent);\n }\n break;\n case 'Tab':\n if (!rawEvent.shiftKey) {\n const eventHandled = this.handleKeyboardEvents(editor, this.tabFeatures);\n if (eventHandled.apiName == 'autoToggleList') {\n event.rawEvent.preventDefault();\n }\n }\n break;\n case 'Enter':\n const eventHandled = this.handleKeyboardEvents(editor, this.enterFeatures);\n if (eventHandled.apiName == 'autoHorizontalLine') {\n event.rawEvent.preventDefault();\n }\n break;\n }\n }\n }\n\n private handleContentChangedEvent(editor: IEditor, event: ContentChangedEvent) {\n const { autoLink, autoTel, autoMailto } = this.options;\n if (event.source == 'Paste' && (autoLink || autoTel || autoMailto)) {\n createLink(editor, {\n autoLink,\n autoTel,\n autoMailto,\n });\n }\n }\n}\n\nconst createAnchor = (url: string, text: string) => {\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.textContent = text;\n return anchor;\n};\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FormatContentModelContext,
|
|
1
|
+
import type { FormatContentModelContext, ReadonlyContentModelDocument, ShallowMutableContentModelParagraph } from 'roosterjs-content-model-types';
|
|
2
2
|
/**
|
|
3
3
|
* @internal
|
|
4
4
|
*/
|
|
@@ -11,7 +11,7 @@ export declare type HorizontalLineTriggerCharacter = '-' | '=' | '_' | '*' | '~'
|
|
|
11
11
|
* @param model the model to insert horizontal line into
|
|
12
12
|
* @param context the formatting context
|
|
13
13
|
*/
|
|
14
|
-
export declare function insertHorizontalLineIntoModel(model:
|
|
14
|
+
export declare function insertHorizontalLineIntoModel(model: ReadonlyContentModelDocument, context: FormatContentModelContext, triggerChar: HorizontalLineTriggerCharacter): void;
|
|
15
15
|
/**
|
|
16
16
|
* @internal
|
|
17
17
|
*
|
|
@@ -21,4 +21,4 @@ export declare function insertHorizontalLineIntoModel(model: ShallowMutableConte
|
|
|
21
21
|
* @param event The keydown event
|
|
22
22
|
* @returns True if horizontal line is inserted, otherwise false
|
|
23
23
|
*/
|
|
24
|
-
export declare
|
|
24
|
+
export declare const checkAndInsertHorizontalLine: (model: ReadonlyContentModelDocument, paragraph: ShallowMutableContentModelParagraph, context: FormatContentModelContext) => boolean;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { __assign } from "tslib";
|
|
2
|
-
import {
|
|
3
|
-
import { addBlock, ChangeSource, createContentModelDocument, createDivider, mergeModel, } from 'roosterjs-content-model-dom';
|
|
2
|
+
import { addBlock, createContentModelDocument, createDivider, mergeModel, } from 'roosterjs-content-model-dom';
|
|
4
3
|
var HorizontalLineTriggerCharacters = [
|
|
5
4
|
'-',
|
|
6
5
|
'=',
|
|
@@ -62,26 +61,20 @@ export function insertHorizontalLineIntoModel(model, context, triggerChar) {
|
|
|
62
61
|
* @param event The keydown event
|
|
63
62
|
* @returns True if horizontal line is inserted, otherwise false
|
|
64
63
|
*/
|
|
65
|
-
export function
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
64
|
+
export var checkAndInsertHorizontalLine = function (model, paragraph, context) {
|
|
65
|
+
var allText = paragraph.segments.reduce(function (acc, segment) { return (segment.segmentType === 'Text' ? acc + segment.text : acc); }, '');
|
|
66
|
+
// At least 3 characters are needed to trigger horizontal line
|
|
67
|
+
if (allText.length < 3) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return HorizontalLineTriggerCharacters.some(function (triggerCharacter) {
|
|
71
|
+
var shouldFormat = allText.split('').every(function (char) { return char === triggerCharacter; });
|
|
72
|
+
if (shouldFormat) {
|
|
73
|
+
paragraph.segments = paragraph.segments.filter(function (s) { return s.segmentType != 'Text'; });
|
|
74
|
+
insertHorizontalLineIntoModel(model, context, triggerCharacter);
|
|
75
|
+
context.canUndoByBackspace = true;
|
|
71
76
|
}
|
|
72
|
-
return
|
|
73
|
-
var shouldFormat = allText.split('').every(function (char) { return char === triggerCharacter; });
|
|
74
|
-
if (shouldFormat) {
|
|
75
|
-
para.segments = para.segments.filter(function (s) { return s.segmentType != 'Text'; });
|
|
76
|
-
insertHorizontalLineIntoModel(model, context, triggerCharacter);
|
|
77
|
-
event.rawEvent.preventDefault();
|
|
78
|
-
context.canUndoByBackspace = true;
|
|
79
|
-
}
|
|
80
|
-
return shouldFormat;
|
|
81
|
-
});
|
|
82
|
-
}, {
|
|
83
|
-
changeSource: ChangeSource.AutoFormat,
|
|
84
|
-
apiName: 'autoHorizontalLine',
|
|
77
|
+
return shouldFormat;
|
|
85
78
|
});
|
|
86
|
-
}
|
|
79
|
+
};
|
|
87
80
|
//# sourceMappingURL=checkAndInsertHorizontalLine.js.map
|