roosterjs-content-model-plugins 9.0.1 → 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 (154) 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/keyboardListTrigger.d.ts +2 -2
  15. package/lib/autoFormat/list/keyboardListTrigger.js +10 -18
  16. package/lib/autoFormat/list/keyboardListTrigger.js.map +1 -1
  17. package/lib/edit/deleteSteps/deleteList.js +13 -7
  18. package/lib/edit/deleteSteps/deleteList.js.map +1 -1
  19. package/lib/edit/inputSteps/handleEnterOnList.js +1 -1
  20. package/lib/edit/inputSteps/handleEnterOnList.js.map +1 -1
  21. package/lib/edit/keyboardDelete.js +2 -2
  22. package/lib/edit/keyboardDelete.js.map +1 -1
  23. package/lib/edit/keyboardTab.js +25 -9
  24. package/lib/edit/keyboardTab.js.map +1 -1
  25. package/lib/edit/tabUtils/handleTabOnTable.d.ts +6 -0
  26. package/lib/edit/tabUtils/handleTabOnTable.js +25 -0
  27. package/lib/edit/tabUtils/handleTabOnTable.js.map +1 -0
  28. package/lib/edit/tabUtils/handleTabOnTableCell.d.ts +6 -0
  29. package/lib/edit/tabUtils/handleTabOnTableCell.js +40 -0
  30. package/lib/edit/tabUtils/handleTabOnTableCell.js.map +1 -0
  31. package/lib/hyperlink/HyperlinkPlugin.d.ts +48 -0
  32. package/lib/hyperlink/HyperlinkPlugin.js +141 -0
  33. package/lib/hyperlink/HyperlinkPlugin.js.map +1 -0
  34. package/lib/hyperlink/HyperlinkToolTip.d.ts +7 -0
  35. package/lib/hyperlink/HyperlinkToolTip.js +3 -0
  36. package/lib/hyperlink/HyperlinkToolTip.js.map +1 -0
  37. package/lib/index.d.ts +2 -0
  38. package/lib/index.js +3 -1
  39. package/lib/index.js.map +1 -1
  40. package/lib/markdown/MarkdownPlugin.d.ts +13 -4
  41. package/lib/markdown/MarkdownPlugin.js +31 -12
  42. package/lib/markdown/MarkdownPlugin.js.map +1 -1
  43. package/lib/markdown/utils/setFormat.d.ts +2 -2
  44. package/lib/markdown/utils/setFormat.js +20 -30
  45. package/lib/markdown/utils/setFormat.js.map +1 -1
  46. package/lib/shortcut/shortcuts.d.ts +3 -3
  47. package/lib/shortcut/shortcuts.js +6 -3
  48. package/lib/shortcut/shortcuts.js.map +1 -1
  49. package/lib-amd/autoFormat/AutoFormatPlugin.d.ts +5 -0
  50. package/lib-amd/autoFormat/AutoFormatPlugin.js +23 -7
  51. package/lib-amd/autoFormat/AutoFormatPlugin.js.map +1 -1
  52. package/lib-amd/autoFormat/hyphen/transformHyphen.d.ts +5 -0
  53. package/lib-amd/autoFormat/hyphen/transformHyphen.js +36 -0
  54. package/lib-amd/autoFormat/hyphen/transformHyphen.js.map +1 -0
  55. package/lib-amd/autoFormat/link/createLink.js +6 -6
  56. package/lib-amd/autoFormat/link/createLink.js.map +1 -1
  57. package/lib-amd/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
  58. package/lib-amd/autoFormat/link/createLinkAfterSpace.js +18 -34
  59. package/lib-amd/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  60. package/lib-amd/autoFormat/link/unlink.js +4 -5
  61. package/lib-amd/autoFormat/link/unlink.js.map +1 -1
  62. package/lib-amd/autoFormat/list/keyboardListTrigger.d.ts +2 -2
  63. package/lib-amd/autoFormat/list/keyboardListTrigger.js +11 -18
  64. package/lib-amd/autoFormat/list/keyboardListTrigger.js.map +1 -1
  65. package/lib-amd/edit/deleteSteps/deleteList.js +13 -7
  66. package/lib-amd/edit/deleteSteps/deleteList.js.map +1 -1
  67. package/lib-amd/edit/inputSteps/handleEnterOnList.js +1 -1
  68. package/lib-amd/edit/inputSteps/handleEnterOnList.js.map +1 -1
  69. package/lib-amd/edit/keyboardDelete.js +2 -2
  70. package/lib-amd/edit/keyboardDelete.js.map +1 -1
  71. package/lib-amd/edit/keyboardTab.js +24 -10
  72. package/lib-amd/edit/keyboardTab.js.map +1 -1
  73. package/lib-amd/edit/tabUtils/handleTabOnTable.d.ts +6 -0
  74. package/lib-amd/edit/tabUtils/handleTabOnTable.js +25 -0
  75. package/lib-amd/edit/tabUtils/handleTabOnTable.js.map +1 -0
  76. package/lib-amd/edit/tabUtils/handleTabOnTableCell.d.ts +6 -0
  77. package/lib-amd/edit/tabUtils/handleTabOnTableCell.js +40 -0
  78. package/lib-amd/edit/tabUtils/handleTabOnTableCell.js.map +1 -0
  79. package/lib-amd/hyperlink/HyperlinkPlugin.d.ts +48 -0
  80. package/lib-amd/hyperlink/HyperlinkPlugin.js +142 -0
  81. package/lib-amd/hyperlink/HyperlinkPlugin.js.map +1 -0
  82. package/lib-amd/hyperlink/HyperlinkToolTip.d.ts +7 -0
  83. package/lib-amd/hyperlink/HyperlinkToolTip.js +5 -0
  84. package/lib-amd/hyperlink/HyperlinkToolTip.js.map +1 -0
  85. package/lib-amd/index.d.ts +2 -0
  86. package/lib-amd/index.js +3 -2
  87. package/lib-amd/index.js.map +1 -1
  88. package/lib-amd/markdown/MarkdownPlugin.d.ts +13 -4
  89. package/lib-amd/markdown/MarkdownPlugin.js +31 -12
  90. package/lib-amd/markdown/MarkdownPlugin.js.map +1 -1
  91. package/lib-amd/markdown/utils/setFormat.d.ts +2 -2
  92. package/lib-amd/markdown/utils/setFormat.js +20 -30
  93. package/lib-amd/markdown/utils/setFormat.js.map +1 -1
  94. package/lib-amd/shortcut/shortcuts.d.ts +3 -3
  95. package/lib-amd/shortcut/shortcuts.js +6 -3
  96. package/lib-amd/shortcut/shortcuts.js.map +1 -1
  97. package/lib-mjs/autoFormat/AutoFormatPlugin.d.ts +5 -0
  98. package/lib-mjs/autoFormat/AutoFormatPlugin.js +24 -6
  99. package/lib-mjs/autoFormat/AutoFormatPlugin.js.map +1 -1
  100. package/lib-mjs/autoFormat/hyphen/transformHyphen.d.ts +5 -0
  101. package/lib-mjs/autoFormat/hyphen/transformHyphen.js +31 -0
  102. package/lib-mjs/autoFormat/hyphen/transformHyphen.js.map +1 -0
  103. package/lib-mjs/autoFormat/link/createLink.js +6 -6
  104. package/lib-mjs/autoFormat/link/createLink.js.map +1 -1
  105. package/lib-mjs/autoFormat/link/createLinkAfterSpace.d.ts +2 -2
  106. package/lib-mjs/autoFormat/link/createLinkAfterSpace.js +17 -34
  107. package/lib-mjs/autoFormat/link/createLinkAfterSpace.js.map +1 -1
  108. package/lib-mjs/autoFormat/link/unlink.js +4 -5
  109. package/lib-mjs/autoFormat/link/unlink.js.map +1 -1
  110. package/lib-mjs/autoFormat/list/keyboardListTrigger.d.ts +2 -2
  111. package/lib-mjs/autoFormat/list/keyboardListTrigger.js +10 -18
  112. package/lib-mjs/autoFormat/list/keyboardListTrigger.js.map +1 -1
  113. package/lib-mjs/edit/deleteSteps/deleteList.js +13 -7
  114. package/lib-mjs/edit/deleteSteps/deleteList.js.map +1 -1
  115. package/lib-mjs/edit/inputSteps/handleEnterOnList.js +1 -1
  116. package/lib-mjs/edit/inputSteps/handleEnterOnList.js.map +1 -1
  117. package/lib-mjs/edit/keyboardDelete.js +2 -2
  118. package/lib-mjs/edit/keyboardDelete.js.map +1 -1
  119. package/lib-mjs/edit/keyboardTab.js +25 -9
  120. package/lib-mjs/edit/keyboardTab.js.map +1 -1
  121. package/lib-mjs/edit/tabUtils/handleTabOnTable.d.ts +6 -0
  122. package/lib-mjs/edit/tabUtils/handleTabOnTable.js +21 -0
  123. package/lib-mjs/edit/tabUtils/handleTabOnTable.js.map +1 -0
  124. package/lib-mjs/edit/tabUtils/handleTabOnTableCell.d.ts +6 -0
  125. package/lib-mjs/edit/tabUtils/handleTabOnTableCell.js +36 -0
  126. package/lib-mjs/edit/tabUtils/handleTabOnTableCell.js.map +1 -0
  127. package/lib-mjs/hyperlink/HyperlinkPlugin.d.ts +48 -0
  128. package/lib-mjs/hyperlink/HyperlinkPlugin.js +138 -0
  129. package/lib-mjs/hyperlink/HyperlinkPlugin.js.map +1 -0
  130. package/lib-mjs/hyperlink/HyperlinkToolTip.d.ts +7 -0
  131. package/lib-mjs/hyperlink/HyperlinkToolTip.js +2 -0
  132. package/lib-mjs/hyperlink/HyperlinkToolTip.js.map +1 -0
  133. package/lib-mjs/index.d.ts +2 -0
  134. package/lib-mjs/index.js +1 -0
  135. package/lib-mjs/index.js.map +1 -1
  136. package/lib-mjs/markdown/MarkdownPlugin.d.ts +13 -4
  137. package/lib-mjs/markdown/MarkdownPlugin.js +31 -12
  138. package/lib-mjs/markdown/MarkdownPlugin.js.map +1 -1
  139. package/lib-mjs/markdown/utils/setFormat.d.ts +2 -2
  140. package/lib-mjs/markdown/utils/setFormat.js +20 -30
  141. package/lib-mjs/markdown/utils/setFormat.js.map +1 -1
  142. package/lib-mjs/shortcut/shortcuts.d.ts +3 -3
  143. package/lib-mjs/shortcut/shortcuts.js +6 -3
  144. package/lib-mjs/shortcut/shortcuts.js.map +1 -1
  145. package/package.json +5 -5
  146. package/lib/autoFormat/link/getLinkSegment.d.ts +0 -5
  147. package/lib/autoFormat/link/getLinkSegment.js +0 -27
  148. package/lib/autoFormat/link/getLinkSegment.js.map +0 -1
  149. package/lib-amd/autoFormat/link/getLinkSegment.d.ts +0 -5
  150. package/lib-amd/autoFormat/link/getLinkSegment.js +0 -27
  151. package/lib-amd/autoFormat/link/getLinkSegment.js.map +0 -1
  152. package/lib-mjs/autoFormat/link/getLinkSegment.d.ts +0 -5
  153. package/lib-mjs/autoFormat/link/getLinkSegment.js +0 -23
  154. package/lib-mjs/autoFormat/link/getLinkSegment.js.map +0 -1
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "./getLinkSegment"], function (require, exports, getLinkSegment_1) {
1
+ define(["require", "exports", "roosterjs-content-model-api"], function (require, exports, roosterjs_content_model_api_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.unlink = void 0;
@@ -6,10 +6,9 @@ define(["require", "exports", "./getLinkSegment"], function (require, exports, g
6
6
  * @internal
7
7
  */
8
8
  function unlink(editor, rawEvent) {
9
- editor.formatContentModel(function (model) {
10
- var link = (0, getLinkSegment_1.getLinkSegment)(model);
11
- if (link === null || link === void 0 ? void 0 : link.link) {
12
- link.link = undefined;
9
+ (0, roosterjs_content_model_api_1.formatTextSegmentBeforeSelectionMarker)(editor, function (_model, linkSegment, _paragraph) {
10
+ if (linkSegment === null || linkSegment === void 0 ? void 0 : linkSegment.link) {
11
+ linkSegment.link = undefined;
13
12
  rawEvent.preventDefault();
14
13
  return true;
15
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"unlink.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/link/unlink.ts"],"names":[],"mappings":";;;;IAGA;;OAEG;IACH,SAAgB,MAAM,CAAC,MAAe,EAAE,QAAuB;QAC3D,MAAM,CAAC,kBAAkB,CAAC,UAAA,KAAK;YAC3B,IAAM,IAAI,GAAG,IAAA,+BAAc,EAAC,KAAK,CAAC,CAAC;YACnC,IAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,EAAE;gBACZ,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;gBACtB,QAAQ,CAAC,cAAc,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC;aACf;YAED,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;IACP,CAAC;IAXD,wBAWC","sourcesContent":["import { getLinkSegment } from './getLinkSegment';\nimport type { IEditor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function unlink(editor: IEditor, rawEvent: KeyboardEvent) {\n editor.formatContentModel(model => {\n const link = getLinkSegment(model);\n if (link?.link) {\n link.link = undefined;\n rawEvent.preventDefault();\n return true;\n }\n\n return false;\n });\n}\n"]}
1
+ {"version":3,"file":"unlink.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/link/unlink.ts"],"names":[],"mappings":";;;;IAIA;;OAEG;IACH,SAAgB,MAAM,CAAC,MAAe,EAAE,QAAuB;QAC3D,IAAA,oEAAsC,EAAC,MAAM,EAAE,UAAC,MAAM,EAAE,WAAW,EAAE,UAAU;YAC3E,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI,EAAE;gBACnB,WAAW,CAAC,IAAI,GAAG,SAAS,CAAC;gBAC7B,QAAQ,CAAC,cAAc,EAAE,CAAC;gBAE1B,OAAO,IAAI,CAAC;aACf;YACD,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;IACP,CAAC;IAVD,wBAUC","sourcesContent":["import { formatTextSegmentBeforeSelectionMarker } from 'roosterjs-content-model-api';\n\nimport type { IEditor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function unlink(editor: IEditor, rawEvent: KeyboardEvent) {\n formatTextSegmentBeforeSelectionMarker(editor, (_model, linkSegment, _paragraph) => {\n if (linkSegment?.link) {\n linkSegment.link = undefined;\n rawEvent.preventDefault();\n\n return true;\n }\n return false;\n });\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { IEditor } from 'roosterjs-content-model-types';
1
+ import type { ContentModelDocument, ContentModelParagraph, FormatContentModelContext } from 'roosterjs-content-model-types';
2
2
  /**
3
3
  * @internal
4
4
  */
5
- export declare function keyboardListTrigger(editor: IEditor, shouldSearchForBullet?: boolean, shouldSearchForNumbering?: boolean): void;
5
+ export declare function keyboardListTrigger(model: ContentModelDocument, paragraph: ContentModelParagraph, context: FormatContentModelContext, shouldSearchForBullet?: boolean, shouldSearchForNumbering?: boolean): boolean;
@@ -1,31 +1,24 @@
1
- define(["require", "exports", "./getListTypeStyle", "roosterjs-content-model-dom", "roosterjs-content-model-api"], function (require, exports, getListTypeStyle_1, roosterjs_content_model_dom_1, roosterjs_content_model_api_1) {
1
+ define(["require", "exports", "./getListTypeStyle", "roosterjs-content-model-api"], function (require, exports, getListTypeStyle_1, roosterjs_content_model_api_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.keyboardListTrigger = void 0;
5
5
  /**
6
6
  * @internal
7
7
  */
8
- function keyboardListTrigger(editor, shouldSearchForBullet, shouldSearchForNumbering) {
8
+ function keyboardListTrigger(model, paragraph, context, shouldSearchForBullet, shouldSearchForNumbering) {
9
9
  if (shouldSearchForBullet === void 0) { shouldSearchForBullet = true; }
10
10
  if (shouldSearchForNumbering === void 0) { shouldSearchForNumbering = true; }
11
11
  if (shouldSearchForBullet || shouldSearchForNumbering) {
12
- editor.formatContentModel(function (model, context) {
13
- var listStyleType = (0, getListTypeStyle_1.getListTypeStyle)(model, shouldSearchForBullet, shouldSearchForNumbering);
14
- if (listStyleType) {
15
- var segmentsAndParagraphs = (0, roosterjs_content_model_dom_1.getSelectedSegmentsAndParagraphs)(model, false);
16
- if (segmentsAndParagraphs[0] && segmentsAndParagraphs[0][1]) {
17
- segmentsAndParagraphs[0][1].segments.splice(0, 1);
18
- }
19
- var listType = listStyleType.listType, styleType = listStyleType.styleType, index = listStyleType.index;
20
- triggerList(model, listType, styleType, index);
21
- context.canUndoByBackspace = true;
22
- return true;
23
- }
24
- return false;
25
- }, {
26
- apiName: 'autoToggleList',
27
- });
12
+ var listStyleType = (0, getListTypeStyle_1.getListTypeStyle)(model, shouldSearchForBullet, shouldSearchForNumbering);
13
+ if (listStyleType) {
14
+ paragraph.segments.splice(0, 1);
15
+ var listType = listStyleType.listType, styleType = listStyleType.styleType, index = listStyleType.index;
16
+ triggerList(model, listType, styleType, index);
17
+ context.canUndoByBackspace = true;
18
+ return true;
19
+ }
28
20
  }
21
+ return false;
29
22
  }
30
23
  exports.keyboardListTrigger = keyboardListTrigger;
31
24
  var triggerList = function (model, listType, styleType, index) {
@@ -1 +1 @@
1
- {"version":3,"file":"keyboardListTrigger.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/list/keyboardListTrigger.ts"],"names":[],"mappings":";;;;IASA;;OAEG;IACH,SAAgB,mBAAmB,CAC/B,MAAe,EACf,qBAAqC,EACrC,wBAAwC;QADxC,sCAAA,EAAA,4BAAqC;QACrC,yCAAA,EAAA,+BAAwC;QAExC,IAAI,qBAAqB,IAAI,wBAAwB,EAAE;YACnD,MAAM,CAAC,kBAAkB,CACrB,UAAC,KAAK,EAAE,OAAO;gBACX,IAAM,aAAa,GAAG,IAAA,mCAAgB,EAClC,KAAK,EACL,qBAAqB,EACrB,wBAAwB,CAC3B,CAAC;gBACF,IAAI,aAAa,EAAE;oBACf,IAAM,qBAAqB,GAAG,IAAA,8DAAgC,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;oBAC7E,IAAI,qBAAqB,CAAC,CAAC,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;wBACzD,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;qBACrD;oBACO,IAAA,QAAQ,GAAuB,aAAa,SAApC,EAAE,SAAS,GAAY,aAAa,UAAzB,EAAE,KAAK,GAAK,aAAa,MAAlB,CAAmB;oBACrD,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;oBAC/C,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;oBAElC,OAAO,IAAI,CAAC;iBACf;gBAED,OAAO,KAAK,CAAC;YACjB,CAAC,EACD;gBACI,OAAO,EAAE,gBAAgB;aAC5B,CACJ,CAAC;SACL;IACL,CAAC;IAhCD,kDAgCC;IAED,IAAM,WAAW,GAAG,UAChB,KAA2B,EAC3B,QAAqB,EACrB,SAAiB,EACjB,KAAc;QAEd,IAAA,yCAAW,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7B,IAAM,aAAa,GAAG,QAAQ,IAAI,IAAI,CAAC;QACvC,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,aAAa,EAAE;YACrC,IAAA,qDAAuB,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACzC;QACD,IAAA,+CAAiB,EACb,KAAK,EACL,aAAa;YACT,CAAC,CAAC;gBACI,gBAAgB,EAAE,SAAS;aAC9B;YACH,CAAC,CAAC;gBACI,kBAAkB,EAAE,SAAS;aAChC,CACV,CAAC;IACN,CAAC,CAAC","sourcesContent":["import { getListTypeStyle } from './getListTypeStyle';\nimport { getSelectedSegmentsAndParagraphs } from 'roosterjs-content-model-dom';\nimport {\n setListType,\n setModelListStartNumber,\n setModelListStyle,\n} from 'roosterjs-content-model-api';\nimport type { ContentModelDocument, IEditor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function keyboardListTrigger(\n editor: IEditor,\n shouldSearchForBullet: boolean = true,\n shouldSearchForNumbering: boolean = true\n) {\n if (shouldSearchForBullet || shouldSearchForNumbering) {\n editor.formatContentModel(\n (model, context) => {\n const listStyleType = getListTypeStyle(\n model,\n shouldSearchForBullet,\n shouldSearchForNumbering\n );\n if (listStyleType) {\n const segmentsAndParagraphs = getSelectedSegmentsAndParagraphs(model, false);\n if (segmentsAndParagraphs[0] && segmentsAndParagraphs[0][1]) {\n segmentsAndParagraphs[0][1].segments.splice(0, 1);\n }\n const { listType, styleType, index } = listStyleType;\n triggerList(model, listType, styleType, index);\n context.canUndoByBackspace = true;\n\n return true;\n }\n\n return false;\n },\n {\n apiName: 'autoToggleList',\n }\n );\n }\n}\n\nconst triggerList = (\n model: ContentModelDocument,\n listType: 'OL' | 'UL',\n styleType: number,\n index?: number\n) => {\n setListType(model, listType);\n const isOrderedList = listType == 'OL';\n if (index && index > 1 && isOrderedList) {\n setModelListStartNumber(model, index);\n }\n setModelListStyle(\n model,\n isOrderedList\n ? {\n orderedStyleType: styleType,\n }\n : {\n unorderedStyleType: styleType,\n }\n );\n};\n"]}
1
+ {"version":3,"file":"keyboardListTrigger.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/autoFormat/list/keyboardListTrigger.ts"],"names":[],"mappings":";;;;IAYA;;OAEG;IACH,SAAgB,mBAAmB,CAC/B,KAA2B,EAC3B,SAAgC,EAChC,OAAkC,EAClC,qBAAqC,EACrC,wBAAwC;QADxC,sCAAA,EAAA,4BAAqC;QACrC,yCAAA,EAAA,+BAAwC;QAExC,IAAI,qBAAqB,IAAI,wBAAwB,EAAE;YACnD,IAAM,aAAa,GAAG,IAAA,mCAAgB,EAClC,KAAK,EACL,qBAAqB,EACrB,wBAAwB,CAC3B,CAAC;YACF,IAAI,aAAa,EAAE;gBACf,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACxB,IAAA,QAAQ,GAAuB,aAAa,SAApC,EAAE,SAAS,GAAY,aAAa,UAAzB,EAAE,KAAK,GAAK,aAAa,MAAlB,CAAmB;gBACrD,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC/C,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;gBAElC,OAAO,IAAI,CAAC;aACf;SACJ;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAvBD,kDAuBC;IAED,IAAM,WAAW,GAAG,UAChB,KAA2B,EAC3B,QAAqB,EACrB,SAAiB,EACjB,KAAc;QAEd,IAAA,yCAAW,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7B,IAAM,aAAa,GAAG,QAAQ,IAAI,IAAI,CAAC;QACvC,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,aAAa,EAAE;YACrC,IAAA,qDAAuB,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;SACzC;QACD,IAAA,+CAAiB,EACb,KAAK,EACL,aAAa;YACT,CAAC,CAAC;gBACI,gBAAgB,EAAE,SAAS;aAC9B;YACH,CAAC,CAAC;gBACI,kBAAkB,EAAE,SAAS;aAChC,CACV,CAAC;IACN,CAAC,CAAC","sourcesContent":["import { getListTypeStyle } from './getListTypeStyle';\nimport {\n setListType,\n setModelListStartNumber,\n setModelListStyle,\n} from 'roosterjs-content-model-api';\nimport type {\n ContentModelDocument,\n ContentModelParagraph,\n FormatContentModelContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function keyboardListTrigger(\n model: ContentModelDocument,\n paragraph: ContentModelParagraph,\n context: FormatContentModelContext,\n shouldSearchForBullet: boolean = true,\n shouldSearchForNumbering: boolean = true\n) {\n if (shouldSearchForBullet || shouldSearchForNumbering) {\n const listStyleType = getListTypeStyle(\n model,\n shouldSearchForBullet,\n shouldSearchForNumbering\n );\n if (listStyleType) {\n paragraph.segments.splice(0, 1);\n const { listType, styleType, index } = listStyleType;\n triggerList(model, listType, styleType, index);\n context.canUndoByBackspace = true;\n\n return true;\n }\n }\n return false;\n}\n\nconst triggerList = (\n model: ContentModelDocument,\n listType: 'OL' | 'UL',\n styleType: number,\n index?: number\n) => {\n setListType(model, listType);\n const isOrderedList = listType == 'OL';\n if (index && index > 1 && isOrderedList) {\n setModelListStartNumber(model, index);\n }\n setModelListStyle(\n model,\n isOrderedList\n ? {\n orderedStyleType: styleType,\n }\n : {\n unorderedStyleType: styleType,\n }\n );\n};\n"]}
@@ -6,15 +6,21 @@ define(["require", "exports", "roosterjs-content-model-dom"], function (require,
6
6
  * @internal
7
7
  */
8
8
  var deleteList = function (context) {
9
+ if (context.deleteResult != 'notDeleted') {
10
+ return;
11
+ }
9
12
  var _a = context.insertPoint, paragraph = _a.paragraph, marker = _a.marker, path = _a.path;
10
- if (context.deleteResult == 'nothingToDelete' || context.deleteResult == 'notDeleted') {
11
- var index = (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem', 'TableCell']);
13
+ if (paragraph.segments[0] == marker) {
14
+ var index = (0, roosterjs_content_model_dom_1.getClosestAncestorBlockGroupIndex)(path, ['ListItem'], ['TableCell', 'FormatContainer']);
12
15
  var item = path[index];
13
- if (item &&
14
- index >= 0 &&
15
- paragraph.segments[0] == marker &&
16
- item.blockGroupType == 'ListItem') {
17
- item.levels = [];
16
+ var lastLevel = item === null || item === void 0 ? void 0 : item.levels[item.levels.length - 1];
17
+ if (lastLevel && (item === null || item === void 0 ? void 0 : item.blocks[0]) == paragraph) {
18
+ if (lastLevel.format.displayForDummyItem == 'block') {
19
+ item.levels.pop();
20
+ }
21
+ else {
22
+ lastLevel.format.displayForDummyItem = 'block';
23
+ }
18
24
  context.deleteResult = 'range';
19
25
  }
20
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deleteList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteList.ts"],"names":[],"mappings":";;;;IAGA;;OAEG;IACI,IAAM,UAAU,GAAwB,UAAA,OAAO;QAC5C,IAAA,KAA8B,OAAO,CAAC,WAAW,EAA/C,SAAS,eAAA,EAAE,MAAM,YAAA,EAAE,IAAI,UAAwB,CAAC;QAExD,IAAI,OAAO,CAAC,YAAY,IAAI,iBAAiB,IAAI,OAAO,CAAC,YAAY,IAAI,YAAY,EAAE;YACnF,IAAM,KAAK,GAAG,IAAA,+DAAiC,EAAC,IAAI,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;YACjF,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IACI,IAAI;gBACJ,KAAK,IAAI,CAAC;gBACV,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM;gBAC/B,IAAI,CAAC,cAAc,IAAI,UAAU,EACnC;gBACE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;gBACjB,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;aAClC;SACJ;IACL,CAAC,CAAC;IAhBW,QAAA,UAAU,cAgBrB","sourcesContent":["import { getClosestAncestorBlockGroupIndex } from 'roosterjs-content-model-dom';\nimport type { DeleteSelectionStep } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteList: DeleteSelectionStep = context => {\n const { paragraph, marker, path } = context.insertPoint;\n\n if (context.deleteResult == 'nothingToDelete' || context.deleteResult == 'notDeleted') {\n const index = getClosestAncestorBlockGroupIndex(path, ['ListItem', 'TableCell']);\n const item = path[index];\n if (\n item &&\n index >= 0 &&\n paragraph.segments[0] == marker &&\n item.blockGroupType == 'ListItem'\n ) {\n item.levels = [];\n context.deleteResult = 'range';\n }\n }\n};\n"]}
1
+ {"version":3,"file":"deleteList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/deleteSteps/deleteList.ts"],"names":[],"mappings":";;;;IAGA;;OAEG;IACI,IAAM,UAAU,GAAwB,UAAA,OAAO;QAClD,IAAI,OAAO,CAAC,YAAY,IAAI,YAAY,EAAE;YACtC,OAAO;SACV;QAEK,IAAA,KAA8B,OAAO,CAAC,WAAW,EAA/C,SAAS,eAAA,EAAE,MAAM,YAAA,EAAE,IAAI,UAAwB,CAAC;QAExD,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE;YACjC,IAAM,KAAK,GAAG,IAAA,+DAAiC,EAC3C,IAAI,EACJ,CAAC,UAAU,CAAC,EACZ,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACnC,CAAC;YACF,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAqC,CAAC;YAC7D,IAAM,SAAS,GAAG,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEvD,IAAI,SAAS,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,CAAC,CAAC,CAAC,KAAI,SAAS,EAAE;gBAC3C,IAAI,SAAS,CAAC,MAAM,CAAC,mBAAmB,IAAI,OAAO,EAAE;oBACjD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;iBACrB;qBAAM;oBACH,SAAS,CAAC,MAAM,CAAC,mBAAmB,GAAG,OAAO,CAAC;iBAClD;gBAED,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC;aAClC;SACJ;IACL,CAAC,CAAC;IA1BW,QAAA,UAAU,cA0BrB","sourcesContent":["import { getClosestAncestorBlockGroupIndex } from 'roosterjs-content-model-dom';\nimport type { DeleteSelectionStep, ContentModelListItem } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const deleteList: DeleteSelectionStep = context => {\n if (context.deleteResult != 'notDeleted') {\n return;\n }\n\n const { paragraph, marker, path } = context.insertPoint;\n\n if (paragraph.segments[0] == marker) {\n const index = getClosestAncestorBlockGroupIndex<ContentModelListItem>(\n path,\n ['ListItem'],\n ['TableCell', 'FormatContainer']\n );\n const item = path[index] as ContentModelListItem | undefined;\n const lastLevel = item?.levels[item.levels.length - 1];\n\n if (lastLevel && item?.blocks[0] == paragraph) {\n if (lastLevel.format.displayForDummyItem == 'block') {\n item.levels.pop();\n } else {\n lastLevel.format.displayForDummyItem = 'block';\n }\n\n context.deleteResult = 'range';\n }\n }\n};\n"]}
@@ -76,7 +76,7 @@ define(["require", "exports", "tslib", "roosterjs-content-model-dom"], function
76
76
  };
77
77
  var createNewListLevel = function (listItem) {
78
78
  return listItem.levels.map(function (level) {
79
- return (0, roosterjs_content_model_dom_1.createListLevel)(level.listType, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, level.format), { startNumberOverride: undefined }), level.dataset);
79
+ return (0, roosterjs_content_model_dom_1.createListLevel)(level.listType, (0, tslib_1.__assign)((0, tslib_1.__assign)({}, level.format), { startNumberOverride: undefined, displayForDummyItem: undefined }), level.dataset);
80
80
  });
81
81
  };
82
82
  var createNewParagraph = function (insertPoint) {
@@ -1 +1 @@
1
- {"version":3,"file":"handleEnterOnList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnList.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createBr,\n createListItem,\n createListLevel,\n createParagraph,\n createSelectionMarker,\n normalizeContentModel,\n normalizeParagraph,\n setParagraphNotImplicit,\n getClosestAncestorBlockGroupIndex,\n isBlockGroupOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelBlockGroup,\n ContentModelListItem,\n DeleteSelectionStep,\n InsertPoint,\n ValidDeleteSelectionContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleEnterOnList: DeleteSelectionStep = context => {\n const { deleteResult } = context;\n if (\n deleteResult == 'nothingToDelete' ||\n deleteResult == 'notDeleted' ||\n deleteResult == 'range'\n ) {\n const { insertPoint, formatContext } = context;\n const { path } = insertPoint;\n const rawEvent = formatContext?.rawEvent;\n const index = getClosestAncestorBlockGroupIndex(path, ['ListItem'], ['TableCell']);\n\n const listItem = path[index];\n const listParent = path[index + 1];\n\n if (listItem && listItem.blockGroupType === 'ListItem' && listParent) {\n const listIndex = listParent.blocks.indexOf(listItem);\n const nextBlock = listParent.blocks[listIndex + 1];\n if (deleteResult == 'range' && nextBlock) {\n normalizeContentModel(listParent);\n const nextListItem = listParent.blocks[listIndex + 1];\n if (\n isBlockGroupOfType<ContentModelListItem>(nextListItem, 'ListItem') &&\n nextListItem.levels[0]\n ) {\n nextListItem.levels.forEach((level, index) => {\n level.format.startNumberOverride = undefined;\n level.dataset = listItem.levels[index]\n ? listItem.levels[index].dataset\n : {};\n });\n const lastParagraph = listItem.blocks[listItem.blocks.length - 1];\n const nextParagraph = nextListItem.blocks[0];\n if (\n nextParagraph.blockType === 'Paragraph' &&\n lastParagraph.blockType === 'Paragraph' &&\n lastParagraph.segments[lastParagraph.segments.length - 1].segmentType ===\n 'SelectionMarker'\n ) {\n lastParagraph.segments.pop();\n\n nextParagraph.segments.unshift(\n createSelectionMarker(insertPoint.marker.format)\n );\n }\n context.lastParagraph = undefined;\n }\n } else if (deleteResult !== 'range') {\n if (isEmptyListItem(listItem)) {\n listItem.levels.pop();\n } else {\n createNewListItem(context, listItem, listParent);\n }\n }\n rawEvent?.preventDefault();\n context.deleteResult = 'range';\n }\n }\n};\n\nconst isEmptyListItem = (listItem: ContentModelListItem) => {\n return (\n listItem.blocks.length === 1 &&\n listItem.blocks[0].blockType === 'Paragraph' &&\n listItem.blocks[0].segments.length === 2 &&\n listItem.blocks[0].segments[0].segmentType === 'SelectionMarker' &&\n listItem.blocks[0].segments[1].segmentType === 'Br'\n );\n};\n\nconst createNewListItem = (\n context: ValidDeleteSelectionContext,\n listItem: ContentModelListItem,\n listParent: ContentModelBlockGroup\n) => {\n const { insertPoint } = context;\n const listIndex = listParent.blocks.indexOf(listItem);\n const newParagraph = createNewParagraph(insertPoint);\n\n const levels = createNewListLevel(listItem);\n const newListItem = createListItem(levels, insertPoint.marker.format);\n newListItem.blocks.push(newParagraph);\n insertPoint.paragraph = newParagraph;\n context.lastParagraph = newParagraph;\n listParent.blocks.splice(listIndex + 1, 0, newListItem);\n};\n\nconst createNewListLevel = (listItem: ContentModelListItem) => {\n return listItem.levels.map(level => {\n return createListLevel(\n level.listType,\n {\n ...level.format,\n startNumberOverride: undefined,\n },\n level.dataset\n );\n });\n};\n\nconst createNewParagraph = (insertPoint: InsertPoint) => {\n const { paragraph, marker } = insertPoint;\n const newParagraph = createParagraph(\n false /*isImplicit*/,\n paragraph.format,\n paragraph.segmentFormat\n );\n\n const markerIndex = paragraph.segments.indexOf(marker);\n const segments = paragraph.segments.splice(\n markerIndex,\n paragraph.segments.length - markerIndex\n );\n\n newParagraph.segments.push(...segments);\n\n setParagraphNotImplicit(paragraph);\n\n if (paragraph.segments.every(x => x.segmentType == 'SelectionMarker')) {\n paragraph.segments.push(createBr(marker.format));\n }\n\n normalizeParagraph(newParagraph);\n\n return newParagraph;\n};\n"]}
1
+ {"version":3,"file":"handleEnterOnList.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/inputSteps/handleEnterOnList.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createBr,\n createListItem,\n createListLevel,\n createParagraph,\n createSelectionMarker,\n normalizeContentModel,\n normalizeParagraph,\n setParagraphNotImplicit,\n getClosestAncestorBlockGroupIndex,\n isBlockGroupOfType,\n} from 'roosterjs-content-model-dom';\nimport type {\n ContentModelBlockGroup,\n ContentModelListItem,\n DeleteSelectionStep,\n InsertPoint,\n ValidDeleteSelectionContext,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport const handleEnterOnList: DeleteSelectionStep = context => {\n const { deleteResult } = context;\n if (\n deleteResult == 'nothingToDelete' ||\n deleteResult == 'notDeleted' ||\n deleteResult == 'range'\n ) {\n const { insertPoint, formatContext } = context;\n const { path } = insertPoint;\n const rawEvent = formatContext?.rawEvent;\n const index = getClosestAncestorBlockGroupIndex(path, ['ListItem'], ['TableCell']);\n\n const listItem = path[index];\n const listParent = path[index + 1];\n\n if (listItem && listItem.blockGroupType === 'ListItem' && listParent) {\n const listIndex = listParent.blocks.indexOf(listItem);\n const nextBlock = listParent.blocks[listIndex + 1];\n if (deleteResult == 'range' && nextBlock) {\n normalizeContentModel(listParent);\n const nextListItem = listParent.blocks[listIndex + 1];\n if (\n isBlockGroupOfType<ContentModelListItem>(nextListItem, 'ListItem') &&\n nextListItem.levels[0]\n ) {\n nextListItem.levels.forEach((level, index) => {\n level.format.startNumberOverride = undefined;\n level.dataset = listItem.levels[index]\n ? listItem.levels[index].dataset\n : {};\n });\n const lastParagraph = listItem.blocks[listItem.blocks.length - 1];\n const nextParagraph = nextListItem.blocks[0];\n if (\n nextParagraph.blockType === 'Paragraph' &&\n lastParagraph.blockType === 'Paragraph' &&\n lastParagraph.segments[lastParagraph.segments.length - 1].segmentType ===\n 'SelectionMarker'\n ) {\n lastParagraph.segments.pop();\n\n nextParagraph.segments.unshift(\n createSelectionMarker(insertPoint.marker.format)\n );\n }\n context.lastParagraph = undefined;\n }\n } else if (deleteResult !== 'range') {\n if (isEmptyListItem(listItem)) {\n listItem.levels.pop();\n } else {\n createNewListItem(context, listItem, listParent);\n }\n }\n rawEvent?.preventDefault();\n context.deleteResult = 'range';\n }\n }\n};\n\nconst isEmptyListItem = (listItem: ContentModelListItem) => {\n return (\n listItem.blocks.length === 1 &&\n listItem.blocks[0].blockType === 'Paragraph' &&\n listItem.blocks[0].segments.length === 2 &&\n listItem.blocks[0].segments[0].segmentType === 'SelectionMarker' &&\n listItem.blocks[0].segments[1].segmentType === 'Br'\n );\n};\n\nconst createNewListItem = (\n context: ValidDeleteSelectionContext,\n listItem: ContentModelListItem,\n listParent: ContentModelBlockGroup\n) => {\n const { insertPoint } = context;\n const listIndex = listParent.blocks.indexOf(listItem);\n const newParagraph = createNewParagraph(insertPoint);\n\n const levels = createNewListLevel(listItem);\n const newListItem = createListItem(levels, insertPoint.marker.format);\n newListItem.blocks.push(newParagraph);\n insertPoint.paragraph = newParagraph;\n context.lastParagraph = newParagraph;\n listParent.blocks.splice(listIndex + 1, 0, newListItem);\n};\n\nconst createNewListLevel = (listItem: ContentModelListItem) => {\n return listItem.levels.map(level => {\n return createListLevel(\n level.listType,\n {\n ...level.format,\n startNumberOverride: undefined,\n displayForDummyItem: undefined, // When ENTER, we should create a new regular list item, so force its dummy item display to undefined\n },\n level.dataset\n );\n });\n};\n\nconst createNewParagraph = (insertPoint: InsertPoint) => {\n const { paragraph, marker } = insertPoint;\n const newParagraph = createParagraph(\n false /*isImplicit*/,\n paragraph.format,\n paragraph.segmentFormat\n );\n\n const markerIndex = paragraph.segments.indexOf(marker);\n const segments = paragraph.segments.splice(\n markerIndex,\n paragraph.segments.length - markerIndex\n );\n\n newParagraph.segments.push(...segments);\n\n setParagraphNotImplicit(paragraph);\n\n if (paragraph.segments.every(x => x.segmentType == 'SelectionMarker')) {\n paragraph.segments.push(createBr(marker.format));\n }\n\n normalizeParagraph(newParagraph);\n\n return newParagraph;\n};\n"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "roosterjs-content-model-dom", "./deleteSteps/deleteAllSegmentBefore", "./deleteSteps/deleteEmptyQuote", "./deleteSteps/deleteList", "./handleKeyboardEventCommon", "./deleteSteps/deleteWordSelection", "./deleteSteps/deleteCollapsedSelection"], function (require, exports, roosterjs_content_model_dom_1, deleteAllSegmentBefore_1, deleteEmptyQuote_1, deleteList_1, handleKeyboardEventCommon_1, deleteWordSelection_1, deleteCollapsedSelection_1) {
1
+ define(["require", "exports", "./deleteSteps/deleteAllSegmentBefore", "./deleteSteps/deleteEmptyQuote", "./deleteSteps/deleteList", "roosterjs-content-model-dom", "./handleKeyboardEventCommon", "./deleteSteps/deleteWordSelection", "./deleteSteps/deleteCollapsedSelection"], function (require, exports, deleteAllSegmentBefore_1, deleteEmptyQuote_1, deleteList_1, roosterjs_content_model_dom_1, handleKeyboardEventCommon_1, deleteWordSelection_1, deleteCollapsedSelection_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.keyboardDelete = void 0;
@@ -42,8 +42,8 @@ define(["require", "exports", "roosterjs-content-model-dom", "./deleteSteps/dele
42
42
  return [
43
43
  deleteAllSegmentBeforeStep,
44
44
  deleteWordSelection,
45
+ isForward ? null : deleteList_1.deleteList,
45
46
  deleteCollapsedSelection,
46
- deleteList_1.deleteList,
47
47
  deleteQuote,
48
48
  ];
49
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"keyboardDelete.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/edit/keyboardDelete.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeSource,\n deleteSelection,\n isModifierKey,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport { deleteAllSegmentBefore } from './deleteSteps/deleteAllSegmentBefore';\nimport { deleteEmptyQuote } from './deleteSteps/deleteEmptyQuote';\nimport { deleteList } from './deleteSteps/deleteList';\nimport {\n handleKeyboardEventResult,\n shouldDeleteAllSegmentsBefore,\n shouldDeleteWord,\n} from './handleKeyboardEventCommon';\nimport {\n backwardDeleteWordSelection,\n forwardDeleteWordSelection,\n} from './deleteSteps/deleteWordSelection';\nimport {\n backwardDeleteCollapsedSelection,\n forwardDeleteCollapsedSelection,\n} from './deleteSteps/deleteCollapsedSelection';\nimport type { DOMSelection, DeleteSelectionStep, IEditor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Do keyboard event handling for DELETE/BACKSPACE key\n * @param editor The editor object\n * @param rawEvent DOM keyboard event\n * @returns True if the event is handled by content model, otherwise false\n */\nexport function keyboardDelete(editor: IEditor, rawEvent: KeyboardEvent) {\n let handled = false;\n const selection = editor.getDOMSelection();\n\n if (shouldDeleteWithContentModel(selection, rawEvent)) {\n editor.formatContentModel(\n (model, context) => {\n const result = deleteSelection(\n model,\n getDeleteSteps(rawEvent, !!editor.getEnvironment().isMac),\n context\n ).deleteResult;\n\n handled = handleKeyboardEventResult(editor, model, rawEvent, result, context);\n return handled;\n },\n {\n rawEvent,\n changeSource: ChangeSource.Keyboard,\n getChangeData: () => rawEvent.which,\n apiName: rawEvent.key == 'Delete' ? 'handleDeleteKey' : 'handleBackspaceKey',\n }\n );\n }\n\n return handled;\n}\n\nfunction getDeleteSteps(rawEvent: KeyboardEvent, isMac: boolean): (DeleteSelectionStep | null)[] {\n const isForward = rawEvent.key == 'Delete';\n const deleteAllSegmentBeforeStep =\n shouldDeleteAllSegmentsBefore(rawEvent) && !isForward ? deleteAllSegmentBefore : null;\n const deleteWordSelection = shouldDeleteWord(rawEvent, isMac)\n ? isForward\n ? forwardDeleteWordSelection\n : backwardDeleteWordSelection\n : null;\n const deleteCollapsedSelection = isForward\n ? forwardDeleteCollapsedSelection\n : backwardDeleteCollapsedSelection;\n const deleteQuote = !isForward ? deleteEmptyQuote : null;\n return [\n deleteAllSegmentBeforeStep,\n deleteWordSelection,\n deleteCollapsedSelection,\n deleteList,\n deleteQuote,\n ];\n}\n\nfunction shouldDeleteWithContentModel(selection: DOMSelection | null, rawEvent: KeyboardEvent) {\n if (!selection) {\n return false; // Nothing to delete\n } else if (selection.type != 'range' || !selection.range.collapsed) {\n return true; // Selection is not collapsed, need to delete all selections\n } else {\n const range = selection.range;\n\n // When selection is collapsed and is in middle of text node, no need to use Content Model to delete\n return !(\n isNodeOfType(range.startContainer, 'TEXT_NODE') &&\n !isModifierKey(rawEvent) &&\n (canDeleteBefore(rawEvent, range) || canDeleteAfter(rawEvent, range))\n );\n }\n}\n\nfunction canDeleteBefore(rawEvent: KeyboardEvent, range: Range) {\n return rawEvent.key == 'Backspace' && range.startOffset > 1;\n}\n\nfunction canDeleteAfter(rawEvent: KeyboardEvent, range: Range) {\n return (\n rawEvent.key == 'Delete' &&\n range.startOffset < (range.startContainer.nodeValue?.length ?? 0) - 1\n );\n}\n"]}
1
+ {"version":3,"file":"keyboardDelete.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/edit/keyboardDelete.ts"],"names":[],"mappings":"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","sourcesContent":["import { deleteAllSegmentBefore } from './deleteSteps/deleteAllSegmentBefore';\nimport { deleteEmptyQuote } from './deleteSteps/deleteEmptyQuote';\nimport { deleteList } from './deleteSteps/deleteList';\nimport {\n ChangeSource,\n deleteSelection,\n isModifierKey,\n isNodeOfType,\n} from 'roosterjs-content-model-dom';\nimport {\n handleKeyboardEventResult,\n shouldDeleteAllSegmentsBefore,\n shouldDeleteWord,\n} from './handleKeyboardEventCommon';\nimport {\n backwardDeleteWordSelection,\n forwardDeleteWordSelection,\n} from './deleteSteps/deleteWordSelection';\nimport {\n backwardDeleteCollapsedSelection,\n forwardDeleteCollapsedSelection,\n} from './deleteSteps/deleteCollapsedSelection';\nimport type { DOMSelection, DeleteSelectionStep, IEditor } from 'roosterjs-content-model-types';\n\n/**\n * @internal\n * Do keyboard event handling for DELETE/BACKSPACE key\n * @param editor The editor object\n * @param rawEvent DOM keyboard event\n * @returns True if the event is handled by content model, otherwise false\n */\nexport function keyboardDelete(editor: IEditor, rawEvent: KeyboardEvent) {\n let handled = false;\n const selection = editor.getDOMSelection();\n\n if (shouldDeleteWithContentModel(selection, rawEvent)) {\n editor.formatContentModel(\n (model, context) => {\n const result = deleteSelection(\n model,\n getDeleteSteps(rawEvent, !!editor.getEnvironment().isMac),\n context\n ).deleteResult;\n\n handled = handleKeyboardEventResult(editor, model, rawEvent, result, context);\n return handled;\n },\n {\n rawEvent,\n changeSource: ChangeSource.Keyboard,\n getChangeData: () => rawEvent.which,\n apiName: rawEvent.key == 'Delete' ? 'handleDeleteKey' : 'handleBackspaceKey',\n }\n );\n }\n\n return handled;\n}\n\nfunction getDeleteSteps(rawEvent: KeyboardEvent, isMac: boolean): (DeleteSelectionStep | null)[] {\n const isForward = rawEvent.key == 'Delete';\n const deleteAllSegmentBeforeStep =\n shouldDeleteAllSegmentsBefore(rawEvent) && !isForward ? deleteAllSegmentBefore : null;\n const deleteWordSelection = shouldDeleteWord(rawEvent, isMac)\n ? isForward\n ? forwardDeleteWordSelection\n : backwardDeleteWordSelection\n : null;\n const deleteCollapsedSelection = isForward\n ? forwardDeleteCollapsedSelection\n : backwardDeleteCollapsedSelection;\n const deleteQuote = !isForward ? deleteEmptyQuote : null;\n return [\n deleteAllSegmentBeforeStep,\n deleteWordSelection,\n isForward ? null : deleteList,\n deleteCollapsedSelection,\n deleteQuote,\n ];\n}\n\nfunction shouldDeleteWithContentModel(selection: DOMSelection | null, rawEvent: KeyboardEvent) {\n if (!selection) {\n return false; // Nothing to delete\n } else if (selection.type != 'range' || !selection.range.collapsed) {\n return true; // Selection is not collapsed, need to delete all selections\n } else {\n const range = selection.range;\n\n // When selection is collapsed and is in middle of text node, no need to use Content Model to delete\n return !(\n isNodeOfType(range.startContainer, 'TEXT_NODE') &&\n !isModifierKey(rawEvent) &&\n (canDeleteBefore(rawEvent, range) || canDeleteAfter(rawEvent, range))\n );\n }\n}\n\nfunction canDeleteBefore(rawEvent: KeyboardEvent, range: Range) {\n return rawEvent.key == 'Backspace' && range.startOffset > 1;\n}\n\nfunction canDeleteAfter(rawEvent: KeyboardEvent, range: Range) {\n return (\n rawEvent.key == 'Delete' &&\n range.startOffset < (range.startContainer.nodeValue?.length ?? 0) - 1\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- define(["require", "exports", "roosterjs-content-model-dom", "./tabUtils/handleTabOnList", "./tabUtils/handleTabOnParagraph", "roosterjs-content-model-api"], function (require, exports, roosterjs_content_model_dom_1, handleTabOnList_1, handleTabOnParagraph_1, roosterjs_content_model_api_1) {
1
+ define(["require", "exports", "roosterjs-content-model-dom", "./tabUtils/handleTabOnList", "./tabUtils/handleTabOnParagraph", "./tabUtils/handleTabOnTable", "./tabUtils/handleTabOnTableCell", "roosterjs-content-model-api"], function (require, exports, roosterjs_content_model_dom_1, handleTabOnList_1, handleTabOnParagraph_1, handleTabOnTable_1, handleTabOnTableCell_1, roosterjs_content_model_api_1) {
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.keyboardTab = void 0;
@@ -7,28 +7,42 @@ define(["require", "exports", "roosterjs-content-model-dom", "./tabUtils/handleT
7
7
  */
8
8
  function keyboardTab(editor, rawEvent) {
9
9
  var selection = editor.getDOMSelection();
10
- if ((selection === null || selection === void 0 ? void 0 : selection.type) == 'range') {
11
- editor.formatContentModel(function (model) {
12
- return handleTab(model, rawEvent);
13
- }, {
14
- apiName: 'handleTabKey',
15
- });
16
- return true;
10
+ switch (selection === null || selection === void 0 ? void 0 : selection.type) {
11
+ case 'range':
12
+ editor.formatContentModel(function (model) {
13
+ return handleTab(model, rawEvent);
14
+ }, {
15
+ apiName: 'handleTabKey',
16
+ });
17
+ return true;
18
+ case 'table':
19
+ editor.formatContentModel(function (model) {
20
+ return (0, handleTabOnTable_1.handleTabOnTable)(model, rawEvent);
21
+ }, {
22
+ apiName: 'handleTabKey',
23
+ });
24
+ return true;
17
25
  }
18
26
  }
19
27
  exports.keyboardTab = keyboardTab;
20
28
  /**
21
29
  * If multiple blocks are selected, indent or outdent the selected blocks with setModelIndentation.
22
- * If only one block is selected, call handleTabOnParagraph or handleTabOnList to handle the tab key.
30
+ * If only one block is selected:
31
+ * - If it is a table cell, call handleTabOnTableCell to handle the tab key.
32
+ * - If it is a paragraph, call handleTabOnParagraph to handle the tab key.
33
+ * - If it is a list item, call handleTabOnList to handle the tab key.
23
34
  */
24
35
  function handleTab(model, rawEvent) {
25
- var blocks = (0, roosterjs_content_model_dom_1.getOperationalBlocks)(model, ['ListItem'], ['TableCell']);
36
+ var blocks = (0, roosterjs_content_model_dom_1.getOperationalBlocks)(model, ['ListItem', 'TableCell'], []);
26
37
  var block = blocks.length > 0 ? blocks[0].block : undefined;
27
38
  if (blocks.length > 1) {
28
39
  (0, roosterjs_content_model_api_1.setModelIndentation)(model, rawEvent.shiftKey ? 'outdent' : 'indent');
29
40
  rawEvent.preventDefault();
30
41
  return true;
31
42
  }
43
+ else if ((0, roosterjs_content_model_dom_1.isBlockGroupOfType)(block, 'TableCell')) {
44
+ return (0, handleTabOnTableCell_1.handleTabOnTableCell)(model, block, rawEvent);
45
+ }
32
46
  else if ((block === null || block === void 0 ? void 0 : block.blockType) === 'Paragraph') {
33
47
  return (0, handleTabOnParagraph_1.handleTabOnParagraph)(model, block, rawEvent);
34
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"keyboardTab.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/edit/keyboardTab.ts"],"names":[],"mappings":";;;;IAUA;;OAEG;IACH,SAAgB,WAAW,CAAC,MAAe,EAAE,QAAuB;QAChE,IAAM,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAE3C,IAAI,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,KAAI,OAAO,EAAE;YAC5B,MAAM,CAAC,kBAAkB,CACrB,UAAA,KAAK;gBACD,OAAO,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC,EACD;gBACI,OAAO,EAAE,cAAc;aAC1B,CACJ,CAAC;YAEF,OAAO,IAAI,CAAC;SACf;IACL,CAAC;IAfD,kCAeC;IAED;;;OAGG;IACH,SAAS,SAAS,CAAC,KAA2B,EAAE,QAAuB;QACnE,IAAM,MAAM,GAAG,IAAA,kDAAoB,EAAuB,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9F,IAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,IAAA,iDAAmB,EAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACrE,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;SACf;aAAM,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,MAAK,WAAW,EAAE;YACzC,OAAO,IAAA,2CAAoB,EAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;SACvD;aAAM,IAAI,IAAA,gDAAkB,EAAuB,KAAK,EAAE,UAAU,CAAC,EAAE;YACpE,OAAO,IAAA,iCAAe,EAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;SAClD;QACD,OAAO,KAAK,CAAC;IACjB,CAAC","sourcesContent":["import { getOperationalBlocks, isBlockGroupOfType } from 'roosterjs-content-model-dom';\nimport { handleTabOnList } from './tabUtils/handleTabOnList';\nimport { handleTabOnParagraph } from './tabUtils/handleTabOnParagraph';\nimport { setModelIndentation } from 'roosterjs-content-model-api';\nimport type {\n ContentModelDocument,\n ContentModelListItem,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function keyboardTab(editor: IEditor, rawEvent: KeyboardEvent) {\n const selection = editor.getDOMSelection();\n\n if (selection?.type == 'range') {\n editor.formatContentModel(\n model => {\n return handleTab(model, rawEvent);\n },\n {\n apiName: 'handleTabKey',\n }\n );\n\n return true;\n }\n}\n\n/**\n * If multiple blocks are selected, indent or outdent the selected blocks with setModelIndentation.\n * If only one block is selected, call handleTabOnParagraph or handleTabOnList to handle the tab key.\n */\nfunction handleTab(model: ContentModelDocument, rawEvent: KeyboardEvent) {\n const blocks = getOperationalBlocks<ContentModelListItem>(model, ['ListItem'], ['TableCell']);\n const block = blocks.length > 0 ? blocks[0].block : undefined;\n if (blocks.length > 1) {\n setModelIndentation(model, rawEvent.shiftKey ? 'outdent' : 'indent');\n rawEvent.preventDefault();\n return true;\n } else if (block?.blockType === 'Paragraph') {\n return handleTabOnParagraph(model, block, rawEvent);\n } else if (isBlockGroupOfType<ContentModelListItem>(block, 'ListItem')) {\n return handleTabOnList(model, block, rawEvent);\n }\n return false;\n}\n"]}
1
+ {"version":3,"file":"keyboardTab.js","sourceRoot":"","sources":["../../../../packages/roosterjs-content-model-plugins/lib/edit/keyboardTab.ts"],"names":[],"mappings":";;;;IAaA;;OAEG;IACH,SAAgB,WAAW,CAAC,MAAe,EAAE,QAAuB;QAChE,IAAM,SAAS,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAE3C,QAAQ,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,EAAE;YACrB,KAAK,OAAO;gBACR,MAAM,CAAC,kBAAkB,CACrB,UAAA,KAAK;oBACD,OAAO,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACtC,CAAC,EACD;oBACI,OAAO,EAAE,cAAc;iBAC1B,CACJ,CAAC;gBAEF,OAAO,IAAI,CAAC;YAChB,KAAK,OAAO;gBACR,MAAM,CAAC,kBAAkB,CACrB,UAAA,KAAK;oBACD,OAAO,IAAA,mCAAgB,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC7C,CAAC,EACD;oBACI,OAAO,EAAE,cAAc;iBAC1B,CACJ,CAAC;gBACF,OAAO,IAAI,CAAC;SACnB;IACL,CAAC;IA1BD,kCA0BC;IAED;;;;;;OAMG;IACH,SAAS,SAAS,CAAC,KAA2B,EAAE,QAAuB;QACnE,IAAM,MAAM,GAAG,IAAA,kDAAoB,EAC/B,KAAK,EACL,CAAC,UAAU,EAAE,WAAW,CAAC,EACzB,EAAE,CACL,CAAC;QACF,IAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,IAAA,iDAAmB,EAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACrE,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;SACf;aAAM,IAAI,IAAA,gDAAkB,EAAwB,KAAK,EAAE,WAAW,CAAC,EAAE;YACtE,OAAO,IAAA,2CAAoB,EAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;SACvD;aAAM,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,MAAK,WAAW,EAAE;YACzC,OAAO,IAAA,2CAAoB,EAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;SACvD;aAAM,IAAI,IAAA,gDAAkB,EAAuB,KAAK,EAAE,UAAU,CAAC,EAAE;YACpE,OAAO,IAAA,iCAAe,EAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;SAClD;QACD,OAAO,KAAK,CAAC;IACjB,CAAC","sourcesContent":["import { getOperationalBlocks, isBlockGroupOfType } from 'roosterjs-content-model-dom';\nimport { handleTabOnList } from './tabUtils/handleTabOnList';\nimport { handleTabOnParagraph } from './tabUtils/handleTabOnParagraph';\nimport { handleTabOnTable } from './tabUtils/handleTabOnTable';\nimport { handleTabOnTableCell } from './tabUtils/handleTabOnTableCell';\nimport { setModelIndentation } from 'roosterjs-content-model-api';\nimport type {\n ContentModelDocument,\n ContentModelListItem,\n ContentModelTableCell,\n IEditor,\n} from 'roosterjs-content-model-types';\n\n/**\n * @internal\n */\nexport function keyboardTab(editor: IEditor, rawEvent: KeyboardEvent) {\n const selection = editor.getDOMSelection();\n\n switch (selection?.type) {\n case 'range':\n editor.formatContentModel(\n model => {\n return handleTab(model, rawEvent);\n },\n {\n apiName: 'handleTabKey',\n }\n );\n\n return true;\n case 'table':\n editor.formatContentModel(\n model => {\n return handleTabOnTable(model, rawEvent);\n },\n {\n apiName: 'handleTabKey',\n }\n );\n return true;\n }\n}\n\n/**\n * If multiple blocks are selected, indent or outdent the selected blocks with setModelIndentation.\n * If only one block is selected:\n * - If it is a table cell, call handleTabOnTableCell to handle the tab key.\n * - If it is a paragraph, call handleTabOnParagraph to handle the tab key.\n * - If it is a list item, call handleTabOnList to handle the tab key.\n */\nfunction handleTab(model: ContentModelDocument, rawEvent: KeyboardEvent) {\n const blocks = getOperationalBlocks<ContentModelListItem | ContentModelTableCell>(\n model,\n ['ListItem', 'TableCell'],\n []\n );\n const block = blocks.length > 0 ? blocks[0].block : undefined;\n if (blocks.length > 1) {\n setModelIndentation(model, rawEvent.shiftKey ? 'outdent' : 'indent');\n rawEvent.preventDefault();\n return true;\n } else if (isBlockGroupOfType<ContentModelTableCell>(block, 'TableCell')) {\n return handleTabOnTableCell(model, block, rawEvent);\n } else if (block?.blockType === 'Paragraph') {\n return handleTabOnParagraph(model, block, rawEvent);\n } else if (isBlockGroupOfType<ContentModelListItem>(block, 'ListItem')) {\n return handleTabOnList(model, block, rawEvent);\n }\n return false;\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ContentModelDocument } from 'roosterjs-content-model-types';
2
+ /**
3
+ * When the whole table is selected, indent or outdent the whole table with setModelIndentation.
4
+ * @internal
5
+ */
6
+ export declare function handleTabOnTable(model: ContentModelDocument, rawEvent: KeyboardEvent): boolean;
@@ -0,0 +1,25 @@
1
+ define(["require", "exports", "roosterjs-content-model-dom", "roosterjs-content-model-api"], function (require, exports, roosterjs_content_model_dom_1, roosterjs_content_model_api_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.handleTabOnTable = void 0;
5
+ /**
6
+ * When the whole table is selected, indent or outdent the whole table with setModelIndentation.
7
+ * @internal
8
+ */
9
+ function handleTabOnTable(model, rawEvent) {
10
+ var tableModel = (0, roosterjs_content_model_dom_1.getFirstSelectedTable)(model)[0];
11
+ if (tableModel && isWholeTableSelected(tableModel)) {
12
+ (0, roosterjs_content_model_api_1.setModelIndentation)(model, rawEvent.shiftKey ? 'outdent' : 'indent');
13
+ rawEvent.preventDefault();
14
+ return true;
15
+ }
16
+ return false;
17
+ }
18
+ exports.handleTabOnTable = handleTabOnTable;
19
+ function isWholeTableSelected(tableModel) {
20
+ var _a, _b, _c, _d;
21
+ return (((_b = (_a = tableModel.rows[0]) === null || _a === void 0 ? void 0 : _a.cells[0]) === null || _b === void 0 ? void 0 : _b.isSelected) &&
22
+ ((_d = (_c = tableModel.rows[tableModel.rows.length - 1]) === null || _c === void 0 ? void 0 : _c.cells[tableModel.widths.length - 1]) === null || _d === void 0 ? void 0 : _d.isSelected));
23
+ }
24
+ });
25
+ //# sourceMappingURL=handleTabOnTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleTabOnTable.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/tabUtils/handleTabOnTable.ts"],"names":[],"mappings":";;;;IAIA;;;OAGG;IACH,SAAgB,gBAAgB,CAAC,KAA2B,EAAE,QAAuB;QACjF,IAAM,UAAU,GAAG,IAAA,mDAAqB,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,UAAU,IAAI,oBAAoB,CAAC,UAAU,CAAC,EAAE;YAChD,IAAA,iDAAmB,EAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACrE,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IARD,4CAQC;IAED,SAAS,oBAAoB,CAAC,UAA6B;;QACvD,OAAO,CACH,CAAA,MAAA,MAAA,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,0CAAE,KAAK,CAAC,CAAC,CAAC,0CAAE,UAAU;aACxC,MAAA,MAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,UAAU,CAAA,CAC/F,CAAC;IACN,CAAC","sourcesContent":["import { getFirstSelectedTable } from 'roosterjs-content-model-dom';\nimport { setModelIndentation } from 'roosterjs-content-model-api';\nimport type { ContentModelDocument, ContentModelTable } from 'roosterjs-content-model-types';\n\n/**\n * When the whole table is selected, indent or outdent the whole table with setModelIndentation.\n * @internal\n */\nexport function handleTabOnTable(model: ContentModelDocument, rawEvent: KeyboardEvent) {\n const tableModel = getFirstSelectedTable(model)[0];\n if (tableModel && isWholeTableSelected(tableModel)) {\n setModelIndentation(model, rawEvent.shiftKey ? 'outdent' : 'indent');\n rawEvent.preventDefault();\n return true;\n }\n return false;\n}\n\nfunction isWholeTableSelected(tableModel: ContentModelTable) {\n return (\n tableModel.rows[0]?.cells[0]?.isSelected &&\n tableModel.rows[tableModel.rows.length - 1]?.cells[tableModel.widths.length - 1]?.isSelected\n );\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { ContentModelDocument, ContentModelTableCell } from 'roosterjs-content-model-types';
2
+ /**
3
+ * When the cursor is on the last cell of a table, add new row and focus first new cell.
4
+ * @internal
5
+ */
6
+ export declare function handleTabOnTableCell(model: ContentModelDocument, cell: ContentModelTableCell, rawEvent: KeyboardEvent): boolean;
@@ -0,0 +1,40 @@
1
+ define(["require", "exports", "roosterjs-content-model-api", "roosterjs-content-model-dom"], function (require, exports, roosterjs_content_model_api_1, roosterjs_content_model_dom_1) {
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.handleTabOnTableCell = void 0;
5
+ /**
6
+ * When the cursor is on the last cell of a table, add new row and focus first new cell.
7
+ * @internal
8
+ */
9
+ function handleTabOnTableCell(model, cell, rawEvent) {
10
+ var _a, _b, _c;
11
+ var tableModel = (0, roosterjs_content_model_dom_1.getFirstSelectedTable)(model)[0];
12
+ // Check if cursor is on last cell of the table
13
+ if (!rawEvent.shiftKey &&
14
+ tableModel &&
15
+ ((_a = tableModel.rows[tableModel.rows.length - 1]) === null || _a === void 0 ? void 0 : _a.cells[tableModel.widths.length - 1]) === cell) {
16
+ (0, roosterjs_content_model_api_1.insertTableRow)(tableModel, 'insertBelow');
17
+ // Clear Table selection
18
+ (0, roosterjs_content_model_api_1.clearSelectedCells)(tableModel, {
19
+ firstRow: tableModel.rows.length - 1,
20
+ firstColumn: 0,
21
+ lastRow: tableModel.rows.length - 1,
22
+ lastColumn: tableModel.widths.length - 1,
23
+ });
24
+ (0, roosterjs_content_model_dom_1.normalizeTable)(tableModel, model.format);
25
+ // Add selection marker to the first cell of the new row
26
+ var markerParagraph = (_c = (_b = tableModel.rows[tableModel.rows.length - 1]) === null || _b === void 0 ? void 0 : _b.cells[0]) === null || _c === void 0 ? void 0 : _c.blocks[0];
27
+ if (markerParagraph.blockType == 'Paragraph') {
28
+ var marker = (0, roosterjs_content_model_dom_1.createSelectionMarker)(model.format);
29
+ markerParagraph.segments.unshift(marker);
30
+ (0, roosterjs_content_model_dom_1.setParagraphNotImplicit)(markerParagraph);
31
+ (0, roosterjs_content_model_dom_1.setSelection)(tableModel.rows[tableModel.rows.length - 1].cells[0], marker);
32
+ }
33
+ rawEvent.preventDefault();
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+ exports.handleTabOnTableCell = handleTabOnTableCell;
39
+ });
40
+ //# sourceMappingURL=handleTabOnTableCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleTabOnTableCell.js","sourceRoot":"","sources":["../../../../../packages/roosterjs-content-model-plugins/lib/edit/tabUtils/handleTabOnTableCell.ts"],"names":[],"mappings":";;;;IAUA;;;OAGG;IACH,SAAgB,oBAAoB,CAChC,KAA2B,EAC3B,IAA2B,EAC3B,QAAuB;;QAEvB,IAAM,UAAU,GAAG,IAAA,mDAAqB,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,+CAA+C;QAC/C,IACI,CAAC,QAAQ,CAAC,QAAQ;YAClB,UAAU;YACV,CAAA,MAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAK,IAAI,EAC3F;YACE,IAAA,4CAAc,EAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YAE1C,wBAAwB;YACxB,IAAA,gDAAkB,EAAC,UAAU,EAAE;gBAC3B,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gBACpC,WAAW,EAAE,CAAC;gBACd,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gBACnC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;aAC3C,CAAC,CAAC;YACH,IAAA,4CAAc,EAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAEzC,wDAAwD;YACxD,IAAM,eAAe,GAAG,MAAA,MAAA,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,KAAK,CAAC,CAAC,CAAC,0CAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YACzF,IAAI,eAAe,CAAC,SAAS,IAAI,WAAW,EAAE;gBAC1C,IAAM,MAAM,GAAG,IAAA,mDAAqB,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAEnD,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAA,qDAAuB,EAAC,eAAe,CAAC,CAAC;gBACzC,IAAA,0CAAY,EAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;aAC9E;YAED,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;SACf;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAtCD,oDAsCC","sourcesContent":["import { clearSelectedCells, insertTableRow } from 'roosterjs-content-model-api';\nimport {\n createSelectionMarker,\n getFirstSelectedTable,\n normalizeTable,\n setParagraphNotImplicit,\n setSelection,\n} from 'roosterjs-content-model-dom';\nimport type { ContentModelDocument, ContentModelTableCell } from 'roosterjs-content-model-types';\n\n/**\n * When the cursor is on the last cell of a table, add new row and focus first new cell.\n * @internal\n */\nexport function handleTabOnTableCell(\n model: ContentModelDocument,\n cell: ContentModelTableCell,\n rawEvent: KeyboardEvent\n) {\n const tableModel = getFirstSelectedTable(model)[0];\n // Check if cursor is on last cell of the table\n if (\n !rawEvent.shiftKey &&\n tableModel &&\n tableModel.rows[tableModel.rows.length - 1]?.cells[tableModel.widths.length - 1] === cell\n ) {\n insertTableRow(tableModel, 'insertBelow');\n\n // Clear Table selection\n clearSelectedCells(tableModel, {\n firstRow: tableModel.rows.length - 1,\n firstColumn: 0,\n lastRow: tableModel.rows.length - 1,\n lastColumn: tableModel.widths.length - 1,\n });\n normalizeTable(tableModel, model.format);\n\n // Add selection marker to the first cell of the new row\n const markerParagraph = tableModel.rows[tableModel.rows.length - 1]?.cells[0]?.blocks[0];\n if (markerParagraph.blockType == 'Paragraph') {\n const marker = createSelectionMarker(model.format);\n\n markerParagraph.segments.unshift(marker);\n setParagraphNotImplicit(markerParagraph);\n setSelection(tableModel.rows[tableModel.rows.length - 1].cells[0], marker);\n }\n\n rawEvent.preventDefault();\n return true;\n }\n\n return false;\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import type { HyperlinkToolTip } from './HyperlinkToolTip';
2
+ import type { EditorPlugin, IEditor, PluginEvent } from 'roosterjs-content-model-types';
3
+ /**
4
+ * Hyperlink plugin does the following jobs for a hyperlink in editor:
5
+ * 1. When hover on a link, show a tool tip
6
+ * 2. When Ctrl+Click on a link, open a new window with the link
7
+ * 3. When type directly on a link whose text matches its link url, update the link url with the link text
8
+ */
9
+ export declare class HyperlinkPlugin implements EditorPlugin {
10
+ private tooltip;
11
+ private target?;
12
+ private onLinkClick?;
13
+ private editor;
14
+ private domHelper;
15
+ private isMac;
16
+ private disposer;
17
+ private currentNode;
18
+ private currentLink;
19
+ /**
20
+ * Create a new instance of HyperLink class
21
+ * @param tooltip Tooltip to show when mouse hover over a link
22
+ * Default value is to return the href itself. If null, there will be no tooltip text.
23
+ * @param target (Optional) Target window name for hyperlink. If null, will use "_blank"
24
+ * @param onLinkClick (Optional) Open link callback (return false to use default behavior)
25
+ */
26
+ constructor(tooltip?: HyperlinkToolTip, target?: string | undefined, onLinkClick?: ((anchor: HTMLAnchorElement, mouseEvent: MouseEvent) => boolean | void) | undefined);
27
+ /**
28
+ * Get a friendly name of this plugin
29
+ */
30
+ getName(): string;
31
+ /**
32
+ * Initialize this plugin
33
+ * @param editor The editor instance
34
+ */
35
+ initialize(editor: IEditor): void;
36
+ /**
37
+ * Dispose this plugin
38
+ */
39
+ dispose(): void;
40
+ /**
41
+ * Handle events triggered from editor
42
+ * @param event PluginEvent object
43
+ */
44
+ onPluginEvent(event: PluginEvent): void;
45
+ protected onMouse: (e: Event) => void;
46
+ private runWithHyperlink;
47
+ private isCtrlOrMetaPressed;
48
+ }