roosterjs-content-model-plugins 9.0.0 → 9.1.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 (160) hide show
  1. package/lib/autoFormat/AutoFormatPlugin.d.ts +5 -0
  2. package/lib/autoFormat/AutoFormatPlugin.js +24 -6
  3. package/lib/autoFormat/AutoFormatPlugin.js.map +1 -1
  4. package/lib/autoFormat/hyphen/transformHyphen.d.ts +5 -0
  5. package/lib/autoFormat/hyphen/transformHyphen.js +35 -0
  6. package/lib/autoFormat/hyphen/transformHyphen.js.map +1 -0
  7. package/lib/autoFormat/link/createLink.js +6 -6
  8. package/lib/autoFormat/link/createLink.js.map +1 -1
  9. package/lib/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
  10. package/lib/autoFormat/link/createLinkAfterSpace.js +17 -34
  11. package/lib/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  12. package/lib/autoFormat/link/unlink.js +4 -5
  13. package/lib/autoFormat/link/unlink.js.map +1 -1
  14. package/lib/autoFormat/list/getListTypeStyle.js +2 -2
  15. package/lib/autoFormat/list/getListTypeStyle.js.map +1 -1
  16. package/lib/autoFormat/list/keyboardListTrigger.d.ts +2 -2
  17. package/lib/autoFormat/list/keyboardListTrigger.js +10 -18
  18. package/lib/autoFormat/list/keyboardListTrigger.js.map +1 -1
  19. package/lib/edit/deleteSteps/deleteList.js +13 -7
  20. package/lib/edit/deleteSteps/deleteList.js.map +1 -1
  21. package/lib/edit/inputSteps/handleEnterOnList.js +1 -1
  22. package/lib/edit/inputSteps/handleEnterOnList.js.map +1 -1
  23. package/lib/edit/keyboardDelete.js +2 -2
  24. package/lib/edit/keyboardDelete.js.map +1 -1
  25. package/lib/edit/keyboardTab.js +25 -9
  26. package/lib/edit/keyboardTab.js.map +1 -1
  27. package/lib/edit/tabUtils/handleTabOnTable.d.ts +6 -0
  28. package/lib/edit/tabUtils/handleTabOnTable.js +25 -0
  29. package/lib/edit/tabUtils/handleTabOnTable.js.map +1 -0
  30. package/lib/edit/tabUtils/handleTabOnTableCell.d.ts +6 -0
  31. package/lib/edit/tabUtils/handleTabOnTableCell.js +40 -0
  32. package/lib/edit/tabUtils/handleTabOnTableCell.js.map +1 -0
  33. package/lib/hyperlink/HyperlinkPlugin.d.ts +48 -0
  34. package/lib/hyperlink/HyperlinkPlugin.js +141 -0
  35. package/lib/hyperlink/HyperlinkPlugin.js.map +1 -0
  36. package/lib/hyperlink/HyperlinkToolTip.d.ts +7 -0
  37. package/lib/hyperlink/HyperlinkToolTip.js +3 -0
  38. package/lib/hyperlink/HyperlinkToolTip.js.map +1 -0
  39. package/lib/index.d.ts +2 -0
  40. package/lib/index.js +3 -1
  41. package/lib/index.js.map +1 -1
  42. package/lib/markdown/MarkdownPlugin.d.ts +13 -4
  43. package/lib/markdown/MarkdownPlugin.js +31 -12
  44. package/lib/markdown/MarkdownPlugin.js.map +1 -1
  45. package/lib/markdown/utils/setFormat.d.ts +2 -2
  46. package/lib/markdown/utils/setFormat.js +20 -30
  47. package/lib/markdown/utils/setFormat.js.map +1 -1
  48. package/lib/shortcut/shortcuts.d.ts +3 -3
  49. package/lib/shortcut/shortcuts.js +6 -3
  50. package/lib/shortcut/shortcuts.js.map +1 -1
  51. package/lib-amd/autoFormat/AutoFormatPlugin.d.ts +5 -0
  52. package/lib-amd/autoFormat/AutoFormatPlugin.js +23 -7
  53. package/lib-amd/autoFormat/AutoFormatPlugin.js.map +1 -1
  54. package/lib-amd/autoFormat/hyphen/transformHyphen.d.ts +5 -0
  55. package/lib-amd/autoFormat/hyphen/transformHyphen.js +36 -0
  56. package/lib-amd/autoFormat/hyphen/transformHyphen.js.map +1 -0
  57. package/lib-amd/autoFormat/link/createLink.js +6 -6
  58. package/lib-amd/autoFormat/link/createLink.js.map +1 -1
  59. package/lib-amd/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
  60. package/lib-amd/autoFormat/link/createLinkAfterSpace.js +18 -34
  61. package/lib-amd/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  62. package/lib-amd/autoFormat/link/unlink.js +4 -5
  63. package/lib-amd/autoFormat/link/unlink.js.map +1 -1
  64. package/lib-amd/autoFormat/list/getListTypeStyle.js +2 -2
  65. package/lib-amd/autoFormat/list/getListTypeStyle.js.map +1 -1
  66. package/lib-amd/autoFormat/list/keyboardListTrigger.d.ts +2 -2
  67. package/lib-amd/autoFormat/list/keyboardListTrigger.js +11 -18
  68. package/lib-amd/autoFormat/list/keyboardListTrigger.js.map +1 -1
  69. package/lib-amd/edit/deleteSteps/deleteList.js +13 -7
  70. package/lib-amd/edit/deleteSteps/deleteList.js.map +1 -1
  71. package/lib-amd/edit/inputSteps/handleEnterOnList.js +1 -1
  72. package/lib-amd/edit/inputSteps/handleEnterOnList.js.map +1 -1
  73. package/lib-amd/edit/keyboardDelete.js +2 -2
  74. package/lib-amd/edit/keyboardDelete.js.map +1 -1
  75. package/lib-amd/edit/keyboardTab.js +24 -10
  76. package/lib-amd/edit/keyboardTab.js.map +1 -1
  77. package/lib-amd/edit/tabUtils/handleTabOnTable.d.ts +6 -0
  78. package/lib-amd/edit/tabUtils/handleTabOnTable.js +25 -0
  79. package/lib-amd/edit/tabUtils/handleTabOnTable.js.map +1 -0
  80. package/lib-amd/edit/tabUtils/handleTabOnTableCell.d.ts +6 -0
  81. package/lib-amd/edit/tabUtils/handleTabOnTableCell.js +40 -0
  82. package/lib-amd/edit/tabUtils/handleTabOnTableCell.js.map +1 -0
  83. package/lib-amd/hyperlink/HyperlinkPlugin.d.ts +48 -0
  84. package/lib-amd/hyperlink/HyperlinkPlugin.js +142 -0
  85. package/lib-amd/hyperlink/HyperlinkPlugin.js.map +1 -0
  86. package/lib-amd/hyperlink/HyperlinkToolTip.d.ts +7 -0
  87. package/lib-amd/hyperlink/HyperlinkToolTip.js +5 -0
  88. package/lib-amd/hyperlink/HyperlinkToolTip.js.map +1 -0
  89. package/lib-amd/index.d.ts +2 -0
  90. package/lib-amd/index.js +3 -2
  91. package/lib-amd/index.js.map +1 -1
  92. package/lib-amd/markdown/MarkdownPlugin.d.ts +13 -4
  93. package/lib-amd/markdown/MarkdownPlugin.js +31 -12
  94. package/lib-amd/markdown/MarkdownPlugin.js.map +1 -1
  95. package/lib-amd/markdown/utils/setFormat.d.ts +2 -2
  96. package/lib-amd/markdown/utils/setFormat.js +20 -30
  97. package/lib-amd/markdown/utils/setFormat.js.map +1 -1
  98. package/lib-amd/shortcut/shortcuts.d.ts +3 -3
  99. package/lib-amd/shortcut/shortcuts.js +6 -3
  100. package/lib-amd/shortcut/shortcuts.js.map +1 -1
  101. package/lib-mjs/autoFormat/AutoFormatPlugin.d.ts +5 -0
  102. package/lib-mjs/autoFormat/AutoFormatPlugin.js +24 -6
  103. package/lib-mjs/autoFormat/AutoFormatPlugin.js.map +1 -1
  104. package/lib-mjs/autoFormat/hyphen/transformHyphen.d.ts +5 -0
  105. package/lib-mjs/autoFormat/hyphen/transformHyphen.js +31 -0
  106. package/lib-mjs/autoFormat/hyphen/transformHyphen.js.map +1 -0
  107. package/lib-mjs/autoFormat/link/createLink.js +6 -6
  108. package/lib-mjs/autoFormat/link/createLink.js.map +1 -1
  109. package/lib-mjs/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
  110. package/lib-mjs/autoFormat/link/createLinkAfterSpace.js +17 -34
  111. package/lib-mjs/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  112. package/lib-mjs/autoFormat/link/unlink.js +4 -5
  113. package/lib-mjs/autoFormat/link/unlink.js.map +1 -1
  114. package/lib-mjs/autoFormat/list/getListTypeStyle.js +2 -2
  115. package/lib-mjs/autoFormat/list/getListTypeStyle.js.map +1 -1
  116. package/lib-mjs/autoFormat/list/keyboardListTrigger.d.ts +2 -2
  117. package/lib-mjs/autoFormat/list/keyboardListTrigger.js +10 -18
  118. package/lib-mjs/autoFormat/list/keyboardListTrigger.js.map +1 -1
  119. package/lib-mjs/edit/deleteSteps/deleteList.js +13 -7
  120. package/lib-mjs/edit/deleteSteps/deleteList.js.map +1 -1
  121. package/lib-mjs/edit/inputSteps/handleEnterOnList.js +1 -1
  122. package/lib-mjs/edit/inputSteps/handleEnterOnList.js.map +1 -1
  123. package/lib-mjs/edit/keyboardDelete.js +2 -2
  124. package/lib-mjs/edit/keyboardDelete.js.map +1 -1
  125. package/lib-mjs/edit/keyboardTab.js +25 -9
  126. package/lib-mjs/edit/keyboardTab.js.map +1 -1
  127. package/lib-mjs/edit/tabUtils/handleTabOnTable.d.ts +6 -0
  128. package/lib-mjs/edit/tabUtils/handleTabOnTable.js +21 -0
  129. package/lib-mjs/edit/tabUtils/handleTabOnTable.js.map +1 -0
  130. package/lib-mjs/edit/tabUtils/handleTabOnTableCell.d.ts +6 -0
  131. package/lib-mjs/edit/tabUtils/handleTabOnTableCell.js +36 -0
  132. package/lib-mjs/edit/tabUtils/handleTabOnTableCell.js.map +1 -0
  133. package/lib-mjs/hyperlink/HyperlinkPlugin.d.ts +48 -0
  134. package/lib-mjs/hyperlink/HyperlinkPlugin.js +138 -0
  135. package/lib-mjs/hyperlink/HyperlinkPlugin.js.map +1 -0
  136. package/lib-mjs/hyperlink/HyperlinkToolTip.d.ts +7 -0
  137. package/lib-mjs/hyperlink/HyperlinkToolTip.js +2 -0
  138. package/lib-mjs/hyperlink/HyperlinkToolTip.js.map +1 -0
  139. package/lib-mjs/index.d.ts +2 -0
  140. package/lib-mjs/index.js +1 -0
  141. package/lib-mjs/index.js.map +1 -1
  142. package/lib-mjs/markdown/MarkdownPlugin.d.ts +13 -4
  143. package/lib-mjs/markdown/MarkdownPlugin.js +31 -12
  144. package/lib-mjs/markdown/MarkdownPlugin.js.map +1 -1
  145. package/lib-mjs/markdown/utils/setFormat.d.ts +2 -2
  146. package/lib-mjs/markdown/utils/setFormat.js +20 -30
  147. package/lib-mjs/markdown/utils/setFormat.js.map +1 -1
  148. package/lib-mjs/shortcut/shortcuts.d.ts +3 -3
  149. package/lib-mjs/shortcut/shortcuts.js +6 -3
  150. package/lib-mjs/shortcut/shortcuts.js.map +1 -1
  151. package/package.json +5 -5
  152. package/lib/autoFormat/link/getLinkSegment.d.ts +0 -5
  153. package/lib/autoFormat/link/getLinkSegment.js +0 -27
  154. package/lib/autoFormat/link/getLinkSegment.js.map +0 -1
  155. package/lib-amd/autoFormat/link/getLinkSegment.d.ts +0 -5
  156. package/lib-amd/autoFormat/link/getLinkSegment.js +0 -27
  157. package/lib-amd/autoFormat/link/getLinkSegment.js.map +0 -1
  158. package/lib-mjs/autoFormat/link/getLinkSegment.d.ts +0 -5
  159. package/lib-mjs/autoFormat/link/getLinkSegment.js +0 -23
  160. package/lib-mjs/autoFormat/link/getLinkSegment.js.map +0 -1
@@ -0,0 +1,142 @@
1
+ define(["require", "exports", "roosterjs-content-model-api"], function (require, exports, roosterjs_content_model_api_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.HyperlinkPlugin = void 0;
5
+ var defaultToolTipCallback = function (url) { return url; };
6
+ /**
7
+ * Hyperlink plugin does the following jobs for a hyperlink in editor:
8
+ * 1. When hover on a link, show a tool tip
9
+ * 2. When Ctrl+Click on a link, open a new window with the link
10
+ * 3. When type directly on a link whose text matches its link url, update the link url with the link text
11
+ */
12
+ var HyperlinkPlugin = /** @class */ (function () {
13
+ /**
14
+ * Create a new instance of HyperLink class
15
+ * @param tooltip Tooltip to show when mouse hover over a link
16
+ * Default value is to return the href itself. If null, there will be no tooltip text.
17
+ * @param target (Optional) Target window name for hyperlink. If null, will use "_blank"
18
+ * @param onLinkClick (Optional) Open link callback (return false to use default behavior)
19
+ */
20
+ function HyperlinkPlugin(tooltip, target, onLinkClick) {
21
+ var _this = this;
22
+ if (tooltip === void 0) { tooltip = defaultToolTipCallback; }
23
+ this.tooltip = tooltip;
24
+ this.target = target;
25
+ this.onLinkClick = onLinkClick;
26
+ this.editor = null;
27
+ this.domHelper = null;
28
+ this.isMac = false;
29
+ this.disposer = null;
30
+ this.currentNode = null;
31
+ this.currentLink = null;
32
+ this.onMouse = function (e) {
33
+ _this.runWithHyperlink(e.target, function (href, a) {
34
+ var _a;
35
+ var tooltip = e.type == 'mouseover'
36
+ ? typeof _this.tooltip == 'function'
37
+ ? _this.tooltip(href, a)
38
+ : _this.tooltip
39
+ : null;
40
+ (_a = _this.domHelper) === null || _a === void 0 ? void 0 : _a.setDomAttribute('title', tooltip);
41
+ });
42
+ };
43
+ }
44
+ /**
45
+ * Get a friendly name of this plugin
46
+ */
47
+ HyperlinkPlugin.prototype.getName = function () {
48
+ return 'Hyperlink';
49
+ };
50
+ /**
51
+ * Initialize this plugin
52
+ * @param editor The editor instance
53
+ */
54
+ HyperlinkPlugin.prototype.initialize = function (editor) {
55
+ this.editor = editor;
56
+ this.domHelper = editor.getDOMHelper();
57
+ this.isMac = !!editor.getEnvironment().isMac;
58
+ this.disposer = editor.attachDomEvent({
59
+ mouseover: { beforeDispatch: this.onMouse },
60
+ mouseout: { beforeDispatch: this.onMouse },
61
+ });
62
+ };
63
+ /**
64
+ * Dispose this plugin
65
+ */
66
+ HyperlinkPlugin.prototype.dispose = function () {
67
+ if (this.disposer) {
68
+ this.disposer();
69
+ this.disposer = null;
70
+ }
71
+ this.currentNode = null;
72
+ this.currentLink = null;
73
+ this.editor = null;
74
+ };
75
+ /**
76
+ * Handle events triggered from editor
77
+ * @param event PluginEvent object
78
+ */
79
+ HyperlinkPlugin.prototype.onPluginEvent = function (event) {
80
+ var _this = this;
81
+ var _a, _b;
82
+ var matchedLink;
83
+ if (event.eventType == 'keyDown') {
84
+ var selection = (_a = this.editor) === null || _a === void 0 ? void 0 : _a.getDOMSelection();
85
+ var node_1 = (selection === null || selection === void 0 ? void 0 : selection.type) == 'range' ? selection.range.commonAncestorContainer : null;
86
+ if (node_1 && node_1 != this.currentNode) {
87
+ this.currentNode = node_1;
88
+ this.currentLink = null;
89
+ this.runWithHyperlink(node_1, function (href, a) {
90
+ if (node_1.textContent &&
91
+ (matchedLink = (0, roosterjs_content_model_api_1.matchLink)(node_1.textContent)) &&
92
+ matchedLink.normalizedUrl == href) {
93
+ _this.currentLink = a;
94
+ }
95
+ });
96
+ }
97
+ }
98
+ else if (event.eventType == 'keyUp') {
99
+ var selection = (_b = this.editor) === null || _b === void 0 ? void 0 : _b.getDOMSelection();
100
+ var node = (selection === null || selection === void 0 ? void 0 : selection.type) == 'range' ? selection.range.commonAncestorContainer : null;
101
+ if (node &&
102
+ node == this.currentNode &&
103
+ this.currentLink &&
104
+ this.currentLink.contains(node) &&
105
+ node.textContent &&
106
+ (matchedLink = (0, roosterjs_content_model_api_1.matchLink)(node.textContent))) {
107
+ this.currentLink.setAttribute('href', matchedLink.normalizedUrl);
108
+ }
109
+ }
110
+ else if (event.eventType == 'mouseUp' && event.isClicking) {
111
+ this.runWithHyperlink(event.rawEvent.target, function (href, anchor) {
112
+ var _a, _b;
113
+ if (!((_a = _this.onLinkClick) === null || _a === void 0 ? void 0 : _a.call(_this, anchor, event.rawEvent)) &&
114
+ _this.isCtrlOrMetaPressed(event.rawEvent) &&
115
+ event.rawEvent.button === 0) {
116
+ event.rawEvent.preventDefault();
117
+ var target = _this.target || '_blank';
118
+ var window_1 = (_b = _this.editor) === null || _b === void 0 ? void 0 : _b.getDocument().defaultView;
119
+ try {
120
+ window_1 === null || window_1 === void 0 ? void 0 : window_1.open(href, target);
121
+ }
122
+ catch (_c) { }
123
+ }
124
+ });
125
+ }
126
+ };
127
+ HyperlinkPlugin.prototype.runWithHyperlink = function (node, callback) {
128
+ var _a;
129
+ var a = (_a = this.domHelper) === null || _a === void 0 ? void 0 : _a.findClosestElementAncestor(node, 'a[href]');
130
+ var href = a === null || a === void 0 ? void 0 : a.getAttribute('href');
131
+ if (href && a) {
132
+ callback(href, a);
133
+ }
134
+ };
135
+ HyperlinkPlugin.prototype.isCtrlOrMetaPressed = function (event) {
136
+ return this.isMac ? event.metaKey : event.ctrlKey;
137
+ };
138
+ return HyperlinkPlugin;
139
+ }());
140
+ exports.HyperlinkPlugin = HyperlinkPlugin;
141
+ });
142
+ //# sourceMappingURL=HyperlinkPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HyperlinkPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/hyperlink/HyperlinkPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { matchLink } from 'roosterjs-content-model-api';\nimport type { HyperlinkToolTip } from './HyperlinkToolTip';\nimport type {\n DOMHelper,\n EditorPlugin,\n IEditor,\n PluginEvent,\n LinkData,\n} from 'roosterjs-content-model-types';\n\nconst defaultToolTipCallback: HyperlinkToolTip = (url: string) => url;\n\n/**\n * Hyperlink plugin does the following jobs for a hyperlink in editor:\n * 1. When hover on a link, show a tool tip\n * 2. When Ctrl+Click on a link, open a new window with the link\n * 3. When type directly on a link whose text matches its link url, update the link url with the link text\n */\nexport class HyperlinkPlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n private domHelper: DOMHelper | null = null;\n private isMac: boolean = false;\n private disposer: (() => void) | null = null;\n\n private currentNode: Node | null = null;\n private currentLink: HTMLAnchorElement | null = null;\n\n /**\n * Create a new instance of HyperLink class\n * @param tooltip Tooltip to show when mouse hover over a link\n * Default value is to return the href itself. If null, there will be no tooltip text.\n * @param target (Optional) Target window name for hyperlink. If null, will use \"_blank\"\n * @param onLinkClick (Optional) Open link callback (return false to use default behavior)\n */\n constructor(\n private tooltip: HyperlinkToolTip = defaultToolTipCallback,\n private target?: string,\n private onLinkClick?: (anchor: HTMLAnchorElement, mouseEvent: MouseEvent) => boolean | void\n ) {}\n\n /**\n * Get a friendly name of this plugin\n */\n getName() {\n return 'Hyperlink';\n }\n\n /**\n * Initialize this plugin\n * @param editor The editor instance\n */\n public initialize(editor: IEditor): void {\n this.editor = editor;\n this.domHelper = editor.getDOMHelper();\n this.isMac = !!editor.getEnvironment().isMac;\n this.disposer = editor.attachDomEvent({\n mouseover: { beforeDispatch: this.onMouse },\n mouseout: { beforeDispatch: this.onMouse },\n });\n }\n\n /**\n * Dispose this plugin\n */\n public dispose(): void {\n if (this.disposer) {\n this.disposer();\n this.disposer = null;\n }\n\n this.currentNode = null;\n this.currentLink = null;\n this.editor = null;\n }\n\n /**\n * Handle events triggered from editor\n * @param event PluginEvent object\n */\n public onPluginEvent(event: PluginEvent): void {\n let matchedLink: LinkData | null;\n\n if (event.eventType == 'keyDown') {\n const selection = this.editor?.getDOMSelection();\n const node =\n selection?.type == 'range' ? selection.range.commonAncestorContainer : null;\n\n if (node && node != this.currentNode) {\n this.currentNode = node;\n this.currentLink = null;\n\n this.runWithHyperlink(node, (href, a) => {\n if (\n node.textContent &&\n (matchedLink = matchLink(node.textContent)) &&\n matchedLink.normalizedUrl == href\n ) {\n this.currentLink = a;\n }\n });\n }\n } else if (event.eventType == 'keyUp') {\n const selection = this.editor?.getDOMSelection();\n const node =\n selection?.type == 'range' ? selection.range.commonAncestorContainer : null;\n\n if (\n node &&\n node == this.currentNode &&\n this.currentLink &&\n this.currentLink.contains(node) &&\n node.textContent &&\n (matchedLink = matchLink(node.textContent))\n ) {\n this.currentLink.setAttribute('href', matchedLink.normalizedUrl);\n }\n } else if (event.eventType == 'mouseUp' && event.isClicking) {\n this.runWithHyperlink(event.rawEvent.target as Node, (href, anchor) => {\n if (\n !this.onLinkClick?.(anchor, event.rawEvent) &&\n this.isCtrlOrMetaPressed(event.rawEvent) &&\n event.rawEvent.button === 0\n ) {\n event.rawEvent.preventDefault();\n\n const target = this.target || '_blank';\n const window = this.editor?.getDocument().defaultView;\n\n try {\n window?.open(href, target);\n } catch {}\n }\n });\n }\n }\n\n protected onMouse = (e: Event) => {\n this.runWithHyperlink(e.target as Node, (href, a) => {\n const tooltip =\n e.type == 'mouseover'\n ? typeof this.tooltip == 'function'\n ? this.tooltip(href, a)\n : this.tooltip\n : null;\n this.domHelper?.setDomAttribute('title', tooltip);\n });\n };\n\n private runWithHyperlink(node: Node, callback: (href: string, a: HTMLAnchorElement) => void) {\n const a = this.domHelper?.findClosestElementAncestor(\n node,\n 'a[href]'\n ) as HTMLAnchorElement | null;\n const href = a?.getAttribute('href');\n\n if (href && a) {\n callback(href, a);\n }\n }\n\n private isCtrlOrMetaPressed(event: KeyboardEvent | MouseEvent): boolean {\n return this.isMac ? event.metaKey : event.ctrlKey;\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A type to specify how to get a tool tip of hyperlink in editor
3
+ * string: Use this string as tooltip
4
+ * null: No tooltip
5
+ * function: Call this function to get a tooltip
6
+ */
7
+ export declare type HyperlinkToolTip = string | null | ((url: string, anchor: HTMLAnchorElement) => string);
@@ -0,0 +1,5 @@
1
+ define(["require", "exports"], function (require, exports) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ });
5
+ //# sourceMappingURL=HyperlinkToolTip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HyperlinkToolTip.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/hyperlink/HyperlinkToolTip.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * A type to specify how to get a tool tip of hyperlink in editor\n * string: Use this string as tooltip\n * null: No tooltip\n * function: Call this function to get a tooltip\n */\nexport type HyperlinkToolTip = string | null | ((url: string, anchor: HTMLAnchorElement) => string);\n"]}
@@ -9,3 +9,5 @@ export { ContextMenuPluginBase, ContextMenuOptions } from './contextMenuBase/Con
9
9
  export { WatermarkPlugin } from './watermark/WatermarkPlugin';
10
10
  export { WatermarkFormat } from './watermark/WatermarkFormat';
11
11
  export { MarkdownPlugin, MarkdownOptions } from './markdown/MarkdownPlugin';
12
+ export { HyperlinkPlugin } from './hyperlink/HyperlinkPlugin';
13
+ export { HyperlinkToolTip } from './hyperlink/HyperlinkToolTip';
package/lib-amd/index.js CHANGED
@@ -1,7 +1,7 @@
1
- define(["require", "exports", "./tableEdit/TableEditPlugin", "./paste/PastePlugin", "./edit/EditPlugin", "./autoFormat/AutoFormatPlugin", "./shortcut/shortcuts", "./shortcut/ShortcutPlugin", "./contextMenuBase/ContextMenuPluginBase", "./watermark/WatermarkPlugin", "./markdown/MarkdownPlugin"], function (require, exports, TableEditPlugin_1, PastePlugin_1, EditPlugin_1, AutoFormatPlugin_1, shortcuts_1, ShortcutPlugin_1, ContextMenuPluginBase_1, WatermarkPlugin_1, MarkdownPlugin_1) {
1
+ define(["require", "exports", "./tableEdit/TableEditPlugin", "./paste/PastePlugin", "./edit/EditPlugin", "./autoFormat/AutoFormatPlugin", "./shortcut/shortcuts", "./shortcut/ShortcutPlugin", "./contextMenuBase/ContextMenuPluginBase", "./watermark/WatermarkPlugin", "./markdown/MarkdownPlugin", "./hyperlink/HyperlinkPlugin"], function (require, exports, TableEditPlugin_1, PastePlugin_1, EditPlugin_1, AutoFormatPlugin_1, shortcuts_1, ShortcutPlugin_1, ContextMenuPluginBase_1, WatermarkPlugin_1, MarkdownPlugin_1, HyperlinkPlugin_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.MarkdownPlugin = exports.WatermarkPlugin = exports.ContextMenuPluginBase = exports.ShortcutPlugin = exports.ShortcutOutdentList = exports.ShortcutIndentList = exports.ShortcutDecreaseFont = exports.ShortcutIncreaseFont = exports.ShortcutNumbering = exports.ShortcutBullet = exports.ShortcutRedoMacOS = exports.ShortcutRedo = exports.ShortcutUndo2 = exports.ShortcutUndo = exports.ShortcutClearFormat = exports.ShortcutUnderline = exports.ShortcutItalic = exports.ShortcutBold = exports.AutoFormatPlugin = exports.EditPlugin = exports.PastePlugin = exports.TableEditPlugin = void 0;
4
+ exports.HyperlinkPlugin = exports.MarkdownPlugin = exports.WatermarkPlugin = exports.ContextMenuPluginBase = exports.ShortcutPlugin = exports.ShortcutOutdentList = exports.ShortcutIndentList = exports.ShortcutDecreaseFont = exports.ShortcutIncreaseFont = exports.ShortcutNumbering = exports.ShortcutBullet = exports.ShortcutRedoMacOS = exports.ShortcutRedo = exports.ShortcutUndo2 = exports.ShortcutUndo = exports.ShortcutClearFormat = exports.ShortcutUnderline = exports.ShortcutItalic = exports.ShortcutBold = exports.AutoFormatPlugin = exports.EditPlugin = exports.PastePlugin = exports.TableEditPlugin = void 0;
5
5
  Object.defineProperty(exports, "TableEditPlugin", { enumerable: true, get: function () { return TableEditPlugin_1.TableEditPlugin; } });
6
6
  Object.defineProperty(exports, "PastePlugin", { enumerable: true, get: function () { return PastePlugin_1.PastePlugin; } });
7
7
  Object.defineProperty(exports, "EditPlugin", { enumerable: true, get: function () { return EditPlugin_1.EditPlugin; } });
@@ -24,5 +24,6 @@ define(["require", "exports", "./tableEdit/TableEditPlugin", "./paste/PastePlugi
24
24
  Object.defineProperty(exports, "ContextMenuPluginBase", { enumerable: true, get: function () { return ContextMenuPluginBase_1.ContextMenuPluginBase; } });
25
25
  Object.defineProperty(exports, "WatermarkPlugin", { enumerable: true, get: function () { return WatermarkPlugin_1.WatermarkPlugin; } });
26
26
  Object.defineProperty(exports, "MarkdownPlugin", { enumerable: true, get: function () { return MarkdownPlugin_1.MarkdownPlugin; } });
27
+ Object.defineProperty(exports, "HyperlinkPlugin", { enumerable: true, get: function () { return HyperlinkPlugin_1.HyperlinkPlugin; } });
27
28
  });
28
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-plugins/lib/index.ts"],"names":[],"mappings":";;;;IAAS,kHAAA,eAAe,OAAA;IACf,0GAAA,WAAW,OAAA;IACX,wGAAA,UAAU,OAAA;IACV,oHAAA,gBAAgB,OAAA;IAGrB,yGAAA,YAAY,OAAA;IACZ,2GAAA,cAAc,OAAA;IACd,8GAAA,iBAAiB,OAAA;IACjB,gHAAA,mBAAmB,OAAA;IACnB,yGAAA,YAAY,OAAA;IACZ,0GAAA,aAAa,OAAA;IACb,yGAAA,YAAY,OAAA;IACZ,8GAAA,iBAAiB,OAAA;IACjB,2GAAA,cAAc,OAAA;IACd,8GAAA,iBAAiB,OAAA;IACjB,iHAAA,oBAAoB,OAAA;IACpB,iHAAA,oBAAoB,OAAA;IACpB,+GAAA,kBAAkB,OAAA;IAClB,gHAAA,mBAAmB,OAAA;IAEd,gHAAA,cAAc,OAAA;IAEd,8HAAA,qBAAqB,OAAA;IACrB,kHAAA,eAAe,OAAA;IAEf,gHAAA,cAAc,OAAA","sourcesContent":["export { TableEditPlugin } from './tableEdit/TableEditPlugin';\nexport { PastePlugin } from './paste/PastePlugin';\nexport { EditPlugin } from './edit/EditPlugin';\nexport { AutoFormatPlugin, AutoFormatOptions } from './autoFormat/AutoFormatPlugin';\n\nexport {\n ShortcutBold,\n ShortcutItalic,\n ShortcutUnderline,\n ShortcutClearFormat,\n ShortcutUndo,\n ShortcutUndo2,\n ShortcutRedo,\n ShortcutRedoMacOS,\n ShortcutBullet,\n ShortcutNumbering,\n ShortcutIncreaseFont,\n ShortcutDecreaseFont,\n ShortcutIndentList,\n ShortcutOutdentList,\n} from './shortcut/shortcuts';\nexport { ShortcutPlugin } from './shortcut/ShortcutPlugin';\nexport { ShortcutKeyDefinition, ShortcutCommand } from './shortcut/ShortcutCommand';\nexport { ContextMenuPluginBase, ContextMenuOptions } from './contextMenuBase/ContextMenuPluginBase';\nexport { WatermarkPlugin } from './watermark/WatermarkPlugin';\nexport { WatermarkFormat } from './watermark/WatermarkFormat';\nexport { MarkdownPlugin, MarkdownOptions } from './markdown/MarkdownPlugin';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/roosterjs-content-model-plugins/lib/index.ts"],"names":[],"mappings":";;;;IAAS,kHAAA,eAAe,OAAA;IACf,0GAAA,WAAW,OAAA;IACX,wGAAA,UAAU,OAAA;IACV,oHAAA,gBAAgB,OAAA;IAGrB,yGAAA,YAAY,OAAA;IACZ,2GAAA,cAAc,OAAA;IACd,8GAAA,iBAAiB,OAAA;IACjB,gHAAA,mBAAmB,OAAA;IACnB,yGAAA,YAAY,OAAA;IACZ,0GAAA,aAAa,OAAA;IACb,yGAAA,YAAY,OAAA;IACZ,8GAAA,iBAAiB,OAAA;IACjB,2GAAA,cAAc,OAAA;IACd,8GAAA,iBAAiB,OAAA;IACjB,iHAAA,oBAAoB,OAAA;IACpB,iHAAA,oBAAoB,OAAA;IACpB,+GAAA,kBAAkB,OAAA;IAClB,gHAAA,mBAAmB,OAAA;IAEd,gHAAA,cAAc,OAAA;IAEd,8HAAA,qBAAqB,OAAA;IACrB,kHAAA,eAAe,OAAA;IAEf,gHAAA,cAAc,OAAA;IACd,kHAAA,eAAe,OAAA","sourcesContent":["export { TableEditPlugin } from './tableEdit/TableEditPlugin';\nexport { PastePlugin } from './paste/PastePlugin';\nexport { EditPlugin } from './edit/EditPlugin';\nexport { AutoFormatPlugin, AutoFormatOptions } from './autoFormat/AutoFormatPlugin';\n\nexport {\n ShortcutBold,\n ShortcutItalic,\n ShortcutUnderline,\n ShortcutClearFormat,\n ShortcutUndo,\n ShortcutUndo2,\n ShortcutRedo,\n ShortcutRedoMacOS,\n ShortcutBullet,\n ShortcutNumbering,\n ShortcutIncreaseFont,\n ShortcutDecreaseFont,\n ShortcutIndentList,\n ShortcutOutdentList,\n} from './shortcut/shortcuts';\nexport { ShortcutPlugin } from './shortcut/ShortcutPlugin';\nexport { ShortcutKeyDefinition, ShortcutCommand } from './shortcut/ShortcutCommand';\nexport { ContextMenuPluginBase, ContextMenuOptions } from './contextMenuBase/ContextMenuPluginBase';\nexport { WatermarkPlugin } from './watermark/WatermarkPlugin';\nexport { WatermarkFormat } from './watermark/WatermarkFormat';\nexport { MarkdownPlugin, MarkdownOptions } from './markdown/MarkdownPlugin';\nexport { HyperlinkPlugin } from './hyperlink/HyperlinkPlugin';\nexport { HyperlinkToolTip } from './hyperlink/HyperlinkToolTip';\n"]}
@@ -1,11 +1,17 @@
1
- import type { EditorPlugin, IEditor, PluginEvent } from 'roosterjs-content-model-types';
1
+ import type { ContentModelCodeFormat, EditorPlugin, IEditor, PluginEvent } from 'roosterjs-content-model-types';
2
2
  /**
3
+ *
3
4
  * Options for Markdown plugin
5
+ * - strikethrough: If true text between ~ will receive strikethrough format.
6
+ * - bold: If true text between * will receive bold format.
7
+ * - italic: If true text between _ will receive italic format.
8
+ * - codeFormat: If provided, text between ` will receive code format. If equal to {}, it will set the default code format.
4
9
  */
5
10
  export interface MarkdownOptions {
6
11
  strikethrough?: boolean;
7
12
  bold?: boolean;
8
13
  italic?: boolean;
14
+ codeFormat?: ContentModelCodeFormat;
9
15
  }
10
16
  /**
11
17
  * Markdown plugin handles markdown formatting, such as transforming * characters into bold text.
@@ -16,12 +22,14 @@ export declare class MarkdownPlugin implements EditorPlugin {
16
22
  private shouldBold;
17
23
  private shouldItalic;
18
24
  private shouldStrikethrough;
25
+ private shouldCode;
19
26
  private lastKeyTyped;
20
27
  /**
21
28
  * @param options An optional parameter that takes in an object of type MarkdownOptions, which includes the following properties:
22
- * - strikethrough: If true text between ~ will receive strikethrough format. Defaults to true.
23
- * - bold: If true text between * will receive bold format. Defaults to true.
24
- * - italic: If true text between _ will receive italic format. Defaults to true.
29
+ * - strikethrough: If true text between ~ will receive strikethrough format. Defaults to false.
30
+ * - bold: If true text between * will receive bold format. Defaults to false.
31
+ * - italic: If true text between _ will receive italic format. Defaults to false.
32
+ * - codeFormat: If provided, text between ` will receive code format. Defaults to undefined.
25
33
  */
26
34
  constructor(options?: MarkdownOptions);
27
35
  /**
@@ -52,4 +60,5 @@ export declare class MarkdownPlugin implements EditorPlugin {
52
60
  private handleKeyDownEvent;
53
61
  private handleBackspaceEvent;
54
62
  private handleContentChangedEvent;
63
+ private disableAllFeatures;
55
64
  }
@@ -16,9 +16,10 @@ define(["require", "exports", "./utils/setFormat"], function (require, exports,
16
16
  var MarkdownPlugin = /** @class */ (function () {
17
17
  /**
18
18
  * @param options An optional parameter that takes in an object of type MarkdownOptions, which includes the following properties:
19
- * - strikethrough: If true text between ~ will receive strikethrough format. Defaults to true.
20
- * - bold: If true text between * will receive bold format. Defaults to true.
21
- * - italic: If true text between _ will receive italic format. Defaults to true.
19
+ * - strikethrough: If true text between ~ will receive strikethrough format. Defaults to false.
20
+ * - bold: If true text between * will receive bold format. Defaults to false.
21
+ * - italic: If true text between _ will receive italic format. Defaults to false.
22
+ * - codeFormat: If provided, text between ` will receive code format. Defaults to undefined.
22
23
  */
23
24
  function MarkdownPlugin(options) {
24
25
  if (options === void 0) { options = DefaultOptions; }
@@ -27,6 +28,7 @@ define(["require", "exports", "./utils/setFormat"], function (require, exports,
27
28
  this.shouldBold = false;
28
29
  this.shouldItalic = false;
29
30
  this.shouldStrikethrough = false;
31
+ this.shouldCode = false;
30
32
  this.lastKeyTyped = null;
31
33
  }
32
34
  /**
@@ -51,9 +53,7 @@ define(["require", "exports", "./utils/setFormat"], function (require, exports,
51
53
  */
52
54
  MarkdownPlugin.prototype.dispose = function () {
53
55
  this.editor = null;
54
- this.shouldBold = false;
55
- this.shouldItalic = false;
56
- this.shouldStrikethrough = false;
56
+ this.disableAllFeatures();
57
57
  this.lastKeyTyped = null;
58
58
  };
59
59
  /**
@@ -119,6 +119,17 @@ define(["require", "exports", "./utils/setFormat"], function (require, exports,
119
119
  }
120
120
  }
121
121
  break;
122
+ case '`':
123
+ if (this.options.codeFormat) {
124
+ if (this.shouldCode) {
125
+ (0, setFormat_1.setFormat)(editor, '`', {} /* format */, this.options.codeFormat);
126
+ this.shouldCode = false;
127
+ }
128
+ else {
129
+ this.shouldCode = true;
130
+ }
131
+ }
132
+ break;
122
133
  }
123
134
  }
124
135
  };
@@ -127,9 +138,7 @@ define(["require", "exports", "./utils/setFormat"], function (require, exports,
127
138
  if (!event.handledByEditFeature && !rawEvent.defaultPrevented) {
128
139
  switch (rawEvent.key) {
129
140
  case 'Enter':
130
- this.shouldBold = false;
131
- this.shouldItalic = false;
132
- this.shouldStrikethrough = false;
141
+ this.disableAllFeatures();
133
142
  this.lastKeyTyped = null;
134
143
  break;
135
144
  case ' ':
@@ -142,6 +151,9 @@ define(["require", "exports", "./utils/setFormat"], function (require, exports,
142
151
  else if (this.lastKeyTyped === '_' && this.shouldItalic) {
143
152
  this.shouldItalic = false;
144
153
  }
154
+ else if (this.lastKeyTyped === '`' && this.shouldCode) {
155
+ this.shouldCode = false;
156
+ }
145
157
  this.lastKeyTyped = null;
146
158
  break;
147
159
  default:
@@ -161,16 +173,23 @@ define(["require", "exports", "./utils/setFormat"], function (require, exports,
161
173
  else if (this.lastKeyTyped === '_' && this.shouldItalic) {
162
174
  this.shouldItalic = false;
163
175
  }
176
+ else if (this.lastKeyTyped === '`' && this.shouldCode) {
177
+ this.shouldCode = false;
178
+ }
164
179
  this.lastKeyTyped = null;
165
180
  }
166
181
  };
167
182
  MarkdownPlugin.prototype.handleContentChangedEvent = function (event) {
168
183
  if (event.source == 'Format') {
169
- this.shouldBold = false;
170
- this.shouldItalic = false;
171
- this.shouldStrikethrough = false;
184
+ this.disableAllFeatures();
172
185
  }
173
186
  };
187
+ MarkdownPlugin.prototype.disableAllFeatures = function () {
188
+ this.shouldBold = false;
189
+ this.shouldItalic = false;
190
+ this.shouldStrikethrough = false;
191
+ this.shouldCode = false;
192
+ };
174
193
  return MarkdownPlugin;
175
194
  }());
176
195
  exports.MarkdownPlugin = MarkdownPlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/markdown/MarkdownPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { setFormat } from './utils/setFormat';\nimport type {\n ContentChangedEvent,\n EditorInputEvent,\n EditorPlugin,\n IEditor,\n KeyDownEvent,\n PluginEvent,\n} from 'roosterjs-content-model-types';\n\n/**\n * Options for Markdown plugin\n */\nexport interface MarkdownOptions {\n strikethrough?: boolean;\n bold?: boolean;\n italic?: boolean;\n}\n\n/**\n * @internal\n */\nconst DefaultOptions: Required<MarkdownOptions> = {\n strikethrough: false,\n bold: false,\n italic: false,\n};\n\n/**\n * Markdown plugin handles markdown formatting, such as transforming * characters into bold text.\n */\nexport class MarkdownPlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n private shouldBold = false;\n private shouldItalic = false;\n private shouldStrikethrough = false;\n private lastKeyTyped: string | null = null;\n\n /**\n * @param options An optional parameter that takes in an object of type MarkdownOptions, which includes the following properties:\n * - strikethrough: If true text between ~ will receive strikethrough format. Defaults to true.\n * - bold: If true text between * will receive bold format. Defaults to true.\n * - italic: If true text between _ will receive italic format. Defaults to true.\n */\n constructor(private options: MarkdownOptions = DefaultOptions) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'Markdown';\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 this.shouldBold = false;\n this.shouldItalic = false;\n this.shouldStrikethrough = false;\n this.lastKeyTyped = 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.handleBackspaceEvent(event);\n this.handleKeyDownEvent(event);\n break;\n case 'contentChanged':\n this.handleContentChangedEvent(event);\n break;\n }\n }\n }\n\n private handleEditorInputEvent(editor: IEditor, event: EditorInputEvent) {\n const rawEvent = event.rawEvent;\n const selection = editor.getDOMSelection();\n if (\n selection &&\n selection.type == 'range' &&\n selection.range.collapsed &&\n rawEvent.inputType == 'insertText'\n ) {\n switch (rawEvent.data) {\n case '*':\n if (this.options.bold) {\n if (this.shouldBold) {\n setFormat(editor, '*', { fontWeight: 'bold' });\n this.shouldBold = false;\n } else {\n this.shouldBold = true;\n }\n }\n\n break;\n case '~':\n if (this.options.strikethrough) {\n if (this.shouldStrikethrough) {\n setFormat(editor, '~', { strikethrough: true });\n this.shouldStrikethrough = false;\n } else {\n this.shouldStrikethrough = true;\n }\n }\n break;\n case '_':\n if (this.options.italic) {\n if (this.shouldItalic) {\n setFormat(editor, '_', { italic: true });\n this.shouldItalic = false;\n } else {\n this.shouldItalic = true;\n }\n }\n break;\n }\n }\n }\n\n private handleKeyDownEvent(event: KeyDownEvent) {\n const rawEvent = event.rawEvent;\n if (!event.handledByEditFeature && !rawEvent.defaultPrevented) {\n switch (rawEvent.key) {\n case 'Enter':\n this.shouldBold = false;\n this.shouldItalic = false;\n this.shouldStrikethrough = false;\n this.lastKeyTyped = null;\n break;\n case ' ':\n if (this.lastKeyTyped === '*' && this.shouldBold) {\n this.shouldBold = false;\n } else if (this.lastKeyTyped === '~' && this.shouldStrikethrough) {\n this.shouldStrikethrough = false;\n } else if (this.lastKeyTyped === '_' && this.shouldItalic) {\n this.shouldItalic = false;\n }\n this.lastKeyTyped = null;\n break;\n default:\n this.lastKeyTyped = rawEvent.key;\n break;\n }\n }\n }\n\n private handleBackspaceEvent(event: KeyDownEvent) {\n if (!event.handledByEditFeature && event.rawEvent.key === 'Backspace') {\n if (this.lastKeyTyped === '*' && this.shouldBold) {\n this.shouldBold = false;\n } else if (this.lastKeyTyped === '~' && this.shouldStrikethrough) {\n this.shouldStrikethrough = false;\n } else if (this.lastKeyTyped === '_' && this.shouldItalic) {\n this.shouldItalic = false;\n }\n this.lastKeyTyped = null;\n }\n }\n\n private handleContentChangedEvent(event: ContentChangedEvent) {\n if (event.source == 'Format') {\n this.shouldBold = false;\n this.shouldItalic = false;\n this.shouldStrikethrough = false;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"MarkdownPlugin.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/markdown/MarkdownPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { setFormat } from './utils/setFormat';\nimport type {\n ContentChangedEvent,\n ContentModelCodeFormat,\n EditorInputEvent,\n EditorPlugin,\n IEditor,\n KeyDownEvent,\n PluginEvent,\n} from 'roosterjs-content-model-types';\n\n/**\n *\n * Options for Markdown plugin\n * - strikethrough: If true text between ~ will receive strikethrough format.\n * - bold: If true text between * will receive bold format.\n * - italic: If true text between _ will receive italic format.\n * - codeFormat: If provided, text between ` will receive code format. If equal to {}, it will set the default code format.\n */\nexport interface MarkdownOptions {\n strikethrough?: boolean;\n bold?: boolean;\n italic?: boolean;\n codeFormat?: ContentModelCodeFormat;\n}\n\n/**\n * @internal\n */\nconst DefaultOptions: Partial<MarkdownOptions> = {\n strikethrough: false,\n bold: false,\n italic: false,\n};\n\n/**\n * Markdown plugin handles markdown formatting, such as transforming * characters into bold text.\n */\nexport class MarkdownPlugin implements EditorPlugin {\n private editor: IEditor | null = null;\n private shouldBold = false;\n private shouldItalic = false;\n private shouldStrikethrough = false;\n private shouldCode = false;\n private lastKeyTyped: string | null = null;\n\n /**\n * @param options An optional parameter that takes in an object of type MarkdownOptions, which includes the following properties:\n * - strikethrough: If true text between ~ will receive strikethrough format. Defaults to false.\n * - bold: If true text between * will receive bold format. Defaults to false.\n * - italic: If true text between _ will receive italic format. Defaults to false.\n * - codeFormat: If provided, text between ` will receive code format. Defaults to undefined.\n */\n constructor(private options: MarkdownOptions = DefaultOptions) {}\n\n /**\n * Get name of this plugin\n */\n getName() {\n return 'Markdown';\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 this.disableAllFeatures();\n this.lastKeyTyped = 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.handleBackspaceEvent(event);\n this.handleKeyDownEvent(event);\n break;\n case 'contentChanged':\n this.handleContentChangedEvent(event);\n break;\n }\n }\n }\n\n private handleEditorInputEvent(editor: IEditor, event: EditorInputEvent) {\n const rawEvent = event.rawEvent;\n const selection = editor.getDOMSelection();\n if (\n selection &&\n selection.type == 'range' &&\n selection.range.collapsed &&\n rawEvent.inputType == 'insertText'\n ) {\n switch (rawEvent.data) {\n case '*':\n if (this.options.bold) {\n if (this.shouldBold) {\n setFormat(editor, '*', { fontWeight: 'bold' });\n this.shouldBold = false;\n } else {\n this.shouldBold = true;\n }\n }\n\n break;\n case '~':\n if (this.options.strikethrough) {\n if (this.shouldStrikethrough) {\n setFormat(editor, '~', { strikethrough: true });\n this.shouldStrikethrough = false;\n } else {\n this.shouldStrikethrough = true;\n }\n }\n break;\n case '_':\n if (this.options.italic) {\n if (this.shouldItalic) {\n setFormat(editor, '_', { italic: true });\n this.shouldItalic = false;\n } else {\n this.shouldItalic = true;\n }\n }\n break;\n case '`':\n if (this.options.codeFormat) {\n if (this.shouldCode) {\n setFormat(editor, '`', {} /* format */, this.options.codeFormat);\n this.shouldCode = false;\n } else {\n this.shouldCode = true;\n }\n }\n break;\n }\n }\n }\n\n private handleKeyDownEvent(event: KeyDownEvent) {\n const rawEvent = event.rawEvent;\n if (!event.handledByEditFeature && !rawEvent.defaultPrevented) {\n switch (rawEvent.key) {\n case 'Enter':\n this.disableAllFeatures();\n this.lastKeyTyped = null;\n break;\n case ' ':\n if (this.lastKeyTyped === '*' && this.shouldBold) {\n this.shouldBold = false;\n } else if (this.lastKeyTyped === '~' && this.shouldStrikethrough) {\n this.shouldStrikethrough = false;\n } else if (this.lastKeyTyped === '_' && this.shouldItalic) {\n this.shouldItalic = false;\n } else if (this.lastKeyTyped === '`' && this.shouldCode) {\n this.shouldCode = false;\n }\n this.lastKeyTyped = null;\n break;\n default:\n this.lastKeyTyped = rawEvent.key;\n break;\n }\n }\n }\n\n private handleBackspaceEvent(event: KeyDownEvent) {\n if (!event.handledByEditFeature && event.rawEvent.key === 'Backspace') {\n if (this.lastKeyTyped === '*' && this.shouldBold) {\n this.shouldBold = false;\n } else if (this.lastKeyTyped === '~' && this.shouldStrikethrough) {\n this.shouldStrikethrough = false;\n } else if (this.lastKeyTyped === '_' && this.shouldItalic) {\n this.shouldItalic = false;\n } else if (this.lastKeyTyped === '`' && this.shouldCode) {\n this.shouldCode = false;\n }\n this.lastKeyTyped = null;\n }\n }\n\n private handleContentChangedEvent(event: ContentChangedEvent) {\n if (event.source == 'Format') {\n this.disableAllFeatures();\n }\n }\n\n private disableAllFeatures() {\n this.shouldBold = false;\n this.shouldItalic = false;\n this.shouldStrikethrough = false;\n this.shouldCode = false;\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { ContentModelSegmentFormat, IEditor } from 'roosterjs-content-model-types';
1
+ import type { ContentModelCodeFormat, ContentModelSegmentFormat, IEditor } from 'roosterjs-content-model-types';
2
2
  /**
3
3
  * @internal
4
4
  */
5
- export declare function setFormat(editor: IEditor, character: string, format: ContentModelSegmentFormat): void;
5
+ export declare function setFormat(editor: IEditor, character: string, format: ContentModelSegmentFormat, codeFormat?: ContentModelCodeFormat): void;
@@ -1,40 +1,30 @@
1
- define(["require", "exports", "tslib", "roosterjs-content-model-dom", "../../pluginUtils/splitTextSegment"], function (require, exports, tslib_1, roosterjs_content_model_dom_1, splitTextSegment_1) {
1
+ define(["require", "exports", "tslib", "roosterjs-content-model-api", "../../pluginUtils/splitTextSegment"], function (require, exports, tslib_1, roosterjs_content_model_api_1, splitTextSegment_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.setFormat = void 0;
5
5
  /**
6
6
  * @internal
7
7
  */
8
- function setFormat(editor, character, format) {
9
- editor.formatContentModel(function (model, context) {
10
- var _a;
11
- var selectedSegmentsAndParagraphs = (0, roosterjs_content_model_dom_1.getSelectedSegmentsAndParagraphs)(model, false /*includeFormatHolder*/);
12
- if (selectedSegmentsAndParagraphs.length > 0 && selectedSegmentsAndParagraphs[0][1]) {
13
- var marker = selectedSegmentsAndParagraphs[0][0];
14
- context.newPendingFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, marker.format), { strikethrough: !!marker.format.strikethrough, italic: !!marker.format.italic, fontWeight: ((_a = marker.format) === null || _a === void 0 ? void 0 : _a.fontWeight) ? 'bold' : undefined });
15
- var paragraph = selectedSegmentsAndParagraphs[0][1];
16
- if (marker.segmentType == 'SelectionMarker') {
17
- var markerIndex = paragraph.segments.indexOf(marker);
18
- if (markerIndex > 0 && paragraph.segments[markerIndex - 1]) {
19
- var segmentBeforeMarker = paragraph.segments[markerIndex - 1];
20
- if (segmentBeforeMarker.segmentType == 'Text' &&
21
- segmentBeforeMarker.text[segmentBeforeMarker.text.length - 1] == character) {
22
- var textBeforeMarker = segmentBeforeMarker.text.slice(0, -1);
23
- if (textBeforeMarker.indexOf(character) > -1) {
24
- var lastCharIndex = segmentBeforeMarker.text.length;
25
- var firstCharIndex = segmentBeforeMarker.text
26
- .substring(0, lastCharIndex - 1)
27
- .lastIndexOf(character);
28
- var formattedText = (0, splitTextSegment_1.splitTextSegment)(segmentBeforeMarker, paragraph, firstCharIndex, lastCharIndex);
29
- formattedText.text = formattedText.text
30
- .replace(character, '')
31
- .slice(0, -1);
32
- formattedText.format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, formattedText.format), format);
33
- context.canUndoByBackspace = true;
34
- return true;
35
- }
36
- }
8
+ function setFormat(editor, character, format, codeFormat) {
9
+ (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (_model, previousSegment, paragraph, markerFormat, context) {
10
+ if (previousSegment.text[previousSegment.text.length - 1] == character) {
11
+ var textBeforeMarker = previousSegment.text.slice(0, -1);
12
+ context.newPendingFormat = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, markerFormat), { strikethrough: !!markerFormat.strikethrough, italic: !!markerFormat.italic, fontWeight: (markerFormat === null || markerFormat === void 0 ? void 0 : markerFormat.fontWeight) ? 'bold' : undefined });
13
+ if (textBeforeMarker.indexOf(character) > -1) {
14
+ var lastCharIndex = previousSegment.text.length;
15
+ var firstCharIndex = previousSegment.text
16
+ .substring(0, lastCharIndex - 1)
17
+ .lastIndexOf(character);
18
+ var formattedText = (0, splitTextSegment_1.splitTextSegment)(previousSegment, paragraph, firstCharIndex, lastCharIndex);
19
+ formattedText.text = formattedText.text.replace(character, '').slice(0, -1);
20
+ formattedText.format = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, formattedText.format), format);
21
+ if (codeFormat) {
22
+ formattedText.code = {
23
+ format: codeFormat,
24
+ };
37
25
  }
26
+ context.canUndoByBackspace = true;
27
+ return true;
38
28
  }
39
29
  }
40
30
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"setFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/markdown/utils/setFormat.ts"],"names":[],"mappings":";;;;IAKA;;OAEG;IACH,SAAgB,SAAS,CAAC,MAAe,EAAE,SAAiB,EAAE,MAAiC;QAC3F,MAAM,CAAC,kBAAkB,CAAC,UAAC,KAAK,EAAE,OAAO;;YACrC,IAAM,6BAA6B,GAAG,IAAA,8DAAgC,EAClE,KAAK,EACL,KAAK,CAAC,uBAAuB,CAChC,CAAC;YAEF,IAAI,6BAA6B,CAAC,MAAM,GAAG,CAAC,IAAI,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBACjF,IAAM,MAAM,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,OAAO,CAAC,gBAAgB,mDACjB,MAAM,CAAC,MAAM,KAChB,aAAa,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAC9B,UAAU,EAAE,CAAA,MAAA,MAAM,CAAC,MAAM,0CAAE,UAAU,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAC7D,CAAC;gBAEF,IAAM,SAAS,GAAG,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,IAAI,MAAM,CAAC,WAAW,IAAI,iBAAiB,EAAE;oBACzC,IAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACvD,IAAI,WAAW,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE;wBACxD,IAAM,mBAAmB,GAAG,SAAS,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;wBAEhE,IACI,mBAAmB,CAAC,WAAW,IAAI,MAAM;4BACzC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,EAC5E;4BACE,IAAM,gBAAgB,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;4BAC/D,IAAI,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;gCAC1C,IAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;gCACtD,IAAM,cAAc,GAAG,mBAAmB,CAAC,IAAI;qCAC1C,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC;qCAC/B,WAAW,CAAC,SAAS,CAAC,CAAC;gCAE5B,IAAM,aAAa,GAAG,IAAA,mCAAgB,EAClC,mBAAmB,EACnB,SAAS,EACT,cAAc,EACd,aAAa,CAChB,CAAC;gCAEF,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI;qCAClC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;qCACtB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gCAClB,aAAa,CAAC,MAAM,mDACb,aAAa,CAAC,MAAM,GACpB,MAAM,CACZ,CAAC;gCAEF,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;gCAClC,OAAO,IAAI,CAAC;6BACf;yBACJ;qBACJ;iBACJ;aACJ;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;IACP,CAAC;IAzDD,8BAyDC","sourcesContent":["import { getSelectedSegmentsAndParagraphs } from 'roosterjs-content-model-dom';\nimport { splitTextSegment } from '../../pluginUtils/splitTextSegment';\n\nimport type { ContentModelSegmentFormat, IEditor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function setFormat(editor: IEditor, character: string, format: ContentModelSegmentFormat) {\n editor.formatContentModel((model, context) => {\n const selectedSegmentsAndParagraphs = getSelectedSegmentsAndParagraphs(\n model,\n false /*includeFormatHolder*/\n );\n\n if (selectedSegmentsAndParagraphs.length > 0 && selectedSegmentsAndParagraphs[0][1]) {\n const marker = selectedSegmentsAndParagraphs[0][0];\n context.newPendingFormat = {\n ...marker.format,\n strikethrough: !!marker.format.strikethrough,\n italic: !!marker.format.italic,\n fontWeight: marker.format?.fontWeight ? 'bold' : undefined,\n };\n\n const paragraph = selectedSegmentsAndParagraphs[0][1];\n if (marker.segmentType == 'SelectionMarker') {\n const markerIndex = paragraph.segments.indexOf(marker);\n if (markerIndex > 0 && paragraph.segments[markerIndex - 1]) {\n const segmentBeforeMarker = paragraph.segments[markerIndex - 1];\n\n if (\n segmentBeforeMarker.segmentType == 'Text' &&\n segmentBeforeMarker.text[segmentBeforeMarker.text.length - 1] == character\n ) {\n const textBeforeMarker = segmentBeforeMarker.text.slice(0, -1);\n if (textBeforeMarker.indexOf(character) > -1) {\n const lastCharIndex = segmentBeforeMarker.text.length;\n const firstCharIndex = segmentBeforeMarker.text\n .substring(0, lastCharIndex - 1)\n .lastIndexOf(character);\n\n const formattedText = splitTextSegment(\n segmentBeforeMarker,\n paragraph,\n firstCharIndex,\n lastCharIndex\n );\n\n formattedText.text = formattedText.text\n .replace(character, '')\n .slice(0, -1);\n formattedText.format = {\n ...formattedText.format,\n ...format,\n };\n\n context.canUndoByBackspace = true;\n return true;\n }\n }\n }\n }\n }\n return false;\n });\n}\n"]}
1
+ {"version":3,"file":"setFormat.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/markdown/utils/setFormat.ts"],"names":[],"mappings":";;;;IASA;;OAEG;IACH,SAAgB,SAAS,CACrB,MAAe,EACf,SAAiB,EACjB,MAAiC,EACjC,UAAmC;QAEnC,IAAA,oEAAsC,EAClC,MAAM,EACN,UAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO;YACtD,IAAI,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,EAAE;gBACpE,IAAM,gBAAgB,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,gBAAgB,mDACjB,YAAY,KACf,aAAa,EAAE,CAAC,CAAC,YAAY,CAAC,aAAa,EAC3C,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAC7B,UAAU,EAAE,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAC5D,CAAC;gBACF,IAAI,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE;oBAC1C,IAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;oBAClD,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI;yBACtC,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC;yBAC/B,WAAW,CAAC,SAAS,CAAC,CAAC;oBAE5B,IAAM,aAAa,GAAG,IAAA,mCAAgB,EAClC,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,CAChB,CAAC;oBAEF,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC5E,aAAa,CAAC,MAAM,mDACb,aAAa,CAAC,MAAM,GACpB,MAAM,CACZ,CAAC;oBACF,IAAI,UAAU,EAAE;wBACZ,aAAa,CAAC,IAAI,GAAG;4BACjB,MAAM,EAAE,UAAU;yBACrB,CAAC;qBACL;oBAED,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAClC,OAAO,IAAI,CAAC;iBACf;aACJ;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CACJ,CAAC;IACN,CAAC;IAhDD,8BAgDC","sourcesContent":["import { formatTextSegmentBeforeSelectionMarker } from 'roosterjs-content-model-api';\nimport { splitTextSegment } from '../../pluginUtils/splitTextSegment';\n\nimport type {\n ContentModelCodeFormat,\n ContentModelSegmentFormat,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function setFormat(\n editor: IEditor,\n character: string,\n format: ContentModelSegmentFormat,\n codeFormat?: ContentModelCodeFormat\n) {\n formatTextSegmentBeforeSelectionMarker(\n editor,\n (_model, previousSegment, paragraph, markerFormat, context) => {\n if (previousSegment.text[previousSegment.text.length - 1] == character) {\n const textBeforeMarker = previousSegment.text.slice(0, -1);\n context.newPendingFormat = {\n ...markerFormat,\n strikethrough: !!markerFormat.strikethrough,\n italic: !!markerFormat.italic,\n fontWeight: markerFormat?.fontWeight ? 'bold' : undefined,\n };\n if (textBeforeMarker.indexOf(character) > -1) {\n const lastCharIndex = previousSegment.text.length;\n const firstCharIndex = previousSegment.text\n .substring(0, lastCharIndex - 1)\n .lastIndexOf(character);\n\n const formattedText = splitTextSegment(\n previousSegment,\n paragraph,\n firstCharIndex,\n lastCharIndex\n );\n\n formattedText.text = formattedText.text.replace(character, '').slice(0, -1);\n formattedText.format = {\n ...formattedText.format,\n ...format,\n };\n if (codeFormat) {\n formattedText.code = {\n format: codeFormat,\n };\n }\n\n context.canUndoByBackspace = true;\n return true;\n }\n }\n return false;\n }\n );\n}\n"]}
@@ -20,7 +20,7 @@ export declare const ShortcutUnderline: ShortcutCommand;
20
20
  /**
21
21
  * Shortcut command for Clear Format
22
22
  * Windows: Ctrl + Space
23
- * MacOS: Meta + Space
23
+ * MacOS: N/A
24
24
  */
25
25
  export declare const ShortcutClearFormat: ShortcutCommand;
26
26
  /**
@@ -74,12 +74,12 @@ export declare const ShortcutDecreaseFont: ShortcutCommand;
74
74
  /**
75
75
  * Shortcut command for Intent list
76
76
  * Windows: Alt + Shift + Arrow Right
77
- * MacOS: Option + Shift+ Arrow Right
77
+ * MacOS: N/A
78
78
  */
79
79
  export declare const ShortcutIndentList: ShortcutCommand;
80
80
  /**
81
81
  * Shortcut command for Outdent list
82
82
  * Windows: Alt + Shift + Arrow Left
83
- * MacOS: Option + Shift+ Arrow Left
83
+ * MacOS: N/A
84
84
  */
85
85
  export declare const ShortcutOutdentList: ShortcutCommand;
@@ -59,7 +59,7 @@ define(["require", "exports", "roosterjs-content-model-core", "./utils/setShortc
59
59
  /**
60
60
  * Shortcut command for Clear Format
61
61
  * Windows: Ctrl + Space
62
- * MacOS: Meta + Space
62
+ * MacOS: N/A
63
63
  */
64
64
  exports.ShortcutClearFormat = {
65
65
  shortcutKey: {
@@ -68,6 +68,7 @@ define(["require", "exports", "roosterjs-content-model-core", "./utils/setShortc
68
68
  which: 32 /* SPACE */,
69
69
  },
70
70
  onClick: function (editor) { return (0, roosterjs_content_model_api_1.clearFormat)(editor); },
71
+ environment: 'nonMac',
71
72
  };
72
73
  /**
73
74
  * Shortcut command for Undo 1
@@ -179,7 +180,7 @@ define(["require", "exports", "roosterjs-content-model-core", "./utils/setShortc
179
180
  /**
180
181
  * Shortcut command for Intent list
181
182
  * Windows: Alt + Shift + Arrow Right
182
- * MacOS: Option + Shift+ Arrow Right
183
+ * MacOS: N/A
183
184
  */
184
185
  exports.ShortcutIndentList = {
185
186
  shortcutKey: {
@@ -190,11 +191,12 @@ define(["require", "exports", "roosterjs-content-model-core", "./utils/setShortc
190
191
  onClick: function (editor) {
191
192
  (0, setShortcutIndentationCommand_1.setShortcutIndentationCommand)(editor, 'indent');
192
193
  },
194
+ environment: 'nonMac',
193
195
  };
194
196
  /**
195
197
  * Shortcut command for Outdent list
196
198
  * Windows: Alt + Shift + Arrow Left
197
- * MacOS: Option + Shift+ Arrow Left
199
+ * MacOS: N/A
198
200
  */
199
201
  exports.ShortcutOutdentList = {
200
202
  shortcutKey: {
@@ -205,6 +207,7 @@ define(["require", "exports", "roosterjs-content-model-core", "./utils/setShortc
205
207
  onClick: function (editor) {
206
208
  (0, setShortcutIndentationCommand_1.setShortcutIndentationCommand)(editor, 'outdent');
207
209
  },
210
+ environment: 'nonMac',
208
211
  };
209
212
  });
210
213
  //# sourceMappingURL=shortcuts.js.map