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.
Files changed (139) hide show
  1. package/lib/autoFormat/AutoFormatPlugin.d.ts +4 -1
  2. package/lib/autoFormat/AutoFormatPlugin.js +94 -96
  3. package/lib/autoFormat/AutoFormatPlugin.js.map +1 -1
  4. package/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.d.ts +3 -3
  5. package/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js +14 -21
  6. package/lib/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js.map +1 -1
  7. package/lib/edit/EditPlugin.d.ts +9 -0
  8. package/lib/edit/EditPlugin.js +19 -3
  9. package/lib/edit/EditPlugin.js.map +1 -1
  10. package/lib/edit/utils/splitParagraph.d.ts +3 -2
  11. package/lib/edit/utils/splitParagraph.js +41 -2
  12. package/lib/edit/utils/splitParagraph.js.map +1 -1
  13. package/lib/imageEdit/ImageEditPlugin.js +9 -9
  14. package/lib/imageEdit/ImageEditPlugin.js.map +1 -1
  15. package/lib/imageEdit/utils/findEditingImage.d.ts +4 -0
  16. package/lib/imageEdit/utils/findEditingImage.js +7 -2
  17. package/lib/imageEdit/utils/findEditingImage.js.map +1 -1
  18. package/lib/paste/PastePlugin.js +3 -3
  19. package/lib/paste/PastePlugin.js.map +1 -1
  20. package/lib/paste/PowerPoint/processPastedContentFromPowerPoint.js +132 -1
  21. package/lib/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
  22. package/lib/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
  23. package/lib/paste/WordDesktop/getStyleMetadata.js +22 -5
  24. package/lib/paste/WordDesktop/getStyleMetadata.js.map +1 -1
  25. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
  26. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js +5 -5
  27. package/lib/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  28. package/lib/paste/WordDesktop/processWordLists.js +25 -60
  29. package/lib/paste/WordDesktop/processWordLists.js.map +1 -1
  30. package/lib/paste/parsers/deprecatedColorParser.js.map +1 -0
  31. package/lib/paste/parsers/linkParser.js.map +1 -0
  32. package/lib/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.js +1 -1
  33. package/lib/paste/parsers/removeNegativeTextIndentParser.js.map +1 -0
  34. package/lib/paste/utils/customListUtils.d.ts +9 -0
  35. package/lib/paste/utils/customListUtils.js +63 -0
  36. package/lib/paste/utils/customListUtils.js.map +1 -0
  37. package/lib/watermark/WatermarkPlugin.js +1 -1
  38. package/lib/watermark/WatermarkPlugin.js.map +1 -1
  39. package/lib-amd/autoFormat/AutoFormatPlugin.d.ts +4 -1
  40. package/lib-amd/autoFormat/AutoFormatPlugin.js +94 -96
  41. package/lib-amd/autoFormat/AutoFormatPlugin.js.map +1 -1
  42. package/lib-amd/autoFormat/horizontalLine/checkAndInsertHorizontalLine.d.ts +3 -3
  43. package/lib-amd/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js +15 -21
  44. package/lib-amd/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js.map +1 -1
  45. package/lib-amd/edit/EditPlugin.d.ts +9 -0
  46. package/lib-amd/edit/EditPlugin.js +19 -3
  47. package/lib-amd/edit/EditPlugin.js.map +1 -1
  48. package/lib-amd/edit/utils/splitParagraph.d.ts +3 -2
  49. package/lib-amd/edit/utils/splitParagraph.js +41 -2
  50. package/lib-amd/edit/utils/splitParagraph.js.map +1 -1
  51. package/lib-amd/imageEdit/ImageEditPlugin.js +9 -9
  52. package/lib-amd/imageEdit/ImageEditPlugin.js.map +1 -1
  53. package/lib-amd/imageEdit/utils/findEditingImage.d.ts +4 -0
  54. package/lib-amd/imageEdit/utils/findEditingImage.js +7 -2
  55. package/lib-amd/imageEdit/utils/findEditingImage.js.map +1 -1
  56. package/lib-amd/paste/PastePlugin.js +2 -2
  57. package/lib-amd/paste/PastePlugin.js.map +1 -1
  58. package/lib-amd/paste/PowerPoint/processPastedContentFromPowerPoint.js +128 -2
  59. package/lib-amd/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
  60. package/lib-amd/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
  61. package/lib-amd/paste/WordDesktop/getStyleMetadata.js +22 -5
  62. package/lib-amd/paste/WordDesktop/getStyleMetadata.js.map +1 -1
  63. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
  64. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js +5 -5
  65. package/lib-amd/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  66. package/lib-amd/paste/WordDesktop/processWordLists.js +25 -60
  67. package/lib-amd/paste/WordDesktop/processWordLists.js.map +1 -1
  68. package/lib-amd/paste/parsers/deprecatedColorParser.js.map +1 -0
  69. package/lib-amd/paste/parsers/linkParser.js.map +1 -0
  70. package/lib-amd/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.js +1 -1
  71. package/lib-amd/paste/parsers/removeNegativeTextIndentParser.js.map +1 -0
  72. package/lib-amd/paste/utils/customListUtils.d.ts +9 -0
  73. package/lib-amd/paste/utils/customListUtils.js +63 -0
  74. package/lib-amd/paste/utils/customListUtils.js.map +1 -0
  75. package/lib-amd/watermark/WatermarkPlugin.js +1 -1
  76. package/lib-amd/watermark/WatermarkPlugin.js.map +1 -1
  77. package/lib-mjs/autoFormat/AutoFormatPlugin.d.ts +4 -1
  78. package/lib-mjs/autoFormat/AutoFormatPlugin.js +95 -97
  79. package/lib-mjs/autoFormat/AutoFormatPlugin.js.map +1 -1
  80. package/lib-mjs/autoFormat/horizontalLine/checkAndInsertHorizontalLine.d.ts +3 -3
  81. package/lib-mjs/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js +15 -22
  82. package/lib-mjs/autoFormat/horizontalLine/checkAndInsertHorizontalLine.js.map +1 -1
  83. package/lib-mjs/edit/EditPlugin.d.ts +9 -0
  84. package/lib-mjs/edit/EditPlugin.js +19 -3
  85. package/lib-mjs/edit/EditPlugin.js.map +1 -1
  86. package/lib-mjs/edit/utils/splitParagraph.d.ts +3 -2
  87. package/lib-mjs/edit/utils/splitParagraph.js +42 -3
  88. package/lib-mjs/edit/utils/splitParagraph.js.map +1 -1
  89. package/lib-mjs/imageEdit/ImageEditPlugin.js +11 -11
  90. package/lib-mjs/imageEdit/ImageEditPlugin.js.map +1 -1
  91. package/lib-mjs/imageEdit/utils/findEditingImage.d.ts +4 -0
  92. package/lib-mjs/imageEdit/utils/findEditingImage.js +6 -1
  93. package/lib-mjs/imageEdit/utils/findEditingImage.js.map +1 -1
  94. package/lib-mjs/paste/PastePlugin.js +3 -3
  95. package/lib-mjs/paste/PastePlugin.js.map +1 -1
  96. package/lib-mjs/paste/PowerPoint/processPastedContentFromPowerPoint.js +133 -2
  97. package/lib-mjs/paste/PowerPoint/processPastedContentFromPowerPoint.js.map +1 -1
  98. package/lib-mjs/paste/WordDesktop/getStyleMetadata.d.ts +2 -2
  99. package/lib-mjs/paste/WordDesktop/getStyleMetadata.js +22 -5
  100. package/lib-mjs/paste/WordDesktop/getStyleMetadata.js.map +1 -1
  101. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.d.ts +2 -2
  102. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js +5 -5
  103. package/lib-mjs/paste/WordDesktop/processPastedContentFromWordDesktop.js.map +1 -1
  104. package/lib-mjs/paste/WordDesktop/processWordLists.js +26 -61
  105. package/lib-mjs/paste/WordDesktop/processWordLists.js.map +1 -1
  106. package/lib-mjs/paste/parsers/deprecatedColorParser.js.map +1 -0
  107. package/lib-mjs/paste/parsers/linkParser.js.map +1 -0
  108. package/lib-mjs/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.js +1 -1
  109. package/lib-mjs/paste/parsers/removeNegativeTextIndentParser.js.map +1 -0
  110. package/lib-mjs/paste/utils/customListUtils.d.ts +9 -0
  111. package/lib-mjs/paste/utils/customListUtils.js +58 -0
  112. package/lib-mjs/paste/utils/customListUtils.js.map +1 -0
  113. package/lib-mjs/watermark/WatermarkPlugin.js +1 -1
  114. package/lib-mjs/watermark/WatermarkPlugin.js.map +1 -1
  115. package/package.json +5 -5
  116. package/lib/paste/WordDesktop/removeNegativeTextIndentParser.js.map +0 -1
  117. package/lib/paste/utils/deprecatedColorParser.js.map +0 -1
  118. package/lib/paste/utils/linkParser.js.map +0 -1
  119. package/lib-amd/paste/WordDesktop/removeNegativeTextIndentParser.js.map +0 -1
  120. package/lib-amd/paste/utils/deprecatedColorParser.js.map +0 -1
  121. package/lib-amd/paste/utils/linkParser.js.map +0 -1
  122. package/lib-mjs/paste/WordDesktop/removeNegativeTextIndentParser.js.map +0 -1
  123. package/lib-mjs/paste/utils/deprecatedColorParser.js.map +0 -1
  124. package/lib-mjs/paste/utils/linkParser.js.map +0 -1
  125. /package/lib/paste/{utils → parsers}/deprecatedColorParser.d.ts +0 -0
  126. /package/lib/paste/{utils → parsers}/deprecatedColorParser.js +0 -0
  127. /package/lib/paste/{utils → parsers}/linkParser.d.ts +0 -0
  128. /package/lib/paste/{utils → parsers}/linkParser.js +0 -0
  129. /package/lib/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.d.ts +0 -0
  130. /package/lib-amd/paste/{utils → parsers}/deprecatedColorParser.d.ts +0 -0
  131. /package/lib-amd/paste/{utils → parsers}/deprecatedColorParser.js +0 -0
  132. /package/lib-amd/paste/{utils → parsers}/linkParser.d.ts +0 -0
  133. /package/lib-amd/paste/{utils → parsers}/linkParser.js +0 -0
  134. /package/lib-amd/paste/{WordDesktop → parsers}/removeNegativeTextIndentParser.d.ts +0 -0
  135. /package/lib-mjs/paste/{utils → parsers}/deprecatedColorParser.d.ts +0 -0
  136. /package/lib-mjs/paste/{utils → parsers}/deprecatedColorParser.js +0 -0
  137. /package/lib-mjs/paste/{utils → parsers}/linkParser.d.ts +0 -0
  138. /package/lib-mjs/paste/{utils → parsers}/linkParser.js +0 -0
  139. /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, element) {
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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","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; 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"]}
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.features = [
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
- var formatOptions_1 = {
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
- formatTextSegmentBeforeSelectionMarker(editor, function (model, _previousSegment, paragraph, _markerFormat, context) {
209
- var _a = _this.options, autoBullet = _a.autoBullet, autoNumbering = _a.autoNumbering, removeListMargins = _a.removeListMargins;
210
- var shouldList = false;
211
- if (autoBullet || autoNumbering) {
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.handleEnterKey(editor, event);
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, IEditor, KeyDownEvent, ShallowMutableContentModelDocument } from 'roosterjs-content-model-types';
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: ShallowMutableContentModelDocument, context: FormatContentModelContext, triggerChar: HorizontalLineTriggerCharacter): void;
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 function checkAndInsertHorizontalLine(editor: IEditor, event: KeyDownEvent): boolean;
24
+ export declare const checkAndInsertHorizontalLine: (model: ReadonlyContentModelDocument, paragraph: ShallowMutableContentModelParagraph, context: FormatContentModelContext) => boolean;
@@ -1,6 +1,5 @@
1
1
  import { __assign } from "tslib";
2
- import { formatTextSegmentBeforeSelectionMarker } from 'roosterjs-content-model-api';
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 checkAndInsertHorizontalLine(editor, event) {
66
- return formatTextSegmentBeforeSelectionMarker(editor, function (model, _, para, __, context) {
67
- var allText = para.segments.reduce(function (acc, segment) { return (segment.segmentType === 'Text' ? acc + segment.text : acc); }, '');
68
- // At least 3 characters are needed to trigger horizontal line
69
- if (allText.length < 3) {
70
- return false;
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 HorizontalLineTriggerCharacters.some(function (triggerCharacter) {
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