@seafile/sea-email-editor 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/README.md +1 -0
  2. package/dist/assets/icons/align-center.svg +1 -0
  3. package/dist/assets/icons/align-left.svg +1 -0
  4. package/dist/assets/icons/align-right.svg +1 -0
  5. package/dist/assets/icons/arrow-down.svg +1 -0
  6. package/dist/assets/icons/arrow-right.svg +1 -0
  7. package/dist/assets/icons/arrow-up.svg +1 -0
  8. package/dist/assets/icons/bold.svg +1 -0
  9. package/dist/assets/icons/callout-color.svg +1 -0
  10. package/dist/assets/icons/check-mark-option.svg +3 -0
  11. package/dist/assets/icons/check-square.svg +1 -0
  12. package/dist/assets/icons/clear-format.svg +1 -0
  13. package/dist/assets/icons/close.svg +3 -0
  14. package/dist/assets/icons/code-block.svg +1 -0
  15. package/dist/assets/icons/image.svg +1 -0
  16. package/dist/assets/icons/inline-code.svg +1 -0
  17. package/dist/assets/icons/insert.svg +1 -0
  18. package/dist/assets/icons/italic.svg +1 -0
  19. package/dist/assets/icons/link.svg +1 -0
  20. package/dist/assets/icons/more.svg +1 -0
  21. package/dist/assets/icons/ol.svg +1 -0
  22. package/dist/assets/icons/quote.svg +1 -0
  23. package/dist/assets/icons/rename.svg +4 -0
  24. package/dist/assets/icons/strikethrough.svg +1 -0
  25. package/dist/assets/icons/table.svg +1 -0
  26. package/dist/assets/icons/ul.svg +1 -0
  27. package/dist/assets/icons/underline.svg +1 -0
  28. package/dist/assets/icons/unlink.svg +1 -0
  29. package/dist/components/browser-tip/index.css +18 -0
  30. package/dist/components/browser-tip/index.js +28 -0
  31. package/dist/components/centered-loading.js +23 -0
  32. package/dist/components/icon/index.css +7 -0
  33. package/dist/components/icon/index.js +30 -0
  34. package/dist/components/icon-button/index.css +33 -0
  35. package/dist/components/icon-button/index.js +71 -0
  36. package/dist/components/index.js +92 -0
  37. package/dist/components/loading/index.css +54 -0
  38. package/dist/components/loading/index.js +15 -0
  39. package/dist/components/modal/index.css +0 -0
  40. package/dist/components/modal/index.js +27 -0
  41. package/dist/components/modal-header/index.css +22 -0
  42. package/dist/components/modal-header/index.js +36 -0
  43. package/dist/components/option/index.css +20 -0
  44. package/dist/components/option/index.js +39 -0
  45. package/dist/components/options-editor/container/index.css +49 -0
  46. package/dist/components/options-editor/container/index.js +122 -0
  47. package/dist/components/options-editor/index.css +26 -0
  48. package/dist/components/options-editor/index.js +70 -0
  49. package/dist/components/options-editor/options/index.css +5 -0
  50. package/dist/components/options-editor/options/index.js +138 -0
  51. package/dist/components/options-editor/options/option/index.css +54 -0
  52. package/dist/components/options-editor/options/option/index.js +138 -0
  53. package/dist/components/popover/index.js +85 -0
  54. package/dist/components/popover/utils.js +76 -0
  55. package/dist/components/search-input/index.css +52 -0
  56. package/dist/components/search-input/index.js +148 -0
  57. package/dist/components/selector-display/index.css +86 -0
  58. package/dist/components/selector-display/index.js +66 -0
  59. package/dist/components/toolbar/index.js +20 -0
  60. package/dist/components/toolbar/toolbar-group/index.css +13 -0
  61. package/dist/components/toolbar/toolbar-group/index.js +22 -0
  62. package/dist/components/toolbar/toolbar-item/index.css +3 -0
  63. package/dist/components/toolbar/toolbar-item/index.js +53 -0
  64. package/dist/components/tooltip/index.css +68 -0
  65. package/dist/components/tooltip/index.js +46 -0
  66. package/dist/components/tooltip/shortcut-key/index.css +7 -0
  67. package/dist/components/tooltip/shortcut-key/index.js +20 -0
  68. package/dist/constants/event-types.js +25 -0
  69. package/dist/constants/index.js +40 -0
  70. package/dist/constants/key-codes.js +104 -0
  71. package/dist/editor/index.css +44 -0
  72. package/dist/editor/index.js +50 -0
  73. package/dist/editor/main/index.css +19 -0
  74. package/dist/editor/main/index.js +166 -0
  75. package/dist/editor/with-props-editor.js +20 -0
  76. package/dist/extension/commons/dropdown-menu-item/index.css +52 -0
  77. package/dist/extension/commons/dropdown-menu-item/index.js +62 -0
  78. package/dist/extension/commons/index.js +5 -0
  79. package/dist/extension/commons/insert-element-dialog/index.js +91 -0
  80. package/dist/extension/commons/menu/index.js +3 -0
  81. package/dist/extension/commons/menu/menu-drop-down.js +98 -0
  82. package/dist/extension/commons/menu-shortcut-indicator/index.js +24 -0
  83. package/dist/extension/commons/menu-shortcut-indicator/style.css +18 -0
  84. package/dist/extension/constants/element-default-style.js +78 -0
  85. package/dist/extension/constants/element-types.js +33 -0
  86. package/dist/extension/constants/index.js +63 -0
  87. package/dist/extension/constants/keyboard.js +33 -0
  88. package/dist/extension/constants/menus-config.js +142 -0
  89. package/dist/extension/core/index.js +38 -0
  90. package/dist/extension/core/queries/index.js +507 -0
  91. package/dist/extension/core/transforms/focus-editor.js +18 -0
  92. package/dist/extension/core/transforms/index.js +49 -0
  93. package/dist/extension/core/transforms/move-children.js +35 -0
  94. package/dist/extension/core/transforms/remove-node-children.js +19 -0
  95. package/dist/extension/core/transforms/replace-node-children.js +24 -0
  96. package/dist/extension/core/utils/index.js +120 -0
  97. package/dist/extension/event-transfer/get-event-transfer.js +38 -0
  98. package/dist/extension/event-transfer/set-event-transfer.js +36 -0
  99. package/dist/extension/highlight/index.js +20 -0
  100. package/dist/extension/highlight/normalize-tokens.js +94 -0
  101. package/dist/extension/highlight/prismjs.js +27 -0
  102. package/dist/extension/highlight/set-node-decorations.js +81 -0
  103. package/dist/extension/highlight/use-highlight.js +20 -0
  104. package/dist/extension/index.js +67 -0
  105. package/dist/extension/plugins/blockquote/helpers.js +68 -0
  106. package/dist/extension/plugins/blockquote/index.js +18 -0
  107. package/dist/extension/plugins/blockquote/menu/index.js +35 -0
  108. package/dist/extension/plugins/blockquote/plugin.js +154 -0
  109. package/dist/extension/plugins/blockquote/render-elem.js +29 -0
  110. package/dist/extension/plugins/check-list/helper.js +34 -0
  111. package/dist/extension/plugins/check-list/index.js +19 -0
  112. package/dist/extension/plugins/check-list/menu/index.js +39 -0
  113. package/dist/extension/plugins/check-list/plugin.js +92 -0
  114. package/dist/extension/plugins/check-list/render-elem.js +61 -0
  115. package/dist/extension/plugins/clear-format/helpers.js +51 -0
  116. package/dist/extension/plugins/clear-format/menu/index.js +35 -0
  117. package/dist/extension/plugins/code-block/helpers.js +140 -0
  118. package/dist/extension/plugins/code-block/index.js +20 -0
  119. package/dist/extension/plugins/code-block/menu/index.js +59 -0
  120. package/dist/extension/plugins/code-block/plugin.js +288 -0
  121. package/dist/extension/plugins/code-block/render-elem/constant.js +22 -0
  122. package/dist/extension/plugins/code-block/render-elem/index.js +89 -0
  123. package/dist/extension/plugins/code-block/render-elem/language-selector/index.css +18 -0
  124. package/dist/extension/plugins/code-block/render-elem/language-selector/index.js +38 -0
  125. package/dist/extension/plugins/formula/formula.css +22 -0
  126. package/dist/extension/plugins/formula/helper.js +80 -0
  127. package/dist/extension/plugins/formula/index.js +19 -0
  128. package/dist/extension/plugins/formula/menu/formula-modal.js +98 -0
  129. package/dist/extension/plugins/formula/menu/index.js +35 -0
  130. package/dist/extension/plugins/formula/plugin.js +22 -0
  131. package/dist/extension/plugins/formula/render-elem.js +64 -0
  132. package/dist/extension/plugins/header/helper.js +55 -0
  133. package/dist/extension/plugins/header/index.js +19 -0
  134. package/dist/extension/plugins/header/menu/index.js +72 -0
  135. package/dist/extension/plugins/header/plugin.js +155 -0
  136. package/dist/extension/plugins/header/render-elem.js +39 -0
  137. package/dist/extension/plugins/html/index.js +13 -0
  138. package/dist/extension/plugins/html/plugin.js +69 -0
  139. package/dist/extension/plugins/image/helper.js +131 -0
  140. package/dist/extension/plugins/image/index.js +19 -0
  141. package/dist/extension/plugins/image/menu/image-menu-dialog.js +92 -0
  142. package/dist/extension/plugins/image/menu/index.css +3 -0
  143. package/dist/extension/plugins/image/menu/index.js +103 -0
  144. package/dist/extension/plugins/image/plugin.js +56 -0
  145. package/dist/extension/plugins/image/render-element/image-previewer.js +89 -0
  146. package/dist/extension/plugins/image/render-element/index.js +141 -0
  147. package/dist/extension/plugins/image/render-element/style.css +68 -0
  148. package/dist/extension/plugins/index.js +116 -0
  149. package/dist/extension/plugins/link/helper.js +258 -0
  150. package/dist/extension/plugins/link/index.js +19 -0
  151. package/dist/extension/plugins/link/menu/index.js +92 -0
  152. package/dist/extension/plugins/link/menu/link-modal.js +169 -0
  153. package/dist/extension/plugins/link/plugin.js +172 -0
  154. package/dist/extension/plugins/link/render-elem/index.css +12 -0
  155. package/dist/extension/plugins/link/render-elem/index.js +103 -0
  156. package/dist/extension/plugins/link/render-elem/link-op-menu/index.css +33 -0
  157. package/dist/extension/plugins/link/render-elem/link-op-menu/index.js +89 -0
  158. package/dist/extension/plugins/list/constant.js +8 -0
  159. package/dist/extension/plugins/list/helpers.js +102 -0
  160. package/dist/extension/plugins/list/index.js +19 -0
  161. package/dist/extension/plugins/list/menu/index.js +41 -0
  162. package/dist/extension/plugins/list/plugin/index.js +80 -0
  163. package/dist/extension/plugins/list/plugin/insert-break-list.js +29 -0
  164. package/dist/extension/plugins/list/plugin/insert-fragment-list.js +179 -0
  165. package/dist/extension/plugins/list/plugin/normalize-list.js +79 -0
  166. package/dist/extension/plugins/list/plugin/on-tab-handle.js +63 -0
  167. package/dist/extension/plugins/list/plugin/shortcut.js +69 -0
  168. package/dist/extension/plugins/list/queries/index.js +52 -0
  169. package/dist/extension/plugins/list/render-elem/index.js +68 -0
  170. package/dist/extension/plugins/list/transforms/index.js +75 -0
  171. package/dist/extension/plugins/list/transforms/insert-list-item.js +98 -0
  172. package/dist/extension/plugins/list/transforms/move-list-item-down.js +50 -0
  173. package/dist/extension/plugins/list/transforms/move-list-item-up.js +124 -0
  174. package/dist/extension/plugins/list/transforms/move-list-items-to-list.js +63 -0
  175. package/dist/extension/plugins/list/transforms/move-list-items.js +73 -0
  176. package/dist/extension/plugins/list/transforms/normalize-list-item.js +110 -0
  177. package/dist/extension/plugins/list/transforms/normalize-nested-list.js +38 -0
  178. package/dist/extension/plugins/list/transforms/remove-first-list-item.js +24 -0
  179. package/dist/extension/plugins/list/transforms/transforms-to-list.js +131 -0
  180. package/dist/extension/plugins/list/transforms/unwrap-list.js +48 -0
  181. package/dist/extension/plugins/markdown/index.js +12 -0
  182. package/dist/extension/plugins/markdown/plugin.js +257 -0
  183. package/dist/extension/plugins/node-id/constants.js +24 -0
  184. package/dist/extension/plugins/node-id/helpers.js +78 -0
  185. package/dist/extension/plugins/node-id/index.js +12 -0
  186. package/dist/extension/plugins/node-id/with-node-id.js +37 -0
  187. package/dist/extension/plugins/p/helper.js +17 -0
  188. package/dist/extension/plugins/p/index.js +17 -0
  189. package/dist/extension/plugins/p/plugin.js +141 -0
  190. package/dist/extension/plugins/p/render-elem.js +29 -0
  191. package/dist/extension/plugins/paragraph/helper.js +17 -0
  192. package/dist/extension/plugins/paragraph/index.js +17 -0
  193. package/dist/extension/plugins/paragraph/plugin.js +141 -0
  194. package/dist/extension/plugins/paragraph/render-elem.js +29 -0
  195. package/dist/extension/plugins/table/constant.js +24 -0
  196. package/dist/extension/plugins/table/context-menu/horizontal-align-popover/index.css +3 -0
  197. package/dist/extension/plugins/table/context-menu/horizontal-align-popover/index.js +64 -0
  198. package/dist/extension/plugins/table/context-menu/index.css +13 -0
  199. package/dist/extension/plugins/table/context-menu/index.js +152 -0
  200. package/dist/extension/plugins/table/context-menu/insert-table-element/index.css +27 -0
  201. package/dist/extension/plugins/table/context-menu/insert-table-element/index.js +113 -0
  202. package/dist/extension/plugins/table/helper.js +333 -0
  203. package/dist/extension/plugins/table/index.js +21 -0
  204. package/dist/extension/plugins/table/menu/index.js +61 -0
  205. package/dist/extension/plugins/table/menu/table-operator.js +97 -0
  206. package/dist/extension/plugins/table/menu/table-size-selector/index.css +27 -0
  207. package/dist/extension/plugins/table/menu/table-size-selector/index.js +98 -0
  208. package/dist/extension/plugins/table/model.js +102 -0
  209. package/dist/extension/plugins/table/plugin.js +351 -0
  210. package/dist/extension/plugins/table/render-elem/index.css +64 -0
  211. package/dist/extension/plugins/table/render-elem/index.js +252 -0
  212. package/dist/extension/plugins/table/table-operations.js +323 -0
  213. package/dist/extension/plugins/text-style/helpers.js +57 -0
  214. package/dist/extension/plugins/text-style/index.js +17 -0
  215. package/dist/extension/plugins/text-style/menu/index.js +37 -0
  216. package/dist/extension/plugins/text-style/plugin.js +38 -0
  217. package/dist/extension/plugins/text-style/render-elem.js +63 -0
  218. package/dist/extension/render/render-element.js +115 -0
  219. package/dist/extension/render/render-leaf.js +22 -0
  220. package/dist/extension/toolbar/index.css +16 -0
  221. package/dist/extension/toolbar/index.js +89 -0
  222. package/dist/extension/toolbar/insert-toolbar.js +78 -0
  223. package/dist/hooks/use-attachments.js +38 -0
  224. package/dist/hooks/use-container-style.js +50 -0
  225. package/dist/hooks/use-mathjax.js +46 -0
  226. package/dist/hooks/use-scroll-context.js +20 -0
  227. package/dist/hooks/use-selection-update.js +20 -0
  228. package/dist/hooks/user-link-click.js +52 -0
  229. package/dist/index.js +9 -0
  230. package/dist/intl/ReactIntlUniversal.js +310 -0
  231. package/dist/intl/constants.js +21 -0
  232. package/dist/intl/index.js +33 -0
  233. package/dist/locale/index.js +11 -0
  234. package/dist/locale/lang/en.json +83 -0
  235. package/dist/slate-convert/html-to-slate/constants.js +146 -0
  236. package/dist/slate-convert/html-to-slate/helper.js +106 -0
  237. package/dist/slate-convert/html-to-slate/index.js +138 -0
  238. package/dist/slate-convert/html-to-slate/rules/blockquote.js +26 -0
  239. package/dist/slate-convert/html-to-slate/rules/br.js +29 -0
  240. package/dist/slate-convert/html-to-slate/rules/check-list.js +29 -0
  241. package/dist/slate-convert/html-to-slate/rules/code-block.js +95 -0
  242. package/dist/slate-convert/html-to-slate/rules/header.js +26 -0
  243. package/dist/slate-convert/html-to-slate/rules/image.js +31 -0
  244. package/dist/slate-convert/html-to-slate/rules/index.js +20 -0
  245. package/dist/slate-convert/html-to-slate/rules/link.js +31 -0
  246. package/dist/slate-convert/html-to-slate/rules/list.js +74 -0
  247. package/dist/slate-convert/html-to-slate/rules/p.js +37 -0
  248. package/dist/slate-convert/html-to-slate/rules/paragraph.js +37 -0
  249. package/dist/slate-convert/html-to-slate/rules/table.js +64 -0
  250. package/dist/slate-convert/html-to-slate/rules/text.js +71 -0
  251. package/dist/slate-convert/index.js +20 -0
  252. package/dist/slate-convert/slate-to-html/index.js +143 -0
  253. package/dist/utils/common.js +46 -0
  254. package/dist/utils/deserialize-html.js +219 -0
  255. package/dist/utils/dom-utils.js +57 -0
  256. package/dist/utils/dom.js +133 -0
  257. package/dist/utils/event-bus.js +40 -0
  258. package/dist/utils/event-handler.js +44 -0
  259. package/dist/utils/get-browser-Info.js +35 -0
  260. package/dist/utils/hotkey.js +45 -0
  261. package/dist/utils/is-punctuation-mark.js +50 -0
  262. package/dist/utils/object-utils.js +56 -0
  263. package/dist/utils/search.js +20 -0
  264. package/dist/utils/translate.js +18 -0
  265. package/dist/utils/type-detection.js +42 -0
  266. package/package.json +177 -0
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _classnames = _interopRequireDefault(require("classnames"));
11
+ var _elementTypes = require("../../../constants/element-types");
12
+ var _helpers = require("../helpers");
13
+ var _constants = require("../../../constants");
14
+ var _components = require("../../../../components");
15
+ var _constants2 = require("../../../../constants");
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
+ const menuConfig = _constants.MENUS_CONFIG_MAP[_elementTypes.CODE_BLOCK];
18
+ const CodeBlockMenu = _ref => {
19
+ let {
20
+ readonly,
21
+ editor,
22
+ toggle
23
+ } = _ref;
24
+ // eslint-disable-next-line react-hooks/exhaustive-deps
25
+ const isActive = (0, _react.useMemo)(() => (0, _helpers.isInCodeBlock)(editor), [editor.selection]);
26
+ const onClick = (0, _react.useCallback)(e => {
27
+ e.preventDefault();
28
+ isActive ? (0, _helpers.unwrapCodeBlock)(editor) : (0, _helpers.transformToCodeBlock)(editor);
29
+ toggle && toggle();
30
+ // eslint-disable-next-line react-hooks/exhaustive-deps
31
+ }, [isActive]);
32
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
33
+ className: (0, _classnames.default)('sea-email-option-editor-option', {
34
+ 'disabled': readonly
35
+ }),
36
+ id: menuConfig.id,
37
+ onClick: onClick,
38
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_components.IconButton, {
39
+ icon: menuConfig.icon,
40
+ className: "no-hover-bg sea-email-option-editor-option-icon",
41
+ style: {
42
+ marginLeft: 0,
43
+ marginRight: 8
44
+ },
45
+ size: 16
46
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
47
+ className: "text-truncate",
48
+ title: (0, _constants2.gettext)(menuConfig.text),
49
+ children: (0, _constants2.gettext)(menuConfig.text)
50
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.IconButton, {
51
+ icon: '',
52
+ className: "sea-email-option-editor-option-check-btn no-hover-bg",
53
+ style: {
54
+ marginLeft: 12
55
+ }
56
+ })]
57
+ });
58
+ };
59
+ var _default = exports.default = CodeBlockMenu;
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _isHotkey = _interopRequireDefault(require("is-hotkey"));
9
+ var _slate = require("slate");
10
+ var _core = require("../../core");
11
+ var _helpers = require("./helpers");
12
+ var _elementTypes = require("../../constants/element-types");
13
+ const withCodeBlock = editor => {
14
+ const {
15
+ normalizeNode,
16
+ insertFragment,
17
+ insertText,
18
+ insertBreak,
19
+ insertData,
20
+ insertNode,
21
+ onHotKeyDown
22
+ } = editor;
23
+ const newEditor = editor;
24
+ newEditor.insertData = data => {
25
+ if (data.types.includes('text/code-block') && !(0, _core.getSelectedNodeByType)(editor, _elementTypes.CODE_BLOCK)) {
26
+ const codeBlockNode = JSON.parse(data.getData('text/code-block'));
27
+ return insertNode(codeBlockNode);
28
+ }
29
+ insertData(data);
30
+ };
31
+ newEditor.insertFragment = data => {
32
+ // only selected code block content
33
+ if (data.length === 1 && data[0].type === _elementTypes.CODE_BLOCK && !(0, _core.getSelectedNodeByType)(editor, _elementTypes.CODE_BLOCK)) {
34
+ data.forEach((node, index) => {
35
+ if (node.type === _elementTypes.CODE_BLOCK) {
36
+ const newBlock = node.children.map(line => {
37
+ const text = _slate.Node.string(line);
38
+ const children = (0, _core.generateElement)(_elementTypes.PARAGRAPH, {
39
+ childrenOrText: text
40
+ });
41
+ return children;
42
+ });
43
+ data.splice(index, 1, ...newBlock);
44
+ }
45
+ });
46
+ return insertFragment(data);
47
+ } else {
48
+ if ((0, _core.getSelectedNodeByType)(editor, _elementTypes.CODE_BLOCK)) {
49
+ // Paste into code block
50
+
51
+ // Pasted data is code block split with code-line
52
+ data.forEach((node, index) => {
53
+ if (node.type === _elementTypes.CODE_BLOCK) {
54
+ const codeLineArr = node.children.map(line => line);
55
+ data.splice(index, 1, ...codeLineArr);
56
+ // Paste the copied content in place in code_block
57
+ } else if (node.type === _elementTypes.CODE_LINE) {
58
+ data.splice(index, 1, node);
59
+ }
60
+ });
61
+ const insertCodeLines = data.map(node => {
62
+ const text = _slate.Node.string(node);
63
+ const codeLine = (0, _core.generateElement)(_elementTypes.CODE_LINE, {
64
+ childrenOrText: text
65
+ });
66
+ return codeLine;
67
+ });
68
+
69
+ // Current focus code-line string not empty
70
+ const string = _slate.Editor.string(newEditor, newEditor.selection.focus.path);
71
+ // Paste the copied content in place in code_block
72
+ if (insertCodeLines.length === 1 && _slate.Range.isExpanded(newEditor.selection)) {
73
+ const text = _slate.Node.string(insertCodeLines[0]);
74
+ insertText(text);
75
+ return;
76
+ }
77
+ if (string.length !== 0 && _slate.Range.isCollapsed(newEditor.selection)) {
78
+ const [node, ...restNode] = insertCodeLines;
79
+ const text = _slate.Node.string(node);
80
+ insertText(text);
81
+ if (restNode.length !== 0) {
82
+ insertBreak();
83
+ insertFragment(restNode);
84
+ }
85
+ return;
86
+ }
87
+ return insertFragment(insertCodeLines);
88
+ } else {
89
+ // Paste into not a code block
90
+ return insertFragment(data);
91
+ }
92
+ }
93
+ };
94
+
95
+ // Rewrite normalizeNode
96
+ newEditor.normalizeNode = _ref => {
97
+ let [node, path] = _ref;
98
+ const type = (0, _core.getNodeType)(node);
99
+ if (type === _elementTypes.CODE_LINE && path.length <= 1) {
100
+ _slate.Transforms.setNodes(newEditor, {
101
+ type: _elementTypes.PARAGRAPH
102
+ }, {
103
+ at: path
104
+ });
105
+ return;
106
+ } else if (type === _elementTypes.CODE_LINE && node.children.length > 1) {
107
+ // If one code_line has more than one text nodes, merge all text nodes into a single text node
108
+ const mergedText = node.children.map(textNode => textNode.text).join('');
109
+ _slate.Transforms.removeNodes(editor, {
110
+ at: [...path]
111
+ });
112
+ _slate.Transforms.insertNodes(editor, {
113
+ type: _elementTypes.CODE_LINE,
114
+ children: [{
115
+ text: mergedText
116
+ }]
117
+ }, {
118
+ at: [...path]
119
+ });
120
+ return;
121
+ }
122
+ if (type === _elementTypes.CODE_BLOCK) {
123
+ if (node.children.length === 0) {
124
+ _slate.Transforms.delete(newEditor, {
125
+ at: path
126
+ });
127
+ return;
128
+ }
129
+
130
+ // code-block is the last node in the editor and needs to be followed by a p node
131
+ const isLast = (0, _core.isLastNode)(newEditor, node);
132
+ if (isLast) {
133
+ const paragraph = (0, _core.generateEmptyElement)(_elementTypes.PARAGRAPH);
134
+ _slate.Transforms.insertNodes(newEditor, paragraph, {
135
+ at: [path[0] + 1]
136
+ });
137
+ }
138
+ const isFirst = (0, _core.isFirstNode)(newEditor, node);
139
+ if (isFirst) {
140
+ const paragraph = (0, _core.generateEmptyElement)(_elementTypes.PARAGRAPH);
141
+ _slate.Transforms.insertNodes(newEditor, paragraph, {
142
+ at: [path[0]]
143
+ });
144
+ }
145
+
146
+ // Here must be a code node below code-block
147
+ if ((0, _core.getNodeType)(node.children[0]) !== _elementTypes.CODE_LINE) {
148
+ _slate.Transforms.unwrapNodes(newEditor);
149
+ _slate.Transforms.setNodes(newEditor, {
150
+ type: _elementTypes.PARAGRAPH
151
+ }, {
152
+ mode: 'highest'
153
+ });
154
+ }
155
+ if (node.children.length > 1) {
156
+ node.children.forEach((child, index) => {
157
+ if (child.type !== _elementTypes.CODE_LINE) {
158
+ _slate.Transforms.setNodes(newEditor, {
159
+ type: _elementTypes.CODE_LINE
160
+ }, {
161
+ at: [...path, index]
162
+ });
163
+ }
164
+ });
165
+ }
166
+ }
167
+ // Perform default behavior
168
+ return normalizeNode([node, path]);
169
+ };
170
+ newEditor.onHotKeyDown = event => {
171
+ const wrapperCodeBlock = (0, _helpers.getCodeBlockNodeEntry)(newEditor);
172
+ if (!wrapperCodeBlock) return onHotKeyDown && onHotKeyDown(event);
173
+ if ((0, _isHotkey.default)('mod+enter', event)) {
174
+ event.preventDefault();
175
+ if (newEditor.selection && !_slate.Range.isExpanded(newEditor.selection)) {
176
+ const path = _slate.Editor.path(newEditor, newEditor.selection);
177
+ const newParagraphPath = [path[0] + 1];
178
+ const newParagraph = (0, _core.generateEmptyElement)(_elementTypes.PARAGRAPH);
179
+ _slate.Transforms.insertNodes(newEditor, newParagraph, {
180
+ at: newParagraphPath
181
+ });
182
+ _slate.Transforms.select(newEditor, newParagraphPath);
183
+ }
184
+ return true;
185
+ }
186
+ if ((0, _isHotkey.default)('tab', event)) {
187
+ if (newEditor.hasMovedSelection) event.stopPropagation();
188
+ event.preventDefault();
189
+ const nodeEntries = _slate.Editor.nodes(newEditor, {
190
+ mode: 'lowest',
191
+ match: node => node.type === _elementTypes.CODE_LINE
192
+ });
193
+ const nodeEntryList = Array.from(nodeEntries);
194
+ for (const nodeEntry of nodeEntryList) {
195
+ const [, path] = nodeEntry;
196
+ // Insert 4 spaces for easier remove space
197
+ _slate.Transforms.insertText(newEditor, ' '.repeat(4), {
198
+ at: {
199
+ path: [...path, 0],
200
+ offset: 0
201
+ }
202
+ });
203
+ }
204
+ const firstCodeLinePath = nodeEntryList.at(0)[1].concat(0);
205
+ const lastCodeLinePath = nodeEntryList.at(-1)[1].concat(0);
206
+ const newRange = _slate.Editor.range(newEditor, firstCodeLinePath, lastCodeLinePath);
207
+ nodeEntryList.length > 1 ? _slate.Transforms.select(newEditor, newRange) : _slate.Transforms.select(newEditor);
208
+ return true;
209
+ }
210
+ if ((0, _isHotkey.default)('shift+tab', event)) {
211
+ if (newEditor.hasMovedSelection) event.stopPropagation();
212
+ event.preventDefault();
213
+ // Match the beginning of the line space, delete up to 4 spaces at a time
214
+ const originSelection = newEditor.selection;
215
+ const matchBeginSpace = /^\s*/;
216
+ const nodeEntries = _slate.Editor.nodes(newEditor, {
217
+ mode: 'lowest',
218
+ match: node => node.type === _elementTypes.CODE_LINE
219
+ });
220
+ const nodeEntryList = Array.from(nodeEntries);
221
+ let removedSpaceCount = 0;
222
+ for (const nodeEntry of nodeEntryList) {
223
+ const [node, path] = nodeEntry;
224
+ const spaceNum = _slate.Node.string(node).match(matchBeginSpace);
225
+ // skip empty line and no space begining line
226
+ if (!spaceNum || !spaceNum[0].length) continue;
227
+ const deleteNum = Math.min(spaceNum[0].length, 4);
228
+ removedSpaceCount += deleteNum;
229
+ for (let i = 0; i < deleteNum; i++) {
230
+ _slate.Transforms.select(newEditor, {
231
+ path: [...path, 0],
232
+ offset: 0
233
+ });
234
+ _slate.Editor.deleteForward(newEditor, {
235
+ unit: 'character'
236
+ });
237
+ }
238
+ }
239
+ // Select multiple rows when operating more then one line
240
+ // Keep cursor location when operating one line
241
+ if (nodeEntryList.length > 1) {
242
+ const firstCodeLinePath = nodeEntryList.at(0)[1].concat(0);
243
+ const lastCodeLinePath = nodeEntryList.at(-1)[1].concat(0);
244
+ const selectLocation = _slate.Editor.range(newEditor, firstCodeLinePath, lastCodeLinePath);
245
+ _slate.Transforms.select(newEditor, selectLocation);
246
+ } else {
247
+ const {
248
+ anchor,
249
+ focus
250
+ } = originSelection;
251
+ const isCollapsed = _slate.Range.isCollapsed(originSelection);
252
+ if (isCollapsed) {
253
+ const selectLocation = {
254
+ ...originSelection.focus,
255
+ offset: originSelection.focus.offset - removedSpaceCount
256
+ };
257
+ _slate.Transforms.select(newEditor, selectLocation);
258
+ } else {
259
+ const selectLocation = {
260
+ anchor: {
261
+ ...anchor,
262
+ offset: anchor.offset - removedSpaceCount
263
+ },
264
+ focus: {
265
+ ...focus,
266
+ offset: focus.offset - removedSpaceCount
267
+ }
268
+ };
269
+ _slate.Transforms.select(newEditor, selectLocation);
270
+ }
271
+ }
272
+ return true;
273
+ }
274
+ if ((0, _isHotkey.default)('mod+a', event)) {
275
+ event.preventDefault();
276
+ const codeBlockEntry = _slate.Editor.nodes(newEditor, {
277
+ mode: 'highest',
278
+ match: node => node.type === _elementTypes.CODE_BLOCK
279
+ });
280
+ if (!codeBlockEntry) return;
281
+ const codeBlockEntryList = Array.from(...codeBlockEntry);
282
+ _slate.Transforms.select(newEditor, codeBlockEntryList[1]);
283
+ return true;
284
+ }
285
+ };
286
+ return newEditor;
287
+ };
288
+ var _default = exports.default = withCodeBlock;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LANGUAGE_MAP = exports.EXPLAIN_TEXT = void 0;
7
+ // Default language key name
8
+ const EXPLAIN_TEXT = exports.EXPLAIN_TEXT = 'text';
9
+ const LANGUAGE_MAP = exports.LANGUAGE_MAP = {
10
+ [EXPLAIN_TEXT]: 'Text',
11
+ html: 'HTML',
12
+ css: 'CSS',
13
+ javascript: 'Javascript',
14
+ c: 'C',
15
+ cpp: 'C++',
16
+ csharp: 'C#',
17
+ java: 'Java',
18
+ python: 'Python',
19
+ sql: 'SQL',
20
+ swift: 'Swift',
21
+ json: 'JSON'
22
+ };
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.renderCodeLine = exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _slateReact = require("slate-react");
11
+ var _languageSelector = _interopRequireDefault(require("./language-selector"));
12
+ var _helpers = require("../helpers");
13
+ var _constant = require("./constant");
14
+ var _core = require("../../../core");
15
+ var _constants = require("../../../constants");
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
+ /* eslint-disable react-hooks/rules-of-hooks */
18
+
19
+ const renderCodeBlock = (_ref, editor) => {
20
+ let {
21
+ attributes,
22
+ children,
23
+ element
24
+ } = _ref;
25
+ const [isShowLanguageSelector, setIsShowLanguageSelector] = (0, _react.useState)(true);
26
+ const codeBlockRef = (0, _react.useRef)(null);
27
+ const isReadonly = (0, _slateReact.useReadOnly)();
28
+ (0, _react.useEffect)(() => {
29
+ if (!editor.selection) return;
30
+ if (!(0, _helpers.isInCodeBlock)(editor)) onHideLanguageSelector();
31
+ if ((0, _helpers.isInCodeBlock)(editor)) registerEventHandler();
32
+ // eslint-disable-next-line react-hooks/exhaustive-deps
33
+ }, [editor, editor.selection]);
34
+ const onHideLanguageSelector = (0, _react.useCallback)(e => {
35
+ var _codeBlockRef$current;
36
+ if (codeBlockRef !== null && codeBlockRef !== void 0 && (_codeBlockRef$current = codeBlockRef.current) !== null && _codeBlockRef$current !== void 0 && _codeBlockRef$current.contains(e === null || e === void 0 ? void 0 : e.target) || (0, _helpers.isInCodeBlock)(editor)) return;
37
+ setIsShowLanguageSelector(false);
38
+ unregisterEventHandler();
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
40
+ }, [setIsShowLanguageSelector]);
41
+ const registerEventHandler = (0, _react.useCallback)(() => {
42
+ setIsShowLanguageSelector(true);
43
+ document.addEventListener('click', onHideLanguageSelector, true);
44
+ }, [onHideLanguageSelector]);
45
+ const unregisterEventHandler = (0, _react.useCallback)(() => {
46
+ document.removeEventListener('click', onHideLanguageSelector);
47
+ }, [onHideLanguageSelector]);
48
+ const handleLangSelectorChange = function () {
49
+ let lang = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _constant.EXPLAIN_TEXT;
50
+ const path = (0, _core.findPath)(editor, element);
51
+ (0, _helpers.setCodeBlockLanguage)(editor, lang, path);
52
+ };
53
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
54
+ ref: codeBlockRef,
55
+ className: element.className,
56
+ style: {
57
+ ...(_constants.ELEMENT_DEFAULT_STYLE[element.type] || {}),
58
+ ...((element === null || element === void 0 ? void 0 : element.style) || {})
59
+ },
60
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("pre", {
61
+ ...attributes,
62
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("code", {
63
+ children: children
64
+ })
65
+ }), isShowLanguageSelector && !isReadonly && /*#__PURE__*/(0, _jsxRuntime.jsx)(_languageSelector.default, {
66
+ lang: element.lang,
67
+ handleLangSelectorChange: handleLangSelectorChange
68
+ })]
69
+ });
70
+ };
71
+ var _default = exports.default = renderCodeBlock;
72
+ const renderCodeLine = (props, editor) => {
73
+ const {
74
+ element,
75
+ attributes,
76
+ children
77
+ } = props;
78
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
79
+ "data-id": element.id,
80
+ ...attributes,
81
+ className: element.className,
82
+ style: {
83
+ ...(_constants.ELEMENT_DEFAULT_STYLE[element.type] || {}),
84
+ ...((element === null || element === void 0 ? void 0 : element.style) || {})
85
+ },
86
+ children: children
87
+ });
88
+ };
89
+ exports.renderCodeLine = renderCodeLine;
@@ -0,0 +1,18 @@
1
+ .sea-email-code-block-lang-selector {
2
+ position: absolute;
3
+ top: 0;
4
+ right: 0;
5
+ display: flex;
6
+ padding: 2px 5px;
7
+ width: max-content;
8
+ border: none;
9
+ border-radius: 3px;
10
+ appearance: none;
11
+ align-items: center;
12
+ line-height: 1;
13
+ font-size: 12px;
14
+ background: #eeeeee;
15
+ cursor: pointer;
16
+ transition: all 0.3s;
17
+ outline: none;
18
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _constant = require("../constant");
10
+ require("./index.css");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ const LanguageSelector = _ref => {
13
+ let {
14
+ handleLangSelectorChange,
15
+ lang = _constant.EXPLAIN_TEXT
16
+ } = _ref;
17
+ const langOptions = (0, _react.useMemo)(() => {
18
+ const options = [];
19
+ for (const value in _constant.LANGUAGE_MAP) {
20
+ if (Object.hasOwnProperty.call(_constant.LANGUAGE_MAP, value)) {
21
+ const name = _constant.LANGUAGE_MAP[value];
22
+ options.push(/*#__PURE__*/(0, _jsxRuntime.jsx)("option", {
23
+ value: value,
24
+ children: name
25
+ }, value));
26
+ }
27
+ }
28
+ return options;
29
+ }, []);
30
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("select", {
31
+ name: "language",
32
+ className: "sea-email-code-block-lang-selector",
33
+ value: lang || '',
34
+ onChange: e => handleLangSelectorChange(e.target.value),
35
+ children: langOptions
36
+ });
37
+ };
38
+ var _default = exports.default = LanguageSelector;
@@ -0,0 +1,22 @@
1
+ /* formula */
2
+ .sea-email-selected-formula {
3
+ display: block;
4
+ user-select: none;
5
+ outline: 2px solid #007bff;
6
+ cursor: pointer;
7
+ }
8
+
9
+ .sea-email-selected-formula .MathJax {
10
+ margin: 0;
11
+ }
12
+
13
+ .formula-dialog-wrapper .form-check-label {
14
+ margin-bottom: 4px;
15
+ }
16
+
17
+ .formula-dialog-wrapper .formula-preview {
18
+ padding: 10px;
19
+ border: 2px dashed #ebebeb;
20
+ min-height: 40px;
21
+ overflow-x: auto;
22
+ }
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.updateFormula = exports.isMenuDisabled = exports.isFormulaType = exports.isFormulaActive = exports.insertFormula = void 0;
8
+ var _slate = require("slate");
9
+ var _slugid = _interopRequireDefault(require("slugid"));
10
+ var _queries = require("../../core/queries");
11
+ var _focusEditor = require("../../core/transforms/focus-editor");
12
+ var _constants = require("../../constants");
13
+ var _elementTypes = require("../../constants/element-types");
14
+ var _core = require("../../core");
15
+ const isMenuDisabled = function (editor) {
16
+ let readonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
17
+ if (readonly) return true;
18
+ const {
19
+ selection
20
+ } = editor;
21
+ if (!selection) return false;
22
+ const selectedElems = (0, _queries.getSelectedElems)(editor);
23
+ // Check if the selected element is illegal
24
+ const isSelectedIllegalElement = selectedElems.some(elem => {
25
+ const {
26
+ type
27
+ } = elem;
28
+ if (editor.isVoid(elem)) return true;
29
+ const unSupportTypes = [_constants.ElementTypes.CODE_BLOCK, _constants.ElementTypes.CODE_LINE, _constants.ElementTypes.TABLE, _constants.ElementTypes.TABLE_CELL, _constants.ElementTypes.TABLE_ROW, _constants.ElementTypes.HEADER1, _constants.ElementTypes.HEADER2, _constants.ElementTypes.HEADER3, _constants.ElementTypes.HEADER4, _constants.ElementTypes.HEADER5, _constants.ElementTypes.HEADER6, _constants.ElementTypes.LIST_ITEM, _constants.ElementTypes.UNORDERED_LIST, _constants.ElementTypes.ORDERED_LIST];
30
+ if (unSupportTypes.includes(type)) return true;
31
+ return false;
32
+ });
33
+ if (isSelectedIllegalElement) return true;
34
+ return false;
35
+ };
36
+ exports.isMenuDisabled = isMenuDisabled;
37
+ const isFormulaActive = editor => {
38
+ return isFormulaType(editor);
39
+ };
40
+ exports.isFormulaActive = isFormulaActive;
41
+ const isFormulaType = editor => {
42
+ const [match] = _slate.Editor.nodes(editor, {
43
+ match: n => (0, _queries.getNodeType)(n) === _constants.ElementTypes.FORMULA,
44
+ universal: true
45
+ });
46
+ return !!match;
47
+ };
48
+ exports.isFormulaType = isFormulaType;
49
+ const insertFormula = (editor, data) => {
50
+ const formula = {
51
+ id: _slugid.default.nice(),
52
+ type: _elementTypes.FORMULA,
53
+ data: {
54
+ formula: data.formula
55
+ },
56
+ children: [(0, _core.generateDefaultText)()]
57
+ };
58
+ _slate.Transforms.insertNodes(editor, formula, {
59
+ at: data.at,
60
+ void: true
61
+ });
62
+ (0, _focusEditor.focusEditor)(editor);
63
+ };
64
+ exports.insertFormula = insertFormula;
65
+ const updateFormula = (editor, data) => {
66
+ const {
67
+ formula,
68
+ at
69
+ } = data;
70
+ _slate.Transforms.setNodes(editor, {
71
+ data: {
72
+ formula
73
+ }
74
+ }, {
75
+ at: at,
76
+ void: true
77
+ });
78
+ (0, _focusEditor.focusEditor)(editor);
79
+ };
80
+ exports.updateFormula = updateFormula;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _elementTypes = require("../../constants/element-types");
9
+ var _menu = _interopRequireDefault(require("./menu"));
10
+ var _plugin = _interopRequireDefault(require("./plugin"));
11
+ var _renderElem = _interopRequireDefault(require("./render-elem"));
12
+ const FormulaPlugin = {
13
+ type: _elementTypes.FORMULA,
14
+ nodeType: 'element',
15
+ editorMenus: [_menu.default],
16
+ editorPlugin: _plugin.default,
17
+ renderElements: [_renderElem.default]
18
+ };
19
+ var _default = exports.default = FormulaPlugin;