@gravity-ui/markdown-editor 15.15.0 → 15.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/bundle/config/dynamicModifiers.js +1 -1
- package/build/cjs/bundle/config/dynamicModifiers.js.map +1 -1
- package/build/cjs/bundle/toolbar/custom/ToolbarFilePopup.d.ts +1 -1
- package/build/cjs/bundle/toolbar/custom/ToolbarFilePopup.js +2 -2
- package/build/cjs/bundle/toolbar/custom/ToolbarFilePopup.js.map +1 -1
- package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.d.ts +1 -1
- package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.js +2 -2
- package/build/cjs/bundle/toolbar/custom/ToolbarImagePopup.js.map +1 -1
- package/build/cjs/core/SchemaDynamicModifier.d.ts +29 -0
- package/build/cjs/core/SchemaDynamicModifier.js +17 -1
- package/build/cjs/core/SchemaDynamicModifier.js.map +1 -1
- package/build/cjs/core/markdown/MarkdownParser.d.ts +69 -1
- package/build/cjs/core/markdown/MarkdownParser.js +60 -9
- package/build/cjs/core/markdown/MarkdownParser.js.map +1 -1
- package/build/cjs/core/markdown/MarkdownSerializerDynamicModifier.d.ts +40 -1
- package/build/cjs/core/markdown/MarkdownSerializerDynamicModifier.js +0 -1
- package/build/cjs/core/markdown/MarkdownSerializerDynamicModifier.js.map +1 -1
- package/build/cjs/core/types/dynamicModifiers.d.ts +28 -1
- package/build/cjs/core/types/dynamicModifiers.js.map +1 -1
- package/build/cjs/core/types/parser.d.ts +2 -0
- package/build/cjs/core/types/parser.js.map +1 -1
- package/build/cjs/forms/FileForm.d.ts +1 -0
- package/build/cjs/forms/FileForm.js +2 -2
- package/build/cjs/forms/FileForm.js.map +1 -1
- package/build/cjs/forms/ImageForm.d.ts +1 -0
- package/build/cjs/forms/ImageForm.js +2 -2
- package/build/cjs/forms/ImageForm.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/bundle/config/dynamicModifiers.js +1 -1
- package/build/esm/bundle/config/dynamicModifiers.js.map +1 -1
- package/build/esm/bundle/toolbar/custom/ToolbarFilePopup.d.ts +1 -1
- package/build/esm/bundle/toolbar/custom/ToolbarFilePopup.js +2 -2
- package/build/esm/bundle/toolbar/custom/ToolbarFilePopup.js.map +1 -1
- package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.d.ts +1 -1
- package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.js +2 -2
- package/build/esm/bundle/toolbar/custom/ToolbarImagePopup.js.map +1 -1
- package/build/esm/core/SchemaDynamicModifier.d.ts +29 -0
- package/build/esm/core/SchemaDynamicModifier.js +17 -1
- package/build/esm/core/SchemaDynamicModifier.js.map +1 -1
- package/build/esm/core/markdown/MarkdownParser.d.ts +69 -1
- package/build/esm/core/markdown/MarkdownParser.js +60 -9
- package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
- package/build/esm/core/markdown/MarkdownSerializerDynamicModifier.d.ts +40 -1
- package/build/esm/core/markdown/MarkdownSerializerDynamicModifier.js +0 -1
- package/build/esm/core/markdown/MarkdownSerializerDynamicModifier.js.map +1 -1
- package/build/esm/core/types/dynamicModifiers.d.ts +28 -1
- package/build/esm/core/types/dynamicModifiers.js.map +1 -1
- package/build/esm/core/types/parser.d.ts +2 -0
- package/build/esm/core/types/parser.js.map +1 -1
- package/build/esm/forms/FileForm.d.ts +1 -0
- package/build/esm/forms/FileForm.js +2 -2
- package/build/esm/forms/FileForm.js.map +1 -1
- package/build/esm/forms/ImageForm.d.ts +1 -0
- package/build/esm/forms/ImageForm.js +2 -2
- package/build/esm/forms/ImageForm.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
import type { ProcessNode, ProcessNodeAttrs, ProcessToken } from "../markdown/MarkdownParser.js";
|
|
2
|
+
import type { SerializerProcessNode } from "../markdown/MarkdownSerializerDynamicModifier.js";
|
|
3
|
+
export type DynamicModifiers = ParserTokenModifier | ParserNodeAttrsModifier | ParserNodeModifier | SerializerNodeModifier | SchemaNodeSpecModifier;
|
|
4
|
+
export type ParserTokenModifier = {
|
|
5
|
+
type: 'parserToken';
|
|
6
|
+
tokenName: string;
|
|
7
|
+
process: ProcessToken;
|
|
8
|
+
};
|
|
9
|
+
export type ParserNodeAttrsModifier = {
|
|
10
|
+
type: 'parserNodeAttrs';
|
|
11
|
+
tokenName: string;
|
|
12
|
+
process: ProcessNodeAttrs;
|
|
13
|
+
};
|
|
14
|
+
export type ParserNodeModifier = {
|
|
15
|
+
type: 'parserNode';
|
|
16
|
+
nodeName: string;
|
|
17
|
+
process: ProcessNode;
|
|
18
|
+
};
|
|
19
|
+
export type SerializerNodeModifier = {
|
|
20
|
+
type: 'serializerNode';
|
|
21
|
+
nodeName: string;
|
|
22
|
+
process: SerializerProcessNode;
|
|
23
|
+
};
|
|
24
|
+
export type SchemaNodeSpecModifier = {
|
|
25
|
+
type: 'schemaNodeSpec';
|
|
26
|
+
nodeName: string;
|
|
27
|
+
allowedAttrs: string[];
|
|
28
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["core/types/dynamicModifiers.ts"],"names":[],"mappings":"","sourcesContent":["import type {ProcessNode, ProcessNodeAttrs, ProcessToken} from '../markdown/MarkdownParser';\nimport type {SerializerProcessNode} from '../markdown/MarkdownSerializerDynamicModifier';\n\
|
|
1
|
+
{"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["core/types/dynamicModifiers.ts"],"names":[],"mappings":"","sourcesContent":["import type {ProcessNode, ProcessNodeAttrs, ProcessToken} from '../markdown/MarkdownParser';\nimport type {SerializerProcessNode} from '../markdown/MarkdownSerializerDynamicModifier';\n\nexport type DynamicModifiers =\n | ParserTokenModifier\n | ParserNodeAttrsModifier\n | ParserNodeModifier\n | SerializerNodeModifier\n | SchemaNodeSpecModifier;\n\nexport type ParserTokenModifier = {\n type: 'parserToken';\n tokenName: string;\n process: ProcessToken;\n};\n\nexport type ParserNodeAttrsModifier = {\n type: 'parserNodeAttrs'; // TODO: fix name\n tokenName: string;\n process: ProcessNodeAttrs;\n};\n\nexport type ParserNodeModifier = {\n type: 'parserNode';\n nodeName: string;\n process: ProcessNode;\n};\n\nexport type SerializerNodeModifier = {\n type: 'serializerNode';\n nodeName: string;\n process: SerializerProcessNode;\n};\n\nexport type SchemaNodeSpecModifier = {\n type: 'schemaNodeSpec';\n nodeName: string;\n allowedAttrs: string[];\n};\n"]}
|
|
@@ -4,6 +4,8 @@ import type { Node } from 'prosemirror-model';
|
|
|
4
4
|
export interface Parser {
|
|
5
5
|
/** Parse raw markup to prosemirror's root node */
|
|
6
6
|
parse(markup: string): Node;
|
|
7
|
+
/** Parse markdown-it tokens stream to prosemirror's root node */
|
|
8
|
+
parse(tokens: Token[]): Node;
|
|
7
9
|
validateLink(url: string): boolean;
|
|
8
10
|
normalizeLink(url: string): string;
|
|
9
11
|
normalizeLinkText(url: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"../../../../src","sources":["core/types/parser.ts"],"names":[],"mappings":"","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type Token from 'markdown-it/lib/token';\nimport type {Node} from 'prosemirror-model';\n\nexport interface Parser {\n /** Parse raw markup to prosemirror's root node */\n parse(markup: string): Node;\n validateLink(url: string): boolean;\n normalizeLink(url: string): string;\n normalizeLinkText(url: string): string;\n matchLinks(text: string): Readonly<Match>[] | null;\n}\n\nexport interface ParserToken {\n name: string;\n type: 'node' | 'block' | 'mark';\n attrs?: {[name: string]: unknown};\n getAttrs?: (token: Token, tokens: Token[], index: number) => NonNullable<ParserToken['attrs']>;\n // It means that there is no closing token\n // That is, the content lies in the content field of the token, and not between the opening and closing tokens.\n noCloseToken?: boolean;\n ignore?: boolean;\n code?: boolean;\n /** only for tokens with type=block */\n prepareContent?: (content: string) => string;\n /**\n * only for tokens with type=block and noCloseToken=true\n * @default 'content'\n */\n contentField?: 'content' | 'children';\n}\n"]}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"../../../../src","sources":["core/types/parser.ts"],"names":[],"mappings":"","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type Token from 'markdown-it/lib/token';\nimport type {Node} from 'prosemirror-model';\n\nexport interface Parser {\n /** Parse raw markup to prosemirror's root node */\n parse(markup: string): Node;\n /** Parse markdown-it tokens stream to prosemirror's root node */\n parse(tokens: Token[]): Node;\n validateLink(url: string): boolean;\n normalizeLink(url: string): string;\n normalizeLinkText(url: string): string;\n matchLinks(text: string): Readonly<Match>[] | null;\n}\n\nexport interface ParserToken {\n name: string;\n type: 'node' | 'block' | 'mark';\n attrs?: {[name: string]: unknown};\n getAttrs?: (token: Token, tokens: Token[], index: number) => NonNullable<ParserToken['attrs']>;\n // It means that there is no closing token\n // That is, the content lies in the content field of the token, and not between the opening and closing tokens.\n noCloseToken?: boolean;\n ignore?: boolean;\n code?: boolean;\n /** only for tokens with type=block */\n prepareContent?: (content: string) => string;\n /**\n * only for tokens with type=block and noCloseToken=true\n * @default 'content'\n */\n contentField?: 'content' | 'children';\n}\n"]}
|
|
@@ -19,7 +19,7 @@ var TabId;
|
|
|
19
19
|
TabId["Attach"] = "attach";
|
|
20
20
|
TabId["Link"] = "link";
|
|
21
21
|
})(TabId || (TabId = {}));
|
|
22
|
-
const FileForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, }) => {
|
|
22
|
+
const FileForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, uploadHint, }) => {
|
|
23
23
|
const [tabId, setTabId] = (0, react_1.useState)(() => (0, lodash_1.isFunction)(onAttach) ? TabId.Attach : TabId.Link);
|
|
24
24
|
const [src, setSrc] = (0, react_1.useState)('');
|
|
25
25
|
const [name, setName] = (0, react_1.useState)('');
|
|
@@ -39,7 +39,7 @@ const FileForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading,
|
|
|
39
39
|
return ((0, jsx_runtime_1.jsxs)(base_1.default.Form, { className: b(null, [className]), children: [shouldRenderTabs && ((0, jsx_runtime_1.jsx)(legacy_1.Tabs, { activeTab: tabId, onSelectTab: setTabId, items: [
|
|
40
40
|
{ id: TabId.Attach, title: (0, forms_1.i18n)('common_tab_attach') },
|
|
41
41
|
{ id: TabId.Link, title: (0, forms_1.i18n)('common_tab_link') },
|
|
42
|
-
] })), tabId === TabId.Attach && onAttach && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Layout, { children: (0, forms_1.i18n)('file_upload_help') }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, children: (0, jsx_runtime_1.jsx)(components_1.ButtonAttach, { multiple: true, buttonProps: {
|
|
42
|
+
] })), tabId === TabId.Attach && onAttach && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Layout, { children: uploadHint ?? (0, forms_1.i18n)('file_upload_help') }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, children: (0, jsx_runtime_1.jsx)(components_1.ButtonAttach, { multiple: true, buttonProps: {
|
|
43
43
|
size: 's',
|
|
44
44
|
view: 'action',
|
|
45
45
|
loading,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileForm.js","sourceRoot":"../../../src","sources":["forms/FileForm.tsx"],"names":[],"mappings":";;;;;AAAA,iCAAgD;AAEhD,6CAAiE;AACjE,qDAA8C;AAE9C,+CAAqD;AACrD,kDAAmC;AACnC,yCAAqC;AACrC,mDAAkD;AAElD,8CAA2C;AAC3C,mEAA0B;AAC1B,sDAA0C;AAE1C,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,WAAW,CAAC,CAAC;AAE1B,IAAW,KAGV;AAHD,WAAW,KAAK;IACZ,0BAAiB,CAAA;IACjB,sBAAa,CAAA;AACjB,CAAC,EAHU,KAAK,KAAL,KAAK,QAGf;
|
|
1
|
+
{"version":3,"file":"FileForm.js","sourceRoot":"../../../src","sources":["forms/FileForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useLayoutEffect, useState} from 'react';\n\nimport {TextInput, type TextInputProps} from '@gravity-ui/uikit';\nimport {Tabs} from '@gravity-ui/uikit/legacy';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/forms';\nimport {isFunction} from '../lodash';\nimport {enterKeyHandler} from '../utils/handlers';\n\nimport {TextInputFixed} from './TextInput';\nimport Form from './base';\nimport {ButtonAttach} from './components';\n\nconst b = cn('file-form');\n\nconst enum TabId {\n Attach = 'attach',\n Link = 'link',\n}\n\nexport type FileFormSubmitParams = {\n src: string;\n name: string;\n};\n\nexport type FileFormProps = ClassNameProps & {\n autoFocus?: boolean;\n onSubmit(params: FileFormSubmitParams): void;\n onCancel(): void;\n onAttach?: (files: File[]) => void;\n loading?: boolean;\n uploadHint?: string;\n};\n\nexport const FileForm: React.FC<FileFormProps> = ({\n className,\n autoFocus,\n onCancel,\n onSubmit,\n onAttach,\n loading,\n uploadHint,\n}) => {\n const [tabId, setTabId] = useState<string>(() =>\n isFunction(onAttach) ? TabId.Attach : TabId.Link,\n );\n const [src, setSrc] = useState('');\n const [name, setName] = useState('');\n\n const shouldRenderTabs = isFunction(onAttach);\n useLayoutEffect(() => {\n if (!shouldRenderTabs && tabId === TabId.Attach) {\n setTabId(TabId.Link);\n }\n }, [shouldRenderTabs, tabId]);\n\n const handleSubmit = () => {\n onSubmit({\n src: src.trim(),\n name: name.trim(),\n });\n };\n const inputEnterKeyHandler: TextInputProps['onKeyDown'] = enterKeyHandler(handleSubmit);\n\n return (\n <Form.Form className={b(null, [className])}>\n {shouldRenderTabs && (\n <Tabs\n activeTab={tabId}\n onSelectTab={setTabId}\n items={[\n {id: TabId.Attach, title: i18n('common_tab_attach')},\n {id: TabId.Link, title: i18n('common_tab_link')},\n ]}\n />\n )}\n {tabId === TabId.Attach && onAttach && (\n <>\n <Form.Layout>{uploadHint ?? i18n('file_upload_help')}</Form.Layout>\n <Form.Footer onCancel={onCancel}>\n <ButtonAttach\n multiple\n buttonProps={{\n size: 's',\n view: 'action',\n loading,\n }}\n onUpdate={onAttach}\n >\n {i18n('common_action_upload')}\n </ButtonAttach>\n </Form.Footer>\n </>\n )}\n {tabId === TabId.Link && (\n <>\n <Form.Layout>\n <Form.Row\n label={i18n('common_link')}\n help={i18n('file_link_help')}\n control={\n <TextInputFixed\n size=\"s\"\n view=\"normal\"\n value={src}\n onUpdate={setSrc}\n placeholder=\"https://\"\n autoFocus={autoFocus}\n className={b('input', {type: 'link'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('file_name')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={name}\n onUpdate={setName}\n className={b('input', {type: 'name'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n </Form.Layout>\n <Form.Footer onCancel={onCancel} onSubmit={handleSubmit} />\n </>\n )}\n </Form.Form>\n );\n};\n"]}
|
|
@@ -20,7 +20,7 @@ var ImageTabId;
|
|
|
20
20
|
ImageTabId["Attach"] = "attach";
|
|
21
21
|
ImageTabId["Link"] = "link";
|
|
22
22
|
})(ImageTabId || (ImageTabId = {}));
|
|
23
|
-
const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, imageTitle: providedName, }) => {
|
|
23
|
+
const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading, imageTitle: providedName, uploadHint, }) => {
|
|
24
24
|
const [tabId, setTabId] = (0, react_1.useState)(() => (0, lodash_1.isFunction)(onAttach) ? ImageTabId.Attach : ImageTabId.Link);
|
|
25
25
|
const [url, setUrl] = (0, react_1.useState)('');
|
|
26
26
|
const [name, setName] = (0, react_1.useState)(providedName ?? '');
|
|
@@ -49,7 +49,7 @@ const ImageForm = ({ className, autoFocus, onCancel, onSubmit, onAttach, loading
|
|
|
49
49
|
return ((0, jsx_runtime_1.jsxs)(base_1.default.Form, { className: b(null, [className]), children: [shouldRenderTabs && ((0, jsx_runtime_1.jsx)(legacy_1.Tabs, { activeTab: tabId, onSelectTab: setTabId, items: [
|
|
50
50
|
{ id: ImageTabId.Attach, title: (0, forms_1.i18n)('common_tab_attach') },
|
|
51
51
|
{ id: ImageTabId.Link, title: (0, forms_1.i18n)('common_tab_link') },
|
|
52
|
-
] })), tabId === ImageTabId.Attach && onAttach && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Layout, { children: (0, forms_1.i18n)('image_upload_help') }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, children: (0, jsx_runtime_1.jsx)(components_1.ButtonAttach, { multiple: true, accept: "image/*", onUpdate: onAttach, buttonProps: { size: 's', view: 'action', loading }, children: (0, forms_1.i18n)('common_action_upload') }) })] })), tabId === ImageTabId.Link && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(base_1.default.Layout, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('common_link'), control: (0, jsx_runtime_1.jsx)(TextInput_1.TextInputFixed, { size: "s", view: "normal", value: url, onUpdate: setUrl, placeholder: "https://", autoFocus: autoFocus, className: b('input', { type: 'link' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('image_name'), control: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { size: "s", view: "normal", value: name, onUpdate: setName, className: b('input', { type: 'name' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('image_alt'), help: (0, forms_1.i18n)('image_alt_help'), control: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { size: "s", view: "normal", value: alt, onUpdate: setAlt, className: b('input', { type: 'alt' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('common_sizes'), control: (0, jsx_runtime_1.jsxs)("div", { className: b('size-controls'), children: [(0, jsx_runtime_1.jsx)(components_1.NumberInput, { min: 0, size: "s", view: "normal", value: width, onUpdate: setWidth, placeholder: (0, forms_1.i18n)('image_size_width'), className: b('input', { type: 'width' }), onKeyDown: inputEnterKeyHandler }), "x", (0, jsx_runtime_1.jsx)(components_1.NumberInput, { min: 0, size: "s", view: "normal", value: height, onUpdate: setHeight, placeholder: (0, forms_1.i18n)('image_size_height'), className: b('input', { type: 'height' }), onKeyDown: inputEnterKeyHandler })] }) })] }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, onSubmit: handleSubmit })] }))] }));
|
|
52
|
+
] })), tabId === ImageTabId.Attach && onAttach && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Layout, { children: uploadHint ?? (0, forms_1.i18n)('image_upload_help') }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, children: (0, jsx_runtime_1.jsx)(components_1.ButtonAttach, { multiple: true, accept: "image/*", onUpdate: onAttach, buttonProps: { size: 's', view: 'action', loading }, children: (0, forms_1.i18n)('common_action_upload') }) })] })), tabId === ImageTabId.Link && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(base_1.default.Layout, { children: [(0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('common_link'), control: (0, jsx_runtime_1.jsx)(TextInput_1.TextInputFixed, { size: "s", view: "normal", value: url, onUpdate: setUrl, placeholder: "https://", autoFocus: autoFocus, className: b('input', { type: 'link' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('image_name'), control: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { size: "s", view: "normal", value: name, onUpdate: setName, className: b('input', { type: 'name' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('image_alt'), help: (0, forms_1.i18n)('image_alt_help'), control: (0, jsx_runtime_1.jsx)(uikit_1.TextInput, { size: "s", view: "normal", value: alt, onUpdate: setAlt, className: b('input', { type: 'alt' }), onKeyPress: inputEnterKeyHandler }) }), (0, jsx_runtime_1.jsx)(base_1.default.Row, { label: (0, forms_1.i18n)('common_sizes'), control: (0, jsx_runtime_1.jsxs)("div", { className: b('size-controls'), children: [(0, jsx_runtime_1.jsx)(components_1.NumberInput, { min: 0, size: "s", view: "normal", value: width, onUpdate: setWidth, placeholder: (0, forms_1.i18n)('image_size_width'), className: b('input', { type: 'width' }), onKeyDown: inputEnterKeyHandler }), "x", (0, jsx_runtime_1.jsx)(components_1.NumberInput, { min: 0, size: "s", view: "normal", value: height, onUpdate: setHeight, placeholder: (0, forms_1.i18n)('image_size_height'), className: b('input', { type: 'height' }), onKeyDown: inputEnterKeyHandler })] }) })] }), (0, jsx_runtime_1.jsx)(base_1.default.Footer, { onCancel: onCancel, onSubmit: handleSubmit })] }))] }));
|
|
53
53
|
};
|
|
54
54
|
exports.ImageForm = ImageForm;
|
|
55
55
|
//# sourceMappingURL=ImageForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageForm.js","sourceRoot":"../../../src","sources":["forms/ImageForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useLayoutEffect, useState} from 'react';\n\nimport {TextInput, type TextInputProps} from '@gravity-ui/uikit';\nimport {Tabs} from '@gravity-ui/uikit/legacy';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/forms';\nimport {isFunction} from '../lodash';\nimport {enterKeyHandler} from '../utils/handlers';\n\nimport {TextInputFixed} from './TextInput';\nimport Form from './base';\nimport {ButtonAttach, NumberInput} from './components';\n\nimport './ImageForm.scss';\n\nconst b = cn('image-form');\n\nconst enum ImageTabId {\n Attach = 'attach',\n Link = 'link',\n}\n\nexport type ImageFormSubmitParams = {\n url: string;\n name: string;\n alt: string;\n width?: number;\n height?: number;\n};\n\nexport type ImageFormProps = ClassNameProps & {\n autoFocus?: boolean;\n onSubmit(params: ImageFormSubmitParams): void;\n onCancel(): void;\n onAttach?: (files: File[]) => void;\n loading?: boolean;\n imageTitle?: string;\n};\n\nexport const ImageForm: React.FC<ImageFormProps> = ({\n className,\n autoFocus,\n onCancel,\n onSubmit,\n onAttach,\n loading,\n imageTitle: providedName,\n}) => {\n const [tabId, setTabId] = useState<string>(() =>\n isFunction(onAttach) ? ImageTabId.Attach : ImageTabId.Link,\n );\n const [url, setUrl] = useState('');\n const [name, setName] = useState(providedName ?? '');\n const [alt, setAlt] = useState('');\n const [width, setWidth] = useState<number | undefined>();\n const [height, setHeight] = useState<number | undefined>();\n\n const shouldRenderTabs = isFunction(onAttach);\n useLayoutEffect(() => {\n if (!shouldRenderTabs && tabId === ImageTabId.Attach) {\n setTabId(ImageTabId.Link);\n }\n }, [shouldRenderTabs, tabId]);\n\n const handleSubmit = () => {\n const data: ImageFormSubmitParams = {\n url: url.trim(),\n name: name.trim(),\n alt: alt.trim(),\n };\n if (typeof width === 'number' && width >= 0) data.width = width;\n if (typeof height === 'number' && height >= 0) data.height = height;\n onSubmit(data);\n };\n const inputEnterKeyHandler: TextInputProps['onKeyDown'] = enterKeyHandler(handleSubmit);\n\n return (\n <Form.Form className={b(null, [className])}>\n {shouldRenderTabs && (\n <Tabs\n activeTab={tabId}\n onSelectTab={setTabId}\n items={[\n {id: ImageTabId.Attach, title: i18n('common_tab_attach')},\n {id: ImageTabId.Link, title: i18n('common_tab_link')},\n ]}\n />\n )}\n {tabId === ImageTabId.Attach && onAttach && (\n <>\n <Form.Layout>{i18n('image_upload_help')}</Form.Layout>\n <Form.Footer onCancel={onCancel}>\n <ButtonAttach\n multiple\n accept=\"image/*\"\n onUpdate={onAttach}\n buttonProps={{size: 's', view: 'action', loading}}\n >\n {i18n('common_action_upload')}\n </ButtonAttach>\n </Form.Footer>\n </>\n )}\n {tabId === ImageTabId.Link && (\n <>\n <Form.Layout>\n <Form.Row\n label={i18n('common_link')}\n control={\n <TextInputFixed\n size=\"s\"\n view=\"normal\"\n value={url}\n onUpdate={setUrl}\n placeholder=\"https://\"\n autoFocus={autoFocus}\n className={b('input', {type: 'link'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_name')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={name}\n onUpdate={setName}\n className={b('input', {type: 'name'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_alt')}\n help={i18n('image_alt_help')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={alt}\n onUpdate={setAlt}\n className={b('input', {type: 'alt'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('common_sizes')}\n control={\n <div className={b('size-controls')}>\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={width}\n onUpdate={setWidth}\n placeholder={i18n('image_size_width')}\n className={b('input', {type: 'width'})}\n onKeyDown={inputEnterKeyHandler}\n />\n x\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={height}\n onUpdate={setHeight}\n placeholder={i18n('image_size_height')}\n className={b('input', {type: 'height'})}\n onKeyDown={inputEnterKeyHandler}\n />\n </div>\n }\n />\n </Form.Layout>\n <Form.Footer onCancel={onCancel} onSubmit={handleSubmit} />\n </>\n )}\n </Form.Form>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ImageForm.js","sourceRoot":"../../../src","sources":["forms/ImageForm.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useLayoutEffect, useState} from 'react';\n\nimport {TextInput, type TextInputProps} from '@gravity-ui/uikit';\nimport {Tabs} from '@gravity-ui/uikit/legacy';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/forms';\nimport {isFunction} from '../lodash';\nimport {enterKeyHandler} from '../utils/handlers';\n\nimport {TextInputFixed} from './TextInput';\nimport Form from './base';\nimport {ButtonAttach, NumberInput} from './components';\n\nimport './ImageForm.scss';\n\nconst b = cn('image-form');\n\nconst enum ImageTabId {\n Attach = 'attach',\n Link = 'link',\n}\n\nexport type ImageFormSubmitParams = {\n url: string;\n name: string;\n alt: string;\n width?: number;\n height?: number;\n};\n\nexport type ImageFormProps = ClassNameProps & {\n autoFocus?: boolean;\n onSubmit(params: ImageFormSubmitParams): void;\n onCancel(): void;\n onAttach?: (files: File[]) => void;\n loading?: boolean;\n imageTitle?: string;\n uploadHint?: string;\n};\n\nexport const ImageForm: React.FC<ImageFormProps> = ({\n className,\n autoFocus,\n onCancel,\n onSubmit,\n onAttach,\n loading,\n imageTitle: providedName,\n uploadHint,\n}) => {\n const [tabId, setTabId] = useState<string>(() =>\n isFunction(onAttach) ? ImageTabId.Attach : ImageTabId.Link,\n );\n const [url, setUrl] = useState('');\n const [name, setName] = useState(providedName ?? '');\n const [alt, setAlt] = useState('');\n const [width, setWidth] = useState<number | undefined>();\n const [height, setHeight] = useState<number | undefined>();\n\n const shouldRenderTabs = isFunction(onAttach);\n useLayoutEffect(() => {\n if (!shouldRenderTabs && tabId === ImageTabId.Attach) {\n setTabId(ImageTabId.Link);\n }\n }, [shouldRenderTabs, tabId]);\n\n const handleSubmit = () => {\n const data: ImageFormSubmitParams = {\n url: url.trim(),\n name: name.trim(),\n alt: alt.trim(),\n };\n if (typeof width === 'number' && width >= 0) data.width = width;\n if (typeof height === 'number' && height >= 0) data.height = height;\n onSubmit(data);\n };\n const inputEnterKeyHandler: TextInputProps['onKeyDown'] = enterKeyHandler(handleSubmit);\n\n return (\n <Form.Form className={b(null, [className])}>\n {shouldRenderTabs && (\n <Tabs\n activeTab={tabId}\n onSelectTab={setTabId}\n items={[\n {id: ImageTabId.Attach, title: i18n('common_tab_attach')},\n {id: ImageTabId.Link, title: i18n('common_tab_link')},\n ]}\n />\n )}\n {tabId === ImageTabId.Attach && onAttach && (\n <>\n <Form.Layout>{uploadHint ?? i18n('image_upload_help')}</Form.Layout>\n <Form.Footer onCancel={onCancel}>\n <ButtonAttach\n multiple\n accept=\"image/*\"\n onUpdate={onAttach}\n buttonProps={{size: 's', view: 'action', loading}}\n >\n {i18n('common_action_upload')}\n </ButtonAttach>\n </Form.Footer>\n </>\n )}\n {tabId === ImageTabId.Link && (\n <>\n <Form.Layout>\n <Form.Row\n label={i18n('common_link')}\n control={\n <TextInputFixed\n size=\"s\"\n view=\"normal\"\n value={url}\n onUpdate={setUrl}\n placeholder=\"https://\"\n autoFocus={autoFocus}\n className={b('input', {type: 'link'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_name')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={name}\n onUpdate={setName}\n className={b('input', {type: 'name'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('image_alt')}\n help={i18n('image_alt_help')}\n control={\n <TextInput\n size=\"s\"\n view=\"normal\"\n value={alt}\n onUpdate={setAlt}\n className={b('input', {type: 'alt'})}\n onKeyPress={inputEnterKeyHandler}\n />\n }\n />\n <Form.Row\n label={i18n('common_sizes')}\n control={\n <div className={b('size-controls')}>\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={width}\n onUpdate={setWidth}\n placeholder={i18n('image_size_width')}\n className={b('input', {type: 'width'})}\n onKeyDown={inputEnterKeyHandler}\n />\n x\n <NumberInput\n min={0}\n size=\"s\"\n view=\"normal\"\n value={height}\n onUpdate={setHeight}\n placeholder={i18n('image_size_height')}\n className={b('input', {type: 'height'})}\n onKeyDown={inputEnterKeyHandler}\n />\n </div>\n }\n />\n </Form.Layout>\n <Form.Footer onCancel={onCancel} onSubmit={handleSubmit} />\n </>\n )}\n </Form.Form>\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.16.2' !== 'undefined' ? '15.16.2' : '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.16.2' !== 'undefined' ? '15.16.2' : 'unknown';\n"]}
|
|
@@ -13,7 +13,7 @@ export function createDynamicModifiers(markupManager) {
|
|
|
13
13
|
*/
|
|
14
14
|
process: (token, _, rawMarkup) => {
|
|
15
15
|
const { map } = token;
|
|
16
|
-
if (map) {
|
|
16
|
+
if (map && rawMarkup !== null) {
|
|
17
17
|
const content = rawMarkup.split('\n').slice(map[0], map[1]).join('\n').trim();
|
|
18
18
|
const tokenId = v5(content, markupManager.getNamespace());
|
|
19
19
|
if (/^\s*#\|/.test(content)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["bundle/config/dynamicModifiers.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAC,EAAE,EAAC,MAAM,MAAM,CAAC;AAKxB,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAC7C,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAE3C,MAAM,UAAU,sBAAsB,CAAC,aAA4B;IAC/D,OAAO;QACH;YACI,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,WAAW;YACtB;;;eAGG;YACH,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE;gBAC7B,MAAM,EAAC,GAAG,EAAC,GAAG,KAAK,CAAC;gBAEpB,IAAI,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["bundle/config/dynamicModifiers.ts"],"names":[],"mappings":"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","sourcesContent":["import dedent from 'ts-dedent';\nimport {v5} from 'uuid';\n\nimport type {DynamicModifiers} from '../../core/types/dynamicModifiers';\nimport type {MarkupManager} from '../MarkupManager';\n\nconst YFM_TABLE_TOKEN_ATTR = 'data-token-id';\nconst YFM_TABLE_NODE_ATTR = 'data-node-id';\n\nexport function createDynamicModifiers(markupManager: MarkupManager): DynamicModifiers[] {\n return [\n {\n type: 'parserToken',\n tokenName: 'yfm_table',\n /**\n * - Assigns a unique `data-token-id` to each token.\n * - Captures and stores the raw Markdown using `MarkupManager`.\n */\n process: (token, _, rawMarkup) => {\n const {map} = token;\n\n if (map && rawMarkup !== null) {\n const content = rawMarkup.split('\\n').slice(map[0], map[1]).join('\\n').trim();\n const tokenId = v5(content, markupManager.getNamespace());\n\n if (/^\\s*#\\|/.test(content)) {\n token.attrSet(YFM_TABLE_TOKEN_ATTR, tokenId);\n markupManager.setMarkup(tokenId, dedent(content));\n }\n }\n return token;\n },\n },\n {\n type: 'parserNodeAttrs',\n tokenName: 'yfm_table',\n /**\n * - Links the token to its corresponding node via `data-node-id`.\n */\n process: (token, attrs) => ({\n ...attrs,\n [YFM_TABLE_NODE_ATTR]: token.attrGet(YFM_TABLE_TOKEN_ATTR),\n }),\n },\n {\n type: 'parserNode',\n nodeName: 'yfm_table',\n process: (node) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n if (nodeId) {\n markupManager.setNode(nodeId, node);\n }\n return node;\n },\n },\n {\n type: 'serializerNode',\n nodeName: 'yfm_table',\n /**\n * - Retrieves the original Markdown using the `data-node-id` attribute.\n * - Uses the original Markdown if the node matches the saved version.\n * - Falls back to schema-based rendering if the node structure, attributes, or parent elements affect it.\n */\n process: (state, node, parent, index, callback) => {\n const nodeId = node.attrs[YFM_TABLE_NODE_ATTR];\n const savedNode = markupManager.getNode(nodeId);\n\n if (savedNode?.eq(node)) {\n const content: string = markupManager.getMarkup(nodeId) || '';\n state.ensureNewLine();\n state.text(content, false);\n state.ensureNewLine();\n state.closeBlock();\n state.write('\\n');\n return;\n }\n\n callback?.(state, node, parent, index);\n },\n },\n {\n type: 'schemaNodeSpec',\n nodeName: 'yfm_table',\n /**\n * - Adds the `data-node-id` attribute to the list of allowed attributes.\n */\n allowedAttrs: [YFM_TABLE_NODE_ATTR],\n },\n ];\n}\n"]}
|
|
@@ -6,5 +6,5 @@ export type ToolbarFilePopupProps = Omit<ToolbarBaseProps<never>, 'editor'> & {
|
|
|
6
6
|
anchorElement: HTMLElement | null;
|
|
7
7
|
uploadHandler?: FileUploadHandler;
|
|
8
8
|
onSuccessUpload?: (result: BatchUploadResult) => void;
|
|
9
|
-
} & Pick<FileFormProps, 'onSubmit'>;
|
|
9
|
+
} & Pick<FileFormProps, 'onSubmit' | 'uploadHint'>;
|
|
10
10
|
export declare const ToolbarFilePopup: React.FC<ToolbarFilePopupProps>;
|
|
@@ -6,7 +6,7 @@ import { i18n } from "../../../i18n/forms/index.js";
|
|
|
6
6
|
import { useBooleanState } from "../../../react-utils/hooks.js";
|
|
7
7
|
import { batchUploadFiles, } from "../../../utils/upload.js";
|
|
8
8
|
const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
|
|
9
|
-
export const ToolbarFilePopup = ({ className, hide, anchorElement, onSubmit, focus, onClick, uploadHandler, onSuccessUpload, }) => {
|
|
9
|
+
export const ToolbarFilePopup = ({ className, hide, anchorElement, onSubmit, focus, onClick, uploadHandler, onSuccessUpload, uploadHint, }) => {
|
|
10
10
|
const toaster = useToaster();
|
|
11
11
|
const [loading, showLoading, hideLoading] = useBooleanState(false);
|
|
12
12
|
const handleCancel = useCallback(() => {
|
|
@@ -34,6 +34,6 @@ export const ToolbarFilePopup = ({ className, hide, anchorElement, onSubmit, foc
|
|
|
34
34
|
focus();
|
|
35
35
|
onSubmit(data);
|
|
36
36
|
onClick?.('addFile');
|
|
37
|
-
}, loading: loading }) }));
|
|
37
|
+
}, loading: loading, uploadHint: uploadHint }) }));
|
|
38
38
|
};
|
|
39
39
|
//# sourceMappingURL=ToolbarFilePopup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarFilePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarFilePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,QAAQ,EAAqB,mCAAgC;AACrE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAUzF,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,SAAS,EACT,IAAI,EACJ,aAAa,EAEb,QAAQ,EACR,KAAK,EACL,OAAO,EACP,aAAa,EACb,eAAe,
|
|
1
|
+
{"version":3,"file":"ToolbarFilePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarFilePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,QAAQ,EAAqB,mCAAgC;AACrE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAUzF,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,SAAS,EACT,IAAI,EACJ,aAAa,EAEb,QAAQ,EACR,KAAK,EACL,OAAO,EACP,aAAa,EACb,eAAe,EACf,UAAU,GACb,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,KAAK,QACL,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,QAAQ,IACL,SAAS,QACT,QAAQ,EACJ,aAAa;gBACb,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,IAAI,CACvC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;wBACN,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,qBAAqB;4BAC3B,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC;4BACjC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;yBACzB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC,EACD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACxB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {FileForm, type FileFormProps} from '../../../forms/FileForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarFilePopupProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n hide: () => void;\n anchorElement: HTMLElement | null;\n\n uploadHandler?: FileUploadHandler;\n onSuccessUpload?: (result: BatchUploadResult) => void;\n} & Pick<FileFormProps, 'onSubmit' | 'uploadHint'>;\n\nexport const ToolbarFilePopup: React.FC<ToolbarFilePopupProps> = ({\n className,\n hide,\n anchorElement,\n\n onSubmit,\n focus,\n onClick,\n uploadHandler,\n onSuccessUpload,\n uploadHint,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n modal\n onOpenChange={handleCancel}\n anchorElement={anchorElement}\n placement={placement}\n className={className}\n >\n <FileForm\n autoFocus\n onAttach={\n uploadHandler &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadHandler).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (error) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_file_upload',\n title: i18n('file_upload_failed'),\n content: String(error),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addFile');\n }}\n loading={loading}\n uploadHint={uploadHint}\n />\n </Popup>\n );\n};\n"]}
|
|
@@ -6,5 +6,5 @@ export type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {
|
|
|
6
6
|
onSuccessUpload?: (res: BatchUploadResult) => void;
|
|
7
7
|
hide: () => void;
|
|
8
8
|
anchorElement: HTMLElement | null;
|
|
9
|
-
} & Pick<ImageFormProps, 'onSubmit' | 'imageTitle'>;
|
|
9
|
+
} & Pick<ImageFormProps, 'onSubmit' | 'imageTitle' | 'uploadHint'>;
|
|
10
10
|
export declare const ToolbarImagePopup: React.FC<ToolbarImagePopuProps>;
|
|
@@ -6,7 +6,7 @@ import { i18n } from "../../../i18n/forms/index.js";
|
|
|
6
6
|
import { useBooleanState } from "../../../react-utils/hooks.js";
|
|
7
7
|
import { batchUploadFiles, } from "../../../utils/upload.js";
|
|
8
8
|
const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
|
|
9
|
-
export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, imageTitle, }) => {
|
|
9
|
+
export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, imageTitle, uploadHint, }) => {
|
|
10
10
|
const toaster = useToaster();
|
|
11
11
|
const [loading, showLoading, hideLoading] = useBooleanState(false);
|
|
12
12
|
const handleCancel = useCallback(() => {
|
|
@@ -34,6 +34,6 @@ export const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, fo
|
|
|
34
34
|
focus();
|
|
35
35
|
onSubmit(data);
|
|
36
36
|
onClick?.('addImage');
|
|
37
|
-
}, loading: loading, imageTitle: imageTitle }) }));
|
|
37
|
+
}, loading: loading, imageTitle: imageTitle, uploadHint: uploadHint }) }));
|
|
38
38
|
};
|
|
39
39
|
//# sourceMappingURL=ToolbarImagePopup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,SAAS,EAAsB,oCAAiC;AACxE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASzF,MAAM,CAAC,MAAM,iBAAiB,GAAoC,CAAC,EAC/D,SAAS,EACT,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAY,EACZ,eAAe,EACf,UAAU,GACb,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,SAAS,IACN,SAAS,QACT,QAAQ,EACJ,YAAY;gBACZ,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,IAAI,CACtC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,sBAAsB;4BAC5B,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC;4BAClC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;yBACvB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,EACD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACxB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {ImageForm, type ImageFormProps} from '../../../forms/ImageForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n uploadImages?: FileUploadHandler;\n onSuccessUpload?: (res: BatchUploadResult) => void;\n hide: () => void;\n anchorElement: HTMLElement | null;\n} & Pick<ImageFormProps, 'onSubmit' | 'imageTitle'>;\n\nexport const ToolbarImagePopup: React.FC<ToolbarImagePopuProps> = ({\n className,\n anchorElement,\n hide,\n onSubmit,\n focus,\n onClick,\n uploadImages,\n onSuccessUpload,\n imageTitle,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n onOpenChange={handleCancel}\n placement={placement}\n className={className}\n >\n <ImageForm\n autoFocus\n onAttach={\n uploadImages &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadImages).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (err) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_image_upload',\n title: i18n('image_upload_failed'),\n content: String(err),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addImage');\n }}\n loading={loading}\n imageTitle={imageTitle}\n />\n </Popup>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,KAAK,EAAuB,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAEzE,OAAO,EAAC,SAAS,EAAsB,oCAAiC;AACxE,OAAO,EAAC,IAAI,EAAC,qCAA4B;AACzC,OAAO,EAAC,eAAe,EAAC,sCAAmC;AAE3D,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASzF,MAAM,CAAC,MAAM,iBAAiB,GAAoC,CAAC,EAC/D,SAAS,EACT,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,OAAO,EACP,YAAY,EACZ,eAAe,EACf,UAAU,EACV,UAAU,GACb,EAAE,EAAE;IACD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,KAAC,KAAK,IACF,IAAI,QACJ,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,KAAC,SAAS,IACN,SAAS,QACT,QAAQ,EACJ,YAAY;gBACZ,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,IAAI,CACtC,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,CAAC;wBACP,eAAe,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;wBACJ,WAAW,EAAE,CAAC;wBACd,OAAO,CAAC,GAAG,CAAC;4BACR,KAAK,EAAE,QAAQ;4BACf,IAAI,EAAE,sBAAsB;4BAC5B,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC;4BAClC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;yBACvB,CAAC,CAAC;oBACP,CAAC,CACJ,CAAC;gBACN,CAAC,CAAC,EAEN,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACf,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC,EACD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,GACxB,GACE,CACX,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Popup, type PopupPlacement, useToaster} from '@gravity-ui/uikit';\n\nimport {ImageForm, type ImageFormProps} from '../../../forms/ImageForm';\nimport {i18n} from '../../../i18n/forms';\nimport {useBooleanState} from '../../../react-utils/hooks';\nimport type {ToolbarBaseProps} from '../../../toolbar';\nimport {\n type BatchUploadResult,\n type FileUploadHandler,\n batchUploadFiles,\n} from '../../../utils/upload';\n\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type ToolbarImagePopuProps = Omit<ToolbarBaseProps<never>, 'editor'> & {\n uploadImages?: FileUploadHandler;\n onSuccessUpload?: (res: BatchUploadResult) => void;\n hide: () => void;\n anchorElement: HTMLElement | null;\n} & Pick<ImageFormProps, 'onSubmit' | 'imageTitle' | 'uploadHint'>;\n\nexport const ToolbarImagePopup: React.FC<ToolbarImagePopuProps> = ({\n className,\n anchorElement,\n hide,\n onSubmit,\n focus,\n onClick,\n uploadImages,\n onSuccessUpload,\n imageTitle,\n uploadHint,\n}) => {\n const toaster = useToaster();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n\n const handleCancel = useCallback(() => {\n hide();\n focus();\n }, [focus, hide]);\n\n return (\n <Popup\n open\n anchorElement={anchorElement}\n onOpenChange={handleCancel}\n placement={placement}\n className={className}\n >\n <ImageForm\n autoFocus\n onAttach={\n uploadImages &&\n ((files) => {\n showLoading();\n batchUploadFiles(files, uploadImages).then(\n (res) => {\n hideLoading();\n hide();\n onSuccessUpload?.(res);\n },\n (err) => {\n hideLoading();\n toaster.add({\n theme: 'danger',\n name: 'toolbar_image_upload',\n title: i18n('image_upload_failed'),\n content: String(err),\n });\n },\n );\n })\n }\n onCancel={handleCancel}\n onSubmit={(data) => {\n hide();\n focus();\n onSubmit(data);\n onClick?.('addImage');\n }}\n loading={loading}\n imageTitle={imageTitle}\n uploadHint={uploadHint}\n />\n </Popup>\n );\n};\n"]}
|
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
import type { NodeSpec } from 'prosemirror-model';
|
|
1
2
|
export type TokenAttrs = {
|
|
2
3
|
[name: string]: unknown;
|
|
3
4
|
};
|
|
5
|
+
export interface NodeSpecProcessor {
|
|
6
|
+
allowedAttrs?: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface SchemaDynamicModifierConfig {
|
|
9
|
+
[elementType: string]: NodeSpecProcessor;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Class SchemaDynamicModifier
|
|
13
|
+
*
|
|
14
|
+
* Provides a mechanism for dynamic modification of schema node attributes:
|
|
15
|
+
*
|
|
16
|
+
* - `allowedAttrs`: A list of additional attributes to include in the ProseMirror schema with default values.
|
|
17
|
+
* When specified, these attributes are added to the schema and preserved during processing.
|
|
18
|
+
*
|
|
19
|
+
* Example:
|
|
20
|
+
* ```ts
|
|
21
|
+
* const dynamicModifier = new SchemaDynamicModifier({
|
|
22
|
+
* paragraph: {
|
|
23
|
+
* allowedAttrs: ['data-paragraph'],
|
|
24
|
+
* },
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class SchemaDynamicModifier {
|
|
29
|
+
private nodeSpecsProcessors;
|
|
30
|
+
constructor(config: SchemaDynamicModifierConfig);
|
|
31
|
+
processNodeSpec(name: string, nodeSpec: NodeSpec): NodeSpec;
|
|
32
|
+
}
|
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Class SchemaDynamicModifier
|
|
3
|
+
*
|
|
4
|
+
* Provides a mechanism for dynamic modification of schema node attributes:
|
|
5
|
+
*
|
|
6
|
+
* - `allowedAttrs`: A list of additional attributes to include in the ProseMirror schema with default values.
|
|
7
|
+
* When specified, these attributes are added to the schema and preserved during processing.
|
|
8
|
+
*
|
|
9
|
+
* Example:
|
|
10
|
+
* ```ts
|
|
11
|
+
* const dynamicModifier = new SchemaDynamicModifier({
|
|
12
|
+
* paragraph: {
|
|
13
|
+
* allowedAttrs: ['data-paragraph'],
|
|
14
|
+
* },
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
2
18
|
export class SchemaDynamicModifier {
|
|
3
19
|
nodeSpecsProcessors;
|
|
4
20
|
constructor(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaDynamicModifier.js","sourceRoot":"../../../src","sources":["core/SchemaDynamicModifier.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SchemaDynamicModifier.js","sourceRoot":"../../../src","sources":["core/SchemaDynamicModifier.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,qBAAqB;IACtB,mBAAmB,CAAiC;IAE5D,YAAY,MAAmC;QAC3C,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,QAAkB;QAC5C,IAAI,WAAW,GAAG,QAAQ,CAAC;QAE3B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE;YACxD,IACI,IAAI,KAAK,WAAW;gBACpB,SAAS,CAAC,YAAY;gBACtB,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;gBACjC,QAAQ,EACV,CAAC;gBACC,WAAW,GAAG;oBACV,GAAG,QAAQ;oBACX,KAAK,EAAE;wBACH,GAAG,QAAQ,CAAC,KAAK;wBACjB,GAAG,SAAS,CAAC,YAAY,CAAC,MAAM,CAC5B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;4BACT,GAAG,CAAC,GAAG,CAAC,GAAG,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC;4BAC3B,OAAO,GAAG,CAAC;wBACf,CAAC,EACD,EAAyB,CAC5B;qBACJ;iBACJ,CAAC;YACN,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACvB,CAAC;CACJ","sourcesContent":["import type {NodeSpec} from 'prosemirror-model';\n\nexport type TokenAttrs = {[name: string]: unknown};\n\nexport interface NodeSpecProcessor {\n allowedAttrs?: string[];\n}\n\nexport interface SchemaDynamicModifierConfig {\n [elementType: string]: NodeSpecProcessor;\n}\n\n/**\n * Class SchemaDynamicModifier\n *\n * Provides a mechanism for dynamic modification of schema node attributes:\n *\n * - `allowedAttrs`: A list of additional attributes to include in the ProseMirror schema with default values.\n * When specified, these attributes are added to the schema and preserved during processing.\n *\n * Example:\n * ```ts\n * const dynamicModifier = new SchemaDynamicModifier({\n * paragraph: {\n * allowedAttrs: ['data-paragraph'],\n * },\n * });\n * ```\n */\nexport class SchemaDynamicModifier {\n private nodeSpecsProcessors: Map<string, NodeSpecProcessor>;\n\n constructor(config: SchemaDynamicModifierConfig) {\n this.nodeSpecsProcessors = new Map(Object.entries(config));\n }\n\n processNodeSpec(name: string, nodeSpec: NodeSpec): NodeSpec {\n let updatedSpec = nodeSpec;\n\n this.nodeSpecsProcessors.forEach((processor, elementType) => {\n if (\n name === elementType &&\n processor.allowedAttrs &&\n processor.allowedAttrs.length > 0 &&\n nodeSpec\n ) {\n updatedSpec = {\n ...nodeSpec,\n attrs: {\n ...nodeSpec.attrs,\n ...processor.allowedAttrs.reduce(\n (acc, key) => {\n acc[key] = {default: null};\n return acc;\n },\n {} as Record<string, any>,\n ),\n },\n };\n }\n });\n\n return updatedSpec;\n }\n}\n"]}
|
|
@@ -31,7 +31,8 @@ export declare class MarkdownParser implements Parser {
|
|
|
31
31
|
normalizeLink(url: string): string;
|
|
32
32
|
normalizeLinkText(url: string): string;
|
|
33
33
|
matchLinks(text: string): Readonly<Match>[] | null;
|
|
34
|
-
parse(
|
|
34
|
+
parse(src: string): Node;
|
|
35
|
+
parse(tokens: Token[]): Node;
|
|
35
36
|
private top;
|
|
36
37
|
private push;
|
|
37
38
|
private getTokenAttrs;
|
|
@@ -51,6 +52,73 @@ export declare class MarkdownParser implements Parser {
|
|
|
51
52
|
private closeMark;
|
|
52
53
|
private parseTokens;
|
|
53
54
|
}
|
|
55
|
+
export type ProcessToken = (token: Token, index: number, rawMarkup: string | null, allowedAttrs?: string[]) => Token;
|
|
54
56
|
export type ProcessNodeAttrs = (token: Token, attrs: TokenAttrs, allowedAttrs?: string[]) => TokenAttrs;
|
|
55
57
|
export type ProcessNode = (node: Node) => Node;
|
|
58
|
+
export interface ElementProcessor {
|
|
59
|
+
processToken?: ProcessToken[];
|
|
60
|
+
processNodeAttrs?: ProcessNodeAttrs[];
|
|
61
|
+
processNode?: ProcessNode[];
|
|
62
|
+
}
|
|
63
|
+
export interface MarkdownParserDynamicModifierConfig {
|
|
64
|
+
[elementType: string]: ElementProcessor;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Class MarkdownParserDynamicModifier
|
|
68
|
+
*
|
|
69
|
+
* Provides a mechanism for dynamic modification of tokens and node attributes during parsing by a MarkdownParser.
|
|
70
|
+
* It allows sequential processing of element types by applying a series of custom handlers:
|
|
71
|
+
*
|
|
72
|
+
* - `processToken`: An array of handlers that process tokens sequentially, each passing the result to the next.
|
|
73
|
+
*
|
|
74
|
+
* - `processNodeAttrs`: An array of handlers that modify and process node attributes.
|
|
75
|
+
*
|
|
76
|
+
* - `processNode`: An array of handlers that process and modify the resulting ProseMirror nodes.
|
|
77
|
+
*
|
|
78
|
+
* Example:
|
|
79
|
+
* ```ts
|
|
80
|
+
* const dynamicModifier = new MarkdownParserDynamicModifier({
|
|
81
|
+
* paragraph: {
|
|
82
|
+
* processToken: [
|
|
83
|
+
* (token, index, rawMarkup, allowedAttrs) => {
|
|
84
|
+
* token.attrSet('data-prefix', 'prefix-value');
|
|
85
|
+
* return token;
|
|
86
|
+
* },
|
|
87
|
+
* (token) => {
|
|
88
|
+
* console.log(`Processing token: ${token.type}`);
|
|
89
|
+
* return token;
|
|
90
|
+
* },
|
|
91
|
+
* ],
|
|
92
|
+
* processNodeAttrs: [
|
|
93
|
+
* (token, attrs) => {
|
|
94
|
+
* attrs['data-paragraph'] = token.attrGet('data-prefix');
|
|
95
|
+
* return attrs;
|
|
96
|
+
* },
|
|
97
|
+
* (token, attrs) => {
|
|
98
|
+
* console.log(`Processing attrs for token: ${token.type}`);
|
|
99
|
+
* return attrs;
|
|
100
|
+
* },
|
|
101
|
+
* ],
|
|
102
|
+
* processNode: [
|
|
103
|
+
* (node) => {
|
|
104
|
+
* console.log(`Processing node: ${node.type}`);
|
|
105
|
+
* return node;
|
|
106
|
+
* },
|
|
107
|
+
* ],
|
|
108
|
+
* },
|
|
109
|
+
* });
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* This class extends the functionality of a MarkdownParser for scenarios such as:
|
|
113
|
+
* - Adding default attributes to specific elements.
|
|
114
|
+
* - Modifying token metadata.
|
|
115
|
+
* - Logging or customizing processing steps for debugging.
|
|
116
|
+
*/
|
|
117
|
+
export declare class MarkdownParserDynamicModifier {
|
|
118
|
+
private elementProcessors;
|
|
119
|
+
constructor(config: MarkdownParserDynamicModifierConfig);
|
|
120
|
+
processTokens(tokens: Token[], rawMarkup: string | null): Token[];
|
|
121
|
+
processAttrs(token: Token, attrs: TokenAttrs): TokenAttrs;
|
|
122
|
+
processNodes(node: Node): Node;
|
|
123
|
+
}
|
|
56
124
|
export {};
|