decap-cms-widget-markdown 2.16.0-beta.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 (215) hide show
  1. package/CHANGELOG.md +820 -0
  2. package/LICENSE +22 -0
  3. package/README.md +9 -0
  4. package/dist/decap-cms-widget-markdown.js +9 -0
  5. package/dist/decap-cms-widget-markdown.js.LICENSE.txt +37 -0
  6. package/dist/decap-cms-widget-markdown.js.map +1 -0
  7. package/dist/esm/MarkdownControl/RawEditor.js +106 -0
  8. package/dist/esm/MarkdownControl/Toolbar.js +216 -0
  9. package/dist/esm/MarkdownControl/ToolbarButton.js +43 -0
  10. package/dist/esm/MarkdownControl/VisualEditor.js +268 -0
  11. package/dist/esm/MarkdownControl/components/Shortcode.js +78 -0
  12. package/dist/esm/MarkdownControl/components/VoidBlock.js +55 -0
  13. package/dist/esm/MarkdownControl/index.js +129 -0
  14. package/dist/esm/MarkdownControl/plugins/BreakToDefaultBlock.js +34 -0
  15. package/dist/esm/MarkdownControl/plugins/CloseBlock.js +36 -0
  16. package/dist/esm/MarkdownControl/plugins/CommandsAndQueries.js +188 -0
  17. package/dist/esm/MarkdownControl/plugins/ForceInsert.js +49 -0
  18. package/dist/esm/MarkdownControl/plugins/Hotkey.js +35 -0
  19. package/dist/esm/MarkdownControl/plugins/LineBreak.js +21 -0
  20. package/dist/esm/MarkdownControl/plugins/Link.js +56 -0
  21. package/dist/esm/MarkdownControl/plugins/blocks/defaultEmptyBlock.js +16 -0
  22. package/dist/esm/MarkdownControl/plugins/blocks/events/keyDown.js +47 -0
  23. package/dist/esm/MarkdownControl/plugins/blocks/events/keyDownBackspace.js +26 -0
  24. package/dist/esm/MarkdownControl/plugins/blocks/events/keyDownEnter.js +28 -0
  25. package/dist/esm/MarkdownControl/plugins/blocks/events/toggleBlock.js +46 -0
  26. package/dist/esm/MarkdownControl/plugins/blocks/locations/areCurrentAndPreviousBlocksOfType.js +20 -0
  27. package/dist/esm/MarkdownControl/plugins/blocks/locations/getListTypeAtCursor.js +16 -0
  28. package/dist/esm/MarkdownControl/plugins/blocks/locations/isCursorAtEndOfParagraph.js +19 -0
  29. package/dist/esm/MarkdownControl/plugins/blocks/locations/isCursorAtStartOfBlockType.js +19 -0
  30. package/dist/esm/MarkdownControl/plugins/blocks/locations/isCursorAtStartOfNonEmptyHeading.js +20 -0
  31. package/dist/esm/MarkdownControl/plugins/blocks/locations/isCursorInBlockType.js +20 -0
  32. package/dist/esm/MarkdownControl/plugins/blocks/locations/isCursorInNonDefaultBlock.js +20 -0
  33. package/dist/esm/MarkdownControl/plugins/blocks/transforms/splitIntoParagraph.js +23 -0
  34. package/dist/esm/MarkdownControl/plugins/blocks/transforms/unwrapIfCursorAtStart.js +36 -0
  35. package/dist/esm/MarkdownControl/plugins/blocks/transforms/wrapListItemsInBlock.js +27 -0
  36. package/dist/esm/MarkdownControl/plugins/blocks/withBlocks.js +19 -0
  37. package/dist/esm/MarkdownControl/plugins/inlines/events/keyDown.js +39 -0
  38. package/dist/esm/MarkdownControl/plugins/inlines/events/keyDownShiftEnter.js +27 -0
  39. package/dist/esm/MarkdownControl/plugins/inlines/events/toggleLink.js +24 -0
  40. package/dist/esm/MarkdownControl/plugins/inlines/events/toggleMark.js +18 -0
  41. package/dist/esm/MarkdownControl/plugins/inlines/locations/isMarkActive.js +17 -0
  42. package/dist/esm/MarkdownControl/plugins/inlines/selectors/getActiveLink.js +15 -0
  43. package/dist/esm/MarkdownControl/plugins/inlines/transforms/unwrapLink.js +14 -0
  44. package/dist/esm/MarkdownControl/plugins/inlines/transforms/wrapLink.js +45 -0
  45. package/dist/esm/MarkdownControl/plugins/inlines/withInlines.js +23 -0
  46. package/dist/esm/MarkdownControl/plugins/lists/events/keyDown.js +38 -0
  47. package/dist/esm/MarkdownControl/plugins/lists/events/keyDownBackspace.js +29 -0
  48. package/dist/esm/MarkdownControl/plugins/lists/events/keyDownEnter.js +44 -0
  49. package/dist/esm/MarkdownControl/plugins/lists/events/keyDownShiftTab.js +32 -0
  50. package/dist/esm/MarkdownControl/plugins/lists/events/keyDownTab.js +57 -0
  51. package/dist/esm/MarkdownControl/plugins/lists/events/toggleListType.js +29 -0
  52. package/dist/esm/MarkdownControl/plugins/lists/locations/isCursorAtListItemStart.js +18 -0
  53. package/dist/esm/MarkdownControl/plugins/lists/locations/isCursorAtNoninitialParagraphStart.js +17 -0
  54. package/dist/esm/MarkdownControl/plugins/lists/locations/isCursorInItemContainingNestedList.js +14 -0
  55. package/dist/esm/MarkdownControl/plugins/lists/locations/isCursorInListItem.js +20 -0
  56. package/dist/esm/MarkdownControl/plugins/lists/locations/isSelectionWithinNoninitialListItem.js +18 -0
  57. package/dist/esm/MarkdownControl/plugins/lists/selectors/getListContainedInListItem.js +18 -0
  58. package/dist/esm/MarkdownControl/plugins/lists/selectors/getLowestAncestorList.js +15 -0
  59. package/dist/esm/MarkdownControl/plugins/lists/selectors/getLowestAncestorQuote.js +15 -0
  60. package/dist/esm/MarkdownControl/plugins/lists/transforms/changeListType.js +24 -0
  61. package/dist/esm/MarkdownControl/plugins/lists/transforms/convertParagraphToListItem.js +27 -0
  62. package/dist/esm/MarkdownControl/plugins/lists/transforms/liftFirstMatchedParent.js +20 -0
  63. package/dist/esm/MarkdownControl/plugins/lists/transforms/liftListItem.js +37 -0
  64. package/dist/esm/MarkdownControl/plugins/lists/transforms/mergeWithPreviousListItem.js +19 -0
  65. package/dist/esm/MarkdownControl/plugins/lists/transforms/moveListToListItem.js +18 -0
  66. package/dist/esm/MarkdownControl/plugins/lists/transforms/splitListItem.js +37 -0
  67. package/dist/esm/MarkdownControl/plugins/lists/transforms/splitToNestedList.js +37 -0
  68. package/dist/esm/MarkdownControl/plugins/lists/transforms/unwrapFirstMatchedParent.js +14 -0
  69. package/dist/esm/MarkdownControl/plugins/lists/transforms/unwrapSelectionFromList.js +25 -0
  70. package/dist/esm/MarkdownControl/plugins/lists/transforms/wrapFirstMatchedParent.js +14 -0
  71. package/dist/esm/MarkdownControl/plugins/lists/transforms/wrapSelectionInList.js +27 -0
  72. package/dist/esm/MarkdownControl/plugins/lists/withLists.js +67 -0
  73. package/dist/esm/MarkdownControl/plugins/matchers/lowestMatchedAncestor.js +13 -0
  74. package/dist/esm/MarkdownControl/plugins/matchers/matchLink.js +14 -0
  75. package/dist/esm/MarkdownControl/plugins/matchers/matchedAncestors.js +15 -0
  76. package/dist/esm/MarkdownControl/plugins/shortcodes/insertShortcode.js +35 -0
  77. package/dist/esm/MarkdownControl/plugins/shortcodes/locations/isCursorInEmptyParagraph.js +20 -0
  78. package/dist/esm/MarkdownControl/plugins/shortcodes/withShortcodes.js +30 -0
  79. package/dist/esm/MarkdownControl/plugins/util.js +18 -0
  80. package/dist/esm/MarkdownControl/renderers.js +326 -0
  81. package/dist/esm/MarkdownPreview.js +47 -0
  82. package/dist/esm/index.js +31 -0
  83. package/dist/esm/regexHelper.js +151 -0
  84. package/dist/esm/schema.js +35 -0
  85. package/dist/esm/serializers/index.js +233 -0
  86. package/dist/esm/serializers/rehypePaperEmoji.js +24 -0
  87. package/dist/esm/serializers/remarkAllowHtmlEntities.js +55 -0
  88. package/dist/esm/serializers/remarkAssertParents.js +89 -0
  89. package/dist/esm/serializers/remarkEscapeMarkdownEntities.js +271 -0
  90. package/dist/esm/serializers/remarkImagesToText.js +41 -0
  91. package/dist/esm/serializers/remarkPaddedLinks.js +127 -0
  92. package/dist/esm/serializers/remarkRehypeShortcodes.js +93 -0
  93. package/dist/esm/serializers/remarkShortcodes.js +123 -0
  94. package/dist/esm/serializers/remarkSlate.js +518 -0
  95. package/dist/esm/serializers/remarkSquashReferences.js +88 -0
  96. package/dist/esm/serializers/remarkStripTrailingBreaks.js +61 -0
  97. package/dist/esm/serializers/remarkWrapHtml.js +24 -0
  98. package/dist/esm/serializers/slateRemark.js +512 -0
  99. package/dist/esm/styles.js +18 -0
  100. package/dist/esm/types.js +10 -0
  101. package/package.json +64 -0
  102. package/src/MarkdownControl/RawEditor.js +100 -0
  103. package/src/MarkdownControl/Toolbar.js +278 -0
  104. package/src/MarkdownControl/ToolbarButton.js +48 -0
  105. package/src/MarkdownControl/VisualEditor.js +293 -0
  106. package/src/MarkdownControl/__tests__/VisualEditor.spec.js +56 -0
  107. package/src/MarkdownControl/__tests__/__snapshots__/parser.spec.js.snap +543 -0
  108. package/src/MarkdownControl/__tests__/parser.spec.js +668 -0
  109. package/src/MarkdownControl/components/Shortcode.js +74 -0
  110. package/src/MarkdownControl/components/VoidBlock.js +58 -0
  111. package/src/MarkdownControl/index.js +125 -0
  112. package/src/MarkdownControl/plugins/BreakToDefaultBlock.js +23 -0
  113. package/src/MarkdownControl/plugins/CloseBlock.js +25 -0
  114. package/src/MarkdownControl/plugins/CommandsAndQueries.js +156 -0
  115. package/src/MarkdownControl/plugins/ForceInsert.js +38 -0
  116. package/src/MarkdownControl/plugins/Hotkey.js +29 -0
  117. package/src/MarkdownControl/plugins/LineBreak.js +15 -0
  118. package/src/MarkdownControl/plugins/Link.js +40 -0
  119. package/src/MarkdownControl/plugins/blocks/defaultEmptyBlock.js +8 -0
  120. package/src/MarkdownControl/plugins/blocks/events/keyDown.js +47 -0
  121. package/src/MarkdownControl/plugins/blocks/events/keyDownBackspace.js +27 -0
  122. package/src/MarkdownControl/plugins/blocks/events/keyDownEnter.js +26 -0
  123. package/src/MarkdownControl/plugins/blocks/events/toggleBlock.js +39 -0
  124. package/src/MarkdownControl/plugins/blocks/locations/areCurrentAndPreviousBlocksOfType.js +15 -0
  125. package/src/MarkdownControl/plugins/blocks/locations/getListTypeAtCursor.js +11 -0
  126. package/src/MarkdownControl/plugins/blocks/locations/isCursorAtEndOfParagraph.js +14 -0
  127. package/src/MarkdownControl/plugins/blocks/locations/isCursorAtStartOfBlockType.js +14 -0
  128. package/src/MarkdownControl/plugins/blocks/locations/isCursorAtStartOfNonEmptyHeading.js +22 -0
  129. package/src/MarkdownControl/plugins/blocks/locations/isCursorInBlockType.js +27 -0
  130. package/src/MarkdownControl/plugins/blocks/locations/isCursorInNonDefaultBlock.js +17 -0
  131. package/src/MarkdownControl/plugins/blocks/transforms/splitIntoParagraph.js +13 -0
  132. package/src/MarkdownControl/plugins/blocks/transforms/unwrapIfCursorAtStart.js +30 -0
  133. package/src/MarkdownControl/plugins/blocks/transforms/wrapListItemsInBlock.js +11 -0
  134. package/src/MarkdownControl/plugins/blocks/withBlocks.js +15 -0
  135. package/src/MarkdownControl/plugins/inlines/events/keyDown.js +38 -0
  136. package/src/MarkdownControl/plugins/inlines/events/keyDownShiftEnter.js +28 -0
  137. package/src/MarkdownControl/plugins/inlines/events/toggleLink.js +17 -0
  138. package/src/MarkdownControl/plugins/inlines/events/toggleMark.js +13 -0
  139. package/src/MarkdownControl/plugins/inlines/locations/isMarkActive.js +11 -0
  140. package/src/MarkdownControl/plugins/inlines/selectors/getActiveLink.js +10 -0
  141. package/src/MarkdownControl/plugins/inlines/transforms/unwrapLink.js +9 -0
  142. package/src/MarkdownControl/plugins/inlines/transforms/wrapLink.js +30 -0
  143. package/src/MarkdownControl/plugins/inlines/withInlines.js +20 -0
  144. package/src/MarkdownControl/plugins/lists/events/keyDown.js +34 -0
  145. package/src/MarkdownControl/plugins/lists/events/keyDownBackspace.js +31 -0
  146. package/src/MarkdownControl/plugins/lists/events/keyDownEnter.js +39 -0
  147. package/src/MarkdownControl/plugins/lists/events/keyDownShiftTab.js +27 -0
  148. package/src/MarkdownControl/plugins/lists/events/keyDownTab.js +55 -0
  149. package/src/MarkdownControl/plugins/lists/events/toggleListType.js +23 -0
  150. package/src/MarkdownControl/plugins/lists/locations/isCursorAtListItemStart.js +13 -0
  151. package/src/MarkdownControl/plugins/lists/locations/isCursorAtNoninitialParagraphStart.js +11 -0
  152. package/src/MarkdownControl/plugins/lists/locations/isCursorInItemContainingNestedList.js +9 -0
  153. package/src/MarkdownControl/plugins/lists/locations/isCursorInListItem.js +21 -0
  154. package/src/MarkdownControl/plugins/lists/locations/isSelectionWithinNoninitialListItem.js +14 -0
  155. package/src/MarkdownControl/plugins/lists/selectors/getListContainedInListItem.js +12 -0
  156. package/src/MarkdownControl/plugins/lists/selectors/getLowestAncestorList.js +11 -0
  157. package/src/MarkdownControl/plugins/lists/selectors/getLowestAncestorQuote.js +11 -0
  158. package/src/MarkdownControl/plugins/lists/transforms/changeListType.js +16 -0
  159. package/src/MarkdownControl/plugins/lists/transforms/convertParagraphToListItem.js +19 -0
  160. package/src/MarkdownControl/plugins/lists/transforms/liftFirstMatchedParent.js +11 -0
  161. package/src/MarkdownControl/plugins/lists/transforms/liftListItem.js +30 -0
  162. package/src/MarkdownControl/plugins/lists/transforms/mergeWithPreviousListItem.js +13 -0
  163. package/src/MarkdownControl/plugins/lists/transforms/moveListToListItem.js +13 -0
  164. package/src/MarkdownControl/plugins/lists/transforms/splitListItem.js +33 -0
  165. package/src/MarkdownControl/plugins/lists/transforms/splitToNestedList.js +33 -0
  166. package/src/MarkdownControl/plugins/lists/transforms/unwrapFirstMatchedParent.js +9 -0
  167. package/src/MarkdownControl/plugins/lists/transforms/unwrapSelectionFromList.js +14 -0
  168. package/src/MarkdownControl/plugins/lists/transforms/wrapFirstMatchedParent.js +9 -0
  169. package/src/MarkdownControl/plugins/lists/transforms/wrapSelectionInList.js +17 -0
  170. package/src/MarkdownControl/plugins/lists/withLists.js +66 -0
  171. package/src/MarkdownControl/plugins/matchers/lowestMatchedAncestor.js +6 -0
  172. package/src/MarkdownControl/plugins/matchers/matchLink.js +9 -0
  173. package/src/MarkdownControl/plugins/matchers/matchedAncestors.js +18 -0
  174. package/src/MarkdownControl/plugins/shortcodes/insertShortcode.js +34 -0
  175. package/src/MarkdownControl/plugins/shortcodes/locations/isCursorInEmptyParagraph.js +17 -0
  176. package/src/MarkdownControl/plugins/shortcodes/withShortcodes.js +26 -0
  177. package/src/MarkdownControl/plugins/util.js +11 -0
  178. package/src/MarkdownControl/renderers.js +352 -0
  179. package/src/MarkdownPreview.js +27 -0
  180. package/src/__tests__/__snapshots__/renderer.spec.js.snap +239 -0
  181. package/src/__tests__/renderer.spec.js +261 -0
  182. package/src/index.js +16 -0
  183. package/src/regexHelper.js +137 -0
  184. package/src/schema.js +35 -0
  185. package/src/serializers/__tests__/__fixtures__/commonmarkExpected.json +625 -0
  186. package/src/serializers/__tests__/__fixtures__/duplicate_marks_github_issue_3280.md +1 -0
  187. package/src/serializers/__tests__/commonmark.spec.js +110 -0
  188. package/src/serializers/__tests__/index.spec.js +52 -0
  189. package/src/serializers/__tests__/remarkAllowHtmlEntities.spec.js +25 -0
  190. package/src/serializers/__tests__/remarkAssertParents.spec.js +171 -0
  191. package/src/serializers/__tests__/remarkEscapeMarkdownEntities.spec.js +84 -0
  192. package/src/serializers/__tests__/remarkPaddedLinks.spec.js +43 -0
  193. package/src/serializers/__tests__/remarkPlugins.spec.js +299 -0
  194. package/src/serializers/__tests__/remarkShortcodes.spec.js +106 -0
  195. package/src/serializers/__tests__/remarkSlate.spec.js +67 -0
  196. package/src/serializers/__tests__/remarkStripTrailingBreaks.spec.js +23 -0
  197. package/src/serializers/__tests__/slate.spec.js +300 -0
  198. package/src/serializers/index.js +226 -0
  199. package/src/serializers/rehypePaperEmoji.js +16 -0
  200. package/src/serializers/remarkAllowHtmlEntities.js +58 -0
  201. package/src/serializers/remarkAssertParents.js +83 -0
  202. package/src/serializers/remarkEscapeMarkdownEntities.js +269 -0
  203. package/src/serializers/remarkImagesToText.js +26 -0
  204. package/src/serializers/remarkPaddedLinks.js +120 -0
  205. package/src/serializers/remarkRehypeShortcodes.js +67 -0
  206. package/src/serializers/remarkShortcodes.js +106 -0
  207. package/src/serializers/remarkSlate.js +425 -0
  208. package/src/serializers/remarkSquashReferences.js +73 -0
  209. package/src/serializers/remarkStripTrailingBreaks.js +56 -0
  210. package/src/serializers/remarkWrapHtml.js +20 -0
  211. package/src/serializers/slateRemark.js +468 -0
  212. package/src/styles.js +13 -0
  213. package/src/types.js +3 -0
  214. package/test-helpers/h.js +32 -0
  215. package/webpack.config.js +3 -0
@@ -0,0 +1,512 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = slateToRemark;
7
+ var _omit2 = _interopRequireDefault(require("lodash/omit"));
8
+ var _intersection2 = _interopRequireDefault(require("lodash/intersection"));
9
+ var _map2 = _interopRequireDefault(require("lodash/map"));
10
+ var _last2 = _interopRequireDefault(require("lodash/last"));
11
+ var _without2 = _interopRequireDefault(require("lodash/without"));
12
+ var _get4 = _interopRequireDefault(require("lodash/get"));
13
+ var _unistBuilder = _interopRequireDefault(require("unist-builder"));
14
+ var _mdastUtilToString = _interopRequireDefault(require("mdast-util-to-string"));
15
+ const _excluded = ["lang", "code"],
16
+ _excluded2 = ["url", "title", "alt"];
17
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
19
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
20
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
22
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
23
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
24
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
25
+ /**
26
+ * Map of Slate node types to MDAST/Remark node types.
27
+ */
28
+ const typeMap = {
29
+ root: 'root',
30
+ paragraph: 'paragraph',
31
+ 'heading-one': 'heading',
32
+ 'heading-two': 'heading',
33
+ 'heading-three': 'heading',
34
+ 'heading-four': 'heading',
35
+ 'heading-five': 'heading',
36
+ 'heading-six': 'heading',
37
+ quote: 'blockquote',
38
+ 'code-block': 'code',
39
+ 'numbered-list': 'list',
40
+ 'bulleted-list': 'list',
41
+ 'list-item': 'listItem',
42
+ table: 'table',
43
+ 'table-row': 'tableRow',
44
+ 'table-cell': 'tableCell',
45
+ break: 'break',
46
+ 'thematic-break': 'thematicBreak',
47
+ link: 'link',
48
+ image: 'image',
49
+ shortcode: 'shortcode'
50
+ };
51
+
52
+ /**
53
+ * Map of Slate mark types to MDAST/Remark node types.
54
+ */
55
+ const markMap = {
56
+ bold: 'strong',
57
+ italic: 'emphasis',
58
+ delete: 'delete',
59
+ code: 'inlineCode'
60
+ };
61
+ const blockTypes = ['paragraph', 'quote', 'heading-one', 'heading-two', 'heading-three', 'heading-four', 'heading-five', 'heading-six', 'bulleted-list', 'numbered-list', 'list-item', 'shortcode', 'table', 'table-row', 'table-cell'];
62
+ const inlineTypes = ['link', 'image', 'break'];
63
+ const leadingWhitespaceExp = /^\s+\S/;
64
+ const trailingWhitespaceExp = /(?!\S)\s+$/;
65
+ function slateToRemark(value, {
66
+ voidCodeBlock
67
+ }) {
68
+ /**
69
+ * The Slate Raw AST generally won't have a top level type, so we set it to
70
+ * "root" for clarity.
71
+ */
72
+ const root = {
73
+ type: 'root',
74
+ children: value
75
+ };
76
+ return transform(root);
77
+
78
+ /**
79
+ * The transform function mimics the approach of a Remark plugin for
80
+ * conformity with the other serialization functions. This function converts
81
+ * Slate nodes to MDAST nodes, and recursively calls itself to process child
82
+ * nodes to arbitrary depth.
83
+ */
84
+ function transform(node) {
85
+ /**
86
+ * Combine adjacent text and inline nodes before processing so they can
87
+ * share marks.
88
+ */
89
+ const hasBlockChildren = node.children && node.children[0] && blockTypes.includes(node.children[0].type);
90
+ const children = hasBlockChildren ? node.children.map(transform).filter(v => v) : convertInlineAndTextChildren(node.children);
91
+ const output = convertBlockNode(node, children);
92
+ //console.log(JSON.stringify(output, null, 2));
93
+ return output;
94
+ }
95
+ function removeMarkFromNodes(nodes, markType) {
96
+ return nodes.map(node => {
97
+ const newNode = _objectSpread({}, node);
98
+ switch (node.type) {
99
+ case 'link':
100
+ {
101
+ const updatedNodes = removeMarkFromNodes(node.children, markType);
102
+ return _objectSpread(_objectSpread({}, node), {}, {
103
+ children: updatedNodes
104
+ });
105
+ }
106
+ case 'image':
107
+ case 'break':
108
+ {
109
+ const data = (0, _omit2.default)(node.data, 'marks');
110
+ return _objectSpread(_objectSpread({}, node), {}, {
111
+ data
112
+ });
113
+ }
114
+ default:
115
+ delete newNode[markType];
116
+ newNode.marks = newNode.marks ? newNode.marks.filter(({
117
+ type
118
+ }) => type !== markType) : [];
119
+ if (newNode.marks.length === 0) {
120
+ delete newNode.marks;
121
+ }
122
+ return newNode;
123
+ }
124
+ });
125
+ }
126
+ function getNodeMarks(node) {
127
+ switch (node.type) {
128
+ case 'link':
129
+ {
130
+ // Code marks can't always be condensed together. If all text in a link
131
+ // is wrapped in a mark, this function returns that mark and the node
132
+ // ends up nested inside of that mark. Code marks sometimes can't do
133
+ // that, like when they wrap all of the text content of a link. Here we
134
+ // remove code marks before processing so that they stay put.
135
+ const nodesWithoutCode = node.children.map(n => {
136
+ const newNode = _objectSpread({}, n);
137
+ newNode.marks = n.marks ? n.marks.filter(({
138
+ type
139
+ }) => type !== 'code') : n.marks, delete newNode.code;
140
+ return newNode;
141
+ });
142
+ const childMarks = (0, _map2.default)(nodesWithoutCode, getNodeMarks);
143
+ return (0, _intersection2.default)(...childMarks);
144
+ }
145
+ case 'break':
146
+ case 'image':
147
+ return (0, _map2.default)((0, _get4.default)(node, ['data', 'marks']), mark => mark.type);
148
+ default:
149
+ return getNodeMarkArray(node);
150
+ }
151
+ }
152
+ function getNodeMarkArray(node) {
153
+ return Object.keys(markMap).filter(mark => !!node[mark]);
154
+ }
155
+ function getSharedMarks(marks, node) {
156
+ const nodeMarks = getNodeMarks(node);
157
+ const sharedMarks = (0, _intersection2.default)(marks, nodeMarks);
158
+ if (sharedMarks[0] === 'code') {
159
+ return nodeMarks.length === 1 ? marks : [];
160
+ }
161
+ return sharedMarks;
162
+ }
163
+ function extractFirstMark(nodes) {
164
+ let firstGroupMarks = getNodeMarks(nodes[0]) || [];
165
+
166
+ // If code mark is present, but there are other marks, process others first.
167
+ // If only the code mark is present, don't allow it to be shared with other
168
+ // nodes.
169
+ if (firstGroupMarks[0] === 'code' && firstGroupMarks.length > 1) {
170
+ firstGroupMarks = [...(0, _without2.default)('firstGroupMarks', 'code'), 'code'];
171
+ }
172
+ let splitIndex = 1;
173
+ if (firstGroupMarks.length > 0) {
174
+ while (splitIndex < nodes.length) {
175
+ if (nodes[splitIndex]) {
176
+ const sharedMarks = getSharedMarks(firstGroupMarks, nodes[splitIndex]);
177
+ if (sharedMarks.length > 0) {
178
+ firstGroupMarks = sharedMarks;
179
+ } else {
180
+ break;
181
+ }
182
+ }
183
+ splitIndex += 1;
184
+ }
185
+ }
186
+ const markType = firstGroupMarks[0];
187
+ const childNodes = nodes.slice(0, splitIndex);
188
+ const updatedChildNodes = markType ? removeMarkFromNodes(childNodes, markType) : childNodes;
189
+ const remainingNodes = nodes.slice(splitIndex);
190
+ return [markType, updatedChildNodes, remainingNodes];
191
+ }
192
+
193
+ /**
194
+ * Converts the strings returned from `splitToNamedParts` to Slate nodes.
195
+ */
196
+ function splitWhitespace(node, {
197
+ trailing
198
+ } = {}) {
199
+ if (!node.text) {
200
+ return {
201
+ trimmedNode: node
202
+ };
203
+ }
204
+ const exp = trailing ? trailingWhitespaceExp : leadingWhitespaceExp;
205
+ const index = node.text.search(exp);
206
+ if (index > -1) {
207
+ const substringIndex = trailing ? index : index + 1;
208
+ const firstSplit = node.text.slice(0, substringIndex);
209
+ const secondSplit = node.text.slice(substringIndex);
210
+ const whitespace = trailing ? secondSplit : firstSplit;
211
+ const text = trailing ? firstSplit : secondSplit;
212
+ return {
213
+ whitespace,
214
+ trimmedNode: _objectSpread(_objectSpread({}, node), {}, {
215
+ text
216
+ })
217
+ };
218
+ }
219
+ return {
220
+ trimmedNode: node
221
+ };
222
+ }
223
+ function collectCenterNodes(nodes, leadingNode, trailingNode) {
224
+ switch (nodes.length) {
225
+ case 0:
226
+ return [];
227
+ case 1:
228
+ return [trailingNode];
229
+ case 2:
230
+ return [leadingNode, trailingNode];
231
+ default:
232
+ return [leadingNode, ...nodes.slice(1, -1), trailingNode];
233
+ }
234
+ }
235
+ function normalizeFlankingWhitespace(nodes) {
236
+ const {
237
+ whitespace: leadingWhitespace,
238
+ trimmedNode: leadingNode
239
+ } = splitWhitespace(nodes[0]);
240
+ const lastNode = nodes.length > 1 ? (0, _last2.default)(nodes) : leadingNode;
241
+ const trailingSplitResult = splitWhitespace(lastNode, {
242
+ trailing: true
243
+ });
244
+ const {
245
+ whitespace: trailingWhitespace,
246
+ trimmedNode: trailingNode
247
+ } = trailingSplitResult;
248
+ const centerNodes = collectCenterNodes(nodes, leadingNode, trailingNode).filter(val => val);
249
+ return {
250
+ leadingWhitespace,
251
+ centerNodes,
252
+ trailingWhitespace
253
+ };
254
+ }
255
+ function createText(text) {
256
+ return text && (0, _unistBuilder.default)('html', text);
257
+ }
258
+ function isNodeInline(node) {
259
+ return inlineTypes.includes(node.type);
260
+ }
261
+ function convertInlineAndTextChildren(nodes = []) {
262
+ const convertedNodes = [];
263
+ let remainingNodes = [...nodes];
264
+ while (remainingNodes.length > 0) {
265
+ const nextNode = remainingNodes[0];
266
+ if (isNodeInline(nextNode) || getNodeMarkArray(nextNode).length > 0) {
267
+ const [markType, markNodes, remainder] = extractFirstMark(remainingNodes);
268
+ /**
269
+ * A node with a code mark will be a text node, and will not be adjacent
270
+ * to a sibling code node as the Slate schema requires them to be
271
+ * merged. Markdown also requires at least a space between inline code
272
+ * nodes.
273
+ */
274
+ if (markType === 'code') {
275
+ const node = markNodes[0];
276
+ convertedNodes.push((0, _unistBuilder.default)(markMap[markType], node.data, node.text));
277
+ } else if (!markType && markNodes.length === 1 && isNodeInline(nextNode)) {
278
+ const node = markNodes[0];
279
+ convertedNodes.push(convertInlineNode(node, convertInlineAndTextChildren(node.children)));
280
+ } else {
281
+ const {
282
+ leadingWhitespace,
283
+ trailingWhitespace,
284
+ centerNodes
285
+ } = normalizeFlankingWhitespace(markNodes);
286
+ const children = convertInlineAndTextChildren(centerNodes);
287
+ const markNode = (0, _unistBuilder.default)(markMap[markType], children);
288
+
289
+ // Filter out empty marks, otherwise their output literally by
290
+ // remark-stringify, eg. an empty bold node becomes "****"
291
+ if ((0, _mdastUtilToString.default)(markNode) === '') {
292
+ remainingNodes = remainder;
293
+ continue;
294
+ }
295
+ const normalizedNodes = [createText(leadingWhitespace), markNode, createText(trailingWhitespace)].filter(val => val);
296
+ convertedNodes.push(...normalizedNodes);
297
+ }
298
+ remainingNodes = remainder;
299
+ } else if (nextNode.type === 'break') {
300
+ remainingNodes = remainingNodes.slice(1);
301
+ convertedNodes.push(convertInlineNode(nextNode));
302
+ } else {
303
+ remainingNodes.shift();
304
+ convertedNodes.push((0, _unistBuilder.default)('html', nextNode.text));
305
+ }
306
+ }
307
+ return convertedNodes;
308
+ }
309
+ function convertCodeBlock(node) {
310
+ return _objectSpread(_objectSpread({}, node), {}, {
311
+ type: 'code-block',
312
+ data: _objectSpread(_objectSpread({}, node.data), node.data.shortcodeData)
313
+ });
314
+ }
315
+ function convertBlockNode(node, children) {
316
+ if (node.type == 'shortcode' && node.data.shortcode == 'code-block') {
317
+ node = convertCodeBlock(node);
318
+ }
319
+ switch (node.type) {
320
+ /**
321
+ * General
322
+ *
323
+ * Convert simple cases that only require a type and children, with no
324
+ * additional properties.
325
+ */
326
+ case 'root':
327
+ case 'paragraph':
328
+ case 'quote':
329
+ case 'list-item':
330
+ case 'table':
331
+ case 'table-row':
332
+ case 'table-cell':
333
+ {
334
+ return (0, _unistBuilder.default)(typeMap[node.type], children);
335
+ }
336
+
337
+ /**
338
+ * Lists
339
+ *
340
+ * Enclose list items in paragraphs
341
+ */
342
+ // case 'list-item':
343
+ // return u(typeMap[node.type], [{ type: 'paragraph', children }]);
344
+
345
+ /**
346
+ * Shortcodes
347
+ *
348
+ * Shortcode nodes only exist in Slate's Raw AST if they were inserted
349
+ * via the plugin toolbar in memory, so they should always have
350
+ * shortcode data attached. The "shortcode" data property contains the
351
+ * name of the registered shortcode plugin, and the "shortcodeData" data
352
+ * property contains the data received from the shortcode plugin's
353
+ * `fromBlock` method when the shortcode node was created.
354
+ *
355
+ * Here we create a `shortcode` MDAST node that contains only the shortcode
356
+ * data.
357
+ */
358
+ case 'shortcode':
359
+ {
360
+ const {
361
+ data
362
+ } = node;
363
+ return (0, _unistBuilder.default)(typeMap[node.type], {
364
+ data
365
+ });
366
+ }
367
+
368
+ /**
369
+ * Headings
370
+ *
371
+ * Slate schemas don't usually infer basic type info from data, so each
372
+ * level of heading is a separately named type. The MDAST schema just
373
+ * has a single "heading" type with the depth stored in a "depth"
374
+ * property on the node. Here we derive the depth from the Slate node
375
+ * type - e.g., for "heading-two", we need a depth value of "2".
376
+ */
377
+ case 'heading-one':
378
+ case 'heading-two':
379
+ case 'heading-three':
380
+ case 'heading-four':
381
+ case 'heading-five':
382
+ case 'heading-six':
383
+ {
384
+ const depthMap = {
385
+ one: 1,
386
+ two: 2,
387
+ three: 3,
388
+ four: 4,
389
+ five: 5,
390
+ six: 6
391
+ };
392
+ const depthText = node.type.split('-')[1];
393
+ const depth = depthMap[depthText];
394
+ const mdastNode = (0, _unistBuilder.default)(typeMap[node.type], {
395
+ depth
396
+ }, children);
397
+ if ((0, _mdastUtilToString.default)(mdastNode)) {
398
+ return mdastNode;
399
+ }
400
+ return;
401
+ }
402
+
403
+ /**
404
+ * Code Blocks
405
+ *
406
+ * Code block nodes may have a single text child, or instead be void and
407
+ * store their value in `data.code`. They also may have a code language
408
+ * stored in the "lang" data property. Here we transfer both the node value
409
+ * and the "lang" data property to the new MDAST node, and spread any
410
+ * remaining data as `data`.
411
+ */
412
+ case 'code-block':
413
+ {
414
+ var _children$;
415
+ const _get2 = (0, _get4.default)(node, 'data', {}),
416
+ {
417
+ lang,
418
+ code
419
+ } = _get2,
420
+ data = _objectWithoutProperties(_get2, _excluded);
421
+ const value = voidCodeBlock ? code : (_children$ = children[0]) === null || _children$ === void 0 ? void 0 : _children$.value;
422
+ return (0, _unistBuilder.default)(typeMap[node.type], {
423
+ lang,
424
+ data
425
+ }, value || '');
426
+ }
427
+
428
+ /**
429
+ * Lists
430
+ *
431
+ * Our Slate schema has separate node types for ordered and unordered
432
+ * lists, but the MDAST spec uses a single type with a boolean "ordered"
433
+ * property to indicate whether the list is numbered. The MDAST spec also
434
+ * allows for a "start" property to indicate the first number used for an
435
+ * ordered list. Here we translate both values to our Slate schema.
436
+ */
437
+ case 'numbered-list':
438
+ case 'bulleted-list':
439
+ {
440
+ const ordered = node.type === 'numbered-list';
441
+ const props = {
442
+ ordered,
443
+ start: (0, _get4.default)(node.data, 'start') || 1
444
+ };
445
+ return (0, _unistBuilder.default)(typeMap[node.type], props, children);
446
+ }
447
+
448
+ /**
449
+ * Thematic Break
450
+ *
451
+ * Thematic break is a block level break. They cannot have children.
452
+ */
453
+ case 'thematic-break':
454
+ {
455
+ return (0, _unistBuilder.default)(typeMap[node.type]);
456
+ }
457
+ }
458
+ }
459
+ function convertInlineNode(node, children) {
460
+ switch (node.type) {
461
+ /**
462
+ * Break
463
+ *
464
+ * Breaks are phrasing level breaks. They cannot have children.
465
+ */
466
+ case 'break':
467
+ {
468
+ return (0, _unistBuilder.default)(typeMap[node.type]);
469
+ }
470
+
471
+ /**
472
+ * Links
473
+ *
474
+ * Url is now stored in data for slate, so we need to pull it out.
475
+ */
476
+ case 'link':
477
+ {
478
+ const {
479
+ title,
480
+ data
481
+ } = node;
482
+ return (0, _unistBuilder.default)(typeMap[node.type], _objectSpread({
483
+ url: data === null || data === void 0 ? void 0 : data.url,
484
+ title
485
+ }, data), children);
486
+ }
487
+
488
+ /**
489
+ * Images
490
+ *
491
+ * This transformation is almost identical to that of links, except for the
492
+ * lack of child nodes and addition of `alt` attribute data.
493
+ */
494
+ case 'image':
495
+ {
496
+ const _get3 = (0, _get4.default)(node, 'data', {}),
497
+ {
498
+ url,
499
+ title,
500
+ alt
501
+ } = _get3,
502
+ data = _objectWithoutProperties(_get3, _excluded2);
503
+ return (0, _unistBuilder.default)(typeMap[node.type], {
504
+ url,
505
+ title,
506
+ alt,
507
+ data
508
+ });
509
+ }
510
+ }
511
+ }
512
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.editorStyleVars = exports.EditorControlBar = void 0;
7
+ var _styledBase = _interopRequireDefault(require("@emotion/styled-base"));
8
+ var _decapCmsUiDefault = require("decap-cms-ui-default");
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ const editorStyleVars = {
11
+ stickyDistanceBottom: '100px'
12
+ };
13
+ exports.editorStyleVars = editorStyleVars;
14
+ const EditorControlBar = (0, _styledBase.default)("div", {
15
+ target: "ehaqqzm0",
16
+ label: "EditorControlBar"
17
+ })("z-index:", _decapCmsUiDefault.zIndex.zIndex200, ";position:sticky;top:0;margin-bottom:", editorStyleVars.stickyDistanceBottom, ";" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHlsZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTzBDIiwiZmlsZSI6Ii4uLy4uL3NyYy9zdHlsZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyB6SW5kZXggfSBmcm9tICdkZWNhcC1jbXMtdWktZGVmYXVsdCc7XG5cbmV4cG9ydCBjb25zdCBlZGl0b3JTdHlsZVZhcnMgPSB7XG4gIHN0aWNreURpc3RhbmNlQm90dG9tOiAnMTAwcHgnLFxufTtcblxuZXhwb3J0IGNvbnN0IEVkaXRvckNvbnRyb2xCYXIgPSBzdHlsZWQuZGl2YFxuICB6LWluZGV4OiAke3pJbmRleC56SW5kZXgyMDB9O1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICB0b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206ICR7ZWRpdG9yU3R5bGVWYXJzLnN0aWNreURpc3RhbmNlQm90dG9tfTtcbmA7XG4iXX0= */"));
18
+ exports.EditorControlBar = EditorControlBar;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SLATE_DEFAULT_BLOCK_TYPE = exports.SLATE_BLOCK_PARENT_TYPES = void 0;
7
+ const SLATE_DEFAULT_BLOCK_TYPE = 'paragraph';
8
+ exports.SLATE_DEFAULT_BLOCK_TYPE = SLATE_DEFAULT_BLOCK_TYPE;
9
+ const SLATE_BLOCK_PARENT_TYPES = ['list-item', 'quote'];
10
+ exports.SLATE_BLOCK_PARENT_TYPES = SLATE_BLOCK_PARENT_TYPES;
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "decap-cms-widget-markdown",
3
+ "description": "Widget for editing markdown in Decap CMS.",
4
+ "version": "2.16.0-beta.0",
5
+ "homepage": "https://www.decapcms.org/docs/widgets/#markdown",
6
+ "repository": "https://github.com/decaporg/decap-cms/tree/master/packages/decap-cms-widget-markdown",
7
+ "bugs": "https://github.com/decaporg/decap-cms/issues",
8
+ "module": "dist/esm/index.js",
9
+ "main": "dist/decap-cms-widget-markdown.js",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "decap-cms",
13
+ "widget",
14
+ "markdown",
15
+ "editor"
16
+ ],
17
+ "sideEffects": false,
18
+ "scripts": {
19
+ "develop": "yarn build:esm --watch",
20
+ "build": "cross-env NODE_ENV=production webpack",
21
+ "build:esm": "cross-env NODE_ENV=esm babel src --out-dir dist/esm --ignore \"**/__tests__\" --root-mode upward"
22
+ },
23
+ "dependencies": {
24
+ "dompurify": "^2.2.6",
25
+ "is-hotkey": "^0.2.0",
26
+ "is-url": "^1.2.4",
27
+ "mdast-util-definitions": "^1.2.3",
28
+ "mdast-util-to-string": "^1.0.5",
29
+ "rehype-parse": "^6.0.0",
30
+ "rehype-remark": "^8.0.0",
31
+ "rehype-stringify": "^7.0.0",
32
+ "remark-parse": "^6.0.3",
33
+ "remark-rehype": "^4.0.0",
34
+ "remark-slate": "^1.8.6",
35
+ "remark-slate-transformer": "^0.7.4",
36
+ "remark-stringify": "^6.0.4",
37
+ "slate": "^0.91.1",
38
+ "slate-base64-serializer": "^0.2.107",
39
+ "slate-history": "^0.93.0",
40
+ "slate-plain-serializer": "^0.7.1",
41
+ "slate-react": "^0.91.2",
42
+ "slate-soft-break": "^0.9.0",
43
+ "unified": "^7.1.0",
44
+ "unist-builder": "^1.0.3",
45
+ "unist-util-visit-parents": "^2.0.1"
46
+ },
47
+ "peerDependencies": {
48
+ "@emotion/core": "^10.0.35",
49
+ "@emotion/styled": "^10.0.27",
50
+ "decap-cms-ui-default": "^2.12.1",
51
+ "immutable": "^3.7.6",
52
+ "lodash": "^4.17.11",
53
+ "prop-types": "^15.7.2",
54
+ "react": "^16.8.4 || ^17.0.0",
55
+ "react-dom": "^16.8.4 || ^17.0.0",
56
+ "react-immutable-proptypes": "^2.1.0"
57
+ },
58
+ "devDependencies": {
59
+ "commonmark": "^0.30.0",
60
+ "commonmark-spec": "^0.30.0",
61
+ "slate-hyperscript": "^0.77.0"
62
+ },
63
+ "gitHead": "1bdf716e5655bf088a343cd90210a2d361a9db52"
64
+ }