@gravity-ui/markdown-editor 15.29.0 → 15.31.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/build/cjs/core/types/serializer.d.ts +5 -0
- package/build/cjs/core/types/serializer.js.map +1 -1
- package/build/cjs/extensions/behavior/Search/SearchViewPlugin.js +24 -0
- package/build/cjs/extensions/behavior/Search/SearchViewPlugin.js.map +1 -1
- package/build/cjs/extensions/markdown/Breaks/index.d.ts +2 -0
- package/build/cjs/extensions/markdown/Breaks/index.js +7 -4
- package/build/cjs/extensions/markdown/Breaks/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +9 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/const.d.ts +2 -1
- package/build/cjs/extensions/markdown/CodeBlock/const.js +6 -1
- package/build/cjs/extensions/markdown/CodeBlock/const.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/index.d.ts +1 -2
- package/build/cjs/extensions/markdown/CodeBlock/index.js +5 -7
- package/build/cjs/extensions/markdown/CodeBlock/index.js.map +1 -1
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/const.d.ts +3 -0
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/const.js +5 -1
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/const.js.map +1 -1
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.d.ts +2 -6
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.js +1 -1
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/parser.js +27 -1
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/parser.js.map +1 -1
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/schema.d.ts +8 -2
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/schema.js +3 -1
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/schema.js.map +1 -1
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/serializer.js +14 -2
- package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/serializer.js.map +1 -1
- package/build/cjs/extensions/yfm/Checkbox/index.css +5 -9
- package/build/cjs/extensions/yfm/Checkbox/index.d.ts +8 -1
- package/build/cjs/extensions/yfm/Checkbox/index.js +1 -1
- package/build/cjs/extensions/yfm/Checkbox/index.js.map +1 -1
- package/build/cjs/extensions/yfm/Checkbox/plugin.d.ts +5 -1
- package/build/cjs/extensions/yfm/Checkbox/plugin.js +8 -3
- package/build/cjs/extensions/yfm/Checkbox/plugin.js.map +1 -1
- package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +5 -1
- package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
- package/build/cjs/markup/codemirror/search-plugin/plugin.js +10 -0
- package/build/cjs/markup/codemirror/search-plugin/plugin.js.map +1 -1
- package/build/cjs/modules/search/components/SearchPopup.d.ts +2 -0
- package/build/cjs/modules/search/components/SearchPopup.js +11 -2
- package/build/cjs/modules/search/components/SearchPopup.js.map +1 -1
- package/build/cjs/modules/search/components/hooks/useObserveIntersection.d.ts +10 -0
- package/build/cjs/modules/search/components/hooks/useObserveIntersection.js +44 -0
- package/build/cjs/modules/search/components/hooks/useObserveIntersection.js.map +1 -0
- package/build/cjs/react-utils/hooks/useRAF.d.ts +1 -0
- package/build/cjs/react-utils/hooks/useRAF.js +24 -0
- package/build/cjs/react-utils/hooks/useRAF.js.map +1 -0
- package/build/cjs/react-utils/useSticky.js +3 -12
- package/build/cjs/react-utils/useSticky.js.map +1 -1
- package/build/cjs/utils/dom.d.ts +3 -0
- package/build/cjs/utils/dom.js +32 -0
- package/build/cjs/utils/dom.js.map +1 -0
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/core/types/serializer.d.ts +5 -0
- package/build/esm/core/types/serializer.js.map +1 -1
- package/build/esm/extensions/behavior/Search/SearchViewPlugin.js +25 -1
- package/build/esm/extensions/behavior/Search/SearchViewPlugin.js.map +1 -1
- package/build/esm/extensions/markdown/Breaks/index.d.ts +2 -0
- package/build/esm/extensions/markdown/Breaks/index.js +7 -5
- package/build/esm/extensions/markdown/Breaks/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.d.ts +9 -0
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/const.d.ts +2 -1
- package/build/esm/extensions/markdown/CodeBlock/const.js +5 -0
- package/build/esm/extensions/markdown/CodeBlock/const.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/index.d.ts +1 -2
- package/build/esm/extensions/markdown/CodeBlock/index.js +3 -5
- package/build/esm/extensions/markdown/CodeBlock/index.js.map +1 -1
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/const.d.ts +3 -0
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/const.js +4 -0
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/const.js.map +1 -1
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.d.ts +2 -6
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.js +1 -1
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/parser.js +28 -2
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/parser.js.map +1 -1
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/schema.d.ts +8 -2
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/schema.js +3 -1
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/schema.js.map +1 -1
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/serializer.js +14 -2
- package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/serializer.js.map +1 -1
- package/build/esm/extensions/yfm/Checkbox/index.css +5 -9
- package/build/esm/extensions/yfm/Checkbox/index.d.ts +8 -1
- package/build/esm/extensions/yfm/Checkbox/index.js +1 -1
- package/build/esm/extensions/yfm/Checkbox/index.js.map +1 -1
- package/build/esm/extensions/yfm/Checkbox/plugin.d.ts +5 -1
- package/build/esm/extensions/yfm/Checkbox/plugin.js +8 -3
- package/build/esm/extensions/yfm/Checkbox/plugin.js.map +1 -1
- package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +5 -1
- package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
- package/build/esm/markup/codemirror/search-plugin/plugin.js +10 -0
- package/build/esm/markup/codemirror/search-plugin/plugin.js.map +1 -1
- package/build/esm/modules/search/components/SearchPopup.d.ts +2 -0
- package/build/esm/modules/search/components/SearchPopup.js +11 -2
- package/build/esm/modules/search/components/SearchPopup.js.map +1 -1
- package/build/esm/modules/search/components/hooks/useObserveIntersection.d.ts +10 -0
- package/build/esm/modules/search/components/hooks/useObserveIntersection.js +41 -0
- package/build/esm/modules/search/components/hooks/useObserveIntersection.js.map +1 -0
- package/build/esm/react-utils/hooks/useRAF.d.ts +1 -0
- package/build/esm/react-utils/hooks/useRAF.js +21 -0
- package/build/esm/react-utils/hooks/useRAF.js.map +1 -0
- package/build/esm/react-utils/useSticky.js +3 -12
- package/build/esm/react-utils/useSticky.js.map +1 -1
- package/build/esm/utils/dom.d.ts +3 -0
- package/build/esm/utils/dom.js +27 -0
- package/build/esm/utils/dom.js.map +1 -0
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/styles.css +5 -9
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSticky.js","sourceRoot":"../../../src","sources":["react-utils/useSticky.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useSticky.js","sourceRoot":"../../../src","sources":["react-utils/useSticky.ts"],"names":[],"mappings":";;AAMA,8BA0CC;AAhDD,iCAA+B;AAE/B,yCAAmD;AAEnD,yCAA4C;AAE5C,SAAgB,SAAS,CAAwB,OAA2B;IACxE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAA,qBAAS,EAAC,MAAM,CAAC,CAAC;IAEpC,IAAA,yBAAa,EAAC,GAAG,EAAE;QACf,IAAI,KAAK,GAAkB,IAAI,CAAC;QAEhC,OAAO,EAAE,CAAC;QAEV,KAAK,MAAM,SAAS,IAAI,mBAAa,EAAE,CAAC;YACpC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,GAAG,EAAE;YACR,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,mBAAa,EAAE,CAAC;gBACpC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;YACjE,CAAC;QACL,CAAC,CAAC;QAEF,SAAS,eAAe;YACpB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACjB,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAED,SAAS,OAAO;YACZ,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,OAAO;gBAAE,OAAO;YAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC;YAClE,MAAM,YAAY,GAAG,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,aAAa,IAAI,YAAY,CAAC;YAEnD,IAAI,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;iBACnD,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,OAAO;gBAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAClE,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import {useState} from 'react';\n\nimport {useEffectOnce, useLatest} from 'react-use';\n\nimport {REFLOW_EVENTS} from 'src/utils/dom';\n\nexport function useSticky<T extends HTMLElement>(elemRef: React.RefObject<T>) {\n const [sticky, setSticky] = useState(false);\n const stickyRef = useLatest(sticky);\n\n useEffectOnce(() => {\n let rafId: number | null = null;\n\n observe();\n\n for (const eventName of REFLOW_EVENTS) {\n window.addEventListener(eventName, scheduleObserve, true);\n }\n\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n for (const eventName of REFLOW_EVENTS) {\n window.removeEventListener(eventName, scheduleObserve, true);\n }\n };\n\n function scheduleObserve() {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n rafId = requestAnimationFrame(observe);\n }\n\n function observe() {\n rafId = null;\n if (!elemRef.current) return;\n const refPageOffset = elemRef.current.getBoundingClientRect().top;\n const stickyOffset = parseInt(getComputedStyle(elemRef.current).top, 10);\n const stickyActive = refPageOffset <= stickyOffset;\n\n if (stickyActive && !stickyRef.current) setSticky(true);\n else if (!stickyActive && stickyRef.current) setSticky(false);\n }\n });\n\n return sticky;\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REFLOW_EVENTS = void 0;
|
|
4
|
+
exports.isElementInViewport = isElementInViewport;
|
|
5
|
+
exports.areElementsIntersecting = areElementsIntersecting;
|
|
6
|
+
exports.REFLOW_EVENTS = new Set([
|
|
7
|
+
'resize',
|
|
8
|
+
'scroll',
|
|
9
|
+
'touchstart',
|
|
10
|
+
'touchmove',
|
|
11
|
+
'touchend',
|
|
12
|
+
'pageshow',
|
|
13
|
+
'load',
|
|
14
|
+
'orientationchange',
|
|
15
|
+
]);
|
|
16
|
+
function isElementInViewport(element) {
|
|
17
|
+
const document = element.ownerDocument;
|
|
18
|
+
const rect = element.getBoundingClientRect();
|
|
19
|
+
return (rect.top >= 0 &&
|
|
20
|
+
rect.left >= 0 &&
|
|
21
|
+
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
|
|
22
|
+
rect.right <= (window.innerWidth || document.documentElement.clientWidth));
|
|
23
|
+
}
|
|
24
|
+
function areElementsIntersecting(elem1, elem2) {
|
|
25
|
+
const rect1 = elem1.getBoundingClientRect();
|
|
26
|
+
const rect2 = elem2.getBoundingClientRect();
|
|
27
|
+
return !(rect1.right < rect2.left ||
|
|
28
|
+
rect1.left > rect2.right ||
|
|
29
|
+
rect1.bottom < rect2.top ||
|
|
30
|
+
rect1.top > rect2.bottom);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"../../../src","sources":["utils/dom.ts"],"names":[],"mappings":";;;AAWA,kDASC;AAED,0DAUC;AAhCY,QAAA,aAAa,GAAsC,IAAI,GAAG,CAAuB;IAC1F,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,UAAU;IACV,UAAU;IACV,MAAM;IACN,mBAAmB;CACtB,CAAC,CAAC;AAEH,SAAgB,mBAAmB,CAAC,OAAgB;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAC7C,OAAO,CACH,IAAI,CAAC,GAAG,IAAI,CAAC;QACb,IAAI,CAAC,IAAI,IAAI,CAAC;QACd,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC;QAC5E,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,CAC5E,CAAC;AACN,CAAC;AAED,SAAgB,uBAAuB,CAAC,KAAc,EAAE,KAAc;IAClE,MAAM,KAAK,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;IAE5C,OAAO,CAAC,CACJ,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI;QACxB,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK;QACxB,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG;QACxB,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAC3B,CAAC;AACN,CAAC","sourcesContent":["export const REFLOW_EVENTS: ReadonlySet<keyof WindowEventMap> = new Set<keyof WindowEventMap>([\n 'resize',\n 'scroll',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'pageshow',\n 'load',\n 'orientationchange',\n]);\n\nexport function isElementInViewport(element: Element) {\n const document = element.ownerDocument;\n const rect = element.getBoundingClientRect();\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n );\n}\n\nexport function areElementsIntersecting(elem1: Element, elem2: Element) {\n const rect1 = elem1.getBoundingClientRect();\n const rect2 = elem2.getBoundingClientRect();\n\n return !(\n rect1.right < rect2.left ||\n rect1.left > rect2.right ||\n rect1.bottom < rect2.top ||\n rect1.top > rect2.bottom\n );\n}\n"]}
|
package/build/cjs/version.js
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VERSION = void 0;
|
|
4
4
|
/** During build process, the current version will be injected here */
|
|
5
|
-
exports.VERSION = typeof '15.
|
|
5
|
+
exports.VERSION = typeof '15.31.0' !== 'undefined' ? '15.31.0' : 'unknown';
|
|
6
6
|
//# sourceMappingURL=version.js.map
|
package/build/cjs/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"../../src","sources":["version.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACzD,QAAA,OAAO,GAAG,OAAO,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC","sourcesContent":["/** During build process, the current version will be injected here */\nexport const VERSION = typeof '15.31.0' !== 'undefined' ? '15.31.0' : 'unknown';\n"]}
|
|
@@ -3,5 +3,10 @@ declare module 'prosemirror-model' {
|
|
|
3
3
|
interface NodeSpec {
|
|
4
4
|
/** Default false */
|
|
5
5
|
isBreak?: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* For non default textblocks.
|
|
8
|
+
* Set true if textblock can contain line breaks (soft-break or/and hard-break).
|
|
9
|
+
*/
|
|
10
|
+
canContainBreaks?: boolean;
|
|
6
11
|
}
|
|
7
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializer.js","sourceRoot":"../../../../src","sources":["core/types/serializer.ts"],"names":[],"mappings":"","sourcesContent":["export type {\n MarkdownSerializerState as SerializerState,\n SerializerNodeToken,\n SerializerMarkToken,\n MarkdownSerializer as Serializer,\n} from '../markdown/MarkdownSerializer';\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n /** Default false */\n isBreak?: boolean;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"serializer.js","sourceRoot":"../../../../src","sources":["core/types/serializer.ts"],"names":[],"mappings":"","sourcesContent":["export type {\n MarkdownSerializerState as SerializerState,\n SerializerNodeToken,\n SerializerMarkToken,\n MarkdownSerializer as Serializer,\n} from '../markdown/MarkdownSerializer';\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n /** Default false */\n isBreak?: boolean;\n /**\n * For non default textblocks.\n * Set true if textblock can contain line breaks (soft-break or/and hard-break).\n */\n canContainBreaks?: boolean;\n }\n}\n"]}
|
|
@@ -2,9 +2,10 @@ import { SearchQuery, getSearchState, setSearchState } from 'prosemirror-search'
|
|
|
2
2
|
import { Plugin, TextSelection } from "../../../pm/state.js";
|
|
3
3
|
import { findParentNodeClosestToPos } from "../../../pm/utils.js";
|
|
4
4
|
import { renderSearchPopup } from "../../../modules/search/index.js";
|
|
5
|
+
import { isElementInViewport } from "../../../utils/dom.js";
|
|
5
6
|
import { getReactRendererFromState } from "../ReactRenderer/index.js";
|
|
6
7
|
import { closeSearch, findNext, findPrev, replaceAll, replaceNext } from "./commands.js";
|
|
7
|
-
import { pluginKey } from "./const.js";
|
|
8
|
+
import { SearchClassName, pluginKey } from "./const.js";
|
|
8
9
|
import { searchKeyHandler } from "./key-handler.js";
|
|
9
10
|
import { startTracking } from "./utils/connect-tracker.js";
|
|
10
11
|
import { FocusManager } from "./utils/focus-manager.js";
|
|
@@ -98,6 +99,16 @@ class SeachPluginView {
|
|
|
98
99
|
onSearchNext: this._onSearchNext,
|
|
99
100
|
onReplaceNext: this._onReplaceNext,
|
|
100
101
|
onReplaceAll: this._onReplaceAll,
|
|
102
|
+
intersectionTracking: {
|
|
103
|
+
container: this._view.dom,
|
|
104
|
+
selector: `.${SearchClassName.ActiveMatch}`,
|
|
105
|
+
observerOptions: {
|
|
106
|
+
childList: true,
|
|
107
|
+
subtree: true,
|
|
108
|
+
attributes: true,
|
|
109
|
+
attributeFilter: ['class'],
|
|
110
|
+
},
|
|
111
|
+
},
|
|
101
112
|
});
|
|
102
113
|
});
|
|
103
114
|
}
|
|
@@ -133,9 +144,11 @@ class SeachPluginView {
|
|
|
133
144
|
};
|
|
134
145
|
_onSearchPrev = () => {
|
|
135
146
|
this._preserveFocus(findPrev);
|
|
147
|
+
requestAnimationFrame(() => this._scrollToActiveIfNeeded());
|
|
136
148
|
};
|
|
137
149
|
_onSearchNext = () => {
|
|
138
150
|
this._preserveFocus(findNext);
|
|
151
|
+
requestAnimationFrame(() => this._scrollToActiveIfNeeded());
|
|
139
152
|
};
|
|
140
153
|
_onReplaceNext = () => {
|
|
141
154
|
this._preserveFocus(replaceNext);
|
|
@@ -149,5 +162,16 @@ class SeachPluginView {
|
|
|
149
162
|
command(this._view.state, this._view.dispatch, this._view);
|
|
150
163
|
this._focusManager.restoreFocus({ preventScroll: true });
|
|
151
164
|
}
|
|
165
|
+
_scrollToActiveIfNeeded = () => {
|
|
166
|
+
const activeElem = this._view.dom
|
|
167
|
+
.getElementsByClassName(SearchClassName.ActiveMatch)
|
|
168
|
+
.item(0);
|
|
169
|
+
if (activeElem && !isElementInViewport(activeElem)) {
|
|
170
|
+
activeElem.scrollIntoView({
|
|
171
|
+
block: 'nearest',
|
|
172
|
+
inline: 'nearest',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
};
|
|
152
176
|
}
|
|
153
177
|
//# sourceMappingURL=SearchViewPlugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchViewPlugin.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Search/SearchViewPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {SearchQuery, type SearchResult, getSearchState, setSearchState} from 'prosemirror-search';\n\nimport type {Node} from '#pm/model';\nimport {type Command, Plugin, type PluginView, TextSelection} from '#pm/state';\nimport {findParentNodeClosestToPos} from '#pm/utils';\nimport type {EditorView} from '#pm/view';\nimport {type SearchCounter, type SearchState, renderSearchPopup} from 'src/modules/search';\n\nimport {getReactRendererFromState} from '../ReactRenderer';\n\nimport {closeSearch, findNext, findPrev, replaceAll, replaceNext} from './commands';\nimport {pluginKey} from './const';\nimport {searchKeyHandler} from './key-handler';\nimport type {SearchViewState} from './types';\nimport {startTracking} from './utils/connect-tracker';\nimport {FocusManager} from './utils/focus-manager';\nimport {getCounter} from './utils/search-counter';\n\nimport './search-plugin.scss';\n\nexport interface SearchViewPluginParams {\n anchorSelector: string;\n}\n\nexport const searchViewPlugin = (params: SearchViewPluginParams) => {\n return new Plugin<SearchViewState>({\n key: pluginKey,\n props: {\n handleKeyDown: searchKeyHandler,\n },\n state: {\n init: () => ({open: false}),\n apply(tr, value, _oldState, _newState) {\n const newValue = tr.getMeta(pluginKey) as SearchViewState | undefined;\n if (typeof newValue === 'object') return newValue;\n return value;\n },\n },\n view(view) {\n return new SeachPluginView(view, params);\n },\n });\n};\n\nclass SeachPluginView implements PluginView {\n private readonly _view: EditorView;\n private readonly _renderer;\n private readonly _focusManager: FocusManager;\n private readonly _viewDomTrackerDispose;\n\n private _counter: SearchCounter;\n private _isDomConnected: boolean;\n private _viewState: SearchViewState | undefined;\n private _searchState: SearchQuery | undefined;\n\n constructor(view: EditorView, params: SearchViewPluginParams) {\n this._view = view;\n this._viewState = pluginKey.getState(view.state);\n this._searchState = getSearchState(view.state)?.query;\n this._counter = getCounter(view.state);\n this._isDomConnected = view.dom.ownerDocument.contains(view.dom);\n\n this._renderer = this._createRenderer(params);\n this._focusManager = new FocusManager(view.dom.ownerDocument);\n\n // uses MutationObserver to detect when view.dom is disconnected from the DOM tree\n // TODO: replace with eventBus (subscribe to change-editor-mode event) to track when to hide the search bar\n // see https://github.com/gravity-ui/markdown-editor/issues/884\n this._viewDomTrackerDispose = startTracking(view.dom, {\n onConnect: this._onEditorViewDomConnected,\n onDisconnect: this._onEditorViewDomDisconnected,\n });\n }\n\n update() {\n const newCounter = getCounter(this._view.state);\n const newViewState = pluginKey.getState(this._view.state);\n const newSearchState = getSearchState(this._view.state)?.query;\n\n if (\n newViewState !== this._viewState ||\n newSearchState !== this._searchState ||\n newCounter.total !== this._counter.total ||\n newCounter.current !== this._counter.current\n ) {\n this._counter = newCounter;\n this._viewState = newViewState;\n this._searchState = newSearchState;\n this._renderer.rerender();\n }\n }\n\n destroy() {\n this._renderer.remove();\n this._viewDomTrackerDispose();\n }\n\n private _onEditorViewDomConnected = () => {\n this._isDomConnected = true;\n this._renderer.rerender();\n };\n\n private _onEditorViewDomDisconnected = () => {\n this._isDomConnected = false;\n this._onClose();\n };\n\n private _createRenderer(params: Pick<SearchViewPluginParams, 'anchorSelector'>) {\n return getReactRendererFromState(this._view.state).createItem('search-view', () => {\n const {\n _viewState: viewState,\n _searchState: searchState,\n _isDomConnected: domConnected,\n } = this;\n\n if (!domConnected || !viewState?.open || !searchState) return null;\n\n const anchor = this._view.dom.ownerDocument.querySelector(params.anchorSelector);\n\n return renderSearchPopup({\n anchor,\n open: viewState.open,\n counter: this._counter,\n state: searchState,\n onClose: this._onClose,\n onChange: this._onChange,\n onSearchPrev: this._onSearchPrev,\n onSearchNext: this._onSearchNext,\n onReplaceNext: this._onReplaceNext,\n onReplaceAll: this._onReplaceAll,\n });\n });\n }\n\n private _onChange = (config: SearchState) => {\n const {state, dispatch} = this._view;\n\n const query = new SearchQuery({\n search: config.search,\n replace: config.replace,\n caseSensitive: config.caseSensitive,\n wholeWord: config.wholeWord,\n });\n\n const tr = setSearchState(state.tr, query);\n const {$from, $to} = tr.selection;\n const parent = findParentNodeClosestToPos($from, (node: Node) => node.type.isTextblock);\n\n let result: SearchResult | null = null;\n // find match in [sel.$from, parent.$end]\n if (parent) result = query.findNext(state, $from.pos, parent.pos + parent.node.nodeSize);\n // find match in [parent.$start or sel.$from, doc.$end]\n if (!result) result = query.findNext(state, parent?.pos || $from.pos);\n // find match in [doc.$start, parent.$start or sel.$to]\n if (!result) result = query.findPrev(state, parent?.pos || $to.pos);\n // update text selection\n if (result) tr.setSelection(TextSelection.create(tr.doc, result.from, result.to));\n\n dispatch(tr);\n };\n\n private _onClose = () => {\n closeSearch(this._view.state, this._view.dispatch);\n this._view.focus();\n };\n\n private _onSearchPrev = () => {\n this._preserveFocus(findPrev);\n };\n\n private _onSearchNext = () => {\n this._preserveFocus(findNext);\n };\n\n private _onReplaceNext = () => {\n this._preserveFocus(replaceNext);\n };\n\n private _onReplaceAll = () => {\n this._preserveFocus(replaceAll);\n };\n\n private _preserveFocus(command: Command) {\n this._focusManager.storeFocus();\n this._view.focus();\n command(this._view.state, this._view.dispatch, this._view);\n this._focusManager.restoreFocus({preventScroll: true});\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SearchViewPlugin.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Search/SearchViewPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {SearchQuery, type SearchResult, getSearchState, setSearchState} from 'prosemirror-search';\n\nimport type {Node} from '#pm/model';\nimport {type Command, Plugin, type PluginView, TextSelection} from '#pm/state';\nimport {findParentNodeClosestToPos} from '#pm/utils';\nimport type {EditorView} from '#pm/view';\nimport {type SearchCounter, type SearchState, renderSearchPopup} from 'src/modules/search';\nimport {isElementInViewport} from 'src/utils/dom';\n\nimport {getReactRendererFromState} from '../ReactRenderer';\n\nimport {closeSearch, findNext, findPrev, replaceAll, replaceNext} from './commands';\nimport {SearchClassName, pluginKey} from './const';\nimport {searchKeyHandler} from './key-handler';\nimport type {SearchViewState} from './types';\nimport {startTracking} from './utils/connect-tracker';\nimport {FocusManager} from './utils/focus-manager';\nimport {getCounter} from './utils/search-counter';\n\nimport './search-plugin.scss';\n\nexport interface SearchViewPluginParams {\n anchorSelector: string;\n}\n\nexport const searchViewPlugin = (params: SearchViewPluginParams) => {\n return new Plugin<SearchViewState>({\n key: pluginKey,\n props: {\n handleKeyDown: searchKeyHandler,\n },\n state: {\n init: () => ({open: false}),\n apply(tr, value, _oldState, _newState) {\n const newValue = tr.getMeta(pluginKey) as SearchViewState | undefined;\n if (typeof newValue === 'object') return newValue;\n return value;\n },\n },\n view(view) {\n return new SeachPluginView(view, params);\n },\n });\n};\n\nclass SeachPluginView implements PluginView {\n private readonly _view: EditorView;\n private readonly _renderer;\n private readonly _focusManager: FocusManager;\n private readonly _viewDomTrackerDispose;\n\n private _counter: SearchCounter;\n private _isDomConnected: boolean;\n private _viewState: SearchViewState | undefined;\n private _searchState: SearchQuery | undefined;\n\n constructor(view: EditorView, params: SearchViewPluginParams) {\n this._view = view;\n this._viewState = pluginKey.getState(view.state);\n this._searchState = getSearchState(view.state)?.query;\n this._counter = getCounter(view.state);\n this._isDomConnected = view.dom.ownerDocument.contains(view.dom);\n\n this._renderer = this._createRenderer(params);\n this._focusManager = new FocusManager(view.dom.ownerDocument);\n\n // uses MutationObserver to detect when view.dom is disconnected from the DOM tree\n // TODO: replace with eventBus (subscribe to change-editor-mode event) to track when to hide the search bar\n // see https://github.com/gravity-ui/markdown-editor/issues/884\n this._viewDomTrackerDispose = startTracking(view.dom, {\n onConnect: this._onEditorViewDomConnected,\n onDisconnect: this._onEditorViewDomDisconnected,\n });\n }\n\n update() {\n const newCounter = getCounter(this._view.state);\n const newViewState = pluginKey.getState(this._view.state);\n const newSearchState = getSearchState(this._view.state)?.query;\n\n if (\n newViewState !== this._viewState ||\n newSearchState !== this._searchState ||\n newCounter.total !== this._counter.total ||\n newCounter.current !== this._counter.current\n ) {\n this._counter = newCounter;\n this._viewState = newViewState;\n this._searchState = newSearchState;\n this._renderer.rerender();\n }\n }\n\n destroy() {\n this._renderer.remove();\n this._viewDomTrackerDispose();\n }\n\n private _onEditorViewDomConnected = () => {\n this._isDomConnected = true;\n this._renderer.rerender();\n };\n\n private _onEditorViewDomDisconnected = () => {\n this._isDomConnected = false;\n this._onClose();\n };\n\n private _createRenderer(params: Pick<SearchViewPluginParams, 'anchorSelector'>) {\n return getReactRendererFromState(this._view.state).createItem('search-view', () => {\n const {\n _viewState: viewState,\n _searchState: searchState,\n _isDomConnected: domConnected,\n } = this;\n\n if (!domConnected || !viewState?.open || !searchState) return null;\n\n const anchor = this._view.dom.ownerDocument.querySelector(params.anchorSelector);\n\n return renderSearchPopup({\n anchor,\n open: viewState.open,\n counter: this._counter,\n state: searchState,\n onClose: this._onClose,\n onChange: this._onChange,\n onSearchPrev: this._onSearchPrev,\n onSearchNext: this._onSearchNext,\n onReplaceNext: this._onReplaceNext,\n onReplaceAll: this._onReplaceAll,\n intersectionTracking: {\n container: this._view.dom,\n selector: `.${SearchClassName.ActiveMatch}`,\n observerOptions: {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['class'],\n },\n },\n });\n });\n }\n\n private _onChange = (config: SearchState) => {\n const {state, dispatch} = this._view;\n\n const query = new SearchQuery({\n search: config.search,\n replace: config.replace,\n caseSensitive: config.caseSensitive,\n wholeWord: config.wholeWord,\n });\n\n const tr = setSearchState(state.tr, query);\n const {$from, $to} = tr.selection;\n const parent = findParentNodeClosestToPos($from, (node: Node) => node.type.isTextblock);\n\n let result: SearchResult | null = null;\n // find match in [sel.$from, parent.$end]\n if (parent) result = query.findNext(state, $from.pos, parent.pos + parent.node.nodeSize);\n // find match in [parent.$start or sel.$from, doc.$end]\n if (!result) result = query.findNext(state, parent?.pos || $from.pos);\n // find match in [doc.$start, parent.$start or sel.$to]\n if (!result) result = query.findPrev(state, parent?.pos || $to.pos);\n // update text selection\n if (result) tr.setSelection(TextSelection.create(tr.doc, result.from, result.to));\n\n dispatch(tr);\n };\n\n private _onClose = () => {\n closeSearch(this._view.state, this._view.dispatch);\n this._view.focus();\n };\n\n private _onSearchPrev = () => {\n this._preserveFocus(findPrev);\n requestAnimationFrame(() => this._scrollToActiveIfNeeded());\n };\n\n private _onSearchNext = () => {\n this._preserveFocus(findNext);\n requestAnimationFrame(() => this._scrollToActiveIfNeeded());\n };\n\n private _onReplaceNext = () => {\n this._preserveFocus(replaceNext);\n };\n\n private _onReplaceAll = () => {\n this._preserveFocus(replaceAll);\n };\n\n private _preserveFocus(command: Command) {\n this._focusManager.storeFocus();\n this._view.focus();\n command(this._view.state, this._view.dispatch, this._view);\n this._focusManager.restoreFocus({preventScroll: true});\n }\n\n private _scrollToActiveIfNeeded = () => {\n const activeElem = this._view.dom\n .getElementsByClassName(SearchClassName.ActiveMatch)\n .item(0);\n\n if (activeElem && !isElementInViewport(activeElem)) {\n activeElem.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n };\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Node } from 'prosemirror-model';
|
|
1
2
|
import type { ExtensionAuto } from "../../../core/index.js";
|
|
2
3
|
export { BreaksSpecs, BreakNodeName, hbType, sbType } from "./BreaksSpecs/index.js";
|
|
3
4
|
export type BreaksOptions = {
|
|
@@ -18,3 +19,4 @@ declare global {
|
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
}
|
|
22
|
+
export declare function isBreakNode(node: Node | null | undefined): boolean;
|
|
@@ -30,10 +30,7 @@ export const Breaks = (builder, opts) => {
|
|
|
30
30
|
};
|
|
31
31
|
const addBr = (br) => chainCommands(exitCode, (state, dispatch) => {
|
|
32
32
|
const { selection: sel, schema } = state;
|
|
33
|
-
if (!isTextSelection(sel) ||
|
|
34
|
-
!sel.empty ||
|
|
35
|
-
// breaks can only be in the paragraph
|
|
36
|
-
sel.$cursor?.parent.type !== pType(schema))
|
|
33
|
+
if (!isTextSelection(sel) || !sel.$cursor || !canContainBreaks(sel.$cursor.parent))
|
|
37
34
|
return false;
|
|
38
35
|
if (isBreakNode(sel.$cursor.nodeBefore)) {
|
|
39
36
|
if (dispatch) {
|
|
@@ -55,7 +52,12 @@ const addBr = (br) => chainCommands(exitCode, (state, dispatch) => {
|
|
|
55
52
|
dispatch?.(state.tr.replaceSelectionWith(br.create()).scrollIntoView());
|
|
56
53
|
return true;
|
|
57
54
|
});
|
|
58
|
-
function
|
|
55
|
+
function canContainBreaks(node) {
|
|
56
|
+
return (Boolean(node.type.spec.canContainBreaks) ||
|
|
57
|
+
// always allow breaks in paragraph
|
|
58
|
+
node.type === pType(node.type.schema));
|
|
59
|
+
}
|
|
60
|
+
export function isBreakNode(node) {
|
|
59
61
|
return Boolean(node?.type.spec.isBreak);
|
|
60
62
|
}
|
|
61
63
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Breaks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAC7C,OAAO,EAAC,KAAK,EAAC,mCAAgC;AAC9C,OAAO,EAAC,eAAe,EAAC,oCAAiC;AACzD,OAAO,EAAC,KAAK,EAAC,uDAA8C;AAE5D,OAAO,EAAC,WAAW,EAA2B,MAAM,EAAE,MAAM,EAAC,+BAAsB;AAEnF,OAAO,EAAC,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAC,+BAAsB;AAWzE,MAAM,CAAC,MAAM,MAAM,GAAiC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClE,IAAI,cAA+B,CAAC;IACpC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACrE,CAAC;SAAM,CAAC;QACJ,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC;QAC/C,YAAY,CAAC,IAAI,CACb,8FAA8F,CACjG,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,GAAG,CACd,8FAA8F,CACjG,CAAC;IACN,CAAC;IAED,OAAO,CAAC,GAAG,CAAqB,WAAW,EAAE,EAAC,cAAc,EAAC,CAAC,CAAC;IAE/D,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,MAAM,IAAI,GAAW;YACjB,aAAa,EAAE,GAAG;SACrB,CAAC;QAEF,IAAI,KAAK,EAAE,EAAE,CAAC;YACV,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC;QAC7B,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,EAAY,EAAE,EAAE,CAC3B,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;IACxC,MAAM,EAAC,SAAS,EAAE,GAAG,EAAE,MAAM,EAAC,GAAG,KAAK,CAAC;IACvC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Breaks/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands, exitCode} from 'prosemirror-commands';\nimport type {Node, NodeType} from 'prosemirror-model';\nimport {TextSelection} from 'prosemirror-state';\n\nimport type {ExtensionAuto, Keymap} from '../../../core';\nimport {globalLogger} from '../../../logger';\nimport {isMac} from '../../../utils/platform';\nimport {isTextSelection} from '../../../utils/selection';\nimport {pType} from '../../base/BaseSchema/BaseSchemaSpecs';\n\nimport {BreaksSpecs, type BreaksSpecsOptions, hbType, sbType} from './BreaksSpecs';\n\nexport {BreaksSpecs, BreakNodeName, hbType, sbType} from './BreaksSpecs';\n\nexport type BreaksOptions = {\n /**\n * This option is used if the 'breaks' parameter is not specified via the context\n * @default 'hard'\n */\n // TODO: [context] make this deprecated\n preferredBreak?: 'hard' | 'soft';\n};\n\nexport const Breaks: ExtensionAuto<BreaksOptions> = (builder, opts) => {\n let preferredBreak: 'hard' | 'soft';\n if (builder.context.has('breaks')) {\n preferredBreak = builder.context.get('breaks') ? 'soft' : 'hard';\n } else {\n preferredBreak = opts.preferredBreak ?? 'hard';\n globalLogger.info(\n \"[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used\",\n );\n builder.logger.log(\n \"[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used\",\n );\n }\n\n builder.use<BreaksSpecsOptions>(BreaksSpecs, {preferredBreak});\n\n builder.addKeymap(({schema}) => {\n const cmd = addBr((preferredBreak === 'soft' ? sbType : hbType)(schema));\n const keys: Keymap = {\n 'Shift-Enter': cmd,\n };\n\n if (isMac()) {\n keys['Ctrl-Enter'] = cmd;\n }\n\n return keys;\n });\n};\n\nconst addBr = (br: NodeType) =>\n chainCommands(exitCode, (state, dispatch) => {\n const {selection: sel, schema} = state;\n if (!isTextSelection(sel) || !sel.$cursor || !canContainBreaks(sel.$cursor.parent))\n return false;\n\n if (isBreakNode(sel.$cursor.nodeBefore)) {\n if (dispatch) {\n const {\n $cursor,\n $cursor: {pos},\n } = sel;\n const from = isBreakNode($cursor.nodeAfter) ? pos + 1 : pos;\n const posEnd = $cursor.end();\n const posAfter = $cursor.after();\n\n const contentAfter = state.doc.slice(from, posEnd, false).content;\n\n let tr = state.tr.insert(posAfter, pType(schema).create(null, contentAfter));\n tr = tr\n .setSelection(TextSelection.create(tr.doc, posAfter + 1))\n .scrollIntoView()\n .delete(pos, posEnd) // remove content after current pos (it's moved to next para)\n .delete(pos - 1, pos); // remove break before current pos ($cursor.nodeBefore)\n dispatch(tr);\n }\n return true;\n }\n\n dispatch?.(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n return true;\n });\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n /**\n * Same as @type {MarkdownIt.Options.breaks}\n */\n breaks: boolean;\n }\n }\n}\n\nfunction canContainBreaks(node: Node): boolean {\n return (\n Boolean(node.type.spec.canContainBreaks) ||\n // always allow breaks in paragraph\n node.type === pType(node.type.schema)\n );\n}\n\nexport function isBreakNode(node: Node | null | undefined): boolean {\n return Boolean(node?.type.spec.isBreak);\n}\n"]}
|
|
@@ -8,7 +8,16 @@ export declare const CodeBlockNodeAttr: {
|
|
|
8
8
|
export declare const codeBlockNodeName = "code_block";
|
|
9
9
|
export declare const codeBlockType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
10
10
|
export type LineNumbersOptions = {
|
|
11
|
+
/**
|
|
12
|
+
* Allow line numbers in codeblock.
|
|
13
|
+
* Available with @diplodoc/transform v4.55.0 or higher.
|
|
14
|
+
* @default true
|
|
15
|
+
*/
|
|
11
16
|
enabled?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* By default, new code blocks are added with line numbers.
|
|
19
|
+
* @default false
|
|
20
|
+
*/
|
|
12
21
|
showByDefault?: boolean;
|
|
13
22
|
};
|
|
14
23
|
export type CodeBlockSpecsOptions = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '../../../../core';\nimport {nodeTypeFactory} from '../../../../utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {enabled?: boolean; showByDefault?: boolean};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addNode('fence', () => ({\n // we adding this node only for define specific 'fence' parser token,\n // which parse fence md token to code_block node\n spec: {},\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n },\n },\n toMd: () => {\n throw new Error('Unexpected toMd() call on fence node');\n },\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport const CodeBlockNodeAttr = {\n Lang: 'data-language',\n Markup: 'data-markup',\n Line: 'data-line',\n ShowLineNumbers: 'data-show-line-numbers',\n} as const;\n\nexport const codeBlockNodeName = 'code_block';\nexport const codeBlockType = nodeTypeFactory(codeBlockNodeName);\n\nexport type LineNumbersOptions = {\n /**\n * Allow line numbers in codeblock.\n * Available with @diplodoc/transform v4.55.0 or higher.\n * @default true\n */\n // TODO [MAJOR]: enable by default and remove option\n enabled?: boolean;\n /**\n * By default, new code blocks are added with line numbers.\n * @default false\n */\n showByDefault?: boolean;\n};\n\nexport type CodeBlockSpecsOptions = {\n nodeview?: ExtensionNodeSpec['view'];\n lineNumbers?: LineNumbersOptions;\n};\n\nconst getLangOfNode = (node: Element) => {\n let result = node.getAttribute(CodeBlockNodeAttr.Lang) || '';\n\n if (!result) {\n const firstElementChild = node.firstElementChild;\n\n if (\n firstElementChild &&\n firstElementChild.nodeName.toLowerCase() === 'code' &&\n firstElementChild.classList.contains('hljs')\n ) {\n result = firstElementChild.getAttribute('class')?.split(' ')?.[1] || '';\n }\n }\n\n return result;\n};\n\nexport const CodeBlockSpecs: ExtensionAuto<CodeBlockSpecsOptions> = (builder, opts) => {\n builder.addNode(codeBlockNodeName, () => ({\n view: opts.nodeview,\n spec: {\n attrs: {\n [CodeBlockNodeAttr.Lang]: {default: ''},\n [CodeBlockNodeAttr.Markup]: {default: '```'},\n [CodeBlockNodeAttr.Line]: {default: null},\n ...(opts.lineNumbers?.enabled\n ? {\n [CodeBlockNodeAttr.ShowLineNumbers]: {\n default: opts.lineNumbers.showByDefault ? 'true' : '',\n },\n }\n : {}),\n },\n content: 'text*',\n group: 'block',\n code: true,\n marks: '',\n selectable: true,\n allowSelection: false,\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node) => {\n return {\n [CodeBlockNodeAttr.Lang]: getLangOfNode(node as Element),\n };\n },\n },\n ],\n toDOM({attrs}) {\n return ['pre', attrs, ['code', 0]];\n },\n },\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n return {\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n [CodeBlockNodeAttr.ShowLineNumbers]: tok.info.includes('showLineNumbers')\n ? 'true'\n : '',\n };\n },\n prepareContent: removeNewLineAtEnd, // content of code blocks contains extra \\n at the end\n },\n },\n toMd: (state, node) => {\n const lang: string = node.attrs[CodeBlockNodeAttr.Lang];\n const markup: string = node.attrs[CodeBlockNodeAttr.Markup];\n const showLineNumbers: string = opts.lineNumbers?.enabled\n ? node.attrs[CodeBlockNodeAttr.ShowLineNumbers]\n : '';\n\n let info = lang;\n\n if (showLineNumbers === 'true') {\n info += ' showLineNumbers';\n }\n\n state.write(markup + info + '\\n');\n state.text(node.textContent, false);\n // Add a newline to the current content before adding closing marker\n state.write('\\n');\n state.write(markup);\n state.closeBlock(node);\n },\n }));\n builder.addNode('fence', () => ({\n // we adding this node only for define specific 'fence' parser token,\n // which parse fence md token to code_block node\n spec: {},\n fromMd: {\n tokenSpec: {\n name: codeBlockNodeName,\n type: 'block',\n noCloseToken: true,\n getAttrs: (tok) => {\n const attrs: Record<string, string | null> = {\n [CodeBlockNodeAttr.Markup]: tok.markup,\n [CodeBlockNodeAttr.Line]: tok.attrGet('data-line'),\n };\n if (tok.info) {\n // like in markdown-it\n // https://github.com/markdown-it/markdown-it/blob/d07d585b6b15aaee2bc8f7a54b994526dad4dbc5/lib/renderer.mjs#L36-L37\n const parts = tok.info.split(/\\s+/);\n\n const isFirstPartForLineNumbers =\n opts.lineNumbers?.enabled && parts[0] === 'showLineNumbers';\n\n attrs[CodeBlockNodeAttr.Lang] = isFirstPartForLineNumbers ? '' : parts[0];\n }\n if (opts.lineNumbers?.enabled && tok.info?.includes('showLineNumbers')) {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = 'true';\n } else {\n attrs[CodeBlockNodeAttr.ShowLineNumbers] = '';\n }\n\n return attrs;\n },\n prepareContent: removeNewLineAtEnd, // content of fence blocks contains extra \\n at the end\n },\n },\n toMd: () => {\n throw new Error('Unexpected toMd() call on fence node');\n },\n }));\n builder.addKeymap(() => ({\n Tab: (state, dispatch) => {\n const {$anchor, $head} = state.selection;\n if ($anchor.sameParent($head) && $anchor.parent.type.name === codeBlockNodeName) {\n dispatch?.(state.tr.replaceSelectionWith(state.schema.text('\\t')).scrollIntoView());\n return true;\n }\n return false;\n },\n }));\n};\n\nfunction removeNewLineAtEnd(content: string): string {\n return content.endsWith('\\n') ? content.slice(0, content.length - 1) : content;\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { codeBlockType } from "./CodeBlockSpecs/index.js";
|
|
1
|
+
import { type LineNumbersOptions, codeBlockType } from "./CodeBlockSpecs/index.js";
|
|
2
2
|
export { codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr } from "./CodeBlockSpecs/index.js";
|
|
3
3
|
export declare const cbAction = "toCodeBlock";
|
|
4
4
|
export { codeBlockType };
|
|
5
|
+
export declare const lineNumbersOptionsDefault: LineNumbersOptions;
|
|
@@ -2,4 +2,9 @@ import { codeBlockType } from "./CodeBlockSpecs/index.js";
|
|
|
2
2
|
export { codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr } from "./CodeBlockSpecs/index.js";
|
|
3
3
|
export const cbAction = 'toCodeBlock';
|
|
4
4
|
export { codeBlockType };
|
|
5
|
+
// After changing the default, don't forget to update LineNumbersOptions
|
|
6
|
+
export const lineNumbersOptionsDefault = {
|
|
7
|
+
enabled: true,
|
|
8
|
+
showByDefault: false,
|
|
9
|
+
};
|
|
5
10
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/const.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,aAAa,EAAC,kCAAyB;AAExE,OAAO,EAAC,iBAAiB,EAAE,iBAAiB,IAAI,aAAa,EAAC,kCAAyB;AACvF,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,OAAO,EAAC,aAAa,EAAC,CAAC;AAEvB,wEAAwE;AACxE,MAAM,CAAC,MAAM,yBAAyB,GAAuB;IACzD,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,KAAK;CACvB,CAAC","sourcesContent":["import {type LineNumbersOptions, codeBlockType} from './CodeBlockSpecs';\n\nexport {codeBlockNodeName, CodeBlockNodeAttr as CodeBlockAttr} from './CodeBlockSpecs';\nexport const cbAction = 'toCodeBlock';\nexport {codeBlockType};\n\n// After changing the default, don't forget to update LineNumbersOptions\nexport const lineNumbersOptionsDefault: LineNumbersOptions = {\n enabled: true,\n showByDefault: false,\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Action, ExtensionAuto } from "../../../core/index.js";
|
|
2
2
|
import { type HighlightLangMap } from "./CodeBlockHighlight/CodeBlockHighlight.js";
|
|
3
|
-
import { type CodeBlockSpecsOptions
|
|
3
|
+
import { type CodeBlockSpecsOptions } from "./CodeBlockSpecs/index.js";
|
|
4
4
|
import { cbAction } from "./const.js";
|
|
5
5
|
export { resetCodeblock } from "./commands.js";
|
|
6
6
|
export { codeBlockNodeName, CodeBlockNodeAttr, codeBlockType } from "./CodeBlockSpecs/index.js";
|
|
@@ -8,7 +8,6 @@ export type CodeBlockOptions = CodeBlockSpecsOptions & {
|
|
|
8
8
|
codeBlockKey?: string | null;
|
|
9
9
|
langs?: HighlightLangMap;
|
|
10
10
|
};
|
|
11
|
-
export declare const lineNumbersOptionsDefault: LineNumbersOptions;
|
|
12
11
|
export declare const CodeBlock: ExtensionAuto<CodeBlockOptions>;
|
|
13
12
|
declare global {
|
|
14
13
|
namespace WysiwygEditor {
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
import { hasParentNodeOfType } from 'prosemirror-utils';
|
|
1
|
+
import { hasParentNodeOfType } from "../../../pm/utils.js";
|
|
3
2
|
import { isFunction } from "../../../lodash.js";
|
|
4
3
|
import { textblockTypeInputRule } from "../../../utils/inputrules.js";
|
|
5
4
|
import { withLogAction } from "../../../utils/keymap.js";
|
|
6
5
|
import { CodeBlockHighlight } from "./CodeBlockHighlight/CodeBlockHighlight.js";
|
|
7
|
-
import { CodeBlockSpecs
|
|
6
|
+
import { CodeBlockSpecs } from "./CodeBlockSpecs/index.js";
|
|
8
7
|
import { newlineInCode, resetCodeblock, setCodeBlockType } from "./commands.js";
|
|
9
|
-
import { cbAction, codeBlockType } from "./const.js";
|
|
8
|
+
import { cbAction, codeBlockType, lineNumbersOptionsDefault } from "./const.js";
|
|
10
9
|
import { codeBlockPastePlugin } from "./plugins/codeBlockPastePlugin.js";
|
|
11
10
|
export { resetCodeblock } from "./commands.js";
|
|
12
11
|
export { codeBlockNodeName, CodeBlockNodeAttr, codeBlockType } from "./CodeBlockSpecs/index.js";
|
|
13
|
-
export const lineNumbersOptionsDefault = { enabled: true, showByDefault: true };
|
|
14
12
|
export const CodeBlock = (builder, opts) => {
|
|
15
13
|
const optsNormalized = {
|
|
16
14
|
...opts,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/CodeBlock/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Action, ExtensionAuto, Keymap} from '#core';\nimport type {NodeType} from '#pm/model';\nimport {hasParentNodeOfType} from '#pm/utils';\nimport {isFunction} from 'src/lodash';\nimport {textblockTypeInputRule} from 'src/utils/inputrules';\nimport {withLogAction} from 'src/utils/keymap';\n\nimport {CodeBlockHighlight, type HighlightLangMap} from './CodeBlockHighlight/CodeBlockHighlight';\nimport {CodeBlockSpecs, type CodeBlockSpecsOptions} from './CodeBlockSpecs';\nimport {newlineInCode, resetCodeblock, setCodeBlockType} from './commands';\nimport {cbAction, codeBlockType, lineNumbersOptionsDefault} from './const';\nimport {codeBlockPastePlugin} from './plugins/codeBlockPastePlugin';\n\nexport {resetCodeblock} from './commands';\nexport {codeBlockNodeName, CodeBlockNodeAttr, codeBlockType} from './CodeBlockSpecs';\n\nexport type CodeBlockOptions = CodeBlockSpecsOptions & {\n codeBlockKey?: string | null;\n langs?: HighlightLangMap;\n};\n\nexport const CodeBlock: ExtensionAuto<CodeBlockOptions> = (builder, opts) => {\n const optsNormalized: CodeBlockOptions = {\n ...opts,\n lineNumbers: {\n enabled:\n typeof opts.lineNumbers?.enabled === 'boolean'\n ? opts.lineNumbers.enabled\n : lineNumbersOptionsDefault.enabled,\n showByDefault:\n typeof opts.lineNumbers?.showByDefault === 'boolean'\n ? opts.lineNumbers.showByDefault\n : lineNumbersOptionsDefault.showByDefault,\n },\n };\n\n builder.use(CodeBlockSpecs, optsNormalized);\n\n builder.addKeymap((deps) => {\n const {codeBlockKey} = optsNormalized;\n const bindings: Keymap = {Enter: newlineInCode, Backspace: resetCodeblock};\n if (codeBlockKey) {\n bindings[codeBlockKey] = withLogAction('code_block', setCodeBlockType(deps));\n }\n return bindings;\n });\n\n builder.addInputRules(({schema}) => ({rules: [codeBlockRule(codeBlockType(schema))]}));\n builder.addAction(cbAction, (deps) => {\n const cb = codeBlockType(deps.schema);\n return {\n isActive: (state) => hasParentNodeOfType(cb)(state.selection),\n isEnable: setCodeBlockType(deps),\n run: setCodeBlockType(deps),\n };\n });\n\n builder.addPlugin(codeBlockPastePlugin, builder.Priority.High);\n\n if (isFunction(optsNormalized.langs)) {\n builder.use(optsNormalized.langs);\n } else {\n builder.use(CodeBlockHighlight, {\n langs: optsNormalized.langs,\n lineNumbers: optsNormalized.lineNumbers,\n });\n }\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [cbAction]: Action;\n }\n }\n}\n\n// Given a code block node type, returns an input rule that turns a\n// textblock starting with three backticks into a code block.\nfunction codeBlockRule(nodeType: NodeType) {\n return textblockTypeInputRule(/^```$/, nodeType);\n}\n"]}
|
|
@@ -10,9 +10,12 @@ export declare const CheckboxAttr: {
|
|
|
10
10
|
readonly Checked: "checked";
|
|
11
11
|
readonly For: "for";
|
|
12
12
|
readonly Line: "data-line";
|
|
13
|
+
readonly Tight: "data-tight";
|
|
13
14
|
};
|
|
14
15
|
export declare const idPrefix = "yfm-editor-checkbox";
|
|
15
16
|
export declare const b: import("@bem-react/classname").ClassNameFormatter;
|
|
16
17
|
export declare const checkboxType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
17
18
|
export declare const checkboxLabelType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
18
19
|
export declare const checkboxInputType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
20
|
+
export declare const CHECKBOX_OPEN_TOKEN = "checkbox_open";
|
|
21
|
+
export declare const CHECKBOX_CLOSE_TOKEN = "checkbox_close";
|
|
@@ -13,10 +13,14 @@ export const CheckboxAttr = {
|
|
|
13
13
|
Checked: 'checked',
|
|
14
14
|
For: 'for',
|
|
15
15
|
Line: 'data-line',
|
|
16
|
+
Tight: 'data-tight',
|
|
16
17
|
};
|
|
17
18
|
export const idPrefix = 'yfm-editor-checkbox';
|
|
19
|
+
// TODO [MAJOR]: remove custom classname
|
|
18
20
|
export const b = cn('checkbox');
|
|
19
21
|
export const checkboxType = nodeTypeFactory(CheckboxNode.Checkbox);
|
|
20
22
|
export const checkboxLabelType = nodeTypeFactory(CheckboxNode.Label);
|
|
21
23
|
export const checkboxInputType = nodeTypeFactory(CheckboxNode.Input);
|
|
24
|
+
export const CHECKBOX_OPEN_TOKEN = 'checkbox_open';
|
|
25
|
+
export const CHECKBOX_CLOSE_TOKEN = 'checkbox_close';
|
|
22
26
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EAAC,eAAe,EAAC,oCAAiC;AAEzD,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACpB,qCAAqB,CAAA;IACrB,wCAAwB,CAAA;IACxB,wCAAwB,CAAA;AAC5B,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,SAAS;IAClB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,WAAW;
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EAAC,eAAe,EAAC,oCAAiC;AAEzD,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACpB,qCAAqB,CAAA;IACrB,wCAAwB,CAAA;IACxB,wCAAwB,CAAA;AAC5B,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,IAAI;IACR,OAAO,EAAE,SAAS;IAClB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,YAAY;CACb,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AAE9C,wCAAwC;AACxC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAErE,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC","sourcesContent":["import {cn} from '../../../../classname';\nimport {nodeTypeFactory} from '../../../../utils/schema';\n\nexport enum CheckboxNode {\n Checkbox = 'checkbox',\n Input = 'checkbox_input',\n Label = 'checkbox_label',\n}\n\nexport const CheckboxAttr = {\n Class: 'class',\n Type: 'type',\n Id: 'id',\n Checked: 'checked',\n For: 'for',\n Line: 'data-line',\n Tight: 'data-tight',\n} as const;\n\nexport const idPrefix = 'yfm-editor-checkbox';\n\n// TODO [MAJOR]: remove custom classname\nexport const b = cn('checkbox');\n\nexport const checkboxType = nodeTypeFactory(CheckboxNode.Checkbox);\nexport const checkboxLabelType = nodeTypeFactory(CheckboxNode.Label);\nexport const checkboxInputType = nodeTypeFactory(CheckboxNode.Input);\n\nexport const CHECKBOX_OPEN_TOKEN = 'checkbox_open';\nexport const CHECKBOX_CLOSE_TOKEN = 'checkbox_close';\n"]}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import type { NodeSpec } from 'prosemirror-model';
|
|
2
1
|
import type { ExtensionAuto, ExtensionNodeSpec } from "../../../../core/index.js";
|
|
2
|
+
import { type GetSchemaSpecsOptions } from "./schema.js";
|
|
3
3
|
export { CheckboxAttr, CheckboxNode, checkboxType, checkboxLabelType, checkboxInputType, } from "./const.js";
|
|
4
|
-
export type CheckboxSpecsOptions = {
|
|
5
|
-
/**
|
|
6
|
-
* @deprecated use placeholder option in BehaviorPreset instead.
|
|
7
|
-
*/
|
|
8
|
-
checkboxLabelPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];
|
|
4
|
+
export type CheckboxSpecsOptions = GetSchemaSpecsOptions & {
|
|
9
5
|
inputView?: ExtensionNodeSpec['view'];
|
|
10
6
|
labelView?: ExtensionNodeSpec['view'];
|
|
11
7
|
checkboxView?: ExtensionNodeSpec['view'];
|
|
@@ -7,7 +7,7 @@ export { CheckboxAttr, CheckboxNode, checkboxType, checkboxLabelType, checkboxIn
|
|
|
7
7
|
export const CheckboxSpecs = (builder, opts) => {
|
|
8
8
|
const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));
|
|
9
9
|
builder
|
|
10
|
-
.configureMd((md) => md.use(checkboxPlugin, { idPrefix, divClass: b() }))
|
|
10
|
+
.configureMd((md) => md.use(checkboxPlugin, { idPrefix, divClass: b(null, 'checkbox') }))
|
|
11
11
|
.addNode(CheckboxNode.Checkbox, () => ({
|
|
12
12
|
spec: schemaSpecs[CheckboxNode.Checkbox],
|
|
13
13
|
toMd: serializerTokens[CheckboxNode.Checkbox],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mDAAmD,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/Checkbox/CheckboxSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,mDAAmD,CAAC;AAI/E,OAAO,EAAC,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAC,mBAAgB;AAClD,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAA6B,cAAc,EAAC,oBAAiB;AACpE,OAAO,EAAC,gBAAgB,EAAC,wBAAqB;AAE9C,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GACpB,mBAAgB;AAQjB,MAAM,CAAC,MAAM,aAAa,GAAwC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAChF,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAE7E,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,EAAE,EAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAC,CAAC,CAAC;SACtF,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC;QACxC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC7C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC;SACjD;QACD,IAAI,EAAE,IAAI,CAAC,YAAY;KAC1B,CAAC,CAAC;SACF,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QACrC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC;SAC9C;QACD,IAAI,EAAE,IAAI,CAAC,SAAS;KACvB,CAAC,CAAC;SACF,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,YAAY,CAAC,KAAK,CAAC;QACrC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC;YAC3C,SAAS,EAAE,gBAAgB;SAC9B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS;KACvB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import checkboxPlugin from '@diplodoc/transform/lib/plugins/checkbox/index.js';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '#core';\n\nimport {CheckboxNode, b, idPrefix} from './const';\nimport {parserTokens} from './parser';\nimport {type GetSchemaSpecsOptions, getSchemaSpecs} from './schema';\nimport {serializerTokens} from './serializer';\n\nexport {\n CheckboxAttr,\n CheckboxNode,\n checkboxType,\n checkboxLabelType,\n checkboxInputType,\n} from './const';\n\nexport type CheckboxSpecsOptions = GetSchemaSpecsOptions & {\n inputView?: ExtensionNodeSpec['view'];\n labelView?: ExtensionNodeSpec['view'];\n checkboxView?: ExtensionNodeSpec['view'];\n};\n\nexport const CheckboxSpecs: ExtensionAuto<CheckboxSpecsOptions> = (builder, opts) => {\n const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));\n\n builder\n .configureMd((md) => md.use(checkboxPlugin, {idPrefix, divClass: b(null, 'checkbox')}))\n .addNode(CheckboxNode.Checkbox, () => ({\n spec: schemaSpecs[CheckboxNode.Checkbox],\n toMd: serializerTokens[CheckboxNode.Checkbox],\n fromMd: {\n tokenSpec: parserTokens[CheckboxNode.Checkbox],\n },\n view: opts.checkboxView,\n }))\n .addNode(CheckboxNode.Input, () => ({\n spec: schemaSpecs[CheckboxNode.Input],\n toMd: serializerTokens[CheckboxNode.Input],\n fromMd: {\n tokenSpec: parserTokens[CheckboxNode.Input],\n },\n view: opts.inputView,\n }))\n .addNode(CheckboxNode.Label, () => ({\n spec: schemaSpecs[CheckboxNode.Label],\n toMd: serializerTokens[CheckboxNode.Label],\n fromMd: {\n tokenSpec: parserTokens[CheckboxNode.Label],\n tokenName: 'checkbox_label',\n },\n view: opts.labelView,\n }));\n};\n"]}
|
|
@@ -1,8 +1,34 @@
|
|
|
1
|
-
import { CheckboxNode } from "../const.js";
|
|
1
|
+
import { CheckboxAttr, CheckboxNode } from "../const.js";
|
|
2
|
+
import { CHECKBOX_CLOSE_TOKEN, CHECKBOX_OPEN_TOKEN } from "./const.js";
|
|
3
|
+
const getCheckboxAttrs = (token, tokens, index) => {
|
|
4
|
+
const tight = checkboxIsTight(tokens, index);
|
|
5
|
+
const attrs = token.attrs ? Object.fromEntries(token.attrs) : {};
|
|
6
|
+
return { ...attrs, [CheckboxAttr.Tight]: tight };
|
|
7
|
+
};
|
|
2
8
|
const getAttrs = (tok) => (tok.attrs ? Object.fromEntries(tok.attrs) : {});
|
|
3
9
|
export const parserTokens = {
|
|
4
|
-
[CheckboxNode.Checkbox]: {
|
|
10
|
+
[CheckboxNode.Checkbox]: {
|
|
11
|
+
name: CheckboxNode.Checkbox,
|
|
12
|
+
type: 'block',
|
|
13
|
+
getAttrs: getCheckboxAttrs,
|
|
14
|
+
},
|
|
5
15
|
[CheckboxNode.Input]: { name: CheckboxNode.Input, type: 'node', getAttrs },
|
|
6
16
|
[CheckboxNode.Label]: { name: CheckboxNode.Label, type: 'block', getAttrs },
|
|
7
17
|
};
|
|
18
|
+
function checkboxIsTight(tokens, index) {
|
|
19
|
+
let closeTokenEndLine;
|
|
20
|
+
let nextOpenTokenStartLine;
|
|
21
|
+
for (let i = index + 1; i < tokens.length; i++) {
|
|
22
|
+
if (tokens[i].type === CHECKBOX_CLOSE_TOKEN) {
|
|
23
|
+
closeTokenEndLine = tokens[i].map?.[1];
|
|
24
|
+
if (tokens[i + 1]?.type === CHECKBOX_OPEN_TOKEN) {
|
|
25
|
+
nextOpenTokenStartLine = tokens[i + 1].map?.[0];
|
|
26
|
+
}
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (!Number.isFinite(closeTokenEndLine) || !Number.isFinite(nextOpenTokenStartLine))
|
|
31
|
+
return null;
|
|
32
|
+
return closeTokenEndLine === nextOpenTokenStartLine;
|
|
33
|
+
}
|
|
8
34
|
//# sourceMappingURL=parser.js.map
|