@gravity-ui/markdown-editor 15.14.2 → 15.16.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/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 +54 -4
- 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/extensions/markdown/Link/paste-plugin.js +8 -2
- package/build/cjs/extensions/markdown/Link/paste-plugin.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +2 -1
- package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.d.ts +2 -1
- package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.js +12 -1
- package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.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/forms/TextInput.js +1 -1
- package/build/cjs/forms/TextInput.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 +54 -4
- 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/extensions/markdown/Link/paste-plugin.js +8 -2
- package/build/esm/extensions/markdown/Link/paste-plugin.js.map +1 -1
- package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +2 -1
- package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
- package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.d.ts +2 -1
- package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.js +12 -1
- package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.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/forms/TextInput.js +1 -1
- package/build/esm/forms/TextInput.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/package.json +2 -2
|
@@ -17,7 +17,7 @@ function createDynamicModifiers(markupManager) {
|
|
|
17
17
|
*/
|
|
18
18
|
process: (token, _, rawMarkup) => {
|
|
19
19
|
const { map } = token;
|
|
20
|
-
if (map) {
|
|
20
|
+
if (map && rawMarkup !== null) {
|
|
21
21
|
const content = rawMarkup.split('\n').slice(map[0], map[1]).join('\n').trim();
|
|
22
22
|
const tokenId = (0, uuid_1.v5)(content, markupManager.getNamespace());
|
|
23
23
|
if (/^\s*#\|/.test(content)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicModifiers.js","sourceRoot":"../../../../src","sources":["bundle/config/dynamicModifiers.ts"],"names":[],"mappings":";;AASA,wDAgFC;;AAzFD,kEAA+B;AAC/B,+BAAwB;AAKxB,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAC7C,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAE3C,SAAgB,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>;
|
|
@@ -9,7 +9,7 @@ const forms_1 = require("../../../i18n/forms/index.js");
|
|
|
9
9
|
const hooks_1 = require("../../../react-utils/hooks.js");
|
|
10
10
|
const upload_1 = require("../../../utils/upload.js");
|
|
11
11
|
const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
|
|
12
|
-
const ToolbarFilePopup = ({ className, hide, anchorElement, onSubmit, focus, onClick, uploadHandler, onSuccessUpload, }) => {
|
|
12
|
+
const ToolbarFilePopup = ({ className, hide, anchorElement, onSubmit, focus, onClick, uploadHandler, onSuccessUpload, uploadHint, }) => {
|
|
13
13
|
const toaster = (0, uikit_1.useToaster)();
|
|
14
14
|
const [loading, showLoading, hideLoading] = (0, hooks_1.useBooleanState)(false);
|
|
15
15
|
const handleCancel = (0, react_1.useCallback)(() => {
|
|
@@ -37,7 +37,7 @@ const ToolbarFilePopup = ({ className, hide, anchorElement, onSubmit, focus, onC
|
|
|
37
37
|
focus();
|
|
38
38
|
onSubmit(data);
|
|
39
39
|
onClick?.('addFile');
|
|
40
|
-
}, loading: loading }) }));
|
|
40
|
+
}, loading: loading, uploadHint: uploadHint }) }));
|
|
41
41
|
};
|
|
42
42
|
exports.ToolbarFilePopup = ToolbarFilePopup;
|
|
43
43
|
//# sourceMappingURL=ToolbarFilePopup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarFilePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarFilePopup.tsx"],"names":[],"mappings":";;;;AAAA,iCAAkC;AAElC,6CAAyE;AAEzE,yDAAqE;AACrE,wDAAyC;AACzC,yDAA2D;AAE3D,qDAI+B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAUlF,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,iCAAkC;AAElC,6CAAyE;AAEzE,yDAAqE;AACrE,wDAAyC;AACzC,yDAA2D;AAE3D,qDAI+B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAUlF,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,IAAA,kBAAU,GAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,uBAAC,aAAK,IACF,IAAI,QACJ,KAAK,QACL,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,uBAAC,mBAAQ,IACL,SAAS,QACT,QAAQ,EACJ,aAAa;gBACb,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,IAAA,yBAAgB,EAAC,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,IAAA,YAAI,EAAC,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;AAjEW,QAAA,gBAAgB,oBAiE3B","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>;
|
|
@@ -9,7 +9,7 @@ const forms_1 = require("../../../i18n/forms/index.js");
|
|
|
9
9
|
const hooks_1 = require("../../../react-utils/hooks.js");
|
|
10
10
|
const upload_1 = require("../../../utils/upload.js");
|
|
11
11
|
const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
|
|
12
|
-
const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, imageTitle, }) => {
|
|
12
|
+
const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, onClick, uploadImages, onSuccessUpload, imageTitle, uploadHint, }) => {
|
|
13
13
|
const toaster = (0, uikit_1.useToaster)();
|
|
14
14
|
const [loading, showLoading, hideLoading] = (0, hooks_1.useBooleanState)(false);
|
|
15
15
|
const handleCancel = (0, react_1.useCallback)(() => {
|
|
@@ -37,7 +37,7 @@ const ToolbarImagePopup = ({ className, anchorElement, hide, onSubmit, focus, on
|
|
|
37
37
|
focus();
|
|
38
38
|
onSubmit(data);
|
|
39
39
|
onClick?.('addImage');
|
|
40
|
-
}, loading: loading, imageTitle: imageTitle }) }));
|
|
40
|
+
}, loading: loading, imageTitle: imageTitle, uploadHint: uploadHint }) }));
|
|
41
41
|
};
|
|
42
42
|
exports.ToolbarImagePopup = ToolbarImagePopup;
|
|
43
43
|
//# sourceMappingURL=ToolbarImagePopup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";;;;AAAA,iCAAkC;AAElC,6CAAyE;AAEzE,2DAAwE;AACxE,wDAAyC;AACzC,yDAA2D;AAE3D,qDAI+B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASlF,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,IAAA,kBAAU,GAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,uBAAC,aAAK,IACF,IAAI,QACJ,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,uBAAC,qBAAS,IACN,SAAS,QACT,QAAQ,EACJ,YAAY;gBACZ,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,IAAA,yBAAgB,EAAC,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,IAAA,YAAI,EAAC,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;
|
|
1
|
+
{"version":3,"file":"ToolbarImagePopup.js","sourceRoot":"../../../../../src","sources":["bundle/toolbar/custom/ToolbarImagePopup.tsx"],"names":[],"mappings":";;;;AAAA,iCAAkC;AAElC,6CAAyE;AAEzE,2DAAwE;AACxE,wDAAyC;AACzC,yDAA2D;AAE3D,qDAI+B;AAE/B,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AASlF,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,IAAA,kBAAU,GAAE,CAAC;IAC7B,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,IAAA,uBAAe,EAAC,KAAK,CAAC,CAAC;IAEnE,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAClC,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAElB,OAAO,CACH,uBAAC,aAAK,IACF,IAAI,QACJ,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,YAEpB,uBAAC,qBAAS,IACN,SAAS,QACT,QAAQ,EACJ,YAAY;gBACZ,CAAC,CAAC,KAAK,EAAE,EAAE;oBACP,WAAW,EAAE,CAAC;oBACd,IAAA,yBAAgB,EAAC,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,IAAA,YAAI,EAAC,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;AAjEW,QAAA,iBAAiB,qBAiE5B","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,7 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SchemaDynamicModifier = void 0;
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Class SchemaDynamicModifier
|
|
6
|
+
*
|
|
7
|
+
* Provides a mechanism for dynamic modification of schema node attributes:
|
|
8
|
+
*
|
|
9
|
+
* - `allowedAttrs`: A list of additional attributes to include in the ProseMirror schema with default values.
|
|
10
|
+
* When specified, these attributes are added to the schema and preserved during processing.
|
|
11
|
+
*
|
|
12
|
+
* Example:
|
|
13
|
+
* ```ts
|
|
14
|
+
* const dynamicModifier = new SchemaDynamicModifier({
|
|
15
|
+
* paragraph: {
|
|
16
|
+
* allowedAttrs: ['data-paragraph'],
|
|
17
|
+
* },
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
5
21
|
class SchemaDynamicModifier {
|
|
6
22
|
nodeSpecsProcessors;
|
|
7
23
|
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,MAAa,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;AAnCD,sDAmCC","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 {};
|
|
@@ -50,15 +50,15 @@ class MarkdownParser {
|
|
|
50
50
|
matchLinks(text) {
|
|
51
51
|
return this.tokenizer.linkify.match(text);
|
|
52
52
|
}
|
|
53
|
-
parse(
|
|
53
|
+
parse(src) {
|
|
54
54
|
const time = Date.now();
|
|
55
55
|
try {
|
|
56
56
|
this.stack = [{ type: this.schema.topNodeType, content: [] }];
|
|
57
57
|
let mdItTokens;
|
|
58
58
|
try {
|
|
59
|
-
mdItTokens = this.tokenizer.parse(
|
|
59
|
+
mdItTokens = typeof src === 'string' ? this.tokenizer.parse(src, {}) : src;
|
|
60
60
|
if (this.dynamicModifier) {
|
|
61
|
-
mdItTokens = this.dynamicModifier.processTokens(mdItTokens,
|
|
61
|
+
mdItTokens = this.dynamicModifier.processTokens(mdItTokens, typeof src === 'string' ? src : null);
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
catch (err) {
|
|
@@ -293,7 +293,57 @@ function maybeMerge(a, b) {
|
|
|
293
293
|
function withoutTrailingNewline(str) {
|
|
294
294
|
return str[str.length - 1] === '\n' || str.endsWith('\\n') ? str.slice(0, str.length - 1) : str;
|
|
295
295
|
}
|
|
296
|
-
/**
|
|
296
|
+
/**
|
|
297
|
+
* Class MarkdownParserDynamicModifier
|
|
298
|
+
*
|
|
299
|
+
* Provides a mechanism for dynamic modification of tokens and node attributes during parsing by a MarkdownParser.
|
|
300
|
+
* It allows sequential processing of element types by applying a series of custom handlers:
|
|
301
|
+
*
|
|
302
|
+
* - `processToken`: An array of handlers that process tokens sequentially, each passing the result to the next.
|
|
303
|
+
*
|
|
304
|
+
* - `processNodeAttrs`: An array of handlers that modify and process node attributes.
|
|
305
|
+
*
|
|
306
|
+
* - `processNode`: An array of handlers that process and modify the resulting ProseMirror nodes.
|
|
307
|
+
*
|
|
308
|
+
* Example:
|
|
309
|
+
* ```ts
|
|
310
|
+
* const dynamicModifier = new MarkdownParserDynamicModifier({
|
|
311
|
+
* paragraph: {
|
|
312
|
+
* processToken: [
|
|
313
|
+
* (token, index, rawMarkup, allowedAttrs) => {
|
|
314
|
+
* token.attrSet('data-prefix', 'prefix-value');
|
|
315
|
+
* return token;
|
|
316
|
+
* },
|
|
317
|
+
* (token) => {
|
|
318
|
+
* console.log(`Processing token: ${token.type}`);
|
|
319
|
+
* return token;
|
|
320
|
+
* },
|
|
321
|
+
* ],
|
|
322
|
+
* processNodeAttrs: [
|
|
323
|
+
* (token, attrs) => {
|
|
324
|
+
* attrs['data-paragraph'] = token.attrGet('data-prefix');
|
|
325
|
+
* return attrs;
|
|
326
|
+
* },
|
|
327
|
+
* (token, attrs) => {
|
|
328
|
+
* console.log(`Processing attrs for token: ${token.type}`);
|
|
329
|
+
* return attrs;
|
|
330
|
+
* },
|
|
331
|
+
* ],
|
|
332
|
+
* processNode: [
|
|
333
|
+
* (node) => {
|
|
334
|
+
* console.log(`Processing node: ${node.type}`);
|
|
335
|
+
* return node;
|
|
336
|
+
* },
|
|
337
|
+
* ],
|
|
338
|
+
* },
|
|
339
|
+
* });
|
|
340
|
+
* ```
|
|
341
|
+
*
|
|
342
|
+
* This class extends the functionality of a MarkdownParser for scenarios such as:
|
|
343
|
+
* - Adding default attributes to specific elements.
|
|
344
|
+
* - Modifying token metadata.
|
|
345
|
+
* - Logging or customizing processing steps for debugging.
|
|
346
|
+
*/
|
|
297
347
|
class MarkdownParserDynamicModifier {
|
|
298
348
|
elementProcessors;
|
|
299
349
|
constructor(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownParser.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownParser.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type MarkdownIt from 'markdown-it';\nimport type Token from 'markdown-it/lib/token';\nimport {Mark, type MarkType, type Node, type NodeType, type Schema} from 'prosemirror-model';\n\nimport {type Logger2, logger} from '../../logger';\nimport type {Parser, ParserToken} from '../types/parser';\n\nimport {ProseMirrorTransformer, type TransformFn} from './ProseMirrorTransformer';\n\nexport type TokenAttrs = {[name: string]: unknown};\n\nconst openSuffix = '_open';\nconst closeSuffix = '_close';\nenum TokenType {\n open = 'open',\n close = 'close',\n default = 'default',\n}\n\n/**\n * Remove suffixes from the node name.\n * Crops specified `openSuffix` and `closeSuffix` from the end of the given `tokName`.\n */\nfunction cropNodeName(tokName: string, openSuffix: string, closeSuffix: string): string {\n const regex = new RegExp(`(${openSuffix})$|(${closeSuffix})$`);\n return tokName.replace(regex, '');\n}\n\ntype MarkdownParserOptions = {\n logger: Logger2.ILogger;\n pmTransformers: TransformFn[];\n dynamicModifier?: MarkdownParserDynamicModifier;\n};\n\nexport class MarkdownParser implements Parser {\n schema: Schema;\n stack: Array<{type: NodeType; attrs?: TokenAttrs; content: Array<Node>}> = [];\n marks: readonly Mark[];\n tokens: Record<string, ParserToken>;\n tokenizer: MarkdownIt;\n pmTransformers: TransformFn[];\n dynamicModifier: MarkdownParserDynamicModifier | null;\n\n private logger: Logger2.ILogger;\n\n constructor(\n schema: Schema,\n tokenizer: MarkdownIt,\n tokens: Record<string, ParserToken>,\n opts: MarkdownParserOptions,\n ) {\n this.schema = schema;\n\n this.marks = Mark.none;\n this.tokens = tokens;\n this.tokenizer = tokenizer;\n this.pmTransformers = opts.pmTransformers;\n this.dynamicModifier = opts.dynamicModifier ?? null;\n\n this.logger = opts.logger.nested({module: 'markdown-parser'});\n }\n\n validateLink(url: string): boolean {\n return this.tokenizer.validateLink(url);\n }\n\n normalizeLink(url: string): string {\n return this.tokenizer.normalizeLink(url);\n }\n\n normalizeLinkText(url: string): string {\n return this.tokenizer.normalizeLinkText(url);\n }\n\n matchLinks(text: string): Readonly<Match>[] | null {\n return this.tokenizer.linkify.match(text);\n }\n\n parse(text: string) {\n const time = Date.now();\n\n try {\n this.stack = [{type: this.schema.topNodeType, content: []}];\n\n let mdItTokens;\n try {\n mdItTokens = this.tokenizer.parse(text, {});\n if (this.dynamicModifier) {\n mdItTokens = this.dynamicModifier.processTokens(mdItTokens, text);\n }\n } catch (err) {\n const e = err as Error;\n e.message = 'Unable to parse your markup. Please check for errors. ' + e.message;\n this.logger.error(e);\n throw e;\n }\n\n this.parseTokens(mdItTokens);\n\n let doc;\n\n // If after parsing there are still unclosed nodes, close them by removing them from the stack.\n do {\n doc = this.closeNode();\n } while (this.stack.length);\n\n const pmTransformer = new ProseMirrorTransformer(this.pmTransformers);\n\n return doc ? pmTransformer.transform(doc) : this.schema.topNodeType.createAndFill()!;\n } finally {\n logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n this.logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n }\n }\n\n private top() {\n return this.stack[this.stack.length - 1];\n }\n\n private push(elt: Node) {\n if (this.stack.length) this.top().content.push(elt);\n }\n\n //#region helpers\n\n private getTokenAttrs(\n token: Token,\n tokenSpec: ParserToken,\n tokenStream: Token[],\n i: number,\n ): TokenAttrs | undefined {\n let attrs: TokenAttrs | undefined = {};\n\n if (tokenSpec.getAttrs) {\n attrs = tokenSpec.getAttrs(token, tokenStream, i);\n } else if (tokenSpec.attrs instanceof Function) {\n attrs = tokenSpec.attrs(token);\n } else {\n attrs = tokenSpec.attrs;\n }\n\n if (this.dynamicModifier) {\n attrs = this.dynamicModifier.processAttrs(token, attrs ?? {});\n }\n\n return attrs;\n }\n\n private getTokenSpec(token: Token) {\n // Matching the pm-node meta-attribute which is set in the plugin for markdown-it\n let tokName = (token.meta?.['pm-node'] as string) || token.type;\n\n // Cropping _open and _close from node name end\n // e.g. paragraph_open -> paragraph\n tokName = cropNodeName(tokName, openSuffix, closeSuffix);\n\n let tokenSpec: ParserToken | undefined;\n if (tokName in this.tokens) {\n tokenSpec = this.tokens[tokName];\n }\n\n if (!tokenSpec) {\n throw new RangeError(`No token spec for token: ${JSON.stringify(token)}`);\n }\n\n return tokenSpec;\n }\n\n // Getting token type from its name\n // e.g. \"paragraph_open\" - is opening token for paragraph\n private getTokenType({type}: Token): keyof typeof TokenType {\n if (type.endsWith(openSuffix)) return TokenType.open;\n if (type.endsWith(closeSuffix)) return TokenType.close;\n\n return TokenType.default;\n }\n\n //#endregion\n\n //#region token handlers\n\n // Self-explanatory\n private handlePrimitiveToken(token: Token) {\n switch (token.type) {\n case 'text':\n this.addText(withoutTrailingNewline(token.content));\n return true;\n case 'inline':\n this.parseTokens(token.children || []);\n return true;\n case 'softbreak':\n // TODO: move all primitive token's handlers to extensions\n if (this.tokens.softbreak) return false;\n this.addText('\\n');\n return true;\n }\n\n return false;\n }\n\n private handleMark(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.schema.marks[tokenSpec.name];\n\n if (tokenSpec.noCloseToken) {\n this.openMark(schemaSpec.create(attrs));\n let {content} = token;\n if (!tokenSpec.code) content = withoutTrailingNewline(content);\n this.addText(content);\n this.closeMark(schemaSpec);\n\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openMark(schemaSpec.create(attrs));\n\n break;\n }\n case 'close': {\n this.closeMark(schemaSpec);\n\n break;\n }\n }\n }\n\n private getNodeSchema(tokenSpec: ParserToken) {\n const spec = this.schema.nodes[tokenSpec.name];\n return spec;\n }\n\n private handleNode(_token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n // Adding node as is, becasuse it doesn't contain content.\n this.addNode(schemaSpec, attrs);\n }\n\n private handleBlock(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n if (tokenSpec.noCloseToken) {\n this.openNode(schemaSpec, attrs);\n\n if (tokenSpec.contentField === 'children' && token.children?.length) {\n this.parseTokens(token.children);\n } else {\n let {content} = token;\n if (tokenSpec.prepareContent) {\n content = tokenSpec.prepareContent(content);\n }\n this.addText(content);\n }\n\n this.closeNode();\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openNode(schemaSpec, attrs);\n\n break;\n }\n case 'close': {\n this.closeNode();\n\n break;\n }\n }\n }\n\n private handleToken(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n switch (tokenSpec.type) {\n case 'mark':\n this.handleMark(token, tokenSpec, attrs);\n break;\n case 'node':\n this.handleNode(token, tokenSpec, attrs);\n break;\n case 'block':\n this.handleBlock(token, tokenSpec, attrs);\n break;\n }\n }\n\n //#endregion\n\n //#region state methods\n\n private addNode(type: NodeType, attrs?: Object, content?: Node[]) {\n let node = type.createAndFill(attrs, content, this.marks);\n if (!node) {\n return null;\n }\n\n if (this.dynamicModifier) {\n node = this.dynamicModifier.processNodes(node);\n }\n\n this.push(node);\n\n return node;\n }\n\n private openNode(type: NodeType, attrs?: TokenAttrs) {\n this.stack.push({type: type, attrs, content: []});\n }\n\n private closeNode() {\n // Marks operate within a node. Therefore, when we close the node, we reset the existing marks.\n if (this.marks.length) {\n this.marks = Mark.none;\n }\n\n const info = this.stack.pop();\n if (info) {\n return this.addNode(info.type, info.attrs, info.content);\n }\n\n return null;\n }\n\n private addText(text: string) {\n if (!text) return;\n const nodes = this.top().content;\n const last = nodes[nodes.length - 1];\n const node = this.schema.text(text, this.marks);\n let merged;\n if (last && (merged = maybeMerge(last, node))) nodes[nodes.length - 1] = merged;\n else nodes.push(node);\n }\n\n // Adding mark to a set of open marks\n private openMark(mark: Mark) {\n this.marks = mark.addToSet(this.marks);\n }\n\n private closeMark(mark: MarkType) {\n this.marks = mark.removeFromSet(this.marks);\n }\n\n //#endregion\n\n private parseTokens(tokens: Token[]) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (this.handlePrimitiveToken(token)) continue;\n\n const tokenSpec = this.getTokenSpec(token);\n\n if (tokenSpec.ignore) continue;\n\n const attrs = this.getTokenAttrs(token, tokenSpec, tokens, i);\n\n this.handleToken(token, tokenSpec, attrs);\n }\n }\n}\n\n// Checking if these are two text nodes and they have the same marks, then it merges them into one.\nfunction maybeMerge(a: Node, b: Node) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n // Somehow this method is not in typings but it exists.\n // @ts-expect-error\n return a.withText(a.text + b.text);\n }\n}\n\nfunction withoutTrailingNewline(str: string) {\n return str[str.length - 1] === '\\n' || str.endsWith('\\\\n') ? str.slice(0, str.length - 1) : str;\n}\n\n/**\n * Class MarkdownParserDynamicModifier\n *\n * Provides a mechanism for dynamic modification of tokens and node attributes during parsing by a MarkdownParser.\n * It allows sequential processing of element types by applying a series of custom handlers:\n *\n * - `processToken`: An array of handlers that process tokens sequentially, each passing the result to the next.\n *\n * - `processNodeAttrs`: An array of handlers that modify and process node attributes.\n *\n * - `processNode`: An array of handlers that process and modify the resulting ProseMirror nodes.\n *\n * Example:\n * ```ts\n * const dynamicModifier = new MarkdownParserDynamicModifier({\n * paragraph: {\n * processToken: [\n * (token, index, rawMarkup, allowedAttrs) => {\n * token.attrSet('data-prefix', 'prefix-value');\n * return token;\n * },\n * (token) => {\n * console.log(`Processing token: ${token.type}`);\n * return token;\n * },\n * ],\n * processNodeAttrs: [\n * (token, attrs) => {\n * attrs['data-paragraph'] = token.attrGet('data-prefix');\n * return attrs;\n * },\n * (token, attrs) => {\n * console.log(`Processing attrs for token: ${token.type}`);\n * return attrs;\n * },\n * ],\n * processNode: [\n * (node) => {\n * console.log(`Processing node: ${node.type}`);\n * return node;\n * },\n * ],\n * },\n * });\n * ```\n *\n * This class extends the functionality of a MarkdownParser for scenarios such as:\n * - Adding default attributes to specific elements.\n * - Modifying token metadata.\n * - Logging or customizing processing steps for debugging.\n */\n\n/** @internal */\nexport type ProcessToken = (\n token: Token,\n index: number,\n rawMarkup: string,\n allowedAttrs?: string[],\n) => Token;\nexport type ProcessNodeAttrs = (\n token: Token,\n attrs: TokenAttrs,\n allowedAttrs?: string[],\n) => TokenAttrs;\nexport type ProcessNode = (node: Node) => Node;\n\n/** @internal */\nexport interface ElementProcessor {\n processToken?: ProcessToken[];\n processNodeAttrs?: ProcessNodeAttrs[];\n processNode?: ProcessNode[];\n}\n\n/** @internal */\nexport interface MarkdownParserDynamicModifierConfig {\n [elementType: string]: ElementProcessor;\n}\n\n/** @internal */\nexport class MarkdownParserDynamicModifier {\n private elementProcessors: Map<string, ElementProcessor>;\n\n constructor(config: MarkdownParserDynamicModifierConfig) {\n this.elementProcessors = new Map(Object.entries(config));\n }\n\n processTokens(tokens: Token[], rawMarkup: string): Token[] {\n return tokens.map((token, index) => {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processToken || processor.processToken.length === 0) {\n return token;\n }\n\n return processor.processToken.reduce((currentToken, process) => {\n return process(currentToken, index, rawMarkup);\n }, token);\n });\n }\n\n processAttrs(token: Token, attrs: TokenAttrs): TokenAttrs {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processNodeAttrs || processor.processNodeAttrs.length === 0) {\n return attrs;\n }\n\n return processor.processNodeAttrs.reduce((currentAttrs, process) => {\n return process(token, currentAttrs);\n }, attrs);\n }\n\n processNodes(node: Node): Node {\n const processor = this.elementProcessors.get(node.type.name);\n if (!processor || !processor.processNode || processor.processNode.length === 0) {\n return node;\n }\n\n return processor.processNode.reduce((currentNode, process) => {\n return process(currentNode);\n }, node);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MarkdownParser.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownParser.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type MarkdownIt from 'markdown-it';\nimport type Token from 'markdown-it/lib/token';\nimport {Mark, type MarkType, type Node, type NodeType, type Schema} from 'prosemirror-model';\n\nimport {type Logger2, logger} from '../../logger';\nimport type {Parser, ParserToken} from '../types/parser';\n\nimport {ProseMirrorTransformer, type TransformFn} from './ProseMirrorTransformer';\n\nexport type TokenAttrs = {[name: string]: unknown};\n\nconst openSuffix = '_open';\nconst closeSuffix = '_close';\nenum TokenType {\n open = 'open',\n close = 'close',\n default = 'default',\n}\n\n/**\n * Remove suffixes from the node name.\n * Crops specified `openSuffix` and `closeSuffix` from the end of the given `tokName`.\n */\nfunction cropNodeName(tokName: string, openSuffix: string, closeSuffix: string): string {\n const regex = new RegExp(`(${openSuffix})$|(${closeSuffix})$`);\n return tokName.replace(regex, '');\n}\n\ntype MarkdownParserOptions = {\n logger: Logger2.ILogger;\n pmTransformers: TransformFn[];\n dynamicModifier?: MarkdownParserDynamicModifier;\n};\n\nexport class MarkdownParser implements Parser {\n schema: Schema;\n stack: Array<{type: NodeType; attrs?: TokenAttrs; content: Array<Node>}> = [];\n marks: readonly Mark[];\n tokens: Record<string, ParserToken>;\n tokenizer: MarkdownIt;\n pmTransformers: TransformFn[];\n dynamicModifier: MarkdownParserDynamicModifier | null;\n\n private logger: Logger2.ILogger;\n\n constructor(\n schema: Schema,\n tokenizer: MarkdownIt,\n tokens: Record<string, ParserToken>,\n opts: MarkdownParserOptions,\n ) {\n this.schema = schema;\n\n this.marks = Mark.none;\n this.tokens = tokens;\n this.tokenizer = tokenizer;\n this.pmTransformers = opts.pmTransformers;\n this.dynamicModifier = opts.dynamicModifier ?? null;\n\n this.logger = opts.logger.nested({module: 'markdown-parser'});\n }\n\n validateLink(url: string): boolean {\n return this.tokenizer.validateLink(url);\n }\n\n normalizeLink(url: string): string {\n return this.tokenizer.normalizeLink(url);\n }\n\n normalizeLinkText(url: string): string {\n return this.tokenizer.normalizeLinkText(url);\n }\n\n matchLinks(text: string): Readonly<Match>[] | null {\n return this.tokenizer.linkify.match(text);\n }\n\n parse(src: string): Node;\n parse(tokens: Token[]): Node;\n parse(src: string | Token[]) {\n const time = Date.now();\n\n try {\n this.stack = [{type: this.schema.topNodeType, content: []}];\n\n let mdItTokens;\n try {\n mdItTokens = typeof src === 'string' ? this.tokenizer.parse(src, {}) : src;\n if (this.dynamicModifier) {\n mdItTokens = this.dynamicModifier.processTokens(\n mdItTokens,\n typeof src === 'string' ? src : null,\n );\n }\n } catch (err) {\n const e = err as Error;\n e.message = 'Unable to parse your markup. Please check for errors. ' + e.message;\n this.logger.error(e);\n throw e;\n }\n\n this.parseTokens(mdItTokens);\n\n let doc;\n\n // If after parsing there are still unclosed nodes, close them by removing them from the stack.\n do {\n doc = this.closeNode();\n } while (this.stack.length);\n\n const pmTransformer = new ProseMirrorTransformer(this.pmTransformers);\n\n return doc ? pmTransformer.transform(doc) : this.schema.topNodeType.createAndFill()!;\n } finally {\n logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n this.logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n }\n }\n\n private top() {\n return this.stack[this.stack.length - 1];\n }\n\n private push(elt: Node) {\n if (this.stack.length) this.top().content.push(elt);\n }\n\n //#region helpers\n\n private getTokenAttrs(\n token: Token,\n tokenSpec: ParserToken,\n tokenStream: Token[],\n i: number,\n ): TokenAttrs | undefined {\n let attrs: TokenAttrs | undefined = {};\n\n if (tokenSpec.getAttrs) {\n attrs = tokenSpec.getAttrs(token, tokenStream, i);\n } else if (tokenSpec.attrs instanceof Function) {\n attrs = tokenSpec.attrs(token);\n } else {\n attrs = tokenSpec.attrs;\n }\n\n if (this.dynamicModifier) {\n attrs = this.dynamicModifier.processAttrs(token, attrs ?? {});\n }\n\n return attrs;\n }\n\n private getTokenSpec(token: Token) {\n // Matching the pm-node meta-attribute which is set in the plugin for markdown-it\n let tokName = (token.meta?.['pm-node'] as string) || token.type;\n\n // Cropping _open and _close from node name end\n // e.g. paragraph_open -> paragraph\n tokName = cropNodeName(tokName, openSuffix, closeSuffix);\n\n let tokenSpec: ParserToken | undefined;\n if (tokName in this.tokens) {\n tokenSpec = this.tokens[tokName];\n }\n\n if (!tokenSpec) {\n throw new RangeError(`No token spec for token: ${JSON.stringify(token)}`);\n }\n\n return tokenSpec;\n }\n\n // Getting token type from its name\n // e.g. \"paragraph_open\" - is opening token for paragraph\n private getTokenType({type}: Token): keyof typeof TokenType {\n if (type.endsWith(openSuffix)) return TokenType.open;\n if (type.endsWith(closeSuffix)) return TokenType.close;\n\n return TokenType.default;\n }\n\n //#endregion\n\n //#region token handlers\n\n // Self-explanatory\n private handlePrimitiveToken(token: Token) {\n switch (token.type) {\n case 'text':\n this.addText(withoutTrailingNewline(token.content));\n return true;\n case 'inline':\n this.parseTokens(token.children || []);\n return true;\n case 'softbreak':\n // TODO: move all primitive token's handlers to extensions\n if (this.tokens.softbreak) return false;\n this.addText('\\n');\n return true;\n }\n\n return false;\n }\n\n private handleMark(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.schema.marks[tokenSpec.name];\n\n if (tokenSpec.noCloseToken) {\n this.openMark(schemaSpec.create(attrs));\n let {content} = token;\n if (!tokenSpec.code) content = withoutTrailingNewline(content);\n this.addText(content);\n this.closeMark(schemaSpec);\n\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openMark(schemaSpec.create(attrs));\n\n break;\n }\n case 'close': {\n this.closeMark(schemaSpec);\n\n break;\n }\n }\n }\n\n private getNodeSchema(tokenSpec: ParserToken) {\n const spec = this.schema.nodes[tokenSpec.name];\n return spec;\n }\n\n private handleNode(_token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n // Adding node as is, becasuse it doesn't contain content.\n this.addNode(schemaSpec, attrs);\n }\n\n private handleBlock(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n if (tokenSpec.noCloseToken) {\n this.openNode(schemaSpec, attrs);\n\n if (tokenSpec.contentField === 'children' && token.children?.length) {\n this.parseTokens(token.children);\n } else {\n let {content} = token;\n if (tokenSpec.prepareContent) {\n content = tokenSpec.prepareContent(content);\n }\n this.addText(content);\n }\n\n this.closeNode();\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openNode(schemaSpec, attrs);\n\n break;\n }\n case 'close': {\n this.closeNode();\n\n break;\n }\n }\n }\n\n private handleToken(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n switch (tokenSpec.type) {\n case 'mark':\n this.handleMark(token, tokenSpec, attrs);\n break;\n case 'node':\n this.handleNode(token, tokenSpec, attrs);\n break;\n case 'block':\n this.handleBlock(token, tokenSpec, attrs);\n break;\n }\n }\n\n //#endregion\n\n //#region state methods\n\n private addNode(type: NodeType, attrs?: Object, content?: Node[]) {\n let node = type.createAndFill(attrs, content, this.marks);\n if (!node) {\n return null;\n }\n\n if (this.dynamicModifier) {\n node = this.dynamicModifier.processNodes(node);\n }\n\n this.push(node);\n\n return node;\n }\n\n private openNode(type: NodeType, attrs?: TokenAttrs) {\n this.stack.push({type: type, attrs, content: []});\n }\n\n private closeNode() {\n // Marks operate within a node. Therefore, when we close the node, we reset the existing marks.\n if (this.marks.length) {\n this.marks = Mark.none;\n }\n\n const info = this.stack.pop();\n if (info) {\n return this.addNode(info.type, info.attrs, info.content);\n }\n\n return null;\n }\n\n private addText(text: string) {\n if (!text) return;\n const nodes = this.top().content;\n const last = nodes[nodes.length - 1];\n const node = this.schema.text(text, this.marks);\n let merged;\n if (last && (merged = maybeMerge(last, node))) nodes[nodes.length - 1] = merged;\n else nodes.push(node);\n }\n\n // Adding mark to a set of open marks\n private openMark(mark: Mark) {\n this.marks = mark.addToSet(this.marks);\n }\n\n private closeMark(mark: MarkType) {\n this.marks = mark.removeFromSet(this.marks);\n }\n\n //#endregion\n\n private parseTokens(tokens: Token[]) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (this.handlePrimitiveToken(token)) continue;\n\n const tokenSpec = this.getTokenSpec(token);\n\n if (tokenSpec.ignore) continue;\n\n const attrs = this.getTokenAttrs(token, tokenSpec, tokens, i);\n\n this.handleToken(token, tokenSpec, attrs);\n }\n }\n}\n\n// Checking if these are two text nodes and they have the same marks, then it merges them into one.\nfunction maybeMerge(a: Node, b: Node) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n // Somehow this method is not in typings but it exists.\n // @ts-expect-error\n return a.withText(a.text + b.text);\n }\n}\n\nfunction withoutTrailingNewline(str: string) {\n return str[str.length - 1] === '\\n' || str.endsWith('\\\\n') ? str.slice(0, str.length - 1) : str;\n}\n\nexport type ProcessToken = (\n token: Token,\n index: number,\n rawMarkup: string | null,\n allowedAttrs?: string[],\n) => Token;\nexport type ProcessNodeAttrs = (\n token: Token,\n attrs: TokenAttrs,\n allowedAttrs?: string[],\n) => TokenAttrs;\nexport type ProcessNode = (node: Node) => Node;\n\nexport interface ElementProcessor {\n processToken?: ProcessToken[];\n processNodeAttrs?: ProcessNodeAttrs[];\n processNode?: ProcessNode[];\n}\n\nexport interface MarkdownParserDynamicModifierConfig {\n [elementType: string]: ElementProcessor;\n}\n\n/**\n * Class MarkdownParserDynamicModifier\n *\n * Provides a mechanism for dynamic modification of tokens and node attributes during parsing by a MarkdownParser.\n * It allows sequential processing of element types by applying a series of custom handlers:\n *\n * - `processToken`: An array of handlers that process tokens sequentially, each passing the result to the next.\n *\n * - `processNodeAttrs`: An array of handlers that modify and process node attributes.\n *\n * - `processNode`: An array of handlers that process and modify the resulting ProseMirror nodes.\n *\n * Example:\n * ```ts\n * const dynamicModifier = new MarkdownParserDynamicModifier({\n * paragraph: {\n * processToken: [\n * (token, index, rawMarkup, allowedAttrs) => {\n * token.attrSet('data-prefix', 'prefix-value');\n * return token;\n * },\n * (token) => {\n * console.log(`Processing token: ${token.type}`);\n * return token;\n * },\n * ],\n * processNodeAttrs: [\n * (token, attrs) => {\n * attrs['data-paragraph'] = token.attrGet('data-prefix');\n * return attrs;\n * },\n * (token, attrs) => {\n * console.log(`Processing attrs for token: ${token.type}`);\n * return attrs;\n * },\n * ],\n * processNode: [\n * (node) => {\n * console.log(`Processing node: ${node.type}`);\n * return node;\n * },\n * ],\n * },\n * });\n * ```\n *\n * This class extends the functionality of a MarkdownParser for scenarios such as:\n * - Adding default attributes to specific elements.\n * - Modifying token metadata.\n * - Logging or customizing processing steps for debugging.\n */\nexport class MarkdownParserDynamicModifier {\n private elementProcessors: Map<string, ElementProcessor>;\n\n constructor(config: MarkdownParserDynamicModifierConfig) {\n this.elementProcessors = new Map(Object.entries(config));\n }\n\n processTokens(tokens: Token[], rawMarkup: string | null): Token[] {\n return tokens.map((token, index) => {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processToken || processor.processToken.length === 0) {\n return token;\n }\n\n return processor.processToken.reduce((currentToken, process) => {\n return process(currentToken, index, rawMarkup);\n }, token);\n });\n }\n\n processAttrs(token: Token, attrs: TokenAttrs): TokenAttrs {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processNodeAttrs || processor.processNodeAttrs.length === 0) {\n return attrs;\n }\n\n return processor.processNodeAttrs.reduce((currentAttrs, process) => {\n return process(token, currentAttrs);\n }, attrs);\n }\n\n processNodes(node: Node): Node {\n const processor = this.elementProcessors.get(node.type.name);\n if (!processor || !processor.processNode || processor.processNode.length === 0) {\n return node;\n }\n\n return processor.processNode.reduce((currentNode, process) => {\n return process(currentNode);\n }, node);\n }\n}\n"]}
|
|
@@ -1 +1,40 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Node } from 'prosemirror-model';
|
|
2
|
+
import type { SerializerNodeToken, SerializerState } from "../types/serializer.js";
|
|
3
|
+
export type SerializerProcessNode = (state: SerializerState, node: Node, parent: Node, index: number, callback?: SerializerNodeToken) => void;
|
|
4
|
+
export interface SerializerNodeProcessor {
|
|
5
|
+
processNode?: SerializerProcessNode[];
|
|
6
|
+
}
|
|
7
|
+
export interface MarkdownSerializerDynamicModifierConfig {
|
|
8
|
+
[nodeType: string]: SerializerNodeProcessor;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Class MarkdownSerializerDynamicModifier
|
|
12
|
+
*
|
|
13
|
+
* Provides a mechanism for dynamic modification of node serialization during conversion of ProseMirror nodes
|
|
14
|
+
* to a markdown-like format. It allows sequential processing of nodes by applying a series of custom handlers:
|
|
15
|
+
*
|
|
16
|
+
* - `processNode`: An array of handlers that process nodes sequentially, each modifying the output.
|
|
17
|
+
*
|
|
18
|
+
* Example:
|
|
19
|
+
* ```ts
|
|
20
|
+
* const serializerModifier = new MarkdownSerializerDynamicModifier({
|
|
21
|
+
* paragraph: {
|
|
22
|
+
* processNode: [
|
|
23
|
+
* (state, node, parent, index, callback) => {
|
|
24
|
+
* // Custom modifications can be performed here.
|
|
25
|
+
* callback(state, node, parent, index);
|
|
26
|
+
* },
|
|
27
|
+
* ],
|
|
28
|
+
* },
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* This class extends the functionality of a MarkdownSerializer for scenarios such as:
|
|
33
|
+
* - Customizing the serialization output.
|
|
34
|
+
* - Logging or modifying node content during serialization.
|
|
35
|
+
*/
|
|
36
|
+
export declare class MarkdownSerializerDynamicModifier {
|
|
37
|
+
private nodeProcessors;
|
|
38
|
+
constructor(config: MarkdownSerializerDynamicModifierConfig);
|
|
39
|
+
processNode(state: SerializerState, node: Node, parent: Node, index: number, callback: SerializerNodeToken): void;
|
|
40
|
+
}
|
|
@@ -27,7 +27,6 @@ exports.MarkdownSerializerDynamicModifier = void 0;
|
|
|
27
27
|
* - Customizing the serialization output.
|
|
28
28
|
* - Logging or modifying node content during serialization.
|
|
29
29
|
*/
|
|
30
|
-
/** @internal */
|
|
31
30
|
class MarkdownSerializerDynamicModifier {
|
|
32
31
|
nodeProcessors;
|
|
33
32
|
constructor(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownSerializerDynamicModifier.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownSerializerDynamicModifier.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"MarkdownSerializerDynamicModifier.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownSerializerDynamicModifier.ts"],"names":[],"mappings":";;;AAoBA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAa,iCAAiC;IAClC,cAAc,CAAuC;IAE7D,YAAY,MAA+C;QACvD,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,WAAW,CACP,KAAsB,EACtB,IAAU,EACV,MAAY,EACZ,KAAa,EACb,QAA6B;QAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1E,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBACrC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;CACJ;AAxBD,8EAwBC","sourcesContent":["import type {Node} from 'prosemirror-model';\n\nimport type {SerializerNodeToken, SerializerState} from '../types/serializer';\n\nexport type SerializerProcessNode = (\n state: SerializerState,\n node: Node,\n parent: Node,\n index: number,\n callback?: SerializerNodeToken,\n) => void;\n\nexport interface SerializerNodeProcessor {\n processNode?: SerializerProcessNode[];\n}\n\nexport interface MarkdownSerializerDynamicModifierConfig {\n [nodeType: string]: SerializerNodeProcessor;\n}\n\n/**\n * Class MarkdownSerializerDynamicModifier\n *\n * Provides a mechanism for dynamic modification of node serialization during conversion of ProseMirror nodes\n * to a markdown-like format. It allows sequential processing of nodes by applying a series of custom handlers:\n *\n * - `processNode`: An array of handlers that process nodes sequentially, each modifying the output.\n *\n * Example:\n * ```ts\n * const serializerModifier = new MarkdownSerializerDynamicModifier({\n * paragraph: {\n * processNode: [\n * (state, node, parent, index, callback) => {\n * // Custom modifications can be performed here.\n * callback(state, node, parent, index);\n * },\n * ],\n * },\n * });\n * ```\n *\n * This class extends the functionality of a MarkdownSerializer for scenarios such as:\n * - Customizing the serialization output.\n * - Logging or modifying node content during serialization.\n */\nexport class MarkdownSerializerDynamicModifier {\n private nodeProcessors: Map<string, SerializerNodeProcessor>;\n\n constructor(config: MarkdownSerializerDynamicModifierConfig) {\n this.nodeProcessors = new Map(Object.entries(config));\n }\n\n processNode(\n state: SerializerState,\n node: Node,\n parent: Node,\n index: number,\n callback: SerializerNodeToken,\n ): void {\n const nodeType = this.nodeProcessors.get(node.type.name);\n\n if (!nodeType || !nodeType.processNode || nodeType.processNode.length === 0) {\n callback(state, node, parent, index);\n } else {\n nodeType.processNode.forEach((process) => {\n process(state, node, parent, index, callback);\n });\n }\n }\n}\n"]}
|
|
@@ -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
|
+
};
|