@kerebron/extension-basic-editor 0.5.2 → 0.5.4
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/assets/image-resize.css +76 -0
- package/esm/BasicEditorKit.d.ts.map +1 -1
- package/esm/BasicEditorKit.js +7 -1
- package/esm/BasicEditorKit.js.map +1 -1
- package/esm/ExtensionBasicCodeEditor.d.ts.map +1 -1
- package/esm/ExtensionBasicCodeEditor.js +4 -2
- package/esm/ExtensionBasicCodeEditor.js.map +1 -1
- package/esm/ExtensionMediaUpload.d.ts +1 -1
- package/esm/ExtensionMediaUpload.d.ts.map +1 -1
- package/esm/ExtensionMediaUpload.js.map +1 -1
- package/esm/MarkLink.d.ts.map +1 -1
- package/esm/MarkLink.js +3 -1
- package/esm/MarkLink.js.map +1 -1
- package/esm/MarkUnderline.d.ts.map +1 -1
- package/esm/MarkUnderline.js +0 -5
- package/esm/MarkUnderline.js.map +1 -1
- package/esm/NodeBookmark.d.ts.map +1 -1
- package/esm/NodeBookmark.js +6 -2
- package/esm/NodeBookmark.js.map +1 -1
- package/esm/NodeBulletList.d.ts +8 -0
- package/esm/NodeBulletList.d.ts.map +1 -1
- package/esm/NodeBulletList.js +8 -0
- package/esm/NodeBulletList.js.map +1 -1
- package/esm/NodeCodeBlock.js +1 -1
- package/esm/NodeCodeBlock.js.map +1 -1
- package/esm/NodeCommentAnchor.d.ts +15 -0
- package/esm/NodeCommentAnchor.d.ts.map +1 -0
- package/esm/NodeCommentAnchor.js +133 -0
- package/esm/NodeCommentAnchor.js.map +1 -0
- package/esm/NodeHorizontalRule.d.ts.map +1 -1
- package/esm/NodeHorizontalRule.js +2 -1
- package/esm/NodeHorizontalRule.js.map +1 -1
- package/esm/NodeImage.d.ts +1 -1
- package/esm/NodeImage.d.ts.map +1 -1
- package/esm/NodeImage.js +4 -1
- package/esm/NodeImage.js.map +1 -1
- package/esm/NodeInlineShortCode.d.ts +1 -3
- package/esm/NodeInlineShortCode.d.ts.map +1 -1
- package/esm/NodeInlineShortCode.js +11 -3
- package/esm/NodeInlineShortCode.js.map +1 -1
- package/esm/NodeListItem.d.ts +12 -2
- package/esm/NodeListItem.d.ts.map +1 -1
- package/esm/NodeListItem.js +24 -4
- package/esm/NodeListItem.js.map +1 -1
- package/esm/NodeOrderedList.d.ts +11 -2
- package/esm/NodeOrderedList.d.ts.map +1 -1
- package/esm/NodeOrderedList.js +11 -2
- package/esm/NodeOrderedList.js.map +1 -1
- package/esm/NodeParagraph.d.ts +1 -0
- package/esm/NodeParagraph.d.ts.map +1 -1
- package/esm/NodeParagraph.js +4 -4
- package/esm/NodeParagraph.js.map +1 -1
- package/esm/NodeSoftBreak.d.ts +8 -0
- package/esm/NodeSoftBreak.d.ts.map +1 -0
- package/esm/NodeSoftBreak.js +17 -0
- package/esm/NodeSoftBreak.js.map +1 -0
- package/esm/pairing/ExtensionPairing.d.ts +7 -0
- package/esm/pairing/ExtensionPairing.d.ts.map +1 -0
- package/esm/pairing/ExtensionPairing.js +11 -0
- package/esm/pairing/ExtensionPairing.js.map +1 -0
- package/esm/pairing/PairNodesPlugin.d.ts +3 -0
- package/esm/pairing/PairNodesPlugin.d.ts.map +1 -0
- package/esm/pairing/PairNodesPlugin.js +45 -0
- package/esm/pairing/PairNodesPlugin.js.map +1 -0
- package/esm/pairing/pairNodes.d.ts +5 -0
- package/esm/pairing/pairNodes.d.ts.map +1 -0
- package/esm/pairing/pairNodes.js +81 -0
- package/esm/pairing/pairNodes.js.map +1 -0
- package/package.json +7 -3
- package/src/BasicEditorKit.ts +7 -1
- package/src/ExtensionBasicCodeEditor.ts +4 -2
- package/src/ExtensionMediaUpload.ts +1 -1
- package/src/MarkLink.ts +3 -1
- package/src/MarkUnderline.ts +0 -7
- package/src/NodeBookmark.ts +6 -2
- package/src/NodeBulletList.ts +9 -0
- package/src/NodeCodeBlock.ts +1 -1
- package/src/NodeCommentAnchor.ts +170 -0
- package/src/NodeHorizontalRule.ts +2 -1
- package/src/NodeImage.ts +6 -3
- package/src/NodeInlineShortCode.ts +17 -7
- package/src/NodeListItem.ts +35 -9
- package/src/NodeOrderedList.ts +11 -2
- package/src/NodeParagraph.ts +5 -5
- package/src/NodeSoftBreak.ts +19 -0
- package/src/pairing/ExtensionPairing.ts +14 -0
- package/src/pairing/PairNodesPlugin.ts +56 -0
- package/src/pairing/pairNodes.ts +108 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Node } from 'prosemirror-model';
|
|
2
|
+
|
|
3
|
+
import { EditorState, Transaction } from 'prosemirror-state';
|
|
4
|
+
import { CommandFactory } from '@kerebron/editor/commands';
|
|
5
|
+
import {
|
|
6
|
+
NESTING_CLOSING,
|
|
7
|
+
NESTING_OPENING,
|
|
8
|
+
NESTING_SELF_CLOSING,
|
|
9
|
+
} from '@kerebron/editor';
|
|
10
|
+
|
|
11
|
+
function generateId(): string {
|
|
12
|
+
return String(Math.random());
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type NodeAndPos = { node: Node; pos: number };
|
|
16
|
+
|
|
17
|
+
export function buildPairingTransaction(
|
|
18
|
+
state: EditorState,
|
|
19
|
+
type: string,
|
|
20
|
+
tr: Transaction,
|
|
21
|
+
) {
|
|
22
|
+
const { doc } = state;
|
|
23
|
+
|
|
24
|
+
const stackMap: Map<string, Array<NodeAndPos>> = new Map();
|
|
25
|
+
const nodes: Array<NodeAndPos> = [];
|
|
26
|
+
|
|
27
|
+
doc.descendants((node, pos) => {
|
|
28
|
+
if (node.type.name === type) {
|
|
29
|
+
nodes.push({ node, pos });
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
let modified = false;
|
|
34
|
+
|
|
35
|
+
for (const { node, pos } of nodes) {
|
|
36
|
+
const raw = node.attrs.content?.trim();
|
|
37
|
+
if (!raw) continue;
|
|
38
|
+
|
|
39
|
+
const match = raw.match(/^[^0-9a-z\/]*(\/?)[\s]*([\w]+)/i);
|
|
40
|
+
const isClosing = match[1] === '/';
|
|
41
|
+
const name = match[2];
|
|
42
|
+
|
|
43
|
+
if (!isClosing) {
|
|
44
|
+
if (!stackMap.has(name)) {
|
|
45
|
+
stackMap.set(name, []);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
stackMap.get(name)!.push({ node, pos });
|
|
49
|
+
} else {
|
|
50
|
+
const stack = stackMap.get(name);
|
|
51
|
+
|
|
52
|
+
if (stack && stack.length > 0) {
|
|
53
|
+
const opening = stack.pop()!;
|
|
54
|
+
const id = generateId();
|
|
55
|
+
|
|
56
|
+
tr.setNodeMarkup(opening.pos, undefined, {
|
|
57
|
+
...opening.node.attrs,
|
|
58
|
+
id,
|
|
59
|
+
nesting: NESTING_OPENING,
|
|
60
|
+
error: undefined,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
tr.setNodeMarkup(pos, undefined, {
|
|
64
|
+
...node.attrs,
|
|
65
|
+
id,
|
|
66
|
+
nesting: NESTING_CLOSING,
|
|
67
|
+
error: undefined,
|
|
68
|
+
});
|
|
69
|
+
} else {
|
|
70
|
+
tr.setNodeMarkup(pos, undefined, {
|
|
71
|
+
...node.attrs,
|
|
72
|
+
error: 'Closing shortcode without matching opening',
|
|
73
|
+
nesting: NESTING_CLOSING,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
modified = true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Any leftover openings are self-closing (no matching close)
|
|
82
|
+
for (const [, stack] of stackMap.entries()) {
|
|
83
|
+
for (const { node, pos } of stack) {
|
|
84
|
+
tr.setNodeMarkup(pos, undefined, {
|
|
85
|
+
...node.attrs,
|
|
86
|
+
nesting: NESTING_SELF_CLOSING,
|
|
87
|
+
id: undefined,
|
|
88
|
+
});
|
|
89
|
+
modified = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return modified ? tr : null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const pairNodes: CommandFactory = (type: string) => {
|
|
97
|
+
return (state: EditorState, dispatch) => {
|
|
98
|
+
const tr = buildPairingTransaction(state, type, state.tr);
|
|
99
|
+
if (!tr) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (dispatch) {
|
|
104
|
+
dispatch(tr);
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
};
|
|
108
|
+
};
|