@krainovsd/markdown-editor 0.3.2 → 0.4.2
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-BgxbH3r2.js → index-Df0WnJ4c.js} +470 -54
- package/lib/cjs/index-Df0WnJ4c.js.map +1 -0
- package/lib/cjs/{index-DU8JMAfc.js → index-Ne5xJkxS.js} +10 -6
- package/lib/cjs/index-Ne5xJkxS.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 +5 -3
- 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 +7 -10
- package/lib/esm/extensions/keymaps/init-key-map.js.map +1 -1
- package/lib/esm/extensions/listeners/get-change-event.js +3 -3
- package/lib/esm/extensions/listeners/get-change-event.js.map +1 -1
- package/lib/esm/extensions/listeners/get-focus-event.js +3 -3
- package/lib/esm/extensions/listeners/get-focus-event.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/blockquote/blockquote-decoration.js +1 -1
- package/lib/esm/extensions/markdown/blockquote/blockquote-decoration.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/bold/bold-decoration.js +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 +34 -3
- package/lib/esm/extensions/markdown/code/code-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/header/header-decoration.js +1 -1
- package/lib/esm/extensions/markdown/image/image-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/image/image-widget.js +26 -2
- package/lib/esm/extensions/markdown/image/image-widget.js.map +1 -1
- package/lib/esm/extensions/markdown/italic/italic-decoration.js +2 -2
- package/lib/esm/extensions/markdown/italic/italic-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/link/link-decoration.js +1 -1
- package/lib/esm/extensions/markdown/link/link-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/link/link-widget.js +28 -2
- package/lib/esm/extensions/markdown/link/link-widget.js.map +1 -1
- package/lib/esm/extensions/markdown/list/list-decoration.js +1 -1
- package/lib/esm/extensions/markdown/list/list-decoration.js.map +1 -1
- package/lib/esm/extensions/markdown/markdown-decoration.js +2 -2
- package/lib/esm/extensions/markdown/markdown-decoration.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-decoration.js +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/strike-through/strike-through-decoration.js +1 -1
- package/lib/esm/extensions/markdown/styles.module.scss.js +2 -2
- package/lib/esm/extensions/markdown/todo/todo-decoration.js +1 -1
- package/lib/esm/extensions/markdown/todo/todo-decoration.js.map +1 -1
- package/lib/esm/extensions/settings/init-settings.js +2 -2
- package/lib/esm/extensions/settings/init-settings.js.map +1 -1
- 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 +5 -2
- package/lib/esm/extensions/theme/themes/get-dark-theme.js.map +1 -1
- package/lib/esm/extensions/theme/themes/get-highlight-template.js +4 -1
- package/lib/esm/extensions/theme/themes/get-highlight-template.js.map +1 -1
- package/lib/esm/extensions/theme/themes/get-light-theme.js +5 -2
- package/lib/esm/extensions/theme/themes/get-light-theme.js.map +1 -1
- package/lib/esm/extensions/theme/themes/get-theme-template.js +7 -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 +151 -0
- package/lib/esm/lib/utils/overlap-mark.js.map +1 -0
- package/lib/esm/module/Editor/Editor.js +3 -6
- package/lib/esm/module/Editor/Editor.js.map +1 -1
- package/lib/esm/module/Editor/lib/init-editor-provider.js +2 -3
- package/lib/esm/module/Editor/lib/init-editor-provider.js.map +1 -1
- package/lib/esm/module/Editor/lib/init-editor.js +1 -1
- package/lib/esm/module/Editor/lib/init-editor.js.map +1 -1
- package/lib/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js.map +1 -1
- package/lib/index.d.ts +11 -2
- package/package.json +19 -29
- package/lib/cjs/index-BgxbH3r2.js.map +0 -1
- package/lib/cjs/index-DU8JMAfc.js.map +0 -1
|
@@ -1,19 +1,20 @@
|
|
|
1
|
+
import { initAutoComplete } from './auto-completes/init-auto-complete.js';
|
|
1
2
|
import { initKeyMaps } from './keymaps/init-key-map.js';
|
|
2
3
|
import { initListeners } from './listeners/init-listeners.js';
|
|
3
4
|
import '@codemirror/lang-markdown';
|
|
4
5
|
import '@codemirror/state';
|
|
5
6
|
import './markdown/markdown-decoration.js';
|
|
6
7
|
import './markdown/markdown-state.js';
|
|
7
|
-
import {
|
|
8
|
+
import { initSettings } from './settings/init-settings.js';
|
|
8
9
|
import { initTheme } from './theme/init-theme.js';
|
|
9
10
|
import '@codemirror/language';
|
|
10
11
|
import '@lezer/highlight';
|
|
11
12
|
import '@codemirror/view';
|
|
12
13
|
|
|
13
|
-
const initExtensions = async ({ onBlur, onChange, onFocus, onEnter, onEscape, readonly = true, vimMode = false, multiCursorText, provider, theme = "light", dark, light, languages, keyMaps, defaultKeyMaps, imageSrcGetter, }) => {
|
|
14
|
+
const initExtensions = async ({ onBlur, onChange, onFocus, onEnter, onEscape, readonly = true, vimMode = false, multiCursorText, provider, theme = "light", dark, light, languages, keyMaps, defaultKeyMaps, imageSrcGetter, autoCompleteTagOptions, autoCompleteConfig, }) => {
|
|
14
15
|
const multiCursorMode = Boolean(multiCursorText && provider);
|
|
15
16
|
const asyncPlugins = await Promise.all([
|
|
16
|
-
|
|
17
|
+
initSettings({ readonly, vimMode }),
|
|
17
18
|
initKeyMaps({
|
|
18
19
|
onEnter,
|
|
19
20
|
onEscape,
|
|
@@ -30,6 +31,7 @@ const initExtensions = async ({ onBlur, onChange, onFocus, onEnter, onEscape, re
|
|
|
30
31
|
resolve(initMarkdown({ languages, imageSrcGetter }));
|
|
31
32
|
});
|
|
32
33
|
}),
|
|
34
|
+
initAutoComplete({ autoCompleteConfig, autoCompleteTagOptions }),
|
|
33
35
|
]);
|
|
34
36
|
const extensions = [
|
|
35
37
|
...asyncPlugins,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-extensions.js","sources":["../../../src/extensions/init-extensions.ts"],"sourcesContent":["import type { Extension } from \"@codemirror/state\";\nimport type { WebsocketProvider } from \"y-websocket\";\nimport type { Text } from \"yjs\";\nimport { type InitKeyMapsOptions, initKeyMaps } from \"./keymaps\";\nimport { type InitListenersOptions, initListeners } from \"./listeners\";\nimport { type InitMarkdownOptions } from \"./markdown\";\nimport {
|
|
1
|
+
{"version":3,"file":"init-extensions.js","sources":["../../../src/extensions/init-extensions.ts"],"sourcesContent":["import type { Extension } from \"@codemirror/state\";\nimport type { WebsocketProvider } from \"y-websocket\";\nimport type { Text } from \"yjs\";\nimport { type InitAutoCompleteOptions, initAutoComplete } from \"./auto-completes\";\nimport { type InitKeyMapsOptions, initKeyMaps } from \"./keymaps\";\nimport { type InitListenersOptions, initListeners } from \"./listeners\";\nimport { type InitMarkdownOptions } from \"./markdown\";\nimport { type InitSettingsOptions, initSettings } from \"./settings\";\nimport { type InitThemeOptions, initTheme } from \"./theme\";\n\nexport type ExtensionsOptions = InitListenersOptions &\n InitThemeOptions &\n InitSettingsOptions &\n InitMarkdownOptions &\n InitKeyMapsOptions &\n InitAutoCompleteOptions;\n\nexport type InitExtensionsOptions = {\n multiCursorText: Text | undefined;\n provider: WebsocketProvider | undefined;\n} & ExtensionsOptions;\n\nexport const initExtensions = async ({\n onBlur,\n onChange,\n onFocus,\n onEnter,\n onEscape,\n readonly = true,\n vimMode = false,\n multiCursorText,\n provider,\n theme = \"light\",\n dark,\n light,\n languages,\n keyMaps,\n defaultKeyMaps,\n imageSrcGetter,\n autoCompleteTagOptions,\n autoCompleteConfig,\n}: InitExtensionsOptions): Promise<Extension[]> => {\n const multiCursorMode = Boolean(multiCursorText && provider);\n\n const asyncPlugins = await Promise.all([\n initSettings({ readonly, vimMode }),\n initKeyMaps({\n onEnter,\n onEscape,\n multiCursorMode,\n keyMaps,\n vimMode,\n theme,\n dark,\n defaultKeyMaps,\n light,\n }),\n new Promise<Extension>((resolve) => {\n void import(\"./markdown\").then(({ initMarkdown }) => {\n resolve(initMarkdown({ languages, imageSrcGetter }));\n });\n }),\n initAutoComplete({ autoCompleteConfig, autoCompleteTagOptions }),\n ]);\n\n const extensions = [\n ...asyncPlugins,\n initTheme({ theme, dark, light }),\n initListeners({ onBlur, onChange, onFocus }),\n ];\n\n if (multiCursorText && provider) {\n const multiCursorModules = await Promise.all([import(\"yjs\"), import(\"y-codemirror.next\")]);\n const [{ UndoManager }, { yCollab }] = multiCursorModules;\n\n const undoManager = new UndoManager(multiCursorText);\n extensions.push(yCollab(multiCursorText, provider.awareness, { undoManager }));\n }\n\n return extensions;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;MAsBa,cAAc,GAAG,OAAO,EACnC,MAAM,EACN,QAAQ,EACR,OAAO,EACP,OAAO,EACP,QAAQ,EACR,QAAQ,GAAG,IAAI,EACf,OAAO,GAAG,KAAK,EACf,eAAe,EACf,QAAQ,EACR,KAAK,GAAG,OAAO,EACf,IAAI,EACJ,KAAK,EACL,SAAS,EACT,OAAO,EACP,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,kBAAkB,GACI,KAA0B;IAChD,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,QAAQ,CAAC;AAE5D,IAAA,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACrC,QAAA,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACnC,QAAA,WAAW,CAAC;YACV,OAAO;YACP,QAAQ;YACR,eAAe;YACf,OAAO;YACP,OAAO;YACP,KAAK;YACL,IAAI;YACJ,cAAc;YACd,KAAK;SACN,CAAC;AACF,QAAA,IAAI,OAAO,CAAY,CAAC,OAAO,KAAI;AACjC,YAAA,KAAK,OAAO,qBAAY,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,KAAI;gBAClD,OAAO,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;AACtD,aAAC,CAAC;AACJ,SAAC,CAAC;AACF,QAAA,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,CAAC;AACjE,KAAA,CAAC;AAEF,IAAA,MAAM,UAAU,GAAG;AACjB,QAAA,GAAG,YAAY;QACf,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;KAC7C;AAED,IAAA,IAAI,eAAe,IAAI,QAAQ,EAAE;AAC/B,QAAA,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,OAAO,mBAAmB,CAAC,CAAC,CAAC;QAC1F,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,kBAAkB;AAEzD,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,eAAe,CAAC;AACpD,QAAA,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;;AAGhF,IAAA,OAAO,UAAU;AACnB;;;;"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import '@codemirror/state';
|
|
2
|
+
import '@codemirror/view';
|
|
3
|
+
import { saveDispatch } from '../../../lib/utils/save-dispatch.js';
|
|
4
|
+
import { overlapMark } from '../../../lib/utils/overlap-mark.js';
|
|
5
|
+
|
|
6
|
+
const BOLD_MARK_STAR = "*".codePointAt(0);
|
|
7
|
+
const BOLD_MARK_DASH = "_".codePointAt(0);
|
|
8
|
+
const SHIFT = 2;
|
|
9
|
+
const insertBoldMarker = ({ state, dispatch }) => {
|
|
10
|
+
const changes = [];
|
|
11
|
+
const { from, to } = state.selection.ranges[0];
|
|
12
|
+
if (from === to)
|
|
13
|
+
return true;
|
|
14
|
+
const { end, start, marked, originalText } = overlapMark({
|
|
15
|
+
marks: [BOLD_MARK_DASH, BOLD_MARK_STAR],
|
|
16
|
+
requireMatched: [SHIFT],
|
|
17
|
+
shift: SHIFT,
|
|
18
|
+
state,
|
|
19
|
+
});
|
|
20
|
+
if (marked) {
|
|
21
|
+
if (~start) {
|
|
22
|
+
changes.push({ from: start, to: start + SHIFT, insert: "" });
|
|
23
|
+
}
|
|
24
|
+
if (~end) {
|
|
25
|
+
changes.push({ from: end, to: end + SHIFT, insert: "" });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const markedText = `**${originalText}**`;
|
|
30
|
+
changes.push({ from, to, insert: markedText });
|
|
31
|
+
}
|
|
32
|
+
saveDispatch(() => {
|
|
33
|
+
const startSelection = ~start ? start : from;
|
|
34
|
+
const endSelection = ~end ? end - (~start ? SHIFT : 0) : to - (~start ? SHIFT : 0);
|
|
35
|
+
dispatch(state.update({
|
|
36
|
+
changes,
|
|
37
|
+
selection: !marked
|
|
38
|
+
? {
|
|
39
|
+
anchor: from + SHIFT,
|
|
40
|
+
head: to + SHIFT,
|
|
41
|
+
}
|
|
42
|
+
: {
|
|
43
|
+
anchor: startSelection,
|
|
44
|
+
head: endSelection,
|
|
45
|
+
},
|
|
46
|
+
}));
|
|
47
|
+
});
|
|
48
|
+
return true;
|
|
49
|
+
};
|
|
50
|
+
const boldKeymap = {
|
|
51
|
+
key: "Mod-b",
|
|
52
|
+
run: insertBoldMarker,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export { boldKeymap };
|
|
56
|
+
//# sourceMappingURL=bold-key-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bold-key-map.js","sources":["../../../../../src/extensions/keymaps/custom/bold-key-map.ts"],"sourcesContent":["import { type ChangeSpec, type StateCommand } from \"@codemirror/state\";\nimport { type KeyBinding } from \"@codemirror/view\";\nimport { utils } from \"@/lib\";\nimport { saveDispatch } from \"@/lib/utils\";\n\nconst BOLD_MARK_STAR = \"*\".codePointAt(0);\nconst BOLD_MARK_DASH = \"_\".codePointAt(0);\nconst SHIFT = 2;\n\nconst insertBoldMarker: StateCommand = ({ state, dispatch }) => {\n const changes: ChangeSpec[] = [];\n const { from, to } = state.selection.ranges[0];\n if (from === to) return true;\n\n const { end, start, marked, originalText } = utils.overlapMark({\n marks: [BOLD_MARK_DASH, BOLD_MARK_STAR],\n requireMatched: [SHIFT],\n shift: SHIFT,\n state,\n });\n\n if (marked) {\n if (~start) {\n changes.push({ from: start, to: start + SHIFT, insert: \"\" });\n }\n if (~end) {\n changes.push({ from: end, to: end + SHIFT, insert: \"\" });\n }\n } else {\n const markedText = `**${originalText}**`;\n changes.push({ from, to, insert: markedText });\n }\n\n saveDispatch(() => {\n const startSelection = ~start ? start : from;\n const endSelection = ~end ? end - (~start ? SHIFT : 0) : to - (~start ? SHIFT : 0);\n\n dispatch(\n state.update({\n changes,\n selection: !marked\n ? {\n anchor: from + SHIFT,\n head: to + SHIFT,\n }\n : {\n anchor: startSelection,\n head: endSelection,\n },\n }),\n );\n });\n\n return true;\n};\n\nexport const boldKeymap: KeyBinding = {\n key: \"Mod-b\",\n run: insertBoldMarker,\n};\n"],"names":["utils.overlapMark"],"mappings":";;;;;AAKA,MAAM,cAAc,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACzC,MAAM,cAAc,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACzC,MAAM,KAAK,GAAG,CAAC;AAEf,MAAM,gBAAgB,GAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAI;IAC7D,MAAM,OAAO,GAAiB,EAAE;AAChC,IAAA,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,EAAE;AAAE,QAAA,OAAO,IAAI;AAE5B,IAAA,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,GAAGA,WAAiB,CAAC;AAC7D,QAAA,KAAK,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;QACvC,cAAc,EAAE,CAAC,KAAK,CAAC;AACvB,QAAA,KAAK,EAAE,KAAK;QACZ,KAAK;AACN,KAAA,CAAC;IAEF,IAAI,MAAM,EAAE;QACV,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;QAE9D,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;;SAErD;AACL,QAAA,MAAM,UAAU,GAAG,CAAK,EAAA,EAAA,YAAY,IAAI;AACxC,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;;IAGhD,YAAY,CAAC,MAAK;AAChB,QAAA,MAAM,cAAc,GAAG,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI;AAC5C,QAAA,MAAM,YAAY,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;AAElF,QAAA,QAAQ,CACN,KAAK,CAAC,MAAM,CAAC;YACX,OAAO;YACP,SAAS,EAAE,CAAC;AACV,kBAAE;oBACE,MAAM,EAAE,IAAI,GAAG,KAAK;oBACpB,IAAI,EAAE,EAAE,GAAG,KAAK;AACjB;AACH,kBAAE;AACE,oBAAA,MAAM,EAAE,cAAc;AACtB,oBAAA,IAAI,EAAE,YAAY;AACnB,iBAAA;AACN,SAAA,CAAC,CACH;AACH,KAAC,CAAC;AAEF,IAAA,OAAO,IAAI;AACb,CAAC;AAEY,MAAA,UAAU,GAAe;AACpC,IAAA,GAAG,EAAE,OAAO;AACZ,IAAA,GAAG,EAAE,gBAAgB;;;;;"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import '@codemirror/state';
|
|
2
|
+
import '@codemirror/view';
|
|
3
|
+
import { saveDispatch } from '../../../lib/utils/save-dispatch.js';
|
|
4
|
+
import { overlapMark } from '../../../lib/utils/overlap-mark.js';
|
|
5
|
+
|
|
6
|
+
const ITALIC_MARK_STAR = "*".codePointAt(0);
|
|
7
|
+
const ITALIC_MARK_DASH = "_".codePointAt(0);
|
|
8
|
+
const SHIFT_COUPLE = 3;
|
|
9
|
+
const SHIFT_ALONE = 1;
|
|
10
|
+
const insertItalicMarker = ({ state, dispatch }) => {
|
|
11
|
+
const changes = [];
|
|
12
|
+
const { from, to } = state.selection.ranges[0];
|
|
13
|
+
if (from === to)
|
|
14
|
+
return true;
|
|
15
|
+
const { end, start, marked, originalText } = overlapMark({
|
|
16
|
+
marks: [ITALIC_MARK_STAR, ITALIC_MARK_DASH],
|
|
17
|
+
requireMatched: [SHIFT_ALONE, SHIFT_COUPLE],
|
|
18
|
+
shift: SHIFT_COUPLE,
|
|
19
|
+
state,
|
|
20
|
+
});
|
|
21
|
+
if (marked) {
|
|
22
|
+
if (~start) {
|
|
23
|
+
changes.push({ from: start, to: start + SHIFT_ALONE, insert: "" });
|
|
24
|
+
}
|
|
25
|
+
if (~end) {
|
|
26
|
+
changes.push({ from: end, to: end + SHIFT_ALONE, insert: "" });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const markedText = `*${originalText}*`;
|
|
31
|
+
changes.push({ from, to, insert: markedText });
|
|
32
|
+
}
|
|
33
|
+
saveDispatch(() => {
|
|
34
|
+
const startSelection = ~start ? start : from;
|
|
35
|
+
const endSelection = ~end ? end - (~start ? SHIFT_ALONE : 0) : to - (~start ? SHIFT_ALONE : 0);
|
|
36
|
+
dispatch(state.update({
|
|
37
|
+
changes,
|
|
38
|
+
selection: !marked
|
|
39
|
+
? {
|
|
40
|
+
anchor: from + SHIFT_ALONE,
|
|
41
|
+
head: to + SHIFT_ALONE,
|
|
42
|
+
}
|
|
43
|
+
: {
|
|
44
|
+
anchor: startSelection,
|
|
45
|
+
head: endSelection,
|
|
46
|
+
},
|
|
47
|
+
}));
|
|
48
|
+
});
|
|
49
|
+
return true;
|
|
50
|
+
};
|
|
51
|
+
const italicKeymap = {
|
|
52
|
+
key: "Mod-i",
|
|
53
|
+
run: insertItalicMarker,
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export { italicKeymap };
|
|
57
|
+
//# sourceMappingURL=italic-key-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"italic-key-map.js","sources":["../../../../../src/extensions/keymaps/custom/italic-key-map.ts"],"sourcesContent":["import { type ChangeSpec, type StateCommand } from \"@codemirror/state\";\nimport { type KeyBinding } from \"@codemirror/view\";\nimport { utils } from \"@/lib\";\nimport { saveDispatch } from \"@/lib/utils\";\n\nconst ITALIC_MARK_STAR = \"*\".codePointAt(0);\nconst ITALIC_MARK_DASH = \"_\".codePointAt(0);\nconst SHIFT_COUPLE = 3;\nconst SHIFT_ALONE = 1;\n\nconst insertItalicMarker: StateCommand = ({ state, dispatch }) => {\n const changes: ChangeSpec[] = [];\n const { from, to } = state.selection.ranges[0];\n if (from === to) return true;\n\n const { end, start, marked, originalText } = utils.overlapMark({\n marks: [ITALIC_MARK_STAR, ITALIC_MARK_DASH],\n requireMatched: [SHIFT_ALONE, SHIFT_COUPLE],\n shift: SHIFT_COUPLE,\n state,\n });\n\n if (marked) {\n if (~start) {\n changes.push({ from: start, to: start + SHIFT_ALONE, insert: \"\" });\n }\n if (~end) {\n changes.push({ from: end, to: end + SHIFT_ALONE, insert: \"\" });\n }\n } else {\n const markedText = `*${originalText}*`;\n changes.push({ from, to, insert: markedText });\n }\n\n saveDispatch(() => {\n const startSelection = ~start ? start : from;\n const endSelection = ~end ? end - (~start ? SHIFT_ALONE : 0) : to - (~start ? SHIFT_ALONE : 0);\n\n dispatch(\n state.update({\n changes,\n selection: !marked\n ? {\n anchor: from + SHIFT_ALONE,\n head: to + SHIFT_ALONE,\n }\n : {\n anchor: startSelection,\n head: endSelection,\n },\n }),\n );\n });\n\n return true;\n};\n\nexport const italicKeymap: KeyBinding = {\n key: \"Mod-i\",\n run: insertItalicMarker,\n};\n"],"names":["utils.overlapMark"],"mappings":";;;;;AAKA,MAAM,gBAAgB,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3C,MAAM,gBAAgB,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3C,MAAM,YAAY,GAAG,CAAC;AACtB,MAAM,WAAW,GAAG,CAAC;AAErB,MAAM,kBAAkB,GAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAI;IAC/D,MAAM,OAAO,GAAiB,EAAE;AAChC,IAAA,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,EAAE;AAAE,QAAA,OAAO,IAAI;AAE5B,IAAA,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,GAAGA,WAAiB,CAAC;AAC7D,QAAA,KAAK,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;AAC3C,QAAA,cAAc,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;AAC3C,QAAA,KAAK,EAAE,YAAY;QACnB,KAAK;AACN,KAAA,CAAC;IAEF,IAAI,MAAM,EAAE;QACV,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;QAEpE,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;;SAE3D;AACL,QAAA,MAAM,UAAU,GAAG,CAAI,CAAA,EAAA,YAAY,GAAG;AACtC,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;;IAGhD,YAAY,CAAC,MAAK;AAChB,QAAA,MAAM,cAAc,GAAG,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI;AAC5C,QAAA,MAAM,YAAY,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC;AAE9F,QAAA,QAAQ,CACN,KAAK,CAAC,MAAM,CAAC;YACX,OAAO;YACP,SAAS,EAAE,CAAC;AACV,kBAAE;oBACE,MAAM,EAAE,IAAI,GAAG,WAAW;oBAC1B,IAAI,EAAE,EAAE,GAAG,WAAW;AACvB;AACH,kBAAE;AACE,oBAAA,MAAM,EAAE,cAAc;AACtB,oBAAA,IAAI,EAAE,YAAY;AACnB,iBAAA;AACN,SAAA,CAAC,CACH;AACH,KAAC,CAAC;AAEF,IAAA,OAAO,IAAI;AACb,CAAC;AAEY,MAAA,YAAY,GAAe;AACtC,IAAA,GAAG,EAAE,OAAO;AACZ,IAAA,GAAG,EAAE,kBAAkB;;;;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import '@codemirror/view';
|
|
2
|
+
import { saveDispatch } from '../../../lib/utils/save-dispatch.js';
|
|
3
|
+
|
|
4
|
+
const insertLinkWrapper = ({ state, dispatch }) => {
|
|
5
|
+
const changes = [];
|
|
6
|
+
const { from, to } = state.selection.ranges[0];
|
|
7
|
+
if (from === to)
|
|
8
|
+
return true;
|
|
9
|
+
const content = state.sliceDoc(from, to);
|
|
10
|
+
const wrapper = `[${content}]()`;
|
|
11
|
+
changes.push({ from, to, insert: wrapper });
|
|
12
|
+
saveDispatch(() => {
|
|
13
|
+
dispatch(state.update({
|
|
14
|
+
changes,
|
|
15
|
+
selection: {
|
|
16
|
+
anchor: to + 3,
|
|
17
|
+
},
|
|
18
|
+
}));
|
|
19
|
+
});
|
|
20
|
+
return true;
|
|
21
|
+
};
|
|
22
|
+
const linkKeymap = {
|
|
23
|
+
key: "Mod-k",
|
|
24
|
+
run: insertLinkWrapper,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { linkKeymap };
|
|
28
|
+
//# sourceMappingURL=link-key-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-key-map.js","sources":["../../../../../src/extensions/keymaps/custom/link-key-map.ts"],"sourcesContent":["import type { ChangeSpec, StateCommand } from \"@codemirror/state\";\nimport type { KeyBinding } from \"@codemirror/view\";\nimport { saveDispatch } from \"@/lib/utils\";\n\nconst insertLinkWrapper: StateCommand = ({ state, dispatch }) => {\n const changes: ChangeSpec[] = [];\n const { from, to } = state.selection.ranges[0];\n if (from === to) return true;\n const content = state.sliceDoc(from, to);\n\n const wrapper = `[${content}]()`;\n changes.push({ from, to, insert: wrapper });\n\n saveDispatch(() => {\n dispatch(\n state.update({\n changes,\n selection: {\n anchor: to + 3,\n },\n }),\n );\n });\n\n return true;\n};\n\nexport const linkKeymap: KeyBinding = {\n key: \"Mod-k\",\n run: insertLinkWrapper,\n};\n"],"names":[],"mappings":";;;AAIA,MAAM,iBAAiB,GAAiB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAI;IAC9D,MAAM,OAAO,GAAiB,EAAE;AAChC,IAAA,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,EAAE;AAAE,QAAA,OAAO,IAAI;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;AAExC,IAAA,MAAM,OAAO,GAAG,CAAI,CAAA,EAAA,OAAO,KAAK;AAChC,IAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE3C,YAAY,CAAC,MAAK;AAChB,QAAA,QAAQ,CACN,KAAK,CAAC,MAAM,CAAC;YACX,OAAO;AACP,YAAA,SAAS,EAAE;gBACT,MAAM,EAAE,EAAE,GAAG,CAAC;AACf,aAAA;AACF,SAAA,CAAC,CACH;AACH,KAAC,CAAC;AAEF,IAAA,OAAO,IAAI;AACb,CAAC;AAEY,MAAA,UAAU,GAAe;AACpC,IAAA,GAAG,EAAE,OAAO;AACZ,IAAA,GAAG,EAAE,iBAAiB;;;;;"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { standardKeymap, historyKeymap
|
|
1
|
+
import { indentWithTab, standardKeymap, historyKeymap } from '@codemirror/commands';
|
|
2
2
|
import { drawSelection, keymap } from '@codemirror/view';
|
|
3
3
|
import { saveDispatch } from '../../lib/utils/save-dispatch.js';
|
|
4
4
|
import { VimModeCompartment, ThemeCompartment } from '../compartments/index.js';
|
|
5
5
|
import { getDarkTheme } from '../theme/themes/get-dark-theme.js';
|
|
6
6
|
import { getLightTheme } from '../theme/themes/get-light-theme.js';
|
|
7
|
+
import { boldKeymap } from './custom/bold-key-map.js';
|
|
8
|
+
import { italicKeymap } from './custom/italic-key-map.js';
|
|
9
|
+
import { linkKeymap } from './custom/link-key-map.js';
|
|
7
10
|
|
|
8
11
|
let vimMode = false;
|
|
9
12
|
let theme = "light";
|
|
@@ -11,7 +14,7 @@ const initKeyMaps = async ({ onEnter, onEscape, multiCursorMode, keyMaps, defaul
|
|
|
11
14
|
vimMode = initialVimMode;
|
|
12
15
|
theme = initialTheme;
|
|
13
16
|
/** tab */
|
|
14
|
-
const keyBindings = [indentWithTab];
|
|
17
|
+
const keyBindings = [indentWithTab, boldKeymap, italicKeymap, linkKeymap];
|
|
15
18
|
/** standard */
|
|
16
19
|
keyBindings.push(...standardKeymap.map((keyMap) => {
|
|
17
20
|
if (keyMap.key === "Enter" && onEnter) {
|
|
@@ -54,15 +57,9 @@ const initKeyMaps = async ({ onEnter, onEscape, multiCursorMode, keyMaps, defaul
|
|
|
54
57
|
view.dispatch({
|
|
55
58
|
effects: ThemeCompartment.reconfigure(theme === "dark"
|
|
56
59
|
? getDarkTheme({
|
|
57
|
-
dark
|
|
58
|
-
light,
|
|
59
|
-
theme,
|
|
60
|
-
})
|
|
60
|
+
dark})
|
|
61
61
|
: getLightTheme({
|
|
62
|
-
|
|
63
|
-
light,
|
|
64
|
-
theme,
|
|
65
|
-
})),
|
|
62
|
+
light})),
|
|
66
63
|
});
|
|
67
64
|
});
|
|
68
65
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-key-map.js","sources":["../../../../src/extensions/keymaps/init-key-map.ts"],"sourcesContent":["import { historyKeymap, indentWithTab, standardKeymap } from \"@codemirror/commands\";\nimport type { Extension } from \"@codemirror/state\";\nimport { type EditorView, type KeyBinding, drawSelection, keymap } from \"@codemirror/view\";\nimport { saveDispatch } from \"@/lib/utils\";\nimport { ThemeCompartment, VimModeCompartment } from \"../compartments\";\nimport { type EditorTheme, type ThemeOptions, getDarkTheme, getLightTheme } from \"../theme\";\n\nexport type InitKeyMapsOptions = {\n onEnter?: HandleEnterKeyMapEditorFunction;\n onEscape?: HandleEscapeKeyMapEditorFunction;\n keyMaps?: CustomKeyMap[];\n defaultKeyMaps?: DefaultKeyMapsOptions;\n};\n\nexport type CustomKeyMap = KeyBinding;\nexport type HandleEnterKeyMapEditorFunction = (view: EditorView) => boolean;\nexport type HandleEscapeKeyMapEditorFunction = (view: EditorView) => boolean;\nexport type DefaultKeyMapsOptions = {\n vim?: boolean;\n theme?: boolean;\n};\n\nlet vimMode = false;\nlet theme: EditorTheme = \"light\";\n\nexport const initKeyMaps = async ({\n onEnter,\n onEscape,\n multiCursorMode,\n keyMaps,\n defaultKeyMaps,\n theme: initialTheme,\n vimMode: initialVimMode,\n dark,\n light,\n}: InitKeyMapsOptions & {\n multiCursorMode: boolean;\n vimMode: boolean;\n theme: EditorTheme;\n dark?: ThemeOptions;\n light?: ThemeOptions;\n}): Promise<Extension> => {\n vimMode = initialVimMode;\n theme = initialTheme;\n\n /** tab */\n const keyBindings: CustomKeyMap[] = [indentWithTab];\n\n /** standard */\n keyBindings.push(\n ...standardKeymap.map<CustomKeyMap>((keyMap) => {\n if (keyMap.key === \"Enter\" && onEnter) {\n return {\n key: \"Enter\",\n shift: keyMap.run,\n run: (view) => {\n const response = onEnter(view);\n\n if (response) keyMap.run?.(view);\n\n return response;\n },\n };\n }\n\n return keyMap;\n }),\n );\n\n /** vim */\n if (defaultKeyMaps?.vim)\n keyBindings.push({\n key: \"Mod-Alt-v\",\n run: (view) => {\n vimMode = !vimMode;\n\n void import(\"@replit/codemirror-vim\").then(({ vim }) => {\n saveDispatch(() => {\n view.dispatch({\n effects: VimModeCompartment.reconfigure(\n vimMode ? [vim({ status: true }), drawSelection()] : [],\n ),\n });\n });\n });\n\n return true;\n },\n });\n\n /** theme */\n if (defaultKeyMaps?.theme)\n keyBindings.push({\n key: \"Mod-Alt-a\",\n run: (view) => {\n theme = theme === \"light\" ? \"dark\" : \"light\";\n saveDispatch(() => {\n view.dispatch({\n effects: ThemeCompartment.reconfigure(\n theme === \"dark\"\n ? getDarkTheme({\n dark,\n light,\n theme,\n })\n : getLightTheme({\n dark,\n light,\n theme,\n }),\n ),\n });\n });\n\n return true;\n },\n });\n\n /** escape */\n if (onEscape) {\n keyBindings.push({\n key: \"Escape\",\n run: (view) => {\n return onEscape(view);\n },\n });\n }\n\n /** custom */\n if (keyMaps) {\n keyBindings.push(...keyMaps);\n }\n\n /** history */\n if (multiCursorMode) {\n const { yUndoManagerKeymap } = await import(\"y-codemirror.next\");\n keyBindings.push(...yUndoManagerKeymap);\n } else {\n keyBindings.push(...historyKeymap);\n }\n\n return keymap.of(keyBindings);\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init-key-map.js","sources":["../../../../src/extensions/keymaps/init-key-map.ts"],"sourcesContent":["import { historyKeymap, indentWithTab, standardKeymap } from \"@codemirror/commands\";\nimport type { Extension } from \"@codemirror/state\";\nimport { type EditorView, type KeyBinding, drawSelection, keymap } from \"@codemirror/view\";\nimport { saveDispatch } from \"@/lib/utils\";\nimport { ThemeCompartment, VimModeCompartment } from \"../compartments\";\nimport { type EditorTheme, type ThemeOptions, getDarkTheme, getLightTheme } from \"../theme\";\nimport { boldKeymap, italicKeymap, linkKeymap } from \"./custom\";\n\nexport type InitKeyMapsOptions = {\n onEnter?: HandleEnterKeyMapEditorFunction;\n onEscape?: HandleEscapeKeyMapEditorFunction;\n keyMaps?: CustomKeyMap[];\n defaultKeyMaps?: DefaultKeyMapsOptions;\n};\n\nexport type CustomKeyMap = KeyBinding;\nexport type HandleEnterKeyMapEditorFunction = (view: EditorView) => boolean;\nexport type HandleEscapeKeyMapEditorFunction = (view: EditorView) => boolean;\nexport type DefaultKeyMapsOptions = {\n vim?: boolean;\n theme?: boolean;\n};\n\nlet vimMode = false;\nlet theme: EditorTheme = \"light\";\n\nexport const initKeyMaps = async ({\n onEnter,\n onEscape,\n multiCursorMode,\n keyMaps,\n defaultKeyMaps,\n theme: initialTheme,\n vimMode: initialVimMode,\n dark,\n light,\n}: InitKeyMapsOptions & {\n multiCursorMode: boolean;\n vimMode: boolean;\n theme: EditorTheme;\n dark?: ThemeOptions;\n light?: ThemeOptions;\n}): Promise<Extension> => {\n vimMode = initialVimMode;\n theme = initialTheme;\n\n /** tab */\n const keyBindings: CustomKeyMap[] = [indentWithTab, boldKeymap, italicKeymap, linkKeymap];\n\n /** standard */\n keyBindings.push(\n ...standardKeymap.map<CustomKeyMap>((keyMap) => {\n if (keyMap.key === \"Enter\" && onEnter) {\n return {\n key: \"Enter\",\n shift: keyMap.run,\n run: (view) => {\n const response = onEnter(view);\n\n if (response) keyMap.run?.(view);\n\n return response;\n },\n };\n }\n\n return keyMap;\n }),\n );\n\n /** vim */\n if (defaultKeyMaps?.vim)\n keyBindings.push({\n key: \"Mod-Alt-v\",\n run: (view) => {\n vimMode = !vimMode;\n\n void import(\"@replit/codemirror-vim\").then(({ vim }) => {\n saveDispatch(() => {\n view.dispatch({\n effects: VimModeCompartment.reconfigure(\n vimMode ? [vim({ status: true }), drawSelection()] : [],\n ),\n });\n });\n });\n\n return true;\n },\n });\n\n /** theme */\n if (defaultKeyMaps?.theme)\n keyBindings.push({\n key: \"Mod-Alt-a\",\n run: (view) => {\n theme = theme === \"light\" ? \"dark\" : \"light\";\n saveDispatch(() => {\n view.dispatch({\n effects: ThemeCompartment.reconfigure(\n theme === \"dark\"\n ? getDarkTheme({\n dark,\n light,\n theme,\n })\n : getLightTheme({\n dark,\n light,\n theme,\n }),\n ),\n });\n });\n\n return true;\n },\n });\n\n /** escape */\n if (onEscape) {\n keyBindings.push({\n key: \"Escape\",\n run: (view) => {\n return onEscape(view);\n },\n });\n }\n\n /** custom */\n if (keyMaps) {\n keyBindings.push(...keyMaps);\n }\n\n /** history */\n if (multiCursorMode) {\n const { yUndoManagerKeymap } = await import(\"y-codemirror.next\");\n keyBindings.push(...yUndoManagerKeymap);\n } else {\n keyBindings.push(...historyKeymap);\n }\n\n return keymap.of(keyBindings);\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,9 @@ import { EditorView } from '@codemirror/view';
|
|
|
2
2
|
|
|
3
3
|
function getChangeEvent({ onChange }) {
|
|
4
4
|
return onChange
|
|
5
|
-
? EditorView.updateListener.of((
|
|
6
|
-
if (
|
|
7
|
-
onChange(
|
|
5
|
+
? EditorView.updateListener.of((event) => {
|
|
6
|
+
if (event.docChanged) {
|
|
7
|
+
onChange(event);
|
|
8
8
|
}
|
|
9
9
|
})
|
|
10
10
|
: [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-change-event.js","sources":["../../../../src/extensions/listeners/get-change-event.ts"],"sourcesContent":["import { EditorView, type ViewUpdate } from \"@codemirror/view\";\n\nexport type GetChangeEventOptions = {\n onChange?: HandleChangeEditorFunction;\n};\n\nexport type HandleChangeEditorFunction = (view: ViewUpdate) => void;\n\nexport function getChangeEvent({ onChange }: GetChangeEventOptions) {\n return onChange\n ? EditorView.updateListener.of((
|
|
1
|
+
{"version":3,"file":"get-change-event.js","sources":["../../../../src/extensions/listeners/get-change-event.ts"],"sourcesContent":["import { EditorView, type ViewUpdate } from \"@codemirror/view\";\n\nexport type GetChangeEventOptions = {\n onChange?: HandleChangeEditorFunction;\n};\n\nexport type HandleChangeEditorFunction = (view: ViewUpdate) => void;\n\nexport function getChangeEvent({ onChange }: GetChangeEventOptions) {\n return onChange\n ? EditorView.updateListener.of((event) => {\n if (event.docChanged) {\n onChange(event);\n }\n })\n : [];\n}\n"],"names":[],"mappings":";;AAQgB,SAAA,cAAc,CAAC,EAAE,QAAQ,EAAyB,EAAA;AAChE,IAAA,OAAO;UACH,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,KAAI;AACrC,YAAA,IAAI,KAAK,CAAC,UAAU,EAAE;gBACpB,QAAQ,CAAC,KAAK,CAAC;;AAEnB,SAAC;UACD,EAAE;AACR;;;;"}
|
|
@@ -3,11 +3,11 @@ import { EditorView } from '@codemirror/view';
|
|
|
3
3
|
|
|
4
4
|
function getFocusEvent({ onBlur, onFocus }) {
|
|
5
5
|
return onFocus || onBlur
|
|
6
|
-
? EditorView.focusChangeEffect.of((
|
|
6
|
+
? EditorView.focusChangeEffect.of((event, focus) => {
|
|
7
7
|
if (focus && onFocus)
|
|
8
|
-
onFocus(
|
|
8
|
+
onFocus(event);
|
|
9
9
|
else if (!focus && onBlur)
|
|
10
|
-
onBlur(
|
|
10
|
+
onBlur(event);
|
|
11
11
|
return null;
|
|
12
12
|
})
|
|
13
13
|
: [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-focus-event.js","sources":["../../../../src/extensions/listeners/get-focus-event.ts"],"sourcesContent":["import { type EditorState } from \"@codemirror/state\";\nimport { EditorView } from \"@codemirror/view\";\n\nexport type GetFocusEventOptions = {\n onFocus?: HandleFocusEditorFunction;\n onBlur?: HandleBlurEditorFunction;\n};\n\nexport type HandleFocusEditorFunction = (state: EditorState) => void;\nexport type HandleBlurEditorFunction = (state: EditorState) => void;\n\nexport function getFocusEvent({ onBlur, onFocus }: GetFocusEventOptions) {\n return onFocus || onBlur\n ? EditorView.focusChangeEffect.of((
|
|
1
|
+
{"version":3,"file":"get-focus-event.js","sources":["../../../../src/extensions/listeners/get-focus-event.ts"],"sourcesContent":["import { type EditorState } from \"@codemirror/state\";\nimport { EditorView } from \"@codemirror/view\";\n\nexport type GetFocusEventOptions = {\n onFocus?: HandleFocusEditorFunction;\n onBlur?: HandleBlurEditorFunction;\n};\n\nexport type HandleFocusEditorFunction = (state: EditorState) => void;\nexport type HandleBlurEditorFunction = (state: EditorState) => void;\n\nexport function getFocusEvent({ onBlur, onFocus }: GetFocusEventOptions) {\n return onFocus || onBlur\n ? EditorView.focusChangeEffect.of((event, focus) => {\n if (focus && onFocus) onFocus(event);\n else if (!focus && onBlur) onBlur(event);\n\n return null;\n })\n : [];\n}\n"],"names":[],"mappings":";;;SAWgB,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAwB,EAAA;IACrE,OAAO,OAAO,IAAI;AAChB,UAAE,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;YAC/C,IAAI,KAAK,IAAI,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC;iBAC/B,IAAI,CAAC,KAAK,IAAI,MAAM;gBAAE,MAAM,CAAC,KAAK,CAAC;AAExC,YAAA,OAAO,IAAI;AACb,SAAC;UACD,EAAE;AACR;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockquote-constants.js","sources":["../../../../../src/extensions/markdown/blockquote/blockquote-constants.ts"],"sourcesContent":["export const NAME_OF_BLOCKQUOTE_MARK = \"QuoteMark\";\nexport const CODE_OF_SPACE =
|
|
1
|
+
{"version":3,"file":"blockquote-constants.js","sources":["../../../../../src/extensions/markdown/blockquote/blockquote-constants.ts"],"sourcesContent":["export const NAME_OF_BLOCKQUOTE_MARK = \"QuoteMark\";\nexport const CODE_OF_SPACE = \" \".codePointAt(0);\nexport const CODE_OF_BLOCKQUOTE_MARK = 62; // >\n"],"names":[],"mappings":"AAAO,MAAM,uBAAuB,GAAG;AAC1B,MAAA,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;AACjC,MAAA,uBAAuB,GAAG,GAAG;;;;"}
|
|
@@ -4,7 +4,7 @@ import '../../compartments/index.js';
|
|
|
4
4
|
import '@codemirror/language';
|
|
5
5
|
import '@lezer/highlight';
|
|
6
6
|
import { CLASSES } from '../../theme/theme-constants.js';
|
|
7
|
-
import {
|
|
7
|
+
import { getHideDecoration, getReplaceDecoration, getLineDecoration } from '../../../lib/utils/get-decoration.js';
|
|
8
8
|
import { isInRange } from '../../../lib/utils/is-in-range.js';
|
|
9
9
|
import styles from '../styles.module.scss.js';
|
|
10
10
|
import { NAME_OF_BLOCKQUOTE_MARK, CODE_OF_SPACE, CODE_OF_BLOCKQUOTE_MARK } from './blockquote-constants.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockquote-decoration.js","sources":["../../../../../src/extensions/markdown/blockquote/blockquote-decoration.ts"],"sourcesContent":["import clsx from \"clsx\";\nimport { CLASSES } from \"@/extensions/theme\";\nimport { utils } from \"@/lib\";\nimport type {\n DecorationPlugin,\n GetDecorationOptions,\n GetSelectionDecorationOptions,\n} from \"../markdown-types\";\nimport styles from \"../styles.module.scss\";\nimport {\n CODE_OF_BLOCKQUOTE_MARK,\n CODE_OF_SPACE,\n NAME_OF_BLOCKQUOTE_MARK,\n} from \"./blockquote-constants\";\nimport { BlockquoteWidget } from \"./blockquote-widget\";\n\nfunction getBlockquoteDecorations({ decorations, node, view }: GetDecorationOptions) {\n if (node.name !== NAME_OF_BLOCKQUOTE_MARK) {\n return;\n }\n\n const line = view.lineBlockAt(node.from);\n let isInner = false;\n\n if (line.from !== node.from) {\n const content = view.state.doc.sliceString(line.from, node.to);\n let pos = content.length - 1;\n let isHasMark = false;\n\n while (pos >= 0) {\n pos--;\n const currentCode = content.charCodeAt(pos);\n if (currentCode === CODE_OF_SPACE) continue;\n if (currentCode === CODE_OF_BLOCKQUOTE_MARK) {\n if (!isHasMark) {\n isHasMark = true;\n continue;\n }\n if (!isInner) {\n isInner = true;\n break;\n }\n }\n pos = -1;\n }\n }\n\n if (!isInner) {\n decorations.push(\n utils.getLineDecoration({\n style: clsx(styles.blockquote, CLASSES.blockquote),\n range: [line.from],\n }),\n );\n }\n}\n\nfunction getBlockquoteSelectionDecorations({\n decorations,\n node,\n view,\n forceActive,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_BLOCKQUOTE_MARK) {\n return;\n }\n\n const line = view.lineBlockAt(node.from);\n let isInner = false;\n let isDeepInner = false;\n\n if (line.from !== node.from) {\n const content = view.state.doc.sliceString(line.from, node.to);\n let pos = content.length;\n let isHasMark = false;\n\n while (pos >= 0) {\n pos--;\n const currentCode = content.charCodeAt(pos);\n\n if (currentCode === CODE_OF_SPACE) continue;\n if (currentCode === CODE_OF_BLOCKQUOTE_MARK) {\n if (!isHasMark) {\n isHasMark = true;\n continue;\n }\n if (!isInner) {\n isInner = true;\n continue;\n }\n if (!isDeepInner) {\n isDeepInner = true;\n break;\n }\n }\n pos = -1;\n }\n }\n\n if (\n forceActive ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [line.from, line.to])\n ) {\n if (!isInner) decorations.push(utils.getHideDecoration({ range: [node.from, node.to] }));\n else\n decorations.push(\n utils.getReplaceDecoration({\n widget: new BlockquoteWidget(isDeepInner),\n range: [node.from, node.to],\n }),\n );\n }\n}\n\nexport const blockquoteDecorationPlugin: DecorationPlugin = {\n decorations: [getBlockquoteDecorations],\n selectionDecorations: [getBlockquoteSelectionDecorations],\n};\n"],"names":["utils.getLineDecoration","utils.isInRange","utils.getHideDecoration","utils.getReplaceDecoration"],"mappings":";;;;;;;;;;;;AAgBA,SAAS,wBAAwB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAwB,EAAA;AACjF,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB,EAAE;QACzC;;IAGF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK;IAEnB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9D,QAAA,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QAC5B,IAAI,SAAS,GAAG,KAAK;AAErB,QAAA,OAAO,GAAG,IAAI,CAAC,EAAE;AACf,YAAA,GAAG,EAAE;YACL,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAC3C,IAAI,WAAW,KAAK,aAAa;gBAAE;AACnC,YAAA,IAAI,WAAW,KAAK,uBAAuB,EAAE;gBAC3C,IAAI,CAAC,SAAS,EAAE;oBACd,SAAS,GAAG,IAAI;oBAChB;;gBAEF,IAAI,CAAC,OAAO,EAAE;oBACZ,OAAO,GAAG,IAAI;oBACd;;;YAGJ,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"blockquote-decoration.js","sources":["../../../../../src/extensions/markdown/blockquote/blockquote-decoration.ts"],"sourcesContent":["import clsx from \"clsx\";\nimport { CLASSES } from \"@/extensions/theme\";\nimport { utils } from \"@/lib\";\nimport type {\n DecorationPlugin,\n GetDecorationOptions,\n GetSelectionDecorationOptions,\n} from \"../markdown-types\";\nimport styles from \"../styles.module.scss\";\nimport {\n CODE_OF_BLOCKQUOTE_MARK,\n CODE_OF_SPACE,\n NAME_OF_BLOCKQUOTE_MARK,\n} from \"./blockquote-constants\";\nimport { BlockquoteWidget } from \"./blockquote-widget\";\n\nfunction getBlockquoteDecorations({ decorations, node, view }: GetDecorationOptions) {\n if (node.name !== NAME_OF_BLOCKQUOTE_MARK) {\n return;\n }\n\n const line = view.lineBlockAt(node.from);\n let isInner = false;\n\n if (line.from !== node.from) {\n const content = view.state.doc.sliceString(line.from, node.to);\n let pos = content.length - 1;\n let isHasMark = false;\n\n while (pos >= 0) {\n pos--;\n const currentCode = content.charCodeAt(pos);\n if (currentCode === CODE_OF_SPACE) continue;\n if (currentCode === CODE_OF_BLOCKQUOTE_MARK) {\n if (!isHasMark) {\n isHasMark = true;\n continue;\n }\n if (!isInner) {\n isInner = true;\n break;\n }\n }\n pos = -1;\n }\n }\n\n if (!isInner) {\n decorations.push(\n utils.getLineDecoration({\n style: clsx(styles.blockquote, CLASSES.blockquote),\n range: [line.from],\n }),\n );\n }\n}\n\nfunction getBlockquoteSelectionDecorations({\n decorations,\n node,\n view,\n forceActive,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_BLOCKQUOTE_MARK) {\n return;\n }\n\n const line = view.lineBlockAt(node.from);\n let isInner = false;\n let isDeepInner = false;\n\n if (line.from !== node.from) {\n const content = view.state.doc.sliceString(line.from, node.to);\n let pos = content.length;\n let isHasMark = false;\n\n while (pos >= 0) {\n pos--;\n const currentCode = content.charCodeAt(pos);\n\n if (currentCode === CODE_OF_SPACE) continue;\n if (currentCode === CODE_OF_BLOCKQUOTE_MARK) {\n if (!isHasMark) {\n isHasMark = true;\n continue;\n }\n if (!isInner) {\n isInner = true;\n continue;\n }\n if (!isDeepInner) {\n isDeepInner = true;\n break;\n }\n }\n pos = -1;\n }\n }\n\n if (\n forceActive ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [line.from, line.to])\n ) {\n if (!isInner) decorations.push(utils.getHideDecoration({ range: [node.from, node.to] }));\n else\n decorations.push(\n utils.getReplaceDecoration({\n widget: new BlockquoteWidget(isDeepInner),\n range: [node.from, node.to],\n }),\n );\n }\n}\n\nexport const blockquoteDecorationPlugin: DecorationPlugin = {\n decorations: [getBlockquoteDecorations],\n selectionDecorations: [getBlockquoteSelectionDecorations],\n};\n"],"names":["utils.getLineDecoration","utils.isInRange","utils.getHideDecoration","utils.getReplaceDecoration"],"mappings":";;;;;;;;;;;;AAgBA,SAAS,wBAAwB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAwB,EAAA;AACjF,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB,EAAE;QACzC;;IAGF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK;IAEnB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9D,QAAA,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QAC5B,IAAI,SAAS,GAAG,KAAK;AAErB,QAAA,OAAO,GAAG,IAAI,CAAC,EAAE;AACf,YAAA,GAAG,EAAE;YACL,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAC3C,IAAI,WAAW,KAAK,aAAa;gBAAE;AACnC,YAAA,IAAI,WAAW,KAAK,uBAAuB,EAAE;gBAC3C,IAAI,CAAC,SAAS,EAAE;oBACd,SAAS,GAAG,IAAI;oBAChB;;gBAEF,IAAI,CAAC,OAAO,EAAE;oBACZ,OAAO,GAAG,IAAI;oBACd;;;YAGJ,GAAG,GAAG,EAAE;;;IAIZ,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,WAAW,CAAC,IAAI,CACdA,iBAAuB,CAAC;YACtB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;AAClD,YAAA,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;AACnB,SAAA,CAAC,CACH;;AAEL;AAEA,SAAS,iCAAiC,CAAC,EACzC,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,WAAW,GACmB,EAAA;AAC9B,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB,EAAE;QACzC;;IAGF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK;IACnB,IAAI,WAAW,GAAG,KAAK;IAEvB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9D,QAAA,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM;QACxB,IAAI,SAAS,GAAG,KAAK;AAErB,QAAA,OAAO,GAAG,IAAI,CAAC,EAAE;AACf,YAAA,GAAG,EAAE;YACL,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAE3C,IAAI,WAAW,KAAK,aAAa;gBAAE;AACnC,YAAA,IAAI,WAAW,KAAK,uBAAuB,EAAE;gBAC3C,IAAI,CAAC,SAAS,EAAE;oBACd,SAAS,GAAG,IAAI;oBAChB;;gBAEF,IAAI,CAAC,OAAO,EAAE;oBACZ,OAAO,GAAG,IAAI;oBACd;;gBAEF,IAAI,CAAC,WAAW,EAAE;oBAChB,WAAW,GAAG,IAAI;oBAClB;;;YAGJ,GAAG,GAAG,EAAE;;;AAIZ,IAAA,IACE,WAAW;QACX,CAAC,IAAI,CAAC,QAAQ;QACd,CAACC,SAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EACnE;AACA,QAAA,IAAI,CAAC,OAAO;YAAE,WAAW,CAAC,IAAI,CAACC,iBAAuB,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;AAEtF,YAAA,WAAW,CAAC,IAAI,CACdC,oBAA0B,CAAC;AACzB,gBAAA,MAAM,EAAE,IAAI,gBAAgB,CAAC,WAAW,CAAC;gBACzC,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC5B,aAAA,CAAC,CACH;;AAEP;AAEa,MAAA,0BAA0B,GAAqB;IAC1D,WAAW,EAAE,CAAC,wBAAwB,CAAC;IACvC,oBAAoB,EAAE,CAAC,iCAAiC,CAAC;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bold-constants.js","sources":["../../../../../src/extensions/markdown/bold/bold-constants.ts"],"sourcesContent":["export const NAME_OF_BOLD = \"StrongEmphasis\";\nexport const LIST_OF_BOLD_MARKS = new Set([
|
|
1
|
+
{"version":3,"file":"bold-constants.js","sources":["../../../../../src/extensions/markdown/bold/bold-constants.ts"],"sourcesContent":["export const NAME_OF_BOLD = \"StrongEmphasis\";\nexport const LIST_OF_BOLD_MARKS = new Set([\"_\".codePointAt(0), \"*\".codePointAt(0)]);\n"],"names":[],"mappings":"AAAO,MAAM,YAAY,GAAG;MACf,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { syntaxTree } from '@codemirror/language';
|
|
2
|
-
import {
|
|
2
|
+
import { getHideDecoration, getMarkDecoration } from '../../../lib/utils/get-decoration.js';
|
|
3
3
|
import { isInRange } from '../../../lib/utils/is-in-range.js';
|
|
4
4
|
import styles from '../styles.module.scss.js';
|
|
5
5
|
import { NAME_OF_BOLD, LIST_OF_BOLD_MARKS } from './bold-constants.js';
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
const NAME_OF_FENCED_CODE = "FencedCode";
|
|
2
2
|
const NAME_OF_INLINE_CODE = "InlineCode";
|
|
3
|
+
const NAME_OF_BLOCK_CODE = "CodeBlock";
|
|
4
|
+
const CODE_OF_SPACE = " ".codePointAt(0);
|
|
3
5
|
const CODE_OF_CODE_MARK = 96; // `
|
|
4
6
|
|
|
5
|
-
export { CODE_OF_CODE_MARK, NAME_OF_FENCED_CODE, NAME_OF_INLINE_CODE };
|
|
7
|
+
export { CODE_OF_CODE_MARK, CODE_OF_SPACE, NAME_OF_BLOCK_CODE, NAME_OF_FENCED_CODE, NAME_OF_INLINE_CODE };
|
|
6
8
|
//# sourceMappingURL=code-constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-constants.js","sources":["../../../../../src/extensions/markdown/code/code-constants.ts"],"sourcesContent":["export const NAME_OF_FENCED_CODE = \"FencedCode\";\nexport const NAME_OF_INLINE_CODE = \"InlineCode\";\nexport const CODE_OF_CODE_MARK = 96; // `\n"],"names":[],"mappings":"AAAO,MAAM,mBAAmB,GAAG;AAC5B,MAAM,mBAAmB,GAAG;
|
|
1
|
+
{"version":3,"file":"code-constants.js","sources":["../../../../../src/extensions/markdown/code/code-constants.ts"],"sourcesContent":["export const NAME_OF_FENCED_CODE = \"FencedCode\";\nexport const NAME_OF_INLINE_CODE = \"InlineCode\";\nexport const NAME_OF_BLOCK_CODE = \"CodeBlock\";\nexport const CODE_OF_SPACE = \" \".codePointAt(0);\nexport const CODE_OF_CODE_MARK = 96; // `\n"],"names":[],"mappings":"AAAO,MAAM,mBAAmB,GAAG;AAC5B,MAAM,mBAAmB,GAAG;AAC5B,MAAM,kBAAkB,GAAG;AACrB,MAAA,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;AACjC,MAAA,iBAAiB,GAAG,GAAG;;;;"}
|
|
@@ -4,11 +4,11 @@ import '../../compartments/index.js';
|
|
|
4
4
|
import '@codemirror/language';
|
|
5
5
|
import '@lezer/highlight';
|
|
6
6
|
import { CLASSES } from '../../theme/theme-constants.js';
|
|
7
|
-
import {
|
|
7
|
+
import { getMarkDecoration, getLineDecoration, getHideDecoration, getWidgetDecorationOptions } from '../../../lib/utils/get-decoration.js';
|
|
8
8
|
import { isInRange } from '../../../lib/utils/is-in-range.js';
|
|
9
9
|
import { isRangeOverlap } from '../../../lib/utils/is-range-overlap.js';
|
|
10
10
|
import styles from '../styles.module.scss.js';
|
|
11
|
-
import { NAME_OF_FENCED_CODE, NAME_OF_INLINE_CODE, CODE_OF_CODE_MARK } from './code-constants.js';
|
|
11
|
+
import { NAME_OF_BLOCK_CODE, CODE_OF_SPACE, NAME_OF_FENCED_CODE, NAME_OF_INLINE_CODE, CODE_OF_CODE_MARK } from './code-constants.js';
|
|
12
12
|
import { CodeWidget } from './code-widget.js';
|
|
13
13
|
|
|
14
14
|
function getCodeSelectionDecorations({ decorations, node, view, forceActive, }) {
|
|
@@ -81,7 +81,7 @@ function getCodeSelectionDecorations({ decorations, node, view, forceActive, })
|
|
|
81
81
|
}
|
|
82
82
|
else {
|
|
83
83
|
decorations.push(getMarkDecoration({
|
|
84
|
-
style: clsx(
|
|
84
|
+
style: clsx(CLASSES.code),
|
|
85
85
|
range: [node.from, node.to],
|
|
86
86
|
}));
|
|
87
87
|
}
|
|
@@ -101,8 +101,39 @@ function getCodeSelectionDecorations({ decorations, node, view, forceActive, })
|
|
|
101
101
|
decorations.push(getHideDecoration({ range: [endMarkPosition.from, endMarkPosition.to] }));
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
+
function getCodeBlockDecorations({ decorations, node, view }) {
|
|
105
|
+
if (node.name !== NAME_OF_BLOCK_CODE)
|
|
106
|
+
return;
|
|
107
|
+
const lines = view.viewportLineBlocks.filter((line) => {
|
|
108
|
+
const isOverlap = isRangeOverlap([node.from, node.to], [line.from, line.to]);
|
|
109
|
+
return isOverlap;
|
|
110
|
+
});
|
|
111
|
+
lines.forEach((line) => {
|
|
112
|
+
const content = view.state.sliceDoc(line.from, line.to);
|
|
113
|
+
let startContent = 0;
|
|
114
|
+
let pos = 0;
|
|
115
|
+
while (pos < content.length) {
|
|
116
|
+
if (content.codePointAt(pos) === CODE_OF_SPACE) {
|
|
117
|
+
pos++;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
startContent = pos;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
decorations.push(getMarkDecoration({
|
|
125
|
+
range: [line.from + startContent, line.to],
|
|
126
|
+
style: clsx(styles.code__block, CLASSES.codeBlock),
|
|
127
|
+
}));
|
|
128
|
+
decorations.push(getLineDecoration({
|
|
129
|
+
range: [line.from],
|
|
130
|
+
style: clsx(styles.code__block_line, CLASSES.codeBlockLine),
|
|
131
|
+
}));
|
|
132
|
+
});
|
|
133
|
+
}
|
|
104
134
|
const codeDecorationPlugin = {
|
|
105
135
|
selectionDecorations: [getCodeSelectionDecorations],
|
|
136
|
+
decorations: [getCodeBlockDecorations],
|
|
106
137
|
};
|
|
107
138
|
|
|
108
139
|
export { codeDecorationPlugin };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-decoration.js","sources":["../../../../../src/extensions/markdown/code/code-decoration.ts"],"sourcesContent":["import clsx from \"clsx\";\nimport { CLASSES } from \"@/extensions/theme\";\nimport { utils } from \"@/lib\";\nimport type { DecorationPlugin, GetSelectionDecorationOptions } from \"../markdown-types\";\nimport styles from \"../styles.module.scss\";\nimport { CODE_OF_CODE_MARK, NAME_OF_FENCED_CODE, NAME_OF_INLINE_CODE } from \"./code-constants\";\nimport { CodeWidget } from \"./code-widget\";\n\nfunction getCodeSelectionDecorations({\n decorations,\n node,\n view,\n forceActive,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_FENCED_CODE && node.name !== NAME_OF_INLINE_CODE) {\n return;\n }\n\n let isOverlapLine = false;\n const startMarkPosition = { from: -1, to: -1 };\n const endMarkPosition = { from: -1, to: -1 };\n const lines = view.viewportLineBlocks.filter((line) => {\n const isOverlap = utils.isRangeOverlap([node.from, node.to], [line.from, line.to]);\n if (isOverlap && utils.isInRange(view.state.selection.ranges, [line.from, line.to]))\n isOverlapLine = true;\n\n return isOverlap;\n });\n let languagePos: [number, number] | undefined;\n let language: string | undefined;\n let codeContent: string | undefined;\n\n const content = view.state.doc.sliceString(node.from, node.to);\n let pos = -1;\n while (\n (startMarkPosition.from === -1 || startMarkPosition.to === -1) &&\n pos >= -1 &&\n pos < content.length\n ) {\n pos++;\n const code = content.charCodeAt(pos);\n\n if (code !== CODE_OF_CODE_MARK && startMarkPosition.from === -1) continue;\n else if (code === CODE_OF_CODE_MARK && startMarkPosition.from === -1)\n startMarkPosition.from = node.from + pos;\n else if (code !== CODE_OF_CODE_MARK && startMarkPosition.from !== -1)\n startMarkPosition.to = node.from + pos;\n }\n\n pos = content.length;\n\n while (\n (endMarkPosition.from === -1 || endMarkPosition.to === -1) &&\n pos >= -1 &&\n pos <= content.length\n ) {\n pos--;\n const code = content.charCodeAt(pos);\n\n if (code !== CODE_OF_CODE_MARK && endMarkPosition.to === -1) continue;\n else if (code === CODE_OF_CODE_MARK && endMarkPosition.to === -1)\n endMarkPosition.to = node.from + pos + 1;\n else if (code !== CODE_OF_CODE_MARK && endMarkPosition.to !== -1)\n endMarkPosition.from = node.from + pos + 1;\n }\n\n if (node.name === NAME_OF_FENCED_CODE) {\n const codeInfo = node.node.getChild(\"CodeInfo\");\n const codeText = node.node.getChild(\"CodeText\");\n\n if (codeInfo) {\n language = view.state.doc.sliceString(codeInfo.from, codeInfo.to);\n languagePos = [codeInfo.from, codeInfo.to];\n }\n if (codeText) codeContent = view.state.doc.sliceString(codeText.from, codeText.to);\n else codeContent = \"\";\n }\n if (node.name === NAME_OF_INLINE_CODE) {\n codeContent = view.state.doc.sliceString(startMarkPosition.to, endMarkPosition.from).trim();\n }\n if (!language) language = \"copy\";\n\n if (lines.length > 1) {\n lines.forEach((line) => {\n decorations.push(\n utils.getLineDecoration({\n style: clsx(styles.code__line, CLASSES.code),\n range: [line.from],\n }),\n );\n });\n } else {\n decorations.push(\n utils.getMarkDecoration({\n style: clsx(styles.code__single, CLASSES.code),\n range: [node.from, node.to],\n }),\n );\n }\n\n if (\n forceActive ||\n !view.hasFocus ||\n (lines.length > 1 && !isOverlapLine) ||\n (lines.length === 1 && !utils.isInRange(view.state.selection.ranges, [node.from, node.to]))\n ) {\n if (lines.length > 1 && language) {\n if (languagePos) decorations.push(utils.getHideDecoration({ range: languagePos }));\n decorations.push(\n utils.getWidgetDecorationOptions({\n widget: new CodeWidget(language, codeContent),\n range: [node.from],\n }),\n );\n }\n decorations.push(\n utils.getHideDecoration({ range: [startMarkPosition.from, startMarkPosition.to] }),\n );\n decorations.push(\n utils.getHideDecoration({ range: [endMarkPosition.from, endMarkPosition.to] }),\n );\n }\n}\n\nexport const codeDecorationPlugin: DecorationPlugin = {\n selectionDecorations: [getCodeSelectionDecorations],\n};\n"],"names":["utils.isRangeOverlap","utils.isInRange","utils.getLineDecoration","utils.getMarkDecoration","utils.getHideDecoration","utils.getWidgetDecorationOptions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"code-decoration.js","sources":["../../../../../src/extensions/markdown/code/code-decoration.ts"],"sourcesContent":["import clsx from \"clsx\";\nimport { CLASSES } from \"@/extensions/theme\";\nimport { utils } from \"@/lib\";\nimport type {\n DecorationPlugin,\n GetDecorationOptions,\n GetSelectionDecorationOptions,\n} from \"../markdown-types\";\nimport styles from \"../styles.module.scss\";\nimport {\n CODE_OF_CODE_MARK,\n CODE_OF_SPACE,\n NAME_OF_BLOCK_CODE,\n NAME_OF_FENCED_CODE,\n NAME_OF_INLINE_CODE,\n} from \"./code-constants\";\nimport { CodeWidget } from \"./code-widget\";\n\nfunction getCodeSelectionDecorations({\n decorations,\n node,\n view,\n forceActive,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_FENCED_CODE && node.name !== NAME_OF_INLINE_CODE) {\n return;\n }\n\n let isOverlapLine = false;\n const startMarkPosition = { from: -1, to: -1 };\n const endMarkPosition = { from: -1, to: -1 };\n const lines = view.viewportLineBlocks.filter((line) => {\n const isOverlap = utils.isRangeOverlap([node.from, node.to], [line.from, line.to]);\n if (isOverlap && utils.isInRange(view.state.selection.ranges, [line.from, line.to]))\n isOverlapLine = true;\n\n return isOverlap;\n });\n let languagePos: [number, number] | undefined;\n let language: string | undefined;\n let codeContent: string | undefined;\n\n const content = view.state.doc.sliceString(node.from, node.to);\n let pos = -1;\n while (\n (startMarkPosition.from === -1 || startMarkPosition.to === -1) &&\n pos >= -1 &&\n pos < content.length\n ) {\n pos++;\n const code = content.charCodeAt(pos);\n\n if (code !== CODE_OF_CODE_MARK && startMarkPosition.from === -1) continue;\n else if (code === CODE_OF_CODE_MARK && startMarkPosition.from === -1)\n startMarkPosition.from = node.from + pos;\n else if (code !== CODE_OF_CODE_MARK && startMarkPosition.from !== -1)\n startMarkPosition.to = node.from + pos;\n }\n\n pos = content.length;\n\n while (\n (endMarkPosition.from === -1 || endMarkPosition.to === -1) &&\n pos >= -1 &&\n pos <= content.length\n ) {\n pos--;\n const code = content.charCodeAt(pos);\n\n if (code !== CODE_OF_CODE_MARK && endMarkPosition.to === -1) continue;\n else if (code === CODE_OF_CODE_MARK && endMarkPosition.to === -1)\n endMarkPosition.to = node.from + pos + 1;\n else if (code !== CODE_OF_CODE_MARK && endMarkPosition.to !== -1)\n endMarkPosition.from = node.from + pos + 1;\n }\n\n if (node.name === NAME_OF_FENCED_CODE) {\n const codeInfo = node.node.getChild(\"CodeInfo\");\n const codeText = node.node.getChild(\"CodeText\");\n\n if (codeInfo) {\n language = view.state.doc.sliceString(codeInfo.from, codeInfo.to);\n languagePos = [codeInfo.from, codeInfo.to];\n }\n if (codeText) codeContent = view.state.doc.sliceString(codeText.from, codeText.to);\n else codeContent = \"\";\n }\n if (node.name === NAME_OF_INLINE_CODE) {\n codeContent = view.state.doc.sliceString(startMarkPosition.to, endMarkPosition.from).trim();\n }\n if (!language) language = \"copy\";\n\n if (lines.length > 1) {\n lines.forEach((line) => {\n decorations.push(\n utils.getLineDecoration({\n style: clsx(styles.code__line, CLASSES.code),\n range: [line.from],\n }),\n );\n });\n } else {\n decorations.push(\n utils.getMarkDecoration({\n style: clsx(CLASSES.code),\n range: [node.from, node.to],\n }),\n );\n }\n\n if (\n forceActive ||\n !view.hasFocus ||\n (lines.length > 1 && !isOverlapLine) ||\n (lines.length === 1 && !utils.isInRange(view.state.selection.ranges, [node.from, node.to]))\n ) {\n if (lines.length > 1 && language) {\n if (languagePos) decorations.push(utils.getHideDecoration({ range: languagePos }));\n decorations.push(\n utils.getWidgetDecorationOptions({\n widget: new CodeWidget(language, codeContent),\n range: [node.from],\n }),\n );\n }\n decorations.push(\n utils.getHideDecoration({ range: [startMarkPosition.from, startMarkPosition.to] }),\n );\n decorations.push(\n utils.getHideDecoration({ range: [endMarkPosition.from, endMarkPosition.to] }),\n );\n }\n}\n\nfunction getCodeBlockDecorations({ decorations, node, view }: GetDecorationOptions) {\n if (node.name !== NAME_OF_BLOCK_CODE) return;\n\n const lines = view.viewportLineBlocks.filter((line) => {\n const isOverlap = utils.isRangeOverlap([node.from, node.to], [line.from, line.to]);\n\n return isOverlap;\n });\n\n lines.forEach((line) => {\n const content = view.state.sliceDoc(line.from, line.to);\n let startContent = 0;\n let pos = 0;\n\n while (pos < content.length) {\n if (content.codePointAt(pos) === CODE_OF_SPACE) {\n pos++;\n } else {\n startContent = pos;\n break;\n }\n }\n\n decorations.push(\n utils.getMarkDecoration({\n range: [line.from + startContent, line.to],\n style: clsx(styles.code__block, CLASSES.codeBlock),\n }),\n );\n\n decorations.push(\n utils.getLineDecoration({\n range: [line.from],\n style: clsx(styles.code__block_line, CLASSES.codeBlockLine),\n }),\n );\n });\n}\n\nexport const codeDecorationPlugin: DecorationPlugin = {\n selectionDecorations: [getCodeSelectionDecorations],\n decorations: [getCodeBlockDecorations],\n};\n"],"names":["utils.isRangeOverlap","utils.isInRange","utils.getLineDecoration","utils.getMarkDecoration","utils.getHideDecoration","utils.getWidgetDecorationOptions"],"mappings":";;;;;;;;;;;;;AAkBA,SAAS,2BAA2B,CAAC,EACnC,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,WAAW,GACmB,EAAA;AAC9B,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE;QAC1E;;IAGF,IAAI,aAAa,GAAG,KAAK;AACzB,IAAA,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;AAC9C,IAAA,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;QACpD,MAAM,SAAS,GAAGA,cAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,SAAS,IAAIC,SAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACjF,aAAa,GAAG,IAAI;AAEtB,QAAA,OAAO,SAAS;AAClB,KAAC,CAAC;AACF,IAAA,IAAI,WAAyC;AAC7C,IAAA,IAAI,QAA4B;AAChC,IAAA,IAAI,WAA+B;AAEnC,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9D,IAAA,IAAI,GAAG,GAAG,EAAE;AACZ,IAAA,OACE,CAAC,iBAAiB,CAAC,IAAI,KAAK,EAAE,IAAI,iBAAiB,CAAC,EAAE,KAAK,EAAE;QAC7D,GAAG,IAAI,EAAE;AACT,QAAA,GAAG,GAAG,OAAO,CAAC,MAAM,EACpB;AACA,QAAA,GAAG,EAAE;QACL,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAEpC,IAAI,IAAI,KAAK,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,KAAK,EAAE;YAAE;aAC5D,IAAI,IAAI,KAAK,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,KAAK,EAAE;YAClE,iBAAiB,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG;aACrC,IAAI,IAAI,KAAK,iBAAiB,IAAI,iBAAiB,CAAC,IAAI,KAAK,EAAE;YAClE,iBAAiB,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG;;AAG1C,IAAA,GAAG,GAAG,OAAO,CAAC,MAAM;AAEpB,IAAA,OACE,CAAC,eAAe,CAAC,IAAI,KAAK,EAAE,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE;QACzD,GAAG,IAAI,EAAE;AACT,QAAA,GAAG,IAAI,OAAO,CAAC,MAAM,EACrB;AACA,QAAA,GAAG,EAAE;QACL,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAEpC,IAAI,IAAI,KAAK,iBAAiB,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE;YAAE;aACxD,IAAI,IAAI,KAAK,iBAAiB,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE;YAC9D,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC;aACrC,IAAI,IAAI,KAAK,iBAAiB,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE;YAC9D,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC;;AAG9C,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAE/C,IAAI,QAAQ,EAAE;AACZ,YAAA,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YACjE,WAAW,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;;AAE5C,QAAA,IAAI,QAAQ;AAAE,YAAA,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;;YAC7E,WAAW,GAAG,EAAE;;AAEvB,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE;QACrC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;;AAE7F,IAAA,IAAI,CAAC,QAAQ;QAAE,QAAQ,GAAG,MAAM;AAEhC,IAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,YAAA,WAAW,CAAC,IAAI,CACdC,iBAAuB,CAAC;gBACtB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC;AAC5C,gBAAA,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;AACnB,aAAA,CAAC,CACH;AACH,SAAC,CAAC;;SACG;AACL,QAAA,WAAW,CAAC,IAAI,CACdC,iBAAuB,CAAC;AACtB,YAAA,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACzB,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC5B,SAAA,CAAC,CACH;;AAGH,IAAA,IACE,WAAW;QACX,CAAC,IAAI,CAAC,QAAQ;SACb,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;AACpC,SAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAACF,SAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAC3F;QACA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,EAAE;AAChC,YAAA,IAAI,WAAW;AAAE,gBAAA,WAAW,CAAC,IAAI,CAACG,iBAAuB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;AAClF,YAAA,WAAW,CAAC,IAAI,CACdC,0BAAgC,CAAC;AAC/B,gBAAA,MAAM,EAAE,IAAI,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC;AAC7C,gBAAA,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;AACnB,aAAA,CAAC,CACH;;QAEH,WAAW,CAAC,IAAI,CACdD,iBAAuB,CAAC,EAAE,KAAK,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC,CACnF;QACD,WAAW,CAAC,IAAI,CACdA,iBAAuB,CAAC,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC,CAC/E;;AAEL;AAEA,SAAS,uBAAuB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAwB,EAAA;AAChF,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB;QAAE;IAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;QACpD,MAAM,SAAS,GAAGJ,cAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;AAElF,QAAA,OAAO,SAAS;AAClB,KAAC,CAAC;AAEF,IAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACvD,IAAI,YAAY,GAAG,CAAC;QACpB,IAAI,GAAG,GAAG,CAAC;AAEX,QAAA,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE;YAC3B,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,aAAa,EAAE;AAC9C,gBAAA,GAAG,EAAE;;iBACA;gBACL,YAAY,GAAG,GAAG;gBAClB;;;AAIJ,QAAA,WAAW,CAAC,IAAI,CACdG,iBAAuB,CAAC;YACtB,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC;AACnD,SAAA,CAAC,CACH;AAED,QAAA,WAAW,CAAC,IAAI,CACdD,iBAAuB,CAAC;AACtB,YAAA,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;YAClB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,aAAa,CAAC;AAC5D,SAAA,CAAC,CACH;AACH,KAAC,CAAC;AACJ;AAEa,MAAA,oBAAoB,GAAqB;IACpD,oBAAoB,EAAE,CAAC,2BAA2B,CAAC;IACnD,WAAW,EAAE,CAAC,uBAAuB,CAAC;;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import clsx from 'clsx';
|
|
2
|
-
import {
|
|
2
|
+
import { getHideDecoration, getLineDecoration } from '../../../lib/utils/get-decoration.js';
|
|
3
3
|
import { isInRange } from '../../../lib/utils/is-in-range.js';
|
|
4
4
|
import styles from '../styles.module.scss.js';
|
|
5
5
|
import { NAME_OF_HEADER, NAME_OF_HEADER_UNDER, NAME_OF_HEADER_MARK } from './header-constants.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-decoration.js","sources":["../../../../../src/extensions/markdown/image/image-decoration.ts"],"sourcesContent":["import { type EditorView } from \"@codemirror/view\";\nimport type { SyntaxNodeRef } from \"@lezer/common\";\nimport { utils } from \"@/lib\";\nimport { markdownState } from \"../markdown-state\";\nimport type {\n DecorationPlugin,\n GetDecorationOptions,\n GetSelectionDecorationOptions,\n} from \"../markdown-types\";\nimport {\n CODE_OF_END_IMAGE_TEXT,\n CODE_OF_END_IMAGE_URL,\n CODE_OF_START_IMAGE_TEXT,\n CODE_OF_START_IMAGE_URL,\n NAME_OF_IMAGE,\n} from \"./image-constants\";\nimport { ImageWidget } from \"./image-widget\";\n\nfunction getImageDecorations({ decorations, node, view, settings }: GetDecorationOptions) {\n if (node.name !== NAME_OF_IMAGE) {\n return;\n }\n\n const { text, url } = parseInfo(view, node);\n const uniqueId = view.state.field(markdownState).uniqueId;\n const line = view.lineBlockAt(node.from);\n const fullLine = line.from === node.from && line.to === node.to;\n\n decorations.push(\n utils.getWidgetDecorationOptions({\n range: [node.to],\n widget: new ImageWidget(\n text,\n url,\n node.from,\n node.to,\n uniqueId,\n fullLine,\n settings.imageSrcGetter,\n view,\n ),\n }),\n );\n}\n\nfunction getImageSelectionDecorations({\n decorations,\n node,\n view,\n forceActive,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_IMAGE) {\n return;\n }\n\n const { text, url } = parseInfo(view, node);\n const openedImage = view.state.field(markdownState).openedImage;\n const uniqueId = view.state.field(markdownState).uniqueId;\n const key = `${url}:${text}:${uniqueId}:${node.from}:${node.to}`;\n const isOpened = openedImage && openedImage === key;\n\n if (isOpened) {\n return void decorations.push(\n utils.getMarkDecoration({\n range: [node.from, node.to],\n attributes: {\n \"data-id\": key,\n },\n }),\n );\n }\n\n if (\n forceActive ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [node.from, node.to])\n ) {\n decorations.push(utils.getHideDecoration({ range: [node.from, node.to] }));\n } else {\n decorations.push(\n utils.getMarkDecoration({\n range: [node.from, node.to],\n attributes: {\n \"data-id\": key,\n },\n }),\n );\n }\n}\n\nfunction parseInfo(view: EditorView, node: SyntaxNodeRef) {\n const content = view.state.doc.sliceString(node.from, node.to);\n const textCoordinates = { from: -1, to: -1 };\n const urlCoordinates = { from: -1, to: -1 };\n let pos = -1;\n\n while (pos < content.length) {\n pos++;\n const code = content.charCodeAt(pos);\n\n if (textCoordinates.from === -1 && code === CODE_OF_START_IMAGE_TEXT)\n textCoordinates.from = pos + 1;\n else if (\n urlCoordinates.from === -1 &&\n textCoordinates.to !== -1 &&\n code === CODE_OF_START_IMAGE_URL\n )\n urlCoordinates.from = pos + 1;\n else if (\n textCoordinates.from !== -1 &&\n textCoordinates.to === -1 &&\n code === CODE_OF_END_IMAGE_TEXT\n )\n textCoordinates.to = pos;\n else if (\n urlCoordinates.from !== -1 &&\n urlCoordinates.to === -1 &&\n code === CODE_OF_END_IMAGE_URL\n )\n urlCoordinates.to = pos;\n }\n\n const text = content.substring(textCoordinates.from, textCoordinates.to);\n const url = content.substring(urlCoordinates.from, urlCoordinates.to);\n\n return { text, url };\n}\n\nexport const imageDecorationPlugin: DecorationPlugin = {\n selectionDecorations: [getImageSelectionDecorations],\n decorations: [getImageDecorations],\n};\n"],"names":["utils.getWidgetDecorationOptions","utils.getMarkDecoration","utils.isInRange","utils.getHideDecoration"],"mappings":";;;;;;;AAkBA,SAAS,mBAAmB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAwB,EAAA;AACtF,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE;QAC/B;;AAGF,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;AAC3C,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;AACxC,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;AAE/D,IAAA,WAAW,CAAC,IAAI,CACdA,0BAAgC,CAAC;AAC/B,QAAA,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,EAAE,IAAI,WAAW,CACrB,IAAI,EACJ,GAAG,EACH,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,EAAE,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,CAAC,cAAc,EACvB,IAAI,CACL;AACF,KAAA,CAAC,CACH;AACH;AAEA,SAAS,4BAA4B,CAAC,EACpC,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,WAAW,GACmB,EAAA;AAC9B,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE;QAC/B;;AAGF,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;AAC3C,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,WAAW;AAC/D,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ;AACzD,IAAA,MAAM,GAAG,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAI,CAAA,EAAA,QAAQ,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE;AAChE,IAAA,MAAM,QAAQ,GAAG,WAAW,IAAI,WAAW,KAAK,GAAG;IAEnD,IAAI,QAAQ,EAAE;QACZ,OAAO,KAAK,WAAW,CAAC,IAAI,CAC1BC,iBAAuB,CAAC;YACtB,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC3B,YAAA,UAAU,EAAE;AACV,gBAAA,SAAS,EAAE,GAAG;AACf,aAAA;AACF,SAAA,CAAC,CACH;;AAGH,IAAA,IACE,WAAW;QACX,CAAC,IAAI,CAAC,QAAQ;QACd,CAACC,SAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EACnE;QACA,WAAW,CAAC,IAAI,CAACC,iBAAuB,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;SACrE;AACL,QAAA,WAAW,CAAC,IAAI,CACdF,iBAAuB,CAAC;YACtB,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC3B,YAAA,UAAU,EAAE;AACV,gBAAA,SAAS,EAAE,GAAG;AACf,aAAA;AACF,SAAA,CAAC,CACH;;AAEL;AAEA,SAAS,SAAS,CAAC,IAAgB,EAAE,IAAmB,EAAA;AACtD,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9D,IAAA,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"image-decoration.js","sources":["../../../../../src/extensions/markdown/image/image-decoration.ts"],"sourcesContent":["import { type EditorView } from \"@codemirror/view\";\nimport type { SyntaxNodeRef } from \"@lezer/common\";\nimport { utils } from \"@/lib\";\nimport { markdownState } from \"../markdown-state\";\nimport type {\n DecorationPlugin,\n GetDecorationOptions,\n GetSelectionDecorationOptions,\n} from \"../markdown-types\";\nimport {\n CODE_OF_END_IMAGE_TEXT,\n CODE_OF_END_IMAGE_URL,\n CODE_OF_START_IMAGE_TEXT,\n CODE_OF_START_IMAGE_URL,\n NAME_OF_IMAGE,\n} from \"./image-constants\";\nimport { ImageWidget } from \"./image-widget\";\n\nfunction getImageDecorations({ decorations, node, view, settings }: GetDecorationOptions) {\n if (node.name !== NAME_OF_IMAGE) {\n return;\n }\n\n const { text, url } = parseInfo(view, node);\n const uniqueId = view.state.field(markdownState).uniqueId;\n const line = view.lineBlockAt(node.from);\n const fullLine = line.from === node.from && line.to === node.to;\n\n decorations.push(\n utils.getWidgetDecorationOptions({\n range: [node.to],\n widget: new ImageWidget(\n text,\n url,\n node.from,\n node.to,\n uniqueId,\n fullLine,\n settings.imageSrcGetter,\n view,\n ),\n }),\n );\n}\n\nfunction getImageSelectionDecorations({\n decorations,\n node,\n view,\n forceActive,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_IMAGE) {\n return;\n }\n\n const { text, url } = parseInfo(view, node);\n const openedImage = view.state.field(markdownState).openedImage;\n const uniqueId = view.state.field(markdownState).uniqueId;\n const key = `${url}:${text}:${uniqueId}:${node.from}:${node.to}`;\n const isOpened = openedImage && openedImage === key;\n\n if (isOpened) {\n return void decorations.push(\n utils.getMarkDecoration({\n range: [node.from, node.to],\n attributes: {\n \"data-id\": key,\n },\n }),\n );\n }\n\n if (\n forceActive ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [node.from, node.to])\n ) {\n decorations.push(utils.getHideDecoration({ range: [node.from, node.to] }));\n } else {\n decorations.push(\n utils.getMarkDecoration({\n range: [node.from, node.to],\n attributes: {\n \"data-id\": key,\n },\n }),\n );\n }\n}\n\nfunction parseInfo(view: EditorView, node: SyntaxNodeRef) {\n const content = view.state.doc.sliceString(node.from, node.to);\n const textCoordinates = { from: -1, to: -1 };\n const urlCoordinates = { from: -1, to: -1 };\n let pos = -1;\n\n while (pos < content.length) {\n pos++;\n const code = content.charCodeAt(pos);\n\n if (textCoordinates.from === -1 && code === CODE_OF_START_IMAGE_TEXT)\n textCoordinates.from = pos + 1;\n else if (\n urlCoordinates.from === -1 &&\n textCoordinates.to !== -1 &&\n code === CODE_OF_START_IMAGE_URL\n )\n urlCoordinates.from = pos + 1;\n else if (\n textCoordinates.from !== -1 &&\n textCoordinates.to === -1 &&\n code === CODE_OF_END_IMAGE_TEXT\n )\n textCoordinates.to = pos;\n else if (\n urlCoordinates.from !== -1 &&\n urlCoordinates.to === -1 &&\n code === CODE_OF_END_IMAGE_URL\n )\n urlCoordinates.to = pos;\n }\n\n const text = content.substring(textCoordinates.from, textCoordinates.to);\n const url = content.substring(urlCoordinates.from, urlCoordinates.to);\n\n return { text, url };\n}\n\nexport const imageDecorationPlugin: DecorationPlugin = {\n selectionDecorations: [getImageSelectionDecorations],\n decorations: [getImageDecorations],\n};\n"],"names":["utils.getWidgetDecorationOptions","utils.getMarkDecoration","utils.isInRange","utils.getHideDecoration"],"mappings":"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"}
|