decap-cms-widget-markdown 3.12.0 → 3.13.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.
- package/CHANGELOG.md +12 -0
- package/dist/decap-cms-widget-markdown.js +6 -6
- package/dist/decap-cms-widget-markdown.js.map +1 -1
- package/dist/esm/MarkdownControl/Toolbar.js +6 -6
- package/dist/esm/MarkdownControl/VisualEditor.js +7 -3
- package/dist/esm/MarkdownControl/components/InlineShortcode.js +67 -0
- package/dist/esm/MarkdownControl/index.js +2 -2
- package/dist/esm/MarkdownControl/plugins/shortcodes/insertShortcode.js +53 -4
- package/dist/esm/MarkdownControl/plugins/shortcodes/withShortcodes.js +11 -1
- package/dist/esm/MarkdownControl/renderers.js +21 -16
- package/dist/esm/MarkdownPreview.js +37 -3
- package/dist/esm/serializers/remarkRehypeShortcodes.js +18 -15
- package/dist/esm/serializers/remarkShortcodes.js +118 -12
- package/dist/esm/serializers/remarkSlate.js +14 -1
- package/dist/esm/serializers/slateRemark.js +18 -2
- package/package.json +23 -13
- package/src/MarkdownControl/Toolbar.js +2 -2
- package/src/MarkdownControl/VisualEditor.js +5 -1
- package/src/MarkdownControl/components/InlineShortcode.js +77 -0
- package/src/MarkdownControl/components/__tests__/InlineShortcode.spec.js +81 -0
- package/src/MarkdownControl/index.js +2 -2
- package/src/MarkdownControl/plugins/shortcodes/__tests__/insertShortcode.spec.js +106 -0
- package/src/MarkdownControl/plugins/shortcodes/insertShortcode.js +59 -6
- package/src/MarkdownControl/plugins/shortcodes/withShortcodes.js +12 -2
- package/src/MarkdownControl/renderers.js +3 -0
- package/src/MarkdownPreview.js +38 -3
- package/src/__tests__/renderer.spec.js +68 -0
- package/src/serializers/__tests__/remarkShortcodes.spec.js +210 -1
- package/src/serializers/__tests__/slate.spec.js +80 -0
- package/src/serializers/remarkRehypeShortcodes.js +19 -9
- package/src/serializers/remarkShortcodes.js +140 -12
- package/src/serializers/remarkSlate.js +7 -0
- package/src/serializers/slateRemark.js +13 -2
- package/LICENSE +0 -22
- package/dist/esm/MarkdownControl/plugins/BreakToDefaultBlock.js +0 -26
- package/dist/esm/MarkdownControl/plugins/CloseBlock.js +0 -28
- package/dist/esm/MarkdownControl/plugins/CommandsAndQueries.js +0 -180
- package/dist/esm/MarkdownControl/plugins/ForceInsert.js +0 -42
- package/dist/esm/MarkdownControl/plugins/Hotkey.js +0 -26
- package/dist/esm/MarkdownControl/plugins/LineBreak.js +0 -13
- package/dist/esm/MarkdownControl/plugins/Link.js +0 -49
- package/dist/esm/MarkdownControl/plugins/lists/locations/isCursorInItemContainingNestedList.js +0 -6
- package/dist/esm/MarkdownControl/plugins/util.js +0 -11
- package/dist/esm/serializers/remarkImagesToText.js +0 -31
- package/dist/esm/types.js +0 -2
|
@@ -1,14 +1,63 @@
|
|
|
1
|
-
import { Transforms } from 'slate';
|
|
1
|
+
import { Editor, Range, Transforms } from 'slate';
|
|
2
2
|
import isCursorInEmptyParagraph from './locations/isCursorInEmptyParagraph';
|
|
3
|
-
function insertShortcode(editor, pluginConfig) {
|
|
4
|
-
|
|
3
|
+
async function insertShortcode(editor, pluginConfig, cmsContext = {}) {
|
|
4
|
+
if (pluginConfig.type === 'inline') {
|
|
5
|
+
const selectionRef = editor.selection ? Editor.rangeRef(editor, editor.selection) : null;
|
|
6
|
+
let selectedText = '';
|
|
7
|
+
if (editor.selection && Range.isRange(editor.selection)) {
|
|
8
|
+
selectedText = Editor.string(editor, editor.selection);
|
|
9
|
+
}
|
|
10
|
+
let shortcodeData = {};
|
|
11
|
+
if (typeof pluginConfig.onInsert === 'function') {
|
|
12
|
+
try {
|
|
13
|
+
const result = await pluginConfig.onInsert({
|
|
14
|
+
selectedText,
|
|
15
|
+
cmsContext
|
|
16
|
+
});
|
|
17
|
+
if (result === null || result === undefined) {
|
|
18
|
+
selectionRef?.unref();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
shortcodeData = result;
|
|
22
|
+
} catch (err) {
|
|
23
|
+
selectionRef?.unref();
|
|
24
|
+
console.error(`Error in onInsert for inline component '${pluginConfig.id}':`, err);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
} else if (pluginConfig.fields) {
|
|
28
|
+
const defaultValues = pluginConfig.fields.toMap().mapKeys((_, field) => field.get('name')).map(field => field.get('default', ''));
|
|
29
|
+
shortcodeData = defaultValues.toJS();
|
|
30
|
+
}
|
|
31
|
+
const nodeData = {
|
|
32
|
+
type: 'inline-shortcode',
|
|
33
|
+
id: pluginConfig.id,
|
|
34
|
+
data: {
|
|
35
|
+
shortcode: pluginConfig.id,
|
|
36
|
+
shortcodeNew: true,
|
|
37
|
+
shortcodeData,
|
|
38
|
+
isVoid: true
|
|
39
|
+
},
|
|
40
|
+
children: [{
|
|
41
|
+
text: ''
|
|
42
|
+
}]
|
|
43
|
+
};
|
|
44
|
+
const at = selectionRef?.unref();
|
|
45
|
+
if (selectionRef && !at) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
Transforms.insertNodes(editor, nodeData, at ? {
|
|
49
|
+
at
|
|
50
|
+
} : undefined);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const defaultValues = pluginConfig.fields ? pluginConfig.fields.toMap().mapKeys((_, field) => field.get('name')).map(field => field.get('default', '')).toJS() : {};
|
|
5
54
|
const nodeData = {
|
|
6
55
|
type: 'shortcode',
|
|
7
56
|
id: pluginConfig.id,
|
|
8
57
|
data: {
|
|
9
58
|
shortcode: pluginConfig.id,
|
|
10
59
|
shortcodeNew: true,
|
|
11
|
-
shortcodeData: defaultValues
|
|
60
|
+
shortcodeData: defaultValues
|
|
12
61
|
},
|
|
13
62
|
children: [{
|
|
14
63
|
text: ''
|
|
@@ -3,10 +3,20 @@ import defaultEmptyBlock from '../blocks/defaultEmptyBlock';
|
|
|
3
3
|
function withShortcodes(editor) {
|
|
4
4
|
const {
|
|
5
5
|
isVoid,
|
|
6
|
+
isInline,
|
|
6
7
|
normalizeNode
|
|
7
8
|
} = editor;
|
|
8
9
|
editor.isVoid = element => {
|
|
9
|
-
|
|
10
|
+
if (element.type === 'shortcode') {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
if (element.type === 'inline-shortcode') {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
return isVoid(element);
|
|
17
|
+
};
|
|
18
|
+
editor.isInline = element => {
|
|
19
|
+
return element.type === 'inline-shortcode' ? true : isInline(element);
|
|
10
20
|
};
|
|
11
21
|
|
|
12
22
|
// Prevent empty editor after deleting shortcode theat was only child
|