@gravity-ui/markdown-editor 15.3.0 → 15.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/extensions/additional/GPT/MarkupGpt/plugin.js +4 -1
- package/build/cjs/extensions/additional/GPT/MarkupGpt/plugin.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +7 -3
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +19 -2
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js +7 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -2
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/actions.js +12 -5
- package/build/cjs/extensions/additional/Mermaid/actions.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/types.d.ts +3 -0
- package/build/cjs/extensions/additional/Mermaid/types.js +3 -0
- package/build/cjs/extensions/additional/Mermaid/types.js.map +1 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -12
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +7 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -2
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js +9 -2
- package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/types.js +3 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
- package/build/cjs/extensions/behavior/Autocomplete/index.d.ts +1 -0
- package/build/cjs/extensions/behavior/Autocomplete/index.js +5 -3
- package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
- package/build/cjs/extensions/behavior/Autocomplete/types.d.ts +1 -1
- package/build/cjs/extensions/behavior/Autocomplete/types.js.map +1 -1
- package/build/cjs/extensions/behavior/Autocomplete/utils.d.ts +3 -0
- package/build/cjs/extensions/behavior/Autocomplete/utils.js +8 -0
- package/build/cjs/extensions/behavior/Autocomplete/utils.js.map +1 -0
- package/build/cjs/extensions/behavior/Clipboard/code.d.ts +7 -1
- package/build/cjs/extensions/behavior/Clipboard/code.js +60 -0
- package/build/cjs/extensions/behavior/Clipboard/code.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/index.js +2 -0
- package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
- package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -6
- package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
- package/build/cjs/extensions/behavior/SharedState/SharedState.d.ts +7 -0
- package/build/cjs/extensions/behavior/SharedState/SharedState.js +16 -0
- package/build/cjs/extensions/behavior/SharedState/SharedState.js.map +1 -0
- package/build/cjs/extensions/behavior/SharedState/index.d.ts +1 -0
- package/build/cjs/extensions/behavior/SharedState/index.js +5 -0
- package/build/cjs/extensions/behavior/SharedState/index.js.map +1 -0
- package/build/cjs/extensions/behavior/SharedState/plugin.d.ts +3 -0
- package/build/cjs/extensions/behavior/SharedState/plugin.js +62 -0
- package/build/cjs/extensions/behavior/SharedState/plugin.js.map +1 -0
- package/build/cjs/extensions/behavior/SharedState/types.d.ts +1 -0
- package/build/cjs/extensions/behavior/SharedState/types.js +3 -0
- package/build/cjs/extensions/behavior/SharedState/types.js.map +1 -0
- package/build/cjs/extensions/behavior/SharedState/utils.d.ts +29 -0
- package/build/cjs/extensions/behavior/SharedState/utils.js +60 -0
- package/build/cjs/extensions/behavior/SharedState/utils.js.map +1 -0
- package/build/cjs/extensions/behavior/index.d.ts +2 -0
- package/build/cjs/extensions/behavior/index.js +4 -0
- package/build/cjs/extensions/behavior/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +41 -26
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
- package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +7 -6
- package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
- package/build/cjs/react-utils/index.d.ts +1 -0
- package/build/cjs/react-utils/index.js +1 -0
- package/build/cjs/react-utils/index.js.map +1 -1
- package/build/cjs/react-utils/useSharedEditingState.d.ts +5 -0
- package/build/cjs/react-utils/useSharedEditingState.js +25 -0
- package/build/cjs/react-utils/useSharedEditingState.js.map +1 -0
- package/build/cjs/utils/descedants.d.ts +8 -0
- package/build/cjs/utils/descedants.js +15 -0
- package/build/cjs/utils/descedants.js.map +1 -0
- package/build/cjs/utils/entity-id.d.ts +11 -0
- package/build/cjs/utils/entity-id.js +21 -0
- package/build/cjs/utils/entity-id.js.map +1 -0
- package/build/cjs/utils/index.d.ts +2 -0
- package/build/cjs/utils/index.js +2 -0
- package/build/cjs/utils/index.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/cjs/view/hocs/withYfmHtml/index.d.ts +2 -0
- package/build/cjs/view/hocs/withYfmHtml/index.js +2 -2
- package/build/cjs/view/hocs/withYfmHtml/index.js.map +1 -1
- package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
- package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
- package/build/esm/extensions/additional/GPT/MarkupGpt/plugin.js +4 -1
- package/build/esm/extensions/additional/GPT/MarkupGpt/plugin.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +8 -4
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +18 -1
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js +6 -0
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +2 -2
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -3
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/actions.js +12 -5
- package/build/esm/extensions/additional/Mermaid/actions.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/types.d.ts +3 -0
- package/build/esm/extensions/additional/Mermaid/types.js +2 -0
- package/build/esm/extensions/additional/Mermaid/types.js.map +1 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -11
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +6 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +2 -2
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -3
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/actions.js +9 -2
- package/build/esm/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/types.js +2 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
- package/build/esm/extensions/behavior/Autocomplete/index.d.ts +1 -0
- package/build/esm/extensions/behavior/Autocomplete/index.js +2 -1
- package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
- package/build/esm/extensions/behavior/Autocomplete/types.d.ts +1 -1
- package/build/esm/extensions/behavior/Autocomplete/types.js.map +1 -1
- package/build/esm/extensions/behavior/Autocomplete/utils.d.ts +3 -0
- package/build/esm/extensions/behavior/Autocomplete/utils.js +5 -0
- package/build/esm/extensions/behavior/Autocomplete/utils.js.map +1 -0
- package/build/esm/extensions/behavior/Clipboard/code.d.ts +7 -1
- package/build/esm/extensions/behavior/Clipboard/code.js +57 -0
- package/build/esm/extensions/behavior/Clipboard/code.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/index.js +2 -0
- package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
- package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -7
- package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
- package/build/esm/extensions/behavior/SharedState/SharedState.d.ts +7 -0
- package/build/esm/extensions/behavior/SharedState/SharedState.js +11 -0
- package/build/esm/extensions/behavior/SharedState/SharedState.js.map +1 -0
- package/build/esm/extensions/behavior/SharedState/index.d.ts +1 -0
- package/build/esm/extensions/behavior/SharedState/index.js +2 -0
- package/build/esm/extensions/behavior/SharedState/index.js.map +1 -0
- package/build/esm/extensions/behavior/SharedState/plugin.d.ts +3 -0
- package/build/esm/extensions/behavior/SharedState/plugin.js +59 -0
- package/build/esm/extensions/behavior/SharedState/plugin.js.map +1 -0
- package/build/esm/extensions/behavior/SharedState/types.d.ts +1 -0
- package/build/esm/extensions/behavior/SharedState/types.js +2 -0
- package/build/esm/extensions/behavior/SharedState/types.js.map +1 -0
- package/build/esm/extensions/behavior/SharedState/utils.d.ts +29 -0
- package/build/esm/extensions/behavior/SharedState/utils.js +56 -0
- package/build/esm/extensions/behavior/SharedState/utils.js.map +1 -0
- package/build/esm/extensions/behavior/index.d.ts +2 -0
- package/build/esm/extensions/behavior/index.js +4 -0
- package/build/esm/extensions/behavior/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +41 -26
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
- package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +8 -7
- package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
- package/build/esm/react-utils/index.d.ts +1 -0
- package/build/esm/react-utils/index.js +1 -0
- package/build/esm/react-utils/index.js.map +1 -1
- package/build/esm/react-utils/useSharedEditingState.d.ts +5 -0
- package/build/esm/react-utils/useSharedEditingState.js +22 -0
- package/build/esm/react-utils/useSharedEditingState.js.map +1 -0
- package/build/esm/utils/descedants.d.ts +8 -0
- package/build/esm/utils/descedants.js +12 -0
- package/build/esm/utils/descedants.js.map +1 -0
- package/build/esm/utils/entity-id.d.ts +11 -0
- package/build/esm/utils/entity-id.js +16 -0
- package/build/esm/utils/entity-id.js.map +1 -0
- package/build/esm/utils/index.d.ts +2 -0
- package/build/esm/utils/index.js +2 -0
- package/build/esm/utils/index.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/esm/view/hocs/withYfmHtml/index.d.ts +2 -0
- package/build/esm/view/hocs/withYfmHtml/index.js +2 -2
- package/build/esm/view/hocs/withYfmHtml/index.js.map +1 -1
- package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
- package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import { entityIdAttr } from "../../../../utils/entity-id.js";
|
|
1
2
|
import { nodeTypeFactory } from "../../../../utils/schema.js";
|
|
2
3
|
export var MermaidAttrs;
|
|
3
4
|
(function (MermaidAttrs) {
|
|
5
|
+
// @ts-expect-error error TS18055
|
|
6
|
+
MermaidAttrs["EntityId"] = "data-entity-id";
|
|
4
7
|
MermaidAttrs["content"] = "content";
|
|
5
8
|
MermaidAttrs["class"] = "class";
|
|
9
|
+
// MAJOR: remove before next major
|
|
10
|
+
/** @deprecated This is no longer used. Removed in next major version */
|
|
6
11
|
MermaidAttrs["newCreated"] = "newCreated";
|
|
7
12
|
})(MermaidAttrs || (MermaidAttrs = {}));
|
|
8
13
|
export const mermaidNodeName = 'mermaid';
|
|
@@ -13,4 +18,5 @@ export const MermaidConsts = {
|
|
|
13
18
|
NodeAttrs: MermaidAttrs,
|
|
14
19
|
nodeType: mermaidNodeType,
|
|
15
20
|
};
|
|
21
|
+
export const defaultMermaidEntityId = mermaidNodeName + '#0';
|
|
16
22
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,uCAA4B;AACjD,OAAO,EAAC,eAAe,EAAC,oCAAyB;AAEjD,MAAM,CAAN,IAAY,YAQX;AARD,WAAY,YAAY;IACpB,iCAAiC;IACjC,2CAAuB,CAAA;IACvB,mCAAmB,CAAA;IACnB,+BAAe,CAAA;IACf,kCAAkC;IAClC,wEAAwE;IACxE,yCAAyB,CAAA;AAC7B,CAAC,EARW,YAAY,KAAZ,YAAY,QAQvB;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,QAAQ,EAAE,eAAe;IACzB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,eAAe;CACnB,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,GAAG,IAAI,CAAC","sourcesContent":["import {entityIdAttr} from 'src/utils/entity-id';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport enum MermaidAttrs {\n // @ts-expect-error error TS18055\n EntityId = entityIdAttr,\n content = 'content',\n class = 'class',\n // MAJOR: remove before next major\n /** @deprecated This is no longer used. Removed in next major version */\n newCreated = 'newCreated',\n}\n\nexport const mermaidNodeName = 'mermaid';\nexport const mermaidNodeType = nodeTypeFactory(mermaidNodeName);\n\nexport const MermaidAction = 'createMermaid';\n\nexport const MermaidConsts = {\n NodeName: mermaidNodeName,\n NodeAttrs: MermaidAttrs,\n nodeType: mermaidNodeType,\n} as const;\n\nexport const defaultMermaidEntityId = mermaidNodeName + '#0';\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { ExtensionNodeSpec } from "../../../../core/index.js";
|
|
2
|
-
export { mermaidNodeName } from "./const.js";
|
|
2
|
+
export { mermaidNodeName, MermaidConsts } from "./const.js";
|
|
3
3
|
export type MermaidSpecsOptions = {
|
|
4
4
|
nodeView?: ExtensionNodeSpec['view'];
|
|
5
5
|
};
|
|
6
|
-
export declare const MermaidSpecs: import("../../../../index.js").ExtensionWithOptions<MermaidSpecsOptions> & {
|
|
6
|
+
export declare const MermaidSpecs: import("../../../../core/index.js").ExtensionWithOptions<MermaidSpecsOptions> & {
|
|
7
7
|
readonly NodeName: "mermaid";
|
|
8
8
|
readonly NodeAttrs: typeof import("./const.js").MermaidAttrs;
|
|
9
9
|
readonly nodeType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
2
2
|
import { transform } from '@diplodoc/mermaid-extension';
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import { generateEntityId } from "../../../../utils/entity-id.js";
|
|
4
|
+
import { MermaidConsts, defaultMermaidEntityId, mermaidNodeName } from "./const.js";
|
|
5
|
+
export { mermaidNodeName, MermaidConsts } from "./const.js";
|
|
5
6
|
const MermaidSpecsExtension = (builder, { nodeView }) => {
|
|
6
7
|
builder
|
|
7
8
|
.configureMd((md) => md.use(transform({ runtime: 'mermaid', bundle: false }), {}))
|
|
@@ -10,7 +11,10 @@ const MermaidSpecsExtension = (builder, { nodeView }) => {
|
|
|
10
11
|
tokenSpec: {
|
|
11
12
|
name: mermaidNodeName,
|
|
12
13
|
type: 'node',
|
|
13
|
-
getAttrs: ({ content }) => ({
|
|
14
|
+
getAttrs: ({ content }) => ({
|
|
15
|
+
[MermaidConsts.NodeAttrs.content]: content,
|
|
16
|
+
[MermaidConsts.NodeAttrs.EntityId]: generateEntityId(mermaidNodeName),
|
|
17
|
+
}),
|
|
14
18
|
},
|
|
15
19
|
},
|
|
16
20
|
spec: {
|
|
@@ -20,6 +24,7 @@ const MermaidSpecsExtension = (builder, { nodeView }) => {
|
|
|
20
24
|
attrs: {
|
|
21
25
|
[MermaidConsts.NodeAttrs.content]: { default: '' },
|
|
22
26
|
[MermaidConsts.NodeAttrs.class]: { default: 'mermaid' },
|
|
27
|
+
[MermaidConsts.NodeAttrs.EntityId]: { default: defaultMermaidEntityId },
|
|
23
28
|
[MermaidConsts.NodeAttrs.newCreated]: { default: null },
|
|
24
29
|
},
|
|
25
30
|
parseDOM: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidSpecs/index.tsx"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,OAAO,EAAC,SAAS,EAAC,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/Mermaid/MermaidSpecs/index.tsx"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,OAAO,EAAC,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAGtD,OAAO,EAAC,gBAAgB,EAAC,uCAA4B;AAErD,OAAO,EAAC,aAAa,EAAE,sBAAsB,EAAE,eAAe,EAAC,mBAAgB;AAC/E,OAAO,EAAC,eAAe,EAAE,aAAa,EAAC,mBAAgB;AAMvD,MAAM,qBAAqB,GAAuC,CAAC,OAAO,EAAE,EAAC,QAAQ,EAAC,EAAE,EAAE;IACtF,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC/E,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7B,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC;oBACtB,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO;oBAC1C,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,eAAe,CAAC;iBACxE,CAAC;aACL;SACJ;QACD,IAAI,EAAE;YACF,UAAU,EAAE,IAAI;YAChB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,OAAO;YACd,KAAK,EAAE;gBACH,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBAChD,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,SAAS,EAAC;gBACrD,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAC,OAAO,EAAE,sBAAsB,EAAC;gBACrE,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;aACxD;YACD,QAAQ,EAAE,EAAE;YACZ,KAAK,CAAC,IAAI;gBACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;YACD,GAAG,EAAE,EAAC,KAAK,EAAE,EAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,EAAC;SACjC;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,MAAM,OAAO,GAAW,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAE1E,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC1B,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;YAClC,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,CAAC,aAAa,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC","sourcesContent":["// eslint-disable-next-line import/no-extraneous-dependencies\nimport {transform} from '@diplodoc/mermaid-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {MermaidConsts, defaultMermaidEntityId, mermaidNodeName} from './const';\nexport {mermaidNodeName, MermaidConsts} from './const';\n\nexport type MermaidSpecsOptions = {\n nodeView?: ExtensionNodeSpec['view'];\n};\n\nconst MermaidSpecsExtension: ExtensionAuto<MermaidSpecsOptions> = (builder, {nodeView}) => {\n builder\n .configureMd((md) => md.use(transform({runtime: 'mermaid', bundle: false}), {}))\n .addNode(mermaidNodeName, () => ({\n fromMd: {\n tokenSpec: {\n name: mermaidNodeName,\n type: 'node',\n getAttrs: ({content}) => ({\n [MermaidConsts.NodeAttrs.content]: content,\n [MermaidConsts.NodeAttrs.EntityId]: generateEntityId(mermaidNodeName),\n }),\n },\n },\n spec: {\n selectable: true,\n atom: true,\n group: 'block',\n attrs: {\n [MermaidConsts.NodeAttrs.content]: {default: ''},\n [MermaidConsts.NodeAttrs.class]: {default: 'mermaid'},\n [MermaidConsts.NodeAttrs.EntityId]: {default: defaultMermaidEntityId},\n [MermaidConsts.NodeAttrs.newCreated]: {default: null},\n },\n parseDOM: [],\n toDOM(node) {\n return ['div', node.attrs];\n },\n dnd: {props: {offset: [8, 1]}},\n },\n toMd: (state, node) => {\n const content: string = node.attrs[MermaidConsts.NodeAttrs.content] || '';\n\n state.write('```mermaid');\n state.ensureNewLine();\n state.text(content.trim(), false);\n state.ensureNewLine();\n state.write('```');\n state.ensureNewLine();\n },\n view: nodeView,\n }));\n};\n\nexport const MermaidSpecs = Object.assign(MermaidSpecsExtension, MermaidConsts);\n"]}
|
|
@@ -1,17 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SharedStateKey } from "../../behavior/SharedState/utils.js";
|
|
2
|
+
import { generateEntityId } from "../../../utils/entity-id.js";
|
|
3
|
+
import { MermaidConsts } from "./MermaidSpecs/index.js";
|
|
2
4
|
export const addMermaid = {
|
|
3
5
|
isEnable(state) {
|
|
4
6
|
return state.selection.empty;
|
|
5
7
|
},
|
|
6
8
|
run(state, dispatch, _view) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
const newEntityId = generateEntityId(MermaidConsts.NodeName);
|
|
10
|
+
const sharedKey = SharedStateKey.define({ name: newEntityId });
|
|
11
|
+
const tr = state.tr.insert(state.selection.from, MermaidConsts.nodeType(state.schema).create({
|
|
12
|
+
[MermaidConsts.NodeAttrs.content]: [
|
|
9
13
|
'sequenceDiagram',
|
|
10
14
|
'\tAlice->>Bob: Hi Bob',
|
|
11
15
|
'\tBob->>Alice: Hi Alice',
|
|
12
16
|
].join('\n'),
|
|
13
|
-
newCreated: true,
|
|
14
|
-
|
|
17
|
+
[MermaidConsts.NodeAttrs.newCreated]: true,
|
|
18
|
+
[MermaidConsts.NodeAttrs.EntityId]: newEntityId,
|
|
19
|
+
}));
|
|
20
|
+
sharedKey.appendTransaction.set(tr, { editing: true });
|
|
21
|
+
dispatch(tr);
|
|
15
22
|
},
|
|
16
23
|
};
|
|
17
24
|
//# sourceMappingURL=actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Mermaid/actions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Mermaid/actions.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,cAAc,EAAC,4CAAkD;AACzE,OAAO,EAAC,gBAAgB,EAAC,oCAA4B;AAErD,OAAO,EAAC,aAAa,EAAC,gCAAuB;AAG7C,MAAM,CAAC,MAAM,UAAU,GAAe;IAClC,QAAQ,CAAC,KAAK;QACV,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK;QACtB,MAAM,WAAW,GAAG,gBAAgB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAA2B,EAAC,IAAI,EAAE,WAAW,EAAC,CAAC,CAAC;QAEvF,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CACtB,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YACxC,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;gBAC/B,iBAAiB;gBACjB,uBAAuB;gBACvB,yBAAyB;aAC5B,CAAC,IAAI,CAAC,IAAI,CAAC;YACZ,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;YAC1C,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW;SAClD,CAAC,CACL,CAAC;QAEF,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;QAErD,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;CACJ,CAAC","sourcesContent":["import type {ActionSpec} from '#core';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState/utils';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {MermaidConsts} from './MermaidSpecs';\nimport type {MermaidEntitySharedState} from './types';\n\nexport const addMermaid: ActionSpec = {\n isEnable(state) {\n return state.selection.empty;\n },\n run(state, dispatch, _view) {\n const newEntityId = generateEntityId(MermaidConsts.NodeName);\n const sharedKey = SharedStateKey.define<MermaidEntitySharedState>({name: newEntityId});\n\n const tr = state.tr.insert(\n state.selection.from,\n MermaidConsts.nodeType(state.schema).create({\n [MermaidConsts.NodeAttrs.content]: [\n 'sequenceDiagram',\n '\\tAlice->>Bob: Hi Bob',\n '\\tBob->>Alice: Hi Alice',\n ].join('\\n'),\n [MermaidConsts.NodeAttrs.newCreated]: true,\n [MermaidConsts.NodeAttrs.EntityId]: newEntityId,\n }),\n );\n\n sharedKey.appendTransaction.set(tr, {editing: true});\n\n dispatch(tr);\n },\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/additional/Mermaid/types.ts"],"names":[],"mappings":"","sourcesContent":["export type MermaidEntitySharedState = {\n editing: boolean;\n};\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Portal } from '@gravity-ui/uikit';
|
|
3
|
-
import { getReactRendererFromState } from "../../../behavior/index.js";
|
|
4
|
-
import {
|
|
3
|
+
import { getReactRendererFromState } from "../../../behavior/ReactRenderer/index.js";
|
|
4
|
+
import { generateEntityId, isInvalidEntityId } from "../../../../utils/entity-id.js";
|
|
5
|
+
import { YfmHtmlBlockConsts, defaultYfmHtmlBlockEntityId } from "../YfmHtmlBlockSpecs/const.js";
|
|
5
6
|
import { STOP_EVENT_CLASSNAME, YfmHtmlBlockView } from "./YfmHtmlBlockView.js";
|
|
6
7
|
export class WYfmHtmlBlockNodeView {
|
|
7
8
|
dom;
|
|
@@ -19,13 +20,11 @@ export class WYfmHtmlBlockNodeView {
|
|
|
19
20
|
this.getPos = getPos;
|
|
20
21
|
this.options = options;
|
|
21
22
|
this.renderItem = getReactRendererFromState(view.state).createItem('yfmHtmlBlock-view', this.renderYfmHtmlBlock.bind(this));
|
|
23
|
+
this.validateEntityId();
|
|
22
24
|
}
|
|
23
25
|
update(node) {
|
|
24
26
|
if (node.type !== this.node.type)
|
|
25
27
|
return false;
|
|
26
|
-
if (node.attrs[YfmHtmlBlockConsts.NodeAttrs.newCreated] !==
|
|
27
|
-
this.node.attrs[YfmHtmlBlockConsts.NodeAttrs.newCreated])
|
|
28
|
-
return false;
|
|
29
28
|
this.node = node;
|
|
30
29
|
this.renderItem.rerender();
|
|
31
30
|
return true;
|
|
@@ -40,6 +39,16 @@ export class WYfmHtmlBlockNodeView {
|
|
|
40
39
|
const target = e.target;
|
|
41
40
|
return target.classList.contains(STOP_EVENT_CLASSNAME);
|
|
42
41
|
}
|
|
42
|
+
validateEntityId() {
|
|
43
|
+
if (isInvalidEntityId({
|
|
44
|
+
node: this.node,
|
|
45
|
+
doc: this.view.state.doc,
|
|
46
|
+
defaultId: defaultYfmHtmlBlockEntityId,
|
|
47
|
+
})) {
|
|
48
|
+
const newId = generateEntityId(YfmHtmlBlockConsts.NodeName);
|
|
49
|
+
this.view.dispatch(this.view.state.tr.setNodeAttribute(this.getPos(), YfmHtmlBlockConsts.NodeAttrs.EntityId, newId));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
43
52
|
onChange(attrs) {
|
|
44
53
|
const pos = this.getPos();
|
|
45
54
|
if (pos === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAIzC,OAAO,EAAC,yBAAyB,EAAC,
|
|
1
|
+
{"version":3,"file":"NodeView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {Portal} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView, NodeView} from 'prosemirror-view';\n\nimport {getReactRendererFromState} from 'src/extensions/behavior/ReactRenderer';\nimport {generateEntityId, isInvalidEntityId} from 'src/utils/entity-id';\n\nimport {YfmHtmlBlockConsts, defaultYfmHtmlBlockEntityId} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\n\nimport {STOP_EVENT_CLASSNAME, YfmHtmlBlockView} from './YfmHtmlBlockView';\n\nexport class WYfmHtmlBlockNodeView implements NodeView {\n readonly dom: HTMLElement;\n private node: Node;\n private readonly view;\n private readonly getPos;\n private readonly options: YfmHtmlBlockOptions = {};\n private readonly renderItem;\n\n constructor({\n node,\n view,\n getPos,\n options,\n }: {\n node: Node;\n view: EditorView;\n getPos: () => number | undefined;\n options: YfmHtmlBlockOptions;\n }) {\n this.node = node;\n this.dom = document.createElement('div');\n this.dom.classList.add('yfm-html-block-container');\n this.dom.contentEditable = 'false';\n this.view = view;\n this.getPos = getPos;\n this.options = options;\n\n this.renderItem = getReactRendererFromState(view.state).createItem(\n 'yfmHtmlBlock-view',\n this.renderYfmHtmlBlock.bind(this),\n );\n\n this.validateEntityId();\n }\n\n update(node: Node) {\n if (node.type !== this.node.type) return false;\n this.node = node;\n this.renderItem.rerender();\n return true;\n }\n\n destroy() {\n this.renderItem.remove();\n }\n\n ignoreMutation() {\n return true;\n }\n\n stopEvent(e: Event) {\n const target = e.target as Element;\n return target.classList.contains(STOP_EVENT_CLASSNAME);\n }\n\n private validateEntityId() {\n if (\n isInvalidEntityId({\n node: this.node,\n doc: this.view.state.doc,\n defaultId: defaultYfmHtmlBlockEntityId,\n })\n ) {\n const newId = generateEntityId(YfmHtmlBlockConsts.NodeName);\n this.view.dispatch(\n this.view.state.tr.setNodeAttribute(\n this.getPos()!,\n YfmHtmlBlockConsts.NodeAttrs.EntityId,\n newId,\n ),\n );\n }\n }\n\n private onChange(attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) {\n const pos = this.getPos();\n if (pos === undefined) return;\n\n const tr = this.view.state.tr.setNodeMarkup(\n pos,\n undefined,\n {\n ...this.node.attrs,\n ...attrs,\n },\n [],\n );\n\n this.view.dispatch(tr);\n }\n\n private renderYfmHtmlBlock() {\n return (\n <Portal container={this.dom}>\n <YfmHtmlBlockView\n getPos={this.getPos}\n node={this.node}\n onChange={this.onChange.bind(this)}\n options={this.options}\n view={this.view}\n />\n </Portal>\n );\n }\n}\n"]}
|
package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import { getStyles } from '@diplodoc/html-extension';
|
|
4
4
|
import { Ellipsis as DotsIcon, Eye } from '@gravity-ui/icons';
|
|
5
5
|
import { Button, Icon, Label, Menu, Popup } from '@gravity-ui/uikit';
|
|
6
|
-
import debounce from "lodash/debounce.js";
|
|
7
6
|
import { cn } from "../../../../classname.js";
|
|
7
|
+
import { SharedStateKey } from "../../../behavior/SharedState/index.js";
|
|
8
8
|
import { TextAreaFixed as TextArea } from "../../../../forms/TextInput.js";
|
|
9
9
|
import { i18n } from "../../../../i18n/common/index.js";
|
|
10
|
+
import { debounce } from "../../../../lodash.js";
|
|
10
11
|
import { useBooleanState, useElementState } from "../../../../react-utils/hooks.js";
|
|
12
|
+
import { useSharedEditingState } from "../../../../react-utils/useSharedEditingState.js";
|
|
11
13
|
import { removeNode } from "../../../../utils/remove-node.js";
|
|
12
14
|
import { YfmHtmlBlockConsts } from "../YfmHtmlBlockSpecs/const.js";
|
|
13
15
|
import "./YfmHtmlBlock.css";
|
|
@@ -29,7 +31,7 @@ const createLinkCLickHandler = (value, document) => (event) => {
|
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
};
|
|
32
|
-
const YfmHtmlBlockPreview = ({ html,
|
|
34
|
+
const YfmHtmlBlockPreview = ({ html, onClick, config }) => {
|
|
33
35
|
const ref = useRef(null);
|
|
34
36
|
const styles = useRef({});
|
|
35
37
|
const classNames = useRef([]);
|
|
@@ -45,7 +47,7 @@ const YfmHtmlBlockPreview = ({ html, onСlick, config }) => {
|
|
|
45
47
|
if (contentWindow) {
|
|
46
48
|
const frameDocument = contentWindow.document;
|
|
47
49
|
frameDocument.addEventListener('dblclick', () => {
|
|
48
|
-
|
|
50
|
+
onClick();
|
|
49
51
|
});
|
|
50
52
|
}
|
|
51
53
|
};
|
|
@@ -142,13 +144,12 @@ const CodeEditMode = ({ initialText, onSave, onCancel }) => {
|
|
|
142
144
|
}, autoFocus: true }), _jsx("div", { className: b('controls'), children: _jsxs("div", { children: [_jsx(Button, { onClick: onCancel, view: 'flat', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('cancel') }) }), _jsx(Button, { onClick: () => onSave(text), view: 'action', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('save') }) })] }) })] }) }));
|
|
143
145
|
};
|
|
144
146
|
export const YfmHtmlBlockView = ({ onChange, node, getPos, view, options: { useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = '' }, }) => {
|
|
145
|
-
const
|
|
147
|
+
const entityId = node.attrs[YfmHtmlBlockConsts.NodeAttrs.EntityId];
|
|
148
|
+
const entityKey = useMemo(() => SharedStateKey.define({ name: entityId }), [entityId]);
|
|
146
149
|
const config = useConfig?.();
|
|
150
|
+
const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);
|
|
147
151
|
const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);
|
|
148
152
|
const [anchorElement, setAnchorElement] = useElementState();
|
|
149
|
-
const handleClick = () => {
|
|
150
|
-
setEditing();
|
|
151
|
-
};
|
|
152
153
|
if (editing) {
|
|
153
154
|
return (_jsx(CodeEditMode, { initialText: node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc], onCancel: unsetEditing, onSave: (v) => {
|
|
154
155
|
onChange({ [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v });
|
|
@@ -165,9 +166,10 @@ export const YfmHtmlBlockView = ({ onChange, node, getPos, view, options: { useC
|
|
|
165
166
|
const head = `<head>${headContent || additional}</head>`;
|
|
166
167
|
const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;
|
|
167
168
|
const html = `<!DOCTYPE html><html>${head}${body}</html>`;
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
169
|
+
const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;
|
|
170
|
+
const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;
|
|
171
|
+
return (_jsxs("div", { className: b(), onDoubleClick: setEditing, children: [_jsx(Label, { className: b('label'), icon: _jsx(Icon, { size: 16, data: Eye }), children: i18n('preview') }), _jsx(YfmHtmlBlockPreview, { html: resultHtml, onClick: setEditing, config: config }), _jsxs("div", { className: b('menu'), children: [_jsx(Button, { onClick: toggleMenuOpen, ref: setAnchorElement, size: "s", className: STOP_EVENT_CLASSNAME, children: _jsx(Icon, { data: DotsIcon, className: STOP_EVENT_CLASSNAME }) }), _jsx(Popup, { anchorElement: anchorElement, open: menuOpen, onOpenChange: closeMenu, placement: "bottom-end", children: _jsxs(Menu, { children: [_jsx(Menu.Item, { onClick: () => {
|
|
172
|
+
setEditing();
|
|
171
173
|
closeMenu();
|
|
172
174
|
}, children: i18n('edit') }), _jsx(Menu.Item, { onClick: () => {
|
|
173
175
|
const pos = getPos();
|
package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YfmHtmlBlockView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useRef, useState} from 'react';\n\nimport {getStyles} from '@diplodoc/html-extension';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\nimport {Ellipsis as DotsIcon, Eye} from '@gravity-ui/icons';\nimport {Button, Icon, Label, Menu, Popup} from '@gravity-ui/uikit';\nimport debounce from 'lodash/debounce';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../../../classname';\nimport {TextAreaFixed as TextArea} from '../../../../forms/TextInput';\nimport {i18n} from '../../../../i18n/common';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\nimport {removeNode} from '../../../../utils/remove-node';\nimport {YfmHtmlBlockConsts} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\n\nimport './YfmHtmlBlock.scss';\n\nexport const cnYfmHtmlBlock = cn('yfm-html-block');\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nconst b = cnYfmHtmlBlock;\n\ninterface YfmHtmlBlockViewProps {\n html: string;\n onСlick: () => void;\n config?: IHTMLIFrameElementConfig;\n}\n\nexport function generateID() {\n return Math.random().toString(36).substr(2, 8);\n}\n\nconst DEFAULT_PADDING = 20;\nconst DEFAULT_DELAY = 100;\n\nconst createLinkCLickHandler = (value: Element, document: Document) => (event: Event) => {\n event.preventDefault();\n const targetId = value.getAttribute('href');\n\n if (targetId) {\n const targetElement = document.querySelector(targetId);\n if (targetElement) {\n targetElement.scrollIntoView({behavior: 'smooth'});\n }\n }\n};\n\nconst YfmHtmlBlockPreview: React.FC<YfmHtmlBlockViewProps> = ({html, onСlick, config}) => {\n const ref = useRef<HTMLIFrameElement>(null);\n const styles = useRef<Record<string, string>>({});\n const classNames = useRef<string[]>([]);\n const resizeConfig = useRef<Record<string, number>>({});\n\n const [height, setHeight] = useState('100%');\n\n useEffect(() => {\n setStyles(config?.styles);\n setClassNames(config?.classNames);\n }, [config, ref.current?.contentWindow?.document?.body]);\n\n const handleLoadIFrame = () => {\n const contentWindow = ref.current?.contentWindow;\n\n handleResizeIFrame();\n\n if (contentWindow) {\n const frameDocument = contentWindow.document;\n frameDocument.addEventListener('dblclick', () => {\n onСlick();\n });\n }\n };\n\n const handleResizeIFrame = () => {\n if (ref.current) {\n const contentWindow = ref.current?.contentWindow;\n if (contentWindow) {\n const body = contentWindow.document.body;\n if (body) {\n const height =\n body.scrollHeight +\n (resizeConfig.current?.padding || DEFAULT_PADDING) +\n 'px';\n\n setHeight(height);\n }\n }\n }\n };\n\n const setClassNames = (newClassNames: string[] | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newClassNames) {\n const previousClassNames = classNames.current;\n\n // remove all classes that were in previousClassNames but are not in classNames\n previousClassNames.forEach((className) => {\n if (!newClassNames.includes(className)) {\n body.classList.remove(className);\n }\n });\n\n // add classes that are in classNames\n newClassNames.forEach((className) => {\n if (!body.classList.contains(className)) {\n body.classList.add(className);\n }\n });\n\n classNames.current = newClassNames;\n }\n };\n\n const setStyles = (newStyles: Record<string, string> | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newStyles) {\n const previousStyles = styles.current;\n\n // remove all styles that are in previousStyles but not in styles\n Object.keys(previousStyles).forEach((property) => {\n if (!Object.prototype.hasOwnProperty.call(newStyles, property)) {\n body.style.removeProperty(property);\n }\n });\n\n // sdd or update styles that are in styles\n Object.keys(newStyles).forEach((property) => {\n body.style.setProperty(property, newStyles[property]);\n });\n\n // update current styles to the new styles\n styles.current = newStyles;\n }\n };\n\n // finds all relative links (href^=\"#\") and changes their click behavior\n const createAnchorLinkHandlers = (type: 'add' | 'remove') => () => {\n const document = ref.current?.contentWindow!.document;\n\n if (document) {\n document.querySelectorAll('a[href^=\"#\"]').forEach((value: Element) => {\n const handler = createLinkCLickHandler(value, document);\n if (type === 'add') {\n value.addEventListener('click', handler);\n } else {\n value.removeEventListener('click', handler);\n }\n });\n }\n };\n\n useEffect(() => {\n ref.current?.addEventListener('load', handleLoadIFrame);\n ref.current?.addEventListener('load', createAnchorLinkHandlers('add'));\n return () => {\n ref.current?.removeEventListener('load', handleLoadIFrame);\n ref.current?.removeEventListener('load', createAnchorLinkHandlers('remove'));\n };\n }, [html]);\n\n useEffect(() => {\n if (ref.current) {\n const resizeObserver = new window.ResizeObserver(\n debounce(handleResizeIFrame, DEFAULT_DELAY),\n );\n resizeObserver.observe(ref.current);\n }\n }, [ref.current?.contentWindow?.document?.body]);\n\n return (\n <iframe\n style={{\n height,\n }}\n ref={ref}\n title={generateID()}\n frameBorder={0}\n className={b('content')}\n srcDoc={html}\n />\n );\n};\n\nconst CodeEditMode: React.FC<{\n initialText: string;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel}) => {\n const [text, setText] = useState(initialText || '\\n');\n\n return (\n <div className={b({editing: true})}>\n <div className={b('editor')}>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n\n <div className={b('controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const YfmHtmlBlockView: React.FC<{\n getPos: () => number | undefined;\n node: Node;\n onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;\n options: YfmHtmlBlockOptions;\n view: EditorView;\n}> = ({\n onChange,\n node,\n getPos,\n view,\n options: {useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = ''},\n}) => {\n const [editing, setEditing, unsetEditing, toggleEditing] = useBooleanState(\n Boolean(node.attrs[YfmHtmlBlockConsts.NodeAttrs.newCreated]),\n );\n\n const config = useConfig?.();\n\n const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n const handleClick = () => {\n setEditing();\n };\n\n if (editing) {\n return (\n <CodeEditMode\n initialText={node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n let additional = baseTarget ? `<base target=\"${baseTarget}\">` : '';\n if (styles) {\n const stylesContent =\n typeof styles === 'string'\n ? `<link rel=\"stylesheet\" href=\"${styles}\" />`\n : `<style>${getStyles(styles)}</style>`;\n additional += stylesContent;\n }\n\n const head = `<head>${headContent || additional}</head>`;\n const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;\n const html = `<!DOCTYPE html><html>${head}${body}</html>`;\n\n const resultHtml = sanitize ? sanitize(html) : html;\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <Label className={b('label')} icon={<Icon size={16} data={Eye} />}>\n {i18n('preview')}\n </Label>\n <YfmHtmlBlockPreview html={resultHtml} onСlick={handleClick} config={config} />\n\n <div className={b('menu')}>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size=\"s\"\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n anchorElement={anchorElement}\n open={menuOpen}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n toggleEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"YfmHtmlBlockView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo, useRef, useState} from 'react';\n\nimport {getStyles} from '@diplodoc/html-extension';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\nimport {Ellipsis as DotsIcon, Eye} from '@gravity-ui/icons';\nimport {Button, Icon, Label, Menu, Popup} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from 'src/classname';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {TextAreaFixed as TextArea} from 'src/forms/TextInput';\nimport {i18n} from 'src/i18n/common';\nimport {debounce} from 'src/lodash';\nimport {useBooleanState, useElementState} from 'src/react-utils/hooks';\nimport {useSharedEditingState} from 'src/react-utils/useSharedEditingState';\nimport {removeNode} from 'src/utils/remove-node';\n\nimport {YfmHtmlBlockConsts} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\nimport type {YfmHtmlBlockEntitySharedState} from '../types';\n\nimport './YfmHtmlBlock.scss';\n\nexport const cnYfmHtmlBlock = cn('yfm-html-block');\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nconst b = cnYfmHtmlBlock;\n\ninterface YfmHtmlBlockViewProps {\n html: string;\n onClick: () => void;\n config?: IHTMLIFrameElementConfig;\n}\n\nexport function generateID() {\n return Math.random().toString(36).substr(2, 8);\n}\n\nconst DEFAULT_PADDING = 20;\nconst DEFAULT_DELAY = 100;\n\nconst createLinkCLickHandler = (value: Element, document: Document) => (event: Event) => {\n event.preventDefault();\n const targetId = value.getAttribute('href');\n\n if (targetId) {\n const targetElement = document.querySelector(targetId);\n if (targetElement) {\n targetElement.scrollIntoView({behavior: 'smooth'});\n }\n }\n};\n\nconst YfmHtmlBlockPreview: React.FC<YfmHtmlBlockViewProps> = ({html, onClick, config}) => {\n const ref = useRef<HTMLIFrameElement>(null);\n const styles = useRef<Record<string, string>>({});\n const classNames = useRef<string[]>([]);\n const resizeConfig = useRef<Record<string, number>>({});\n\n const [height, setHeight] = useState('100%');\n\n useEffect(() => {\n setStyles(config?.styles);\n setClassNames(config?.classNames);\n }, [config, ref.current?.contentWindow?.document?.body]);\n\n const handleLoadIFrame = () => {\n const contentWindow = ref.current?.contentWindow;\n\n handleResizeIFrame();\n\n if (contentWindow) {\n const frameDocument = contentWindow.document;\n frameDocument.addEventListener('dblclick', () => {\n onClick();\n });\n }\n };\n\n const handleResizeIFrame = () => {\n if (ref.current) {\n const contentWindow = ref.current?.contentWindow;\n if (contentWindow) {\n const body = contentWindow.document.body;\n if (body) {\n const height =\n body.scrollHeight +\n (resizeConfig.current?.padding || DEFAULT_PADDING) +\n 'px';\n\n setHeight(height);\n }\n }\n }\n };\n\n const setClassNames = (newClassNames: string[] | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newClassNames) {\n const previousClassNames = classNames.current;\n\n // remove all classes that were in previousClassNames but are not in classNames\n previousClassNames.forEach((className) => {\n if (!newClassNames.includes(className)) {\n body.classList.remove(className);\n }\n });\n\n // add classes that are in classNames\n newClassNames.forEach((className) => {\n if (!body.classList.contains(className)) {\n body.classList.add(className);\n }\n });\n\n classNames.current = newClassNames;\n }\n };\n\n const setStyles = (newStyles: Record<string, string> | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newStyles) {\n const previousStyles = styles.current;\n\n // remove all styles that are in previousStyles but not in styles\n Object.keys(previousStyles).forEach((property) => {\n if (!Object.prototype.hasOwnProperty.call(newStyles, property)) {\n body.style.removeProperty(property);\n }\n });\n\n // sdd or update styles that are in styles\n Object.keys(newStyles).forEach((property) => {\n body.style.setProperty(property, newStyles[property]);\n });\n\n // update current styles to the new styles\n styles.current = newStyles;\n }\n };\n\n // finds all relative links (href^=\"#\") and changes their click behavior\n const createAnchorLinkHandlers = (type: 'add' | 'remove') => () => {\n const document = ref.current?.contentWindow!.document;\n\n if (document) {\n document.querySelectorAll('a[href^=\"#\"]').forEach((value: Element) => {\n const handler = createLinkCLickHandler(value, document);\n if (type === 'add') {\n value.addEventListener('click', handler);\n } else {\n value.removeEventListener('click', handler);\n }\n });\n }\n };\n\n useEffect(() => {\n ref.current?.addEventListener('load', handleLoadIFrame);\n ref.current?.addEventListener('load', createAnchorLinkHandlers('add'));\n return () => {\n ref.current?.removeEventListener('load', handleLoadIFrame);\n ref.current?.removeEventListener('load', createAnchorLinkHandlers('remove'));\n };\n }, [html]);\n\n useEffect(() => {\n if (ref.current) {\n const resizeObserver = new window.ResizeObserver(\n debounce(handleResizeIFrame, DEFAULT_DELAY),\n );\n resizeObserver.observe(ref.current);\n }\n }, [ref.current?.contentWindow?.document?.body]);\n\n return (\n <iframe\n style={{\n height,\n }}\n ref={ref}\n title={generateID()}\n frameBorder={0}\n className={b('content')}\n srcDoc={html}\n />\n );\n};\n\nconst CodeEditMode: React.FC<{\n initialText: string;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel}) => {\n const [text, setText] = useState(initialText || '\\n');\n\n return (\n <div className={b({editing: true})}>\n <div className={b('editor')}>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n\n <div className={b('controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const YfmHtmlBlockView: React.FC<{\n getPos: () => number | undefined;\n node: Node;\n onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;\n options: YfmHtmlBlockOptions;\n view: EditorView;\n}> = ({\n onChange,\n node,\n getPos,\n view,\n options: {useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = ''},\n}) => {\n const entityId: string = node.attrs[YfmHtmlBlockConsts.NodeAttrs.EntityId];\n const entityKey = useMemo(\n () => SharedStateKey.define<YfmHtmlBlockEntitySharedState>({name: entityId}),\n [entityId],\n );\n\n const config = useConfig?.();\n\n const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);\n const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n if (editing) {\n return (\n <CodeEditMode\n initialText={node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n let additional = baseTarget ? `<base target=\"${baseTarget}\">` : '';\n if (styles) {\n const stylesContent =\n typeof styles === 'string'\n ? `<link rel=\"stylesheet\" href=\"${styles}\" />`\n : `<style>${getStyles(styles)}</style>`;\n additional += stylesContent;\n }\n\n const head = `<head>${headContent || additional}</head>`;\n const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;\n const html = `<!DOCTYPE html><html>${head}${body}</html>`;\n\n const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;\n\n const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <Label className={b('label')} icon={<Icon size={16} data={Eye} />}>\n {i18n('preview')}\n </Label>\n <YfmHtmlBlockPreview html={resultHtml} onClick={setEditing} config={config} />\n\n <div className={b('menu')}>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size=\"s\"\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n anchorElement={anchorElement}\n open={menuOpen}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n setEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export declare enum YfmHtmlBlockAttrs {
|
|
2
|
+
EntityId = "data-entity-id",
|
|
2
3
|
class = "class",
|
|
3
4
|
frameborder = "frameborder",
|
|
5
|
+
/** @deprecated This is no longer used. Removed in next major version */
|
|
4
6
|
newCreated = "newCreated",
|
|
5
7
|
srcdoc = "srcdoc",
|
|
6
8
|
style = "style"
|
|
@@ -13,3 +15,4 @@ export declare const YfmHtmlBlockConsts: {
|
|
|
13
15
|
readonly NodeAttrs: typeof YfmHtmlBlockAttrs;
|
|
14
16
|
readonly nodeType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
15
17
|
};
|
|
18
|
+
export declare const defaultYfmHtmlBlockEntityId: string;
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import { entityIdAttr } from "../../../../utils/entity-id.js";
|
|
1
2
|
import { nodeTypeFactory } from "../../../../utils/schema.js";
|
|
2
3
|
export var YfmHtmlBlockAttrs;
|
|
3
4
|
(function (YfmHtmlBlockAttrs) {
|
|
5
|
+
// @ts-expect-error error TS18055
|
|
6
|
+
YfmHtmlBlockAttrs["EntityId"] = "data-entity-id";
|
|
4
7
|
YfmHtmlBlockAttrs["class"] = "class";
|
|
5
8
|
YfmHtmlBlockAttrs["frameborder"] = "frameborder";
|
|
9
|
+
// MAJOR: remove before next major
|
|
10
|
+
/** @deprecated This is no longer used. Removed in next major version */
|
|
6
11
|
YfmHtmlBlockAttrs["newCreated"] = "newCreated";
|
|
7
12
|
YfmHtmlBlockAttrs["srcdoc"] = "srcdoc";
|
|
8
13
|
YfmHtmlBlockAttrs["style"] = "style";
|
|
@@ -15,4 +20,5 @@ export const YfmHtmlBlockConsts = {
|
|
|
15
20
|
NodeAttrs: YfmHtmlBlockAttrs,
|
|
16
21
|
nodeType: yfmHtmlBlockNodeType,
|
|
17
22
|
};
|
|
23
|
+
export const defaultYfmHtmlBlockEntityId = yfmHtmlBlockNodeName + '#0';
|
|
18
24
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,uCAA4B;AACjD,OAAO,EAAC,eAAe,EAAC,oCAAyB;AAEjD,MAAM,CAAN,IAAY,iBAUX;AAVD,WAAY,iBAAiB;IACzB,iCAAiC;IACjC,gDAAuB,CAAA;IACvB,oCAAe,CAAA;IACf,gDAA2B,CAAA;IAC3B,kCAAkC;IAClC,wEAAwE;IACxE,8CAAyB,CAAA;IACzB,sCAAiB,CAAA;IACjB,oCAAe,CAAA;AACnB,CAAC,EAVW,iBAAiB,KAAjB,iBAAiB,QAU5B;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC,oBAAoB,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEvD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAC9B,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,iBAAiB;IAC5B,QAAQ,EAAE,oBAAoB;CACxB,CAAC;AAEX,MAAM,CAAC,MAAM,2BAA2B,GAAG,oBAAoB,GAAG,IAAI,CAAC","sourcesContent":["import {entityIdAttr} from 'src/utils/entity-id';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport enum YfmHtmlBlockAttrs {\n // @ts-expect-error error TS18055\n EntityId = entityIdAttr,\n class = 'class',\n frameborder = 'frameborder',\n // MAJOR: remove before next major\n /** @deprecated This is no longer used. Removed in next major version */\n newCreated = 'newCreated',\n srcdoc = 'srcdoc',\n style = 'style',\n}\n\nexport const yfmHtmlBlockNodeName = 'yfm_html_block';\nexport const yfmHtmlBlockNodeType = nodeTypeFactory(yfmHtmlBlockNodeName);\n\nexport const YfmHtmlBlockAction = 'createYfmHtmlBlock';\n\nexport const YfmHtmlBlockConsts = {\n NodeName: yfmHtmlBlockNodeName,\n NodeAttrs: YfmHtmlBlockAttrs,\n nodeType: yfmHtmlBlockNodeType,\n} as const;\n\nexport const defaultYfmHtmlBlockEntityId = yfmHtmlBlockNodeName + '#0';\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type PluginOptions } from '@diplodoc/html-extension';
|
|
2
2
|
import type { ExtensionNodeSpec } from "../../../../core/index.js";
|
|
3
|
-
export { yfmHtmlBlockNodeName } from "./const.js";
|
|
3
|
+
export { yfmHtmlBlockNodeName, YfmHtmlBlockConsts } from "./const.js";
|
|
4
4
|
export interface YfmHtmlBlockSpecsOptions extends Omit<PluginOptions, 'runtimeJsPath' | 'containerClasses' | 'bundle' | 'embeddingMode'> {
|
|
5
5
|
nodeView?: ExtensionNodeSpec['view'];
|
|
6
6
|
}
|
|
7
|
-
export declare const YfmHtmlBlockSpecs: import("../../../../index.js").ExtensionWithOptions<YfmHtmlBlockSpecsOptions> & {
|
|
7
|
+
export declare const YfmHtmlBlockSpecs: import("../../../../core/index.js").ExtensionWithOptions<YfmHtmlBlockSpecsOptions> & {
|
|
8
8
|
readonly NodeName: "yfm_html_block";
|
|
9
9
|
readonly NodeAttrs: typeof import("./const.js").YfmHtmlBlockAttrs;
|
|
10
10
|
readonly nodeType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { transform } from '@diplodoc/html-extension';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { generateEntityId } from "../../../../utils/entity-id.js";
|
|
3
|
+
import { YfmHtmlBlockConsts, defaultYfmHtmlBlockEntityId } from "./const.js";
|
|
4
|
+
export { yfmHtmlBlockNodeName, YfmHtmlBlockConsts } from "./const.js";
|
|
4
5
|
const YfmHtmlBlockSpecsExtension = (builder, { nodeView, ...options }) => {
|
|
5
6
|
builder
|
|
6
7
|
.configureMd((md) => md.use(transform({
|
|
@@ -14,7 +15,10 @@ const YfmHtmlBlockSpecsExtension = (builder, { nodeView, ...options }) => {
|
|
|
14
15
|
name: YfmHtmlBlockConsts.NodeName,
|
|
15
16
|
type: 'node',
|
|
16
17
|
noCloseToken: true,
|
|
17
|
-
getAttrs: ({ content }) => ({
|
|
18
|
+
getAttrs: ({ content }) => ({
|
|
19
|
+
[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: content,
|
|
20
|
+
[YfmHtmlBlockConsts.NodeAttrs.EntityId]: generateEntityId(YfmHtmlBlockConsts.NodeName),
|
|
21
|
+
}),
|
|
18
22
|
},
|
|
19
23
|
},
|
|
20
24
|
spec: {
|
|
@@ -25,6 +29,7 @@ const YfmHtmlBlockSpecsExtension = (builder, { nodeView, ...options }) => {
|
|
|
25
29
|
[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: { default: '' },
|
|
26
30
|
[YfmHtmlBlockConsts.NodeAttrs.style]: { default: null },
|
|
27
31
|
[YfmHtmlBlockConsts.NodeAttrs.newCreated]: { default: null },
|
|
32
|
+
[YfmHtmlBlockConsts.NodeAttrs.EntityId]: { default: defaultYfmHtmlBlockEntityId },
|
|
28
33
|
},
|
|
29
34
|
toDOM: (node) => ['iframe', node.attrs],
|
|
30
35
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,SAAS,EAAC,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAC,gBAAgB,EAAC,uCAA4B;AAErD,OAAO,EAAC,kBAAkB,EAAE,2BAA2B,EAAC,mBAAgB;AAExE,OAAO,EAAC,oBAAoB,EAAE,kBAAkB,EAAC,mBAAgB;AAOjE,MAAM,0BAA0B,GAA4C,CACxE,OAAO,EACP,EAAC,QAAQ,EAAE,GAAG,OAAO,EAAC,EACxB,EAAE;IACA,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE,CAAC,GAAG,CACF,SAAS,CAAC;QACN,MAAM,EAAE,KAAK;QACb,aAAa,EAAE,QAAQ;QACvB,GAAG,OAAO;KACb,CAAC,EACF,EAAE,CACL,CACJ;SACA,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,kBAAkB,CAAC,QAAQ;gBACjC,IAAI,EAAE,MAAM;gBACZ,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC;oBACtB,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO;oBAC9C,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CACrD,kBAAkB,CAAC,QAAQ,CAC9B;iBACJ,CAAC;aACL;SACJ;QACD,IAAI,EAAE;YACF,KAAK,EAAE,OAAO;YACd,KAAK,EAAE;gBACH,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,UAAU,EAAC;gBAC3D,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACzD,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACpD,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;gBACrD,CAAC,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;gBAC1D,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAC,OAAO,EAAE,2BAA2B,EAAC;aAClF;YACD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;SAC1C;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACxB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7D,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC","sourcesContent":["import {type PluginOptions, transform} from '@diplodoc/html-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {YfmHtmlBlockConsts, defaultYfmHtmlBlockEntityId} from './const';\n\nexport {yfmHtmlBlockNodeName, YfmHtmlBlockConsts} from './const';\n\nexport interface YfmHtmlBlockSpecsOptions\n extends Omit<PluginOptions, 'runtimeJsPath' | 'containerClasses' | 'bundle' | 'embeddingMode'> {\n nodeView?: ExtensionNodeSpec['view'];\n}\n\nconst YfmHtmlBlockSpecsExtension: ExtensionAuto<YfmHtmlBlockSpecsOptions> = (\n builder,\n {nodeView, ...options},\n) => {\n builder\n .configureMd((md) =>\n md.use(\n transform({\n bundle: false,\n embeddingMode: 'srcdoc',\n ...options,\n }),\n {},\n ),\n )\n .addNode(YfmHtmlBlockConsts.NodeName, () => ({\n fromMd: {\n tokenSpec: {\n name: YfmHtmlBlockConsts.NodeName,\n type: 'node',\n noCloseToken: true,\n getAttrs: ({content}) => ({\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: content,\n [YfmHtmlBlockConsts.NodeAttrs.EntityId]: generateEntityId(\n YfmHtmlBlockConsts.NodeName,\n ),\n }),\n },\n },\n spec: {\n group: 'block',\n attrs: {\n [YfmHtmlBlockConsts.NodeAttrs.class]: {default: 'yfm-html'},\n [YfmHtmlBlockConsts.NodeAttrs.frameborder]: {default: ''},\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: {default: ''},\n [YfmHtmlBlockConsts.NodeAttrs.style]: {default: null},\n [YfmHtmlBlockConsts.NodeAttrs.newCreated]: {default: null},\n [YfmHtmlBlockConsts.NodeAttrs.EntityId]: {default: defaultYfmHtmlBlockEntityId},\n },\n toDOM: (node) => ['iframe', node.attrs],\n },\n toMd: (state, node) => {\n state.write('::: html');\n state.write('\\n');\n state.write(node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]);\n state.ensureNewLine();\n state.write(':::');\n state.closeBlock(node);\n },\n view: nodeView,\n }));\n};\n\nexport const YfmHtmlBlockSpecs = Object.assign(YfmHtmlBlockSpecsExtension, YfmHtmlBlockConsts);\n"]}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
+
import { SharedStateKey } from "../../behavior/SharedState/index.js";
|
|
2
|
+
import { generateEntityId } from "../../../utils/entity-id.js";
|
|
1
3
|
import { YfmHtmlBlockConsts, yfmHtmlBlockNodeType } from "./YfmHtmlBlockSpecs/const.js";
|
|
2
4
|
export const addYfmHtmlBlock = {
|
|
3
5
|
isEnable(state) {
|
|
4
6
|
return state.selection.empty;
|
|
5
7
|
},
|
|
6
8
|
run(state, dispatch, _view) {
|
|
7
|
-
|
|
9
|
+
const entityId = generateEntityId(YfmHtmlBlockConsts.NodeName);
|
|
10
|
+
const sharedKey = SharedStateKey.define({ name: entityId });
|
|
11
|
+
const tr = state.tr.insert(state.selection.from, yfmHtmlBlockNodeType(state.schema).create({
|
|
8
12
|
[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: '\n',
|
|
9
13
|
[YfmHtmlBlockConsts.NodeAttrs.newCreated]: true,
|
|
10
|
-
|
|
14
|
+
[YfmHtmlBlockConsts.NodeAttrs.EntityId]: entityId,
|
|
15
|
+
}));
|
|
16
|
+
sharedKey.appendTransaction.set(tr, { editing: true });
|
|
17
|
+
dispatch(tr);
|
|
11
18
|
},
|
|
12
19
|
};
|
|
13
20
|
//# sourceMappingURL=actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/actions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/actions.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,cAAc,EAAC,4CAA4C;AACnE,OAAO,EAAC,gBAAgB,EAAC,oCAA4B;AAErD,OAAO,EAAC,kBAAkB,EAAE,oBAAoB,EAAC,qCAAkC;AAGnF,MAAM,CAAC,MAAM,eAAe,GAAe;IACvC,QAAQ,CAAC,KAAK;QACV,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK;QACtB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAgC,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;QAEzF,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CACtB,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YACtC,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI;YAC3C,CAAC,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;YAC/C,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACpD,CAAC,CACL,CAAC;QAEF,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;QAErD,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;CACJ,CAAC","sourcesContent":["import type {ActionSpec} from '#core';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {YfmHtmlBlockConsts, yfmHtmlBlockNodeType} from './YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockEntitySharedState} from './types';\n\nexport const addYfmHtmlBlock: ActionSpec = {\n isEnable(state) {\n return state.selection.empty;\n },\n run(state, dispatch, _view) {\n const entityId = generateEntityId(YfmHtmlBlockConsts.NodeName);\n const sharedKey = SharedStateKey.define<YfmHtmlBlockEntitySharedState>({name: entityId});\n\n const tr = state.tr.insert(\n state.selection.from,\n yfmHtmlBlockNodeType(state.schema).create({\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: '\\n',\n [YfmHtmlBlockConsts.NodeAttrs.newCreated]: true,\n [YfmHtmlBlockConsts.NodeAttrs.EntityId]: entityId,\n }),\n );\n\n sharedKey.appendTransaction.set(tr, {editing: true});\n\n dispatch(tr);\n },\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/types.ts"],"names":[],"mappings":"","sourcesContent":["export type YfmHtmlBlockEntitySharedState = {\n editing: boolean;\n};\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ExtensionAuto, ExtensionDeps } from "../../../core/index.js";
|
|
2
2
|
import type { AutocompleteItem } from "./types.js";
|
|
3
3
|
export { openAutocomplete, closeAutocomplete } from 'prosemirror-autocomplete';
|
|
4
|
+
export { getAutocompleteState } from "./utils.js";
|
|
4
5
|
export declare const AutocompleteDecoClassName = "autocomplete";
|
|
5
6
|
export type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;
|
|
6
7
|
export * from "./types.js";
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import autocomplete from 'prosemirror-autocomplete';
|
|
1
|
+
import { autocomplete } from 'prosemirror-autocomplete';
|
|
2
2
|
import { Plugin } from 'prosemirror-state';
|
|
3
3
|
import { isFunction } from "../../../lodash.js";
|
|
4
4
|
import { MainHandler } from "./handler.js";
|
|
5
5
|
export { openAutocomplete, closeAutocomplete } from 'prosemirror-autocomplete';
|
|
6
|
+
export { getAutocompleteState } from "./utils.js";
|
|
6
7
|
export const AutocompleteDecoClassName = 'autocomplete';
|
|
7
8
|
export * from "./types.js";
|
|
8
9
|
/**
|