@krainovsd/markdown-editor 0.3.1 → 0.4.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/lib/cjs/{index-DXevyHeZ.js → index-CXENq_0E.js} +10 -6
- package/lib/cjs/index-CXENq_0E.js.map +1 -0
- package/lib/cjs/{index-nRNnOuav.js → index-Dj0jRUGF.js} +465 -38
- package/lib/cjs/index-Dj0jRUGF.js.map +1 -0
- package/lib/cjs/index.js +2 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/esm/extensions/auto-completes/custom/tag-auto-complete.js +33 -0
- package/lib/esm/extensions/auto-completes/custom/tag-auto-complete.js.map +1 -0
- package/lib/esm/extensions/auto-completes/init-auto-complete.js +27 -0
- package/lib/esm/extensions/auto-completes/init-auto-complete.js.map +1 -0
- package/lib/esm/extensions/init-extensions.js +3 -1
- package/lib/esm/extensions/init-extensions.js.map +1 -1
- package/lib/esm/extensions/keymaps/custom/bold-key-map.js +56 -0
- package/lib/esm/extensions/keymaps/custom/bold-key-map.js.map +1 -0
- package/lib/esm/extensions/keymaps/custom/italic-key-map.js +57 -0
- package/lib/esm/extensions/keymaps/custom/italic-key-map.js.map +1 -0
- package/lib/esm/extensions/keymaps/custom/link-key-map.js +28 -0
- package/lib/esm/extensions/keymaps/custom/link-key-map.js.map +1 -0
- package/lib/esm/extensions/keymaps/init-key-map.js +4 -1
- package/lib/esm/extensions/keymaps/init-key-map.js.map +1 -1
- package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js +1 -1
- package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js.map +1 -1
- package/lib/esm/extensions/markdown/bold/bold-constants.js +1 -1
- package/lib/esm/extensions/markdown/bold/bold-constants.js.map +1 -1
- package/lib/esm/extensions/markdown/code/code-constants.js +3 -1
- package/lib/esm/extensions/markdown/code/code-constants.js.map +1 -1
- package/lib/esm/extensions/markdown/code/code-decoration.js +32 -1
- package/lib/esm/extensions/markdown/code/code-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/image/image-decoration.js +2 -3
- package/lib/esm/extensions/markdown/image/image-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/image/image-widget.js +47 -4
- package/lib/esm/extensions/markdown/image/image-widget.js.map +1 -1
- package/lib/esm/extensions/markdown/italic/italic-decoration.js +6 -4
- package/lib/esm/extensions/markdown/italic/italic-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/link/link-decoration.js +2 -2
- package/lib/esm/extensions/markdown/link/link-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/link/link-widget.js +23 -0
- package/lib/esm/extensions/markdown/link/link-widget.js.map +1 -1
- package/lib/esm/extensions/markdown/markdown-decoration.js +5 -10
- package/lib/esm/extensions/markdown/markdown-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/markdown-state.js +1 -5
- package/lib/esm/extensions/markdown/markdown-state.js.map +1 -1
- package/lib/esm/extensions/markdown/mention/mention-constants.js +4 -3
- package/lib/esm/extensions/markdown/mention/mention-constants.js.map +1 -1
- package/lib/esm/extensions/markdown/mention/mention-parser.js +8 -5
- package/lib/esm/extensions/markdown/mention/mention-parser.js.map +1 -1
- package/lib/esm/extensions/markdown/styles.module.scss.js +2 -2
- package/lib/esm/extensions/theme/theme-constants.js +2 -0
- package/lib/esm/extensions/theme/theme-constants.js.map +1 -1
- package/lib/esm/extensions/theme/themes/get-dark-theme.js +2 -0
- package/lib/esm/extensions/theme/themes/get-dark-theme.js.map +1 -1
- package/lib/esm/extensions/theme/themes/get-light-theme.js +2 -0
- package/lib/esm/extensions/theme/themes/get-light-theme.js.map +1 -1
- package/lib/esm/extensions/theme/themes/get-theme-template.js +6 -0
- package/lib/esm/extensions/theme/themes/get-theme-template.js.map +1 -1
- package/lib/esm/index.js +1 -0
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/lib/utils/overlap-mark.js +148 -0
- package/lib/esm/lib/utils/overlap-mark.js.map +1 -0
- package/lib/esm/module/Editor/Editor.js +1 -0
- package/lib/esm/module/Editor/Editor.js.map +1 -1
- package/lib/index.d.ts +14 -1
- package/package.json +2 -1
- package/lib/cjs/index-DXevyHeZ.js.map +0 -1
- package/lib/cjs/index-nRNnOuav.js.map +0 -1
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
function overlapMark({ marks, shift, state, requireMatched }) {
|
|
2
|
+
const { from, to, shiftAfterInner, shiftAfterOuter, shiftBeforeInner, shiftBeforeOuter, text } = processShiftContent(state, shift, marks);
|
|
3
|
+
const startIndex = findMarkIndex(text.substring(0, shiftBeforeInner + shiftBeforeOuter), marks, requireMatched, "right");
|
|
4
|
+
const endIndex = findMarkIndex(text.substring(text.length - shiftAfterInner - shiftAfterOuter), marks, requireMatched, "left");
|
|
5
|
+
const start = ~startIndex ? from - shiftBeforeOuter + startIndex : -1;
|
|
6
|
+
const end = ~endIndex ? to - shiftAfterInner + endIndex : -1;
|
|
7
|
+
// console.log({
|
|
8
|
+
// from,
|
|
9
|
+
// to,
|
|
10
|
+
// shiftAfterInner,
|
|
11
|
+
// shiftAfterOuter,
|
|
12
|
+
// shiftBeforeInner,
|
|
13
|
+
// shiftBeforeOuter,
|
|
14
|
+
// text,
|
|
15
|
+
// textStart: text.substring(0, shiftBeforeInner + shiftBeforeOuter),
|
|
16
|
+
// textEnd: text.substring(text.length - shiftAfterInner - shiftAfterOuter),
|
|
17
|
+
// startIndex,
|
|
18
|
+
// endIndex,
|
|
19
|
+
// end,
|
|
20
|
+
// start,
|
|
21
|
+
// });
|
|
22
|
+
return {
|
|
23
|
+
start,
|
|
24
|
+
end,
|
|
25
|
+
marked: Boolean(~start || ~end),
|
|
26
|
+
originalText: text.substring(shiftBeforeOuter, text.length - shiftAfterOuter),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function findMarkIndex(text, marks, requireMatched, direction = "right") {
|
|
30
|
+
if (text.length === 0)
|
|
31
|
+
return -1;
|
|
32
|
+
const maxRequired = Math.max(...requireMatched);
|
|
33
|
+
const minRequired = Math.min(...requireMatched);
|
|
34
|
+
let pos = 0;
|
|
35
|
+
let matched = 0;
|
|
36
|
+
let start = -1;
|
|
37
|
+
for (const mark of marks) {
|
|
38
|
+
if (!mark)
|
|
39
|
+
continue;
|
|
40
|
+
while (pos < text.length) {
|
|
41
|
+
if (text.codePointAt(pos) === mark)
|
|
42
|
+
matched++;
|
|
43
|
+
else {
|
|
44
|
+
if (
|
|
45
|
+
// eslint-disable-next-line no-loop-func -- https://eslint.org/docs/latest/rules/no-loop-func#known-limitations
|
|
46
|
+
requireMatched.some((rm) => rm === matched) &&
|
|
47
|
+
((direction === "right" && pos - matched > start) ||
|
|
48
|
+
(direction === "left" && (pos - matched < start || start === -1)))) {
|
|
49
|
+
start = direction === "right" ? pos - minRequired : pos - matched;
|
|
50
|
+
// console.log({ pos, matched, start, minRequired, maxRequired, direction });
|
|
51
|
+
}
|
|
52
|
+
else if (maxRequired < matched) {
|
|
53
|
+
const posMin = pos - minRequired;
|
|
54
|
+
const posMax = pos - matched;
|
|
55
|
+
// console.log({ posMin, posMax, pos, minRequired, maxRequired, direction, matched });
|
|
56
|
+
if (direction === "right" && posMin > start)
|
|
57
|
+
start = posMin;
|
|
58
|
+
if (direction === "left" && (posMax < start || start === -1))
|
|
59
|
+
start = posMax;
|
|
60
|
+
}
|
|
61
|
+
matched = 0;
|
|
62
|
+
}
|
|
63
|
+
pos++;
|
|
64
|
+
}
|
|
65
|
+
if (
|
|
66
|
+
// eslint-disable-next-line no-loop-func -- https://eslint.org/docs/latest/rules/no-loop-func#known-limitations
|
|
67
|
+
requireMatched.some((rm) => rm === matched) &&
|
|
68
|
+
((direction === "right" && pos - matched > start) ||
|
|
69
|
+
(direction === "left" && (pos - matched < start || start === -1)))) {
|
|
70
|
+
start = direction === "right" ? pos - minRequired : pos - matched;
|
|
71
|
+
// console.log({ pos, matched, start, minRequired, maxRequired, direction });
|
|
72
|
+
}
|
|
73
|
+
else if (maxRequired < matched) {
|
|
74
|
+
const posMin = pos - minRequired;
|
|
75
|
+
const posMax = pos - matched;
|
|
76
|
+
// console.log({ posMin, posMax, pos, minRequired, maxRequired, direction, matched });
|
|
77
|
+
if (direction === "right" && posMin > start)
|
|
78
|
+
start = posMin;
|
|
79
|
+
if (direction === "left" && (posMax < start || start === -1))
|
|
80
|
+
start = posMax;
|
|
81
|
+
}
|
|
82
|
+
pos = 0;
|
|
83
|
+
matched = 0;
|
|
84
|
+
}
|
|
85
|
+
return start;
|
|
86
|
+
}
|
|
87
|
+
function processShiftContent(state, shift, marks) {
|
|
88
|
+
const { from, to } = state.selection.ranges[0];
|
|
89
|
+
const linePoint = state.lineBreak.codePointAt(0);
|
|
90
|
+
let pos = 0;
|
|
91
|
+
/** processing outer shifts */
|
|
92
|
+
const initialTextBefore = state.sliceDoc(from - shift, from);
|
|
93
|
+
let shiftBeforeOuter = 0;
|
|
94
|
+
pos = initialTextBefore.length - 1;
|
|
95
|
+
while (pos > -1) {
|
|
96
|
+
if (initialTextBefore.codePointAt(pos) === linePoint)
|
|
97
|
+
break;
|
|
98
|
+
shiftBeforeOuter++;
|
|
99
|
+
pos--;
|
|
100
|
+
}
|
|
101
|
+
const initialTextAfter = state.sliceDoc(to, to + shift);
|
|
102
|
+
let shiftAfterOuter = 0;
|
|
103
|
+
pos = 0;
|
|
104
|
+
while (pos < initialTextAfter.length) {
|
|
105
|
+
if (initialTextAfter.codePointAt(pos) === linePoint)
|
|
106
|
+
break;
|
|
107
|
+
shiftAfterOuter++;
|
|
108
|
+
pos++;
|
|
109
|
+
}
|
|
110
|
+
/** processing inner shifts */
|
|
111
|
+
const initialText = state.sliceDoc(from, to);
|
|
112
|
+
let shiftBeforeInner = 0;
|
|
113
|
+
pos = 0;
|
|
114
|
+
if (initialText.length > 1)
|
|
115
|
+
while (pos < initialText.length) {
|
|
116
|
+
// eslint-disable-next-line no-loop-func -- https://eslint.org/docs/latest/rules/no-loop-func#known-limitations
|
|
117
|
+
if (marks.some((m) => m === initialText.codePointAt(pos)))
|
|
118
|
+
shiftBeforeInner++;
|
|
119
|
+
else
|
|
120
|
+
break;
|
|
121
|
+
pos++;
|
|
122
|
+
}
|
|
123
|
+
const initialTextWithoutBeforeShift = initialText.substring(shiftBeforeInner + 1);
|
|
124
|
+
let shiftAfterInner = 0;
|
|
125
|
+
pos = initialTextWithoutBeforeShift.length - 1;
|
|
126
|
+
if (initialText.length > 1 || shiftBeforeInner > 0)
|
|
127
|
+
while (pos > -1) {
|
|
128
|
+
// eslint-disable-next-line no-loop-func -- https://eslint.org/docs/latest/rules/no-loop-func#known-limitations
|
|
129
|
+
if (marks.some((m) => m === initialTextWithoutBeforeShift.codePointAt(pos)))
|
|
130
|
+
shiftAfterInner++;
|
|
131
|
+
else
|
|
132
|
+
break;
|
|
133
|
+
pos--;
|
|
134
|
+
}
|
|
135
|
+
const text = state.sliceDoc(from - shiftBeforeOuter, to + shiftAfterOuter);
|
|
136
|
+
return {
|
|
137
|
+
from,
|
|
138
|
+
to,
|
|
139
|
+
shiftBeforeOuter,
|
|
140
|
+
shiftBeforeInner,
|
|
141
|
+
shiftAfterOuter,
|
|
142
|
+
shiftAfterInner,
|
|
143
|
+
text,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export { overlapMark };
|
|
148
|
+
//# sourceMappingURL=overlap-mark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlap-mark.js","sources":["../../../../src/lib/utils/overlap-mark.ts"],"sourcesContent":["import type { EditorState } from \"@codemirror/state\";\n\ntype OverlapMarkOptions = {\n state: EditorState;\n shift: number;\n marks: (number | undefined)[];\n requireMatched: number[];\n};\n\nexport function overlapMark({ marks, shift, state, requireMatched }: OverlapMarkOptions) {\n const { from, to, shiftAfterInner, shiftAfterOuter, shiftBeforeInner, shiftBeforeOuter, text } =\n processShiftContent(state, shift, marks);\n\n const startIndex = findMarkIndex(\n text.substring(0, shiftBeforeInner + shiftBeforeOuter),\n marks,\n requireMatched,\n \"right\",\n );\n const endIndex = findMarkIndex(\n text.substring(text.length - shiftAfterInner - shiftAfterOuter),\n marks,\n requireMatched,\n \"left\",\n );\n\n const start = ~startIndex ? from - shiftBeforeOuter + startIndex : -1;\n const end = ~endIndex ? to - shiftAfterInner + endIndex : -1;\n\n // console.log({\n // from,\n // to,\n // shiftAfterInner,\n // shiftAfterOuter,\n // shiftBeforeInner,\n // shiftBeforeOuter,\n // text,\n // textStart: text.substring(0, shiftBeforeInner + shiftBeforeOuter),\n // textEnd: text.substring(text.length - shiftAfterInner - shiftAfterOuter),\n // startIndex,\n // endIndex,\n // end,\n // start,\n // });\n\n return {\n start,\n end,\n marked: Boolean(~start || ~end),\n originalText: text.substring(shiftBeforeOuter, text.length - shiftAfterOuter),\n };\n}\n\nfunction findMarkIndex(\n text: string,\n marks: (number | undefined)[],\n requireMatched: number[],\n direction: \"right\" | \"left\" = \"right\",\n) {\n if (text.length === 0) return -1;\n\n const maxRequired = Math.max(...requireMatched);\n const minRequired = Math.min(...requireMatched);\n\n let pos = 0;\n let matched = 0;\n let start = -1;\n\n for (const mark of marks) {\n if (!mark) continue;\n\n while (pos < text.length) {\n if (text.codePointAt(pos) === mark) matched++;\n else {\n if (\n // eslint-disable-next-line no-loop-func -- https://eslint.org/docs/latest/rules/no-loop-func#known-limitations\n requireMatched.some((rm) => rm === matched) &&\n ((direction === \"right\" && pos - matched > start) ||\n (direction === \"left\" && (pos - matched < start || start === -1)))\n ) {\n start = direction === \"right\" ? pos - minRequired : pos - matched;\n // console.log({ pos, matched, start, minRequired, maxRequired, direction });\n } else if (maxRequired < matched) {\n const posMin = pos - minRequired;\n const posMax = pos - matched;\n\n // console.log({ posMin, posMax, pos, minRequired, maxRequired, direction, matched });\n\n if (direction === \"right\" && posMin > start) start = posMin;\n if (direction === \"left\" && (posMax < start || start === -1)) start = posMax;\n }\n matched = 0;\n }\n pos++;\n }\n\n if (\n // eslint-disable-next-line no-loop-func -- https://eslint.org/docs/latest/rules/no-loop-func#known-limitations\n requireMatched.some((rm) => rm === matched) &&\n ((direction === \"right\" && pos - matched > start) ||\n (direction === \"left\" && (pos - matched < start || start === -1)))\n ) {\n start = direction === \"right\" ? pos - minRequired : pos - matched;\n // console.log({ pos, matched, start, minRequired, maxRequired, direction });\n } else if (maxRequired < matched) {\n const posMin = pos - minRequired;\n const posMax = pos - matched;\n\n // console.log({ posMin, posMax, pos, minRequired, maxRequired, direction, matched });\n\n if (direction === \"right\" && posMin > start) start = posMin;\n if (direction === \"left\" && (posMax < start || start === -1)) start = posMax;\n }\n\n pos = 0;\n matched = 0;\n }\n\n return start;\n}\n\nfunction processShiftContent(state: EditorState, shift: number, marks: (number | undefined)[]) {\n const { from, to } = state.selection.ranges[0];\n const linePoint = state.lineBreak.codePointAt(0);\n let pos = 0;\n\n /** processing outer shifts */\n const initialTextBefore = state.sliceDoc(from - shift, from);\n let shiftBeforeOuter = 0;\n pos = initialTextBefore.length - 1;\n\n while (pos > -1) {\n if (initialTextBefore.codePointAt(pos) === linePoint) break;\n shiftBeforeOuter++;\n pos--;\n }\n\n const initialTextAfter = state.sliceDoc(to, to + shift);\n let shiftAfterOuter = 0;\n pos = 0;\n\n while (pos < initialTextAfter.length) {\n if (initialTextAfter.codePointAt(pos) === linePoint) break;\n shiftAfterOuter++;\n pos++;\n }\n\n /** processing inner shifts */\n const initialText = state.sliceDoc(from, to);\n let shiftBeforeInner = 0;\n pos = 0;\n\n if (initialText.length > 1)\n while (pos < initialText.length) {\n // eslint-disable-next-line no-loop-func -- https://eslint.org/docs/latest/rules/no-loop-func#known-limitations\n if (marks.some((m) => m === initialText.codePointAt(pos))) shiftBeforeInner++;\n else break;\n\n pos++;\n }\n\n const initialTextWithoutBeforeShift = initialText.substring(shiftBeforeInner + 1);\n let shiftAfterInner = 0;\n pos = initialTextWithoutBeforeShift.length - 1;\n\n if (initialText.length > 1 || shiftBeforeInner > 0)\n while (pos > -1) {\n // eslint-disable-next-line no-loop-func -- https://eslint.org/docs/latest/rules/no-loop-func#known-limitations\n if (marks.some((m) => m === initialTextWithoutBeforeShift.codePointAt(pos)))\n shiftAfterInner++;\n else break;\n\n pos--;\n }\n\n const text = state.sliceDoc(from - shiftBeforeOuter, to + shiftAfterOuter);\n\n return {\n from,\n to,\n shiftBeforeOuter,\n shiftBeforeInner,\n shiftAfterOuter,\n shiftAfterInner,\n text,\n };\n}\n"],"names":[],"mappings":"AASM,SAAU,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAsB,EAAA;IACrF,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAC5F,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IAE1C,MAAM,UAAU,GAAG,aAAa,CAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAAC,EACtD,KAAK,EACL,cAAc,EACd,OAAO,CACR;IACD,MAAM,QAAQ,GAAG,aAAa,CAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,GAAG,eAAe,CAAC,EAC/D,KAAK,EACL,cAAc,EACd,MAAM,CACP;AAED,IAAA,MAAM,KAAK,GAAG,CAAC,UAAU,GAAG,IAAI,GAAG,gBAAgB,GAAG,UAAU,GAAG,CAAC,CAAC;AACrE,IAAA,MAAM,GAAG,GAAG,CAAC,QAAQ,GAAG,EAAE,GAAG,eAAe,GAAG,QAAQ,GAAG,CAAC,CAAC;;;;;;;;;;;;;;;;IAkB5D,OAAO;QACL,KAAK;QACL,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC;AAC/B,QAAA,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC;KAC9E;AACH;AAEA,SAAS,aAAa,CACpB,IAAY,EACZ,KAA6B,EAC7B,cAAwB,EACxB,SAAA,GAA8B,OAAO,EAAA;AAErC,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEhC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;IAE/C,IAAI,GAAG,GAAG,CAAC;IACX,IAAI,OAAO,GAAG,CAAC;AACf,IAAA,IAAI,KAAK,GAAG,CAAC,CAAC;AAEd,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,IAAI,CAAC,IAAI;YAAE;AAEX,QAAA,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI;AAAE,gBAAA,OAAO,EAAE;iBACxC;AACH,gBAAA;;gBAEE,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC;qBAC1C,CAAC,SAAS,KAAK,OAAO,IAAI,GAAG,GAAG,OAAO,GAAG,KAAK;AAC9C,yBAAC,SAAS,KAAK,MAAM,KAAK,GAAG,GAAG,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EACpE;AACA,oBAAA,KAAK,GAAG,SAAS,KAAK,OAAO,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,GAAG,OAAO;;;AAE5D,qBAAA,IAAI,WAAW,GAAG,OAAO,EAAE;AAChC,oBAAA,MAAM,MAAM,GAAG,GAAG,GAAG,WAAW;AAChC,oBAAA,MAAM,MAAM,GAAG,GAAG,GAAG,OAAO;;AAI5B,oBAAA,IAAI,SAAS,KAAK,OAAO,IAAI,MAAM,GAAG,KAAK;wBAAE,KAAK,GAAG,MAAM;AAC3D,oBAAA,IAAI,SAAS,KAAK,MAAM,KAAK,MAAM,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;wBAAE,KAAK,GAAG,MAAM;;gBAE9E,OAAO,GAAG,CAAC;;AAEb,YAAA,GAAG,EAAE;;AAGP,QAAA;;QAEE,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC;aAC1C,CAAC,SAAS,KAAK,OAAO,IAAI,GAAG,GAAG,OAAO,GAAG,KAAK;AAC9C,iBAAC,SAAS,KAAK,MAAM,KAAK,GAAG,GAAG,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EACpE;AACA,YAAA,KAAK,GAAG,SAAS,KAAK,OAAO,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,GAAG,OAAO;;;AAE5D,aAAA,IAAI,WAAW,GAAG,OAAO,EAAE;AAChC,YAAA,MAAM,MAAM,GAAG,GAAG,GAAG,WAAW;AAChC,YAAA,MAAM,MAAM,GAAG,GAAG,GAAG,OAAO;;AAI5B,YAAA,IAAI,SAAS,KAAK,OAAO,IAAI,MAAM,GAAG,KAAK;gBAAE,KAAK,GAAG,MAAM;AAC3D,YAAA,IAAI,SAAS,KAAK,MAAM,KAAK,MAAM,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;gBAAE,KAAK,GAAG,MAAM;;QAG9E,GAAG,GAAG,CAAC;QACP,OAAO,GAAG,CAAC;;AAGb,IAAA,OAAO,KAAK;AACd;AAEA,SAAS,mBAAmB,CAAC,KAAkB,EAAE,KAAa,EAAE,KAA6B,EAAA;AAC3F,IAAA,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAChD,IAAI,GAAG,GAAG,CAAC;;AAGX,IAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC;IAC5D,IAAI,gBAAgB,GAAG,CAAC;AACxB,IAAA,GAAG,GAAG,iBAAiB,CAAC,MAAM,GAAG,CAAC;AAElC,IAAA,OAAO,GAAG,GAAG,CAAC,CAAC,EAAE;AACf,QAAA,IAAI,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE;AACtD,QAAA,gBAAgB,EAAE;AAClB,QAAA,GAAG,EAAE;;AAGP,IAAA,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IACvD,IAAI,eAAe,GAAG,CAAC;IACvB,GAAG,GAAG,CAAC;AAEP,IAAA,OAAO,GAAG,GAAG,gBAAgB,CAAC,MAAM,EAAE;AACpC,QAAA,IAAI,gBAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE;AACrD,QAAA,eAAe,EAAE;AACjB,QAAA,GAAG,EAAE;;;IAIP,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IAC5C,IAAI,gBAAgB,GAAG,CAAC;IACxB,GAAG,GAAG,CAAC;AAEP,IAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;AACxB,QAAA,OAAO,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE;;AAE/B,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AAAE,gBAAA,gBAAgB,EAAE;;gBACxE;AAEL,YAAA,GAAG,EAAE;;IAGT,MAAM,6BAA6B,GAAG,WAAW,CAAC,SAAS,CAAC,gBAAgB,GAAG,CAAC,CAAC;IACjF,IAAI,eAAe,GAAG,CAAC;AACvB,IAAA,GAAG,GAAG,6BAA6B,CAAC,MAAM,GAAG,CAAC;IAE9C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,gBAAgB,GAAG,CAAC;AAChD,QAAA,OAAO,GAAG,GAAG,CAAC,CAAC,EAAE;;AAEf,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,6BAA6B,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AACzE,gBAAA,eAAe,EAAE;;gBACd;AAEL,YAAA,GAAG,EAAE;;AAGT,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,gBAAgB,EAAE,EAAE,GAAG,eAAe,CAAC;IAE1E,OAAO;QACL,IAAI;QACJ,EAAE;QACF,gBAAgB;QAChB,gBAAgB;QAChB,eAAe;QACf,eAAe;QACf,IAAI;KACL;AACH;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EditorView, drawSelection } from '@codemirror/view';
|
|
2
2
|
import { ReadonlyCompartment, ThemeCompartment, VimModeCompartment } from '../../extensions/compartments/index.js';
|
|
3
|
+
import '@codemirror/autocomplete';
|
|
3
4
|
import '@codemirror/commands';
|
|
4
5
|
import { saveDispatch } from '../../lib/utils/save-dispatch.js';
|
|
5
6
|
import { getDarkTheme } from '../../extensions/theme/themes/get-dark-theme.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.js","sources":["../../../../src/module/Editor/Editor.ts"],"sourcesContent":["import { EditorView, drawSelection } from \"@codemirror/view\";\nimport type { WebsocketProvider } from \"y-websocket\";\nimport type { Text } from \"yjs\";\nimport {\n type EditorTheme,\n ReadonlyCompartment,\n ThemeCompartment,\n VimModeCompartment,\n getDarkTheme,\n getLightTheme,\n} from \"@/extensions\";\nimport { saveDispatch } from \"@/lib/utils\";\nimport { type EditorArguments } from \"./Editor.types\";\nimport { initEditor } from \"./lib\";\n\nexport class Editor {\n view: EditorView | undefined;\n\n provider: WebsocketProvider | undefined;\n\n arguments: EditorArguments;\n\n yText: Text | undefined;\n\n constructor(options: EditorArguments) {\n void initEditor(options).then((editor) => {\n this.view = editor.view;\n this.provider = editor.provider;\n this.yText = editor.multiCursorText;\n });\n\n this.arguments = options;\n }\n\n focus = () => {\n if (!this.view) return;\n\n this.view.focus();\n };\n\n getContent = () => {\n if (!this.view) return;\n\n return this.view.state.doc.toString();\n };\n\n setContent = (content: string, position?: number) => {\n if (!this.view) return;\n\n if (position == undefined) {\n const cursor = this.view.state.selection.main.head;\n position = cursor;\n }\n\n const transaction = this.view.state.update({\n changes: {\n from: position,\n insert: content,\n },\n });\n saveDispatch(() => {\n if (!this.view) return;\n\n this.view.dispatch(transaction);\n });\n };\n\n replaceContent = (content: string) => {\n // if (!this.yText) return;\n\n // this.yText.delete(0, this.yText.length);\n // this.yText.insert(0, content);\n\n // return;\n\n if (!this.view) return;\n\n const transaction = this.view.state.update({\n changes: { from: 0, to: this.view.state.doc.length, insert: content },\n });\n saveDispatch(() => {\n if (!this.view) return;\n\n this.view.dispatch(transaction);\n });\n };\n\n setReadonly = (readonly: boolean) => {\n saveDispatch(() => {\n if (!this.view) return;\n this.view.dispatch({\n effects: ReadonlyCompartment.reconfigure(EditorView.editable.of(!readonly)),\n });\n });\n };\n\n setTheme = (theme?: EditorTheme) => {\n saveDispatch(() => {\n if (!this.view) return;\n this.view.dispatch({\n effects: ThemeCompartment.reconfigure(\n theme === \"dark\"\n ? getDarkTheme({\n dark: this.arguments.dark,\n light: this.arguments.light,\n theme,\n })\n : getLightTheme({\n dark: this.arguments.dark,\n light: this.arguments.light,\n theme,\n }),\n ),\n });\n });\n };\n\n setVimMode = async (mode: boolean) => {\n if (!this.view) return;\n\n const { vim } = await import(\"@replit/codemirror-vim\");\n\n saveDispatch(() => {\n if (!this.view) return;\n this.view.dispatch({\n effects: VimModeCompartment.reconfigure(\n mode ? [vim({ status: true }), drawSelection()] : [],\n ),\n });\n });\n };\n\n setUserProvider = (name: string = \"Anonymous\", color: string = \"#000000\") => {\n if (!this.provider) return;\n\n this.provider.awareness.setLocalStateField(\"user\", { name, color });\n };\n\n destroy = () => {\n saveDispatch(() => {\n if (!this.view) return;\n this.view.destroy();\n });\n saveDispatch(() => {\n if (this.provider) this.provider.destroy();\n });\n };\n}\n\nexport type EditorInterface = typeof Editor;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Editor.js","sources":["../../../../src/module/Editor/Editor.ts"],"sourcesContent":["import { EditorView, drawSelection } from \"@codemirror/view\";\nimport type { WebsocketProvider } from \"y-websocket\";\nimport type { Text } from \"yjs\";\nimport {\n type EditorTheme,\n ReadonlyCompartment,\n ThemeCompartment,\n VimModeCompartment,\n getDarkTheme,\n getLightTheme,\n} from \"@/extensions\";\nimport { saveDispatch } from \"@/lib/utils\";\nimport { type EditorArguments } from \"./Editor.types\";\nimport { initEditor } from \"./lib\";\n\nexport class Editor {\n view: EditorView | undefined;\n\n provider: WebsocketProvider | undefined;\n\n arguments: EditorArguments;\n\n yText: Text | undefined;\n\n constructor(options: EditorArguments) {\n void initEditor(options).then((editor) => {\n this.view = editor.view;\n this.provider = editor.provider;\n this.yText = editor.multiCursorText;\n });\n\n this.arguments = options;\n }\n\n focus = () => {\n if (!this.view) return;\n\n this.view.focus();\n };\n\n getContent = () => {\n if (!this.view) return;\n\n return this.view.state.doc.toString();\n };\n\n setContent = (content: string, position?: number) => {\n if (!this.view) return;\n\n if (position == undefined) {\n const cursor = this.view.state.selection.main.head;\n position = cursor;\n }\n\n const transaction = this.view.state.update({\n changes: {\n from: position,\n insert: content,\n },\n });\n saveDispatch(() => {\n if (!this.view) return;\n\n this.view.dispatch(transaction);\n });\n };\n\n replaceContent = (content: string) => {\n // if (!this.yText) return;\n\n // this.yText.delete(0, this.yText.length);\n // this.yText.insert(0, content);\n\n // return;\n\n if (!this.view) return;\n\n const transaction = this.view.state.update({\n changes: { from: 0, to: this.view.state.doc.length, insert: content },\n });\n saveDispatch(() => {\n if (!this.view) return;\n\n this.view.dispatch(transaction);\n });\n };\n\n setReadonly = (readonly: boolean) => {\n saveDispatch(() => {\n if (!this.view) return;\n this.view.dispatch({\n effects: ReadonlyCompartment.reconfigure(EditorView.editable.of(!readonly)),\n });\n });\n };\n\n setTheme = (theme?: EditorTheme) => {\n saveDispatch(() => {\n if (!this.view) return;\n this.view.dispatch({\n effects: ThemeCompartment.reconfigure(\n theme === \"dark\"\n ? getDarkTheme({\n dark: this.arguments.dark,\n light: this.arguments.light,\n theme,\n })\n : getLightTheme({\n dark: this.arguments.dark,\n light: this.arguments.light,\n theme,\n }),\n ),\n });\n });\n };\n\n setVimMode = async (mode: boolean) => {\n if (!this.view) return;\n\n const { vim } = await import(\"@replit/codemirror-vim\");\n\n saveDispatch(() => {\n if (!this.view) return;\n this.view.dispatch({\n effects: VimModeCompartment.reconfigure(\n mode ? [vim({ status: true }), drawSelection()] : [],\n ),\n });\n });\n };\n\n setUserProvider = (name: string = \"Anonymous\", color: string = \"#000000\") => {\n if (!this.provider) return;\n\n this.provider.awareness.setLocalStateField(\"user\", { name, color });\n };\n\n destroy = () => {\n saveDispatch(() => {\n if (!this.view) return;\n this.view.destroy();\n });\n saveDispatch(() => {\n if (this.provider) this.provider.destroy();\n });\n };\n}\n\nexport type EditorInterface = typeof Editor;\n"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { KeyBinding, EditorView, ViewUpdate, Decoration } from '@codemirror/view';
|
|
2
2
|
import { WebsocketProvider } from 'y-websocket';
|
|
3
3
|
import { Text } from 'yjs';
|
|
4
|
+
import { autocompletion } from '@codemirror/autocomplete';
|
|
4
5
|
import { EditorState, Range } from '@codemirror/state';
|
|
5
6
|
import { LanguageDescription } from '@codemirror/language';
|
|
6
7
|
import { SyntaxNodeRef } from '@lezer/common';
|
|
7
8
|
|
|
9
|
+
type InitAutoCompleteOptions = {
|
|
10
|
+
autoCompleteTagOptions?: string[];
|
|
11
|
+
autoCompleteConfig?: Omit<Exclude<Parameters<typeof autocompletion>[0], undefined>, "override">;
|
|
12
|
+
};
|
|
13
|
+
|
|
8
14
|
type EditorTheme = "dark" | "light";
|
|
9
15
|
type InitThemeOptions = {
|
|
10
16
|
dark?: ThemeOptions;
|
|
@@ -29,6 +35,8 @@ type ThemeConfig = {
|
|
|
29
35
|
mentionColor?: string;
|
|
30
36
|
vimSelectionFocused?: string;
|
|
31
37
|
vimSelection?: string;
|
|
38
|
+
codeBlockBorderColor?: string;
|
|
39
|
+
codeBlockBackground?: string;
|
|
32
40
|
};
|
|
33
41
|
type HighlightConfig = {
|
|
34
42
|
keyword?: string;
|
|
@@ -81,12 +89,14 @@ type GetDecorationOptions = {
|
|
|
81
89
|
node: SyntaxNodeRef;
|
|
82
90
|
decorations: Range<Decoration>[];
|
|
83
91
|
view: EditorView;
|
|
92
|
+
settings: MarkdownDecorationSettings;
|
|
84
93
|
};
|
|
85
94
|
type GetSelectionDecorationOptions = {
|
|
86
95
|
node: SyntaxNodeRef;
|
|
87
96
|
decorations: Range<Decoration>[];
|
|
88
97
|
view: EditorView;
|
|
89
98
|
forceActive: boolean;
|
|
99
|
+
settings: MarkdownDecorationSettings;
|
|
90
100
|
};
|
|
91
101
|
type GetDecorationFunction = (options: GetDecorationOptions) => void;
|
|
92
102
|
type GetSelectionDecorationFunction = (options: GetSelectionDecorationOptions) => void;
|
|
@@ -94,13 +104,16 @@ type DecorationPlugin = {
|
|
|
94
104
|
decorations?: GetDecorationFunction[];
|
|
95
105
|
selectionDecorations?: GetSelectionDecorationFunction[];
|
|
96
106
|
};
|
|
107
|
+
type MarkdownDecorationSettings = {
|
|
108
|
+
imageSrcGetter?: (src: string) => string;
|
|
109
|
+
};
|
|
97
110
|
|
|
98
111
|
type InitSettingsOptions = {
|
|
99
112
|
readonly?: boolean;
|
|
100
113
|
vimMode?: boolean;
|
|
101
114
|
};
|
|
102
115
|
|
|
103
|
-
type ExtensionsOptions = InitListenersOptions & InitThemeOptions & InitSettingsOptions & InitMarkdownOptions & InitKeyMapsOptions;
|
|
116
|
+
type ExtensionsOptions = InitListenersOptions & InitThemeOptions & InitSettingsOptions & InitMarkdownOptions & InitKeyMapsOptions & InitAutoCompleteOptions;
|
|
104
117
|
type InitExtensionsOptions = {
|
|
105
118
|
multiCursorText: Text | undefined;
|
|
106
119
|
provider: WebsocketProvider | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@krainovsd/markdown-editor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Krainov markdown-editor",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "KrainovSD <denislosev48@gmail.com>",
|
|
@@ -73,6 +73,7 @@
|
|
|
73
73
|
"@codemirror/language": "6.10.8",
|
|
74
74
|
"@codemirror/state": "6.5.1",
|
|
75
75
|
"@codemirror/view": "6.36.2",
|
|
76
|
+
"@codemirror/autocomplete": "6.18.6",
|
|
76
77
|
"@lezer/highlight": "1.2.1",
|
|
77
78
|
"@replit/codemirror-vim": "6.2.1",
|
|
78
79
|
"clsx": "2.1.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DXevyHeZ.js","sources":["../../src/extensions/markdown/mention/mention-parser.ts","../../src/extensions/markdown/markdown-parser.ts","../../src/extensions/markdown/init-markdown.ts"],"sourcesContent":["import type { MarkdownConfig } from \"@lezer/markdown\";\nimport { CODE_OF_SPACE, CODE_OF_START_MENTION, NAME_OF_MENTION } from \"./mention-constants\";\n\nexport const mentionParser: MarkdownConfig = {\n defineNodes: [{ name: NAME_OF_MENTION }],\n parseInline: [\n {\n name: NAME_OF_MENTION,\n parse(cx, next, pos) {\n if (next != CODE_OF_START_MENTION) return -1;\n let end: number = pos + 1;\n for (let i = pos + 1; i < cx.end; i++) {\n const next = cx.char(i);\n if (next === CODE_OF_SPACE) break;\n end++;\n }\n\n return cx.addElement(cx.elt(NAME_OF_MENTION, pos, end));\n },\n },\n ],\n};\n","import type { MarkdownExtension } from \"@lezer/markdown\";\nimport { mentionParser } from \"./mention\";\n\nexport const markdownParserPlugin: MarkdownExtension = [mentionParser];\n","import { markdown, markdownLanguage } from \"@codemirror/lang-markdown\";\nimport { type Extension } from \"@codemirror/state\";\nimport { markdownDecorationPlugin } from \"./markdown-decoration\";\nimport { markdownParserPlugin } from \"./markdown-parser\";\nimport { markdownState } from \"./markdown-state\";\nimport type { InitMarkdownOptions } from \"./markdown-types\";\n\nexport const initMarkdown = ({ languages, imageSrcGetter }: InitMarkdownOptions): Extension => {\n return [\n markdownState,\n markdown({\n base: markdownLanguage,\n codeLanguages: languages,\n addKeymap: true,\n extensions: [markdownParserPlugin],\n }),\n markdownDecorationPlugin({ imageSrcGetter }),\n ];\n};\n"],"names":["NAME_OF_MENTION","CODE_OF_START_MENTION","CODE_OF_SPACE","markdownState","markdown","markdownLanguage","markdownDecorationPlugin"],"mappings":";;;;;;;;;;;;;;AAGO,MAAM,aAAa,GAAmB;AAC3C,IAAA,WAAW,EAAE,CAAC,EAAE,IAAI,EAAEA,qBAAe,EAAE,CAAC;AACxC,IAAA,WAAW,EAAE;AACX,QAAA;AACE,YAAA,IAAI,EAAEA,qBAAe;AACrB,YAAA,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAA;gBACjB,IAAI,IAAI,IAAIC,2BAAqB;oBAAE,OAAO,CAAC,CAAC;AAC5C,gBAAA,IAAI,GAAG,GAAW,GAAG,GAAG,CAAC;AACzB,gBAAA,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;oBACrC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;oBACvB,IAAI,IAAI,KAAKC,mBAAa;wBAAE;AAC5B,oBAAA,GAAG,EAAE;;AAGP,gBAAA,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAACF,qBAAe,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aACxD;AACF,SAAA;AACF,KAAA;CACF;;AClBM,MAAM,oBAAoB,GAAsB,CAAC,aAAa,CAAC;;ACIzD,MAAA,YAAY,GAAG,CAAC,EAAE,SAAS,EAAE,cAAc,EAAuB,KAAe;IAC5F,OAAO;QACLG,mBAAa;AACb,QAAAC,qBAAQ,CAAC;AACP,YAAA,IAAI,EAAEC,6BAAgB;AACtB,YAAA,aAAa,EAAE,SAAS;AACxB,YAAA,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,CAAC,oBAAoB,CAAC;SACnC,CAAC;AACF,QAAAC,8BAAwB,CAAC,EAAE,cAAc,EAAE,CAAC;KAC7C;AACH;;;;"}
|