@gravity-ui/markdown-editor 15.35.1 → 15.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/core/Editor.js +2 -0
- package/build/cjs/core/Editor.js.map +1 -1
- package/build/cjs/core/index.d.ts +1 -0
- package/build/cjs/core/index.js +3 -1
- package/build/cjs/core/index.js.map +1 -1
- package/build/cjs/core/markdown/MarkdownParser.d.ts +1 -0
- package/build/cjs/core/markdown/MarkdownParser.js +3 -0
- package/build/cjs/core/markdown/MarkdownParser.js.map +1 -1
- package/build/cjs/core/types/parser.d.ts +1 -0
- package/build/cjs/core/types/parser.js.map +1 -1
- package/build/cjs/core/utils/parser.d.ts +3 -0
- package/build/cjs/core/utils/parser.js +12 -0
- package/build/cjs/core/utils/parser.js.map +1 -0
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +3 -0
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
- package/build/cjs/extensions/markdown/Bold/index.js +1 -1
- package/build/cjs/extensions/markdown/Bold/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Code/index.js +1 -1
- package/build/cjs/extensions/markdown/Code/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +75 -66
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +42 -22
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +20 -0
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -1
- package/build/cjs/extensions/markdown/Italic/index.js +1 -1
- package/build/cjs/extensions/markdown/Italic/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Mark/index.js +1 -1
- package/build/cjs/extensions/markdown/Mark/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Strike/index.js +1 -1
- package/build/cjs/extensions/markdown/Strike/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Underline/index.js +1 -1
- package/build/cjs/extensions/markdown/Underline/index.js.map +1 -1
- package/build/cjs/extensions/yfm/Monospace/index.js +1 -1
- package/build/cjs/extensions/yfm/Monospace/index.js.map +1 -1
- package/build/cjs/utils/actions.d.ts +6 -0
- package/build/cjs/utils/actions.js +24 -0
- package/build/cjs/utils/actions.js.map +1 -1
- package/build/cjs/utils/marks.d.ts +6 -0
- package/build/cjs/utils/marks.js +31 -0
- package/build/cjs/utils/marks.js.map +1 -1
- package/build/cjs/utils/transaction.d.ts +1 -0
- package/build/cjs/utils/transaction.js +40 -0
- package/build/cjs/utils/transaction.js.map +1 -0
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/core/Editor.js +2 -0
- package/build/esm/core/Editor.js.map +1 -1
- package/build/esm/core/index.d.ts +1 -0
- package/build/esm/core/index.js +1 -0
- package/build/esm/core/index.js.map +1 -1
- package/build/esm/core/markdown/MarkdownParser.d.ts +1 -0
- package/build/esm/core/markdown/MarkdownParser.js +3 -0
- package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
- package/build/esm/core/types/parser.d.ts +1 -0
- package/build/esm/core/types/parser.js.map +1 -1
- package/build/esm/core/utils/parser.d.ts +3 -0
- package/build/esm/core/utils/parser.js +8 -0
- package/build/esm/core/utils/parser.js.map +1 -0
- package/build/esm/extensions/behavior/SelectionContext/tooltip.js +3 -0
- package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
- package/build/esm/extensions/markdown/Bold/index.js +2 -2
- package/build/esm/extensions/markdown/Bold/index.js.map +1 -1
- package/build/esm/extensions/markdown/Code/index.js +2 -2
- package/build/esm/extensions/markdown/Code/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +75 -66
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +43 -23
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +20 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -1
- package/build/esm/extensions/markdown/Italic/index.js +2 -2
- package/build/esm/extensions/markdown/Italic/index.js.map +1 -1
- package/build/esm/extensions/markdown/Mark/index.js +2 -2
- package/build/esm/extensions/markdown/Mark/index.js.map +1 -1
- package/build/esm/extensions/markdown/Strike/index.js +2 -2
- package/build/esm/extensions/markdown/Strike/index.js.map +1 -1
- package/build/esm/extensions/markdown/Underline/index.js +2 -2
- package/build/esm/extensions/markdown/Underline/index.js.map +1 -1
- package/build/esm/extensions/yfm/Monospace/index.js +2 -2
- package/build/esm/extensions/yfm/Monospace/index.js.map +1 -1
- package/build/esm/utils/actions.d.ts +6 -0
- package/build/esm/utils/actions.js +24 -1
- package/build/esm/utils/actions.js.map +1 -1
- package/build/esm/utils/marks.d.ts +6 -0
- package/build/esm/utils/marks.js +30 -0
- package/build/esm/utils/marks.js.map +1 -1
- package/build/esm/utils/transaction.d.ts +1 -0
- package/build/esm/utils/transaction.js +36 -0
- package/build/esm/utils/transaction.js.map +1 -0
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/package.json +1 -1
package/build/cjs/core/Editor.js
CHANGED
|
@@ -13,6 +13,7 @@ const actions_1 = require("./utils/actions.js");
|
|
|
13
13
|
const dynamicModifiers_1 = require("./utils/dynamicModifiers.js");
|
|
14
14
|
const logger_2 = require("./utils/logger.js");
|
|
15
15
|
const metrics_1 = require("./utils/metrics.js");
|
|
16
|
+
const parser_1 = require("./utils/parser.js");
|
|
16
17
|
class WysiwygEditor {
|
|
17
18
|
#view;
|
|
18
19
|
#serializer;
|
|
@@ -55,6 +56,7 @@ class WysiwygEditor {
|
|
|
55
56
|
dynamicModifiers,
|
|
56
57
|
}, logger);
|
|
57
58
|
plugins.unshift(logger_2.LoggerFacet.of(logger));
|
|
59
|
+
plugins.unshift(parser_1.ParserFacet.of(parser));
|
|
58
60
|
const state = prosemirror_state_1.EditorState.create({
|
|
59
61
|
schema,
|
|
60
62
|
doc: parser.parse(initialContent),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.js","sourceRoot":"../../../src","sources":["core/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type {PresetName} from 'markdown-it';\nimport {EditorState} from 'prosemirror-state';\nimport {EditorView} from 'prosemirror-view';\n\nimport type {CommonEditor, ContentHandler, MarkupString} from '../common';\nimport {Logger2} from '../logger';\n\nimport type {ActionsManager} from './ActionsManager';\nimport {WysiwygContentHandler} from './ContentHandler';\nimport {ExtensionsManager} from './ExtensionsManager';\nimport {SchemaDynamicModifier} from './SchemaDynamicModifier';\nimport {MarkdownParserDynamicModifier} from './markdown/MarkdownParser';\nimport {MarkdownSerializerDynamicModifier} from './markdown/MarkdownSerializerDynamicModifier';\nimport type {TransformFn} from './markdown/ProseMirrorTransformer';\nimport type {ActionStorage} from './types/actions';\nimport type {DynamicModifiers} from './types/dynamicModifiers';\nimport type {Extension} from './types/extension';\nimport type {Parser} from './types/parser';\nimport type {Serializer} from './types/serializer';\nimport {bindActions} from './utils/actions';\nimport {convertDynamicModifiersConfigs} from './utils/dynamicModifiers';\nimport {LoggerFacet} from './utils/logger';\nimport {logTransactionMetrics} from './utils/metrics';\n\ntype OnChange = (editor: WysiwygEditor) => void;\n\nexport type EscapeConfig = {\n commonEscape?: RegExp;\n startOfLineEscape?: RegExp;\n};\n\nexport type WysiwygEditorOptions = {\n domElem?: Element;\n /** markdown markup */\n initialContent?: string;\n extensions?: Extension;\n /** @default 'default' */\n mdPreset?: PresetName;\n allowHTML?: boolean;\n linkify?: boolean;\n pmTransformers?: TransformFn[];\n linkifyTlds?: string | string[];\n escapeConfig?: EscapeConfig;\n /** Call on any state change (move cursor, change selection, etc...) */\n onChange?: OnChange;\n /** Call only if document change */\n onDocChange?: OnChange;\n /** @internal Modifiers adjust the parser and serializer */\n modifiers?: DynamicModifiers[];\n logger?: Logger2.ILogger;\n};\n\nexport class WysiwygEditor implements CommonEditor, ActionStorage {\n #view: EditorView;\n #serializer: Serializer;\n #parser: Parser;\n #actions: ActionsManager;\n #contentHandler: ContentHandler;\n #escapeConfig?: EscapeConfig;\n\n get dom() {\n return this.#view.dom;\n }\n\n get serializer() {\n return this.#serializer;\n }\n\n get parser() {\n return this.#parser;\n }\n\n get actions() {\n return this.#actions.actions;\n }\n\n /** @internal used for prosemirror-dev-tools in demo */\n get view() {\n return this.#view;\n }\n\n constructor({\n domElem,\n initialContent = '',\n extensions = () => {},\n allowHTML,\n mdPreset,\n linkify,\n pmTransformers,\n linkifyTlds,\n escapeConfig,\n onChange,\n onDocChange,\n modifiers,\n logger = new Logger2(),\n }: WysiwygEditorOptions) {\n const dynamicModifiersConfig = modifiers\n ? convertDynamicModifiersConfigs(modifiers)\n : undefined;\n const dynamicModifiers = dynamicModifiersConfig\n ? {\n schema: new SchemaDynamicModifier(dynamicModifiersConfig.schema),\n parser: new MarkdownParserDynamicModifier(dynamicModifiersConfig.parser),\n serializer: new MarkdownSerializerDynamicModifier(\n dynamicModifiersConfig.serializer,\n ),\n }\n : undefined;\n\n const {\n schema,\n markupParser: parser,\n serializer,\n nodeViews,\n markViews,\n plugins,\n rawActions,\n actions,\n } = ExtensionsManager.process(\n extensions,\n {\n // \"breaks\" option only affects the renderer, but not the parser\n mdOpts: {html: allowHTML, linkify, breaks: true, preset: mdPreset},\n linkifyTlds,\n pmTransformers,\n dynamicModifiers,\n },\n logger,\n );\n\n plugins.unshift(LoggerFacet.of(logger));\n\n const state = EditorState.create({\n schema,\n doc: parser.parse(initialContent),\n plugins,\n });\n\n const thisOnChange = () => this.tryOnChange(onChange);\n const thisOnDocChange = () => this.tryOnChange(onDocChange);\n\n this.#view = new EditorView(domElem ?? null, {\n state,\n nodeViews,\n markViews,\n dispatchTransaction(tr) {\n const newState = this.state.apply(tr);\n // @ts-expect-error\n this.updateState(newState);\n thisOnChange();\n if (tr.docChanged) {\n thisOnDocChange();\n }\n logTransactionMetrics(tr, logger);\n },\n });\n this.#actions = actions.setActions(\n bindActions<keyof WysiwygEditor.Actions>(rawActions)(\n this.#view,\n ) as WysiwygEditor.Actions,\n );\n this.#serializer = serializer;\n this.#parser = parser;\n this.#contentHandler = new WysiwygContentHandler(this.#view, parser);\n this.#escapeConfig = escapeConfig;\n }\n\n action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T] {\n return this.#actions.action(actionName);\n }\n\n focus() {\n return this.#view.focus();\n }\n\n hasFocus() {\n return this.#view.hasFocus();\n }\n\n getValue(): MarkupString {\n return this.#serializer.serialize(this.#view.state.doc, this.#escapeConfig);\n }\n\n isEmpty(): boolean {\n const {doc} = this.#view.state;\n return (\n doc.childCount === 1 &&\n doc.firstChild?.type.name === 'paragraph' &&\n doc.firstChild.childCount === 0\n );\n }\n\n clear(): void {\n return this.#contentHandler.clear();\n }\n\n replace(newMarkup: MarkupString): void {\n return this.#contentHandler.replace(newMarkup);\n }\n\n prepend(markup: MarkupString): void {\n return this.#contentHandler.prepend(markup);\n }\n\n append(markup: MarkupString): void {\n return this.#contentHandler.append(markup);\n }\n\n moveCursor(position: 'start' | 'end'): void {\n return this.#contentHandler.moveCursor(position);\n }\n\n destroy() {\n this.#view.destroy();\n }\n\n private tryOnChange(cb?: OnChange) {\n if (cb) {\n try {\n cb(this);\n } catch (err) {\n console.error(err);\n }\n }\n }\n}\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {}\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Editor.js","sourceRoot":"../../../src","sources":["core/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type {PresetName} from 'markdown-it';\nimport {EditorState} from 'prosemirror-state';\nimport {EditorView} from 'prosemirror-view';\n\nimport type {CommonEditor, ContentHandler, MarkupString} from '../common';\nimport {Logger2} from '../logger';\n\nimport type {ActionsManager} from './ActionsManager';\nimport {WysiwygContentHandler} from './ContentHandler';\nimport {ExtensionsManager} from './ExtensionsManager';\nimport {SchemaDynamicModifier} from './SchemaDynamicModifier';\nimport {MarkdownParserDynamicModifier} from './markdown/MarkdownParser';\nimport {MarkdownSerializerDynamicModifier} from './markdown/MarkdownSerializerDynamicModifier';\nimport type {TransformFn} from './markdown/ProseMirrorTransformer';\nimport type {ActionStorage} from './types/actions';\nimport type {DynamicModifiers} from './types/dynamicModifiers';\nimport type {Extension} from './types/extension';\nimport type {Parser} from './types/parser';\nimport type {Serializer} from './types/serializer';\nimport {bindActions} from './utils/actions';\nimport {convertDynamicModifiersConfigs} from './utils/dynamicModifiers';\nimport {LoggerFacet} from './utils/logger';\nimport {logTransactionMetrics} from './utils/metrics';\nimport {ParserFacet} from './utils/parser';\n\ntype OnChange = (editor: WysiwygEditor) => void;\n\nexport type EscapeConfig = {\n commonEscape?: RegExp;\n startOfLineEscape?: RegExp;\n};\n\nexport type WysiwygEditorOptions = {\n domElem?: Element;\n /** markdown markup */\n initialContent?: string;\n extensions?: Extension;\n /** @default 'default' */\n mdPreset?: PresetName;\n allowHTML?: boolean;\n linkify?: boolean;\n pmTransformers?: TransformFn[];\n linkifyTlds?: string | string[];\n escapeConfig?: EscapeConfig;\n /** Call on any state change (move cursor, change selection, etc...) */\n onChange?: OnChange;\n /** Call only if document change */\n onDocChange?: OnChange;\n /** @internal Modifiers adjust the parser and serializer */\n modifiers?: DynamicModifiers[];\n logger?: Logger2.ILogger;\n};\n\nexport class WysiwygEditor implements CommonEditor, ActionStorage {\n #view: EditorView;\n #serializer: Serializer;\n #parser: Parser;\n #actions: ActionsManager;\n #contentHandler: ContentHandler;\n #escapeConfig?: EscapeConfig;\n\n get dom() {\n return this.#view.dom;\n }\n\n get serializer() {\n return this.#serializer;\n }\n\n get parser() {\n return this.#parser;\n }\n\n get actions() {\n return this.#actions.actions;\n }\n\n /** @internal used for prosemirror-dev-tools in demo */\n get view() {\n return this.#view;\n }\n\n constructor({\n domElem,\n initialContent = '',\n extensions = () => {},\n allowHTML,\n mdPreset,\n linkify,\n pmTransformers,\n linkifyTlds,\n escapeConfig,\n onChange,\n onDocChange,\n modifiers,\n logger = new Logger2(),\n }: WysiwygEditorOptions) {\n const dynamicModifiersConfig = modifiers\n ? convertDynamicModifiersConfigs(modifiers)\n : undefined;\n const dynamicModifiers = dynamicModifiersConfig\n ? {\n schema: new SchemaDynamicModifier(dynamicModifiersConfig.schema),\n parser: new MarkdownParserDynamicModifier(dynamicModifiersConfig.parser),\n serializer: new MarkdownSerializerDynamicModifier(\n dynamicModifiersConfig.serializer,\n ),\n }\n : undefined;\n\n const {\n schema,\n markupParser: parser,\n serializer,\n nodeViews,\n markViews,\n plugins,\n rawActions,\n actions,\n } = ExtensionsManager.process(\n extensions,\n {\n // \"breaks\" option only affects the renderer, but not the parser\n mdOpts: {html: allowHTML, linkify, breaks: true, preset: mdPreset},\n linkifyTlds,\n pmTransformers,\n dynamicModifiers,\n },\n logger,\n );\n\n plugins.unshift(LoggerFacet.of(logger));\n plugins.unshift(ParserFacet.of(parser));\n\n const state = EditorState.create({\n schema,\n doc: parser.parse(initialContent),\n plugins,\n });\n\n const thisOnChange = () => this.tryOnChange(onChange);\n const thisOnDocChange = () => this.tryOnChange(onDocChange);\n\n this.#view = new EditorView(domElem ?? null, {\n state,\n nodeViews,\n markViews,\n dispatchTransaction(tr) {\n const newState = this.state.apply(tr);\n // @ts-expect-error\n this.updateState(newState);\n thisOnChange();\n if (tr.docChanged) {\n thisOnDocChange();\n }\n logTransactionMetrics(tr, logger);\n },\n });\n this.#actions = actions.setActions(\n bindActions<keyof WysiwygEditor.Actions>(rawActions)(\n this.#view,\n ) as WysiwygEditor.Actions,\n );\n this.#serializer = serializer;\n this.#parser = parser;\n this.#contentHandler = new WysiwygContentHandler(this.#view, parser);\n this.#escapeConfig = escapeConfig;\n }\n\n action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T] {\n return this.#actions.action(actionName);\n }\n\n focus() {\n return this.#view.focus();\n }\n\n hasFocus() {\n return this.#view.hasFocus();\n }\n\n getValue(): MarkupString {\n return this.#serializer.serialize(this.#view.state.doc, this.#escapeConfig);\n }\n\n isEmpty(): boolean {\n const {doc} = this.#view.state;\n return (\n doc.childCount === 1 &&\n doc.firstChild?.type.name === 'paragraph' &&\n doc.firstChild.childCount === 0\n );\n }\n\n clear(): void {\n return this.#contentHandler.clear();\n }\n\n replace(newMarkup: MarkupString): void {\n return this.#contentHandler.replace(newMarkup);\n }\n\n prepend(markup: MarkupString): void {\n return this.#contentHandler.prepend(markup);\n }\n\n append(markup: MarkupString): void {\n return this.#contentHandler.append(markup);\n }\n\n moveCursor(position: 'start' | 'end'): void {\n return this.#contentHandler.moveCursor(position);\n }\n\n destroy() {\n this.#view.destroy();\n }\n\n private tryOnChange(cb?: OnChange) {\n if (cb) {\n try {\n cb(this);\n } catch (err) {\n console.error(err);\n }\n }\n }\n}\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {}\n }\n}\n"]}
|
|
@@ -3,6 +3,7 @@ export * from "./ExtensionBuilder.js";
|
|
|
3
3
|
export * from "./ExtensionsManager.js";
|
|
4
4
|
export { bindActions } from "./utils/actions.js";
|
|
5
5
|
export { getLoggerFromState } from "./utils/logger.js";
|
|
6
|
+
export { getParserFromState } from "./utils/parser.js";
|
|
6
7
|
export { trackTransactionMetrics } from "./utils/metrics.js";
|
|
7
8
|
export type { Keymap } from "./types/keymap.js";
|
|
8
9
|
export type { ActionSpec, Action, ActionStorage, CommandWithAttrs } from "./types/actions.js";
|
package/build/cjs/core/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.trackTransactionMetrics = exports.getLoggerFromState = exports.bindActions = void 0;
|
|
3
|
+
exports.trackTransactionMetrics = exports.getParserFromState = exports.getLoggerFromState = exports.bindActions = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
tslib_1.__exportStar(require("./Editor.js"), exports);
|
|
6
6
|
tslib_1.__exportStar(require("./ExtensionBuilder.js"), exports);
|
|
@@ -9,6 +9,8 @@ var actions_1 = require("./utils/actions.js");
|
|
|
9
9
|
Object.defineProperty(exports, "bindActions", { enumerable: true, get: function () { return actions_1.bindActions; } });
|
|
10
10
|
var logger_1 = require("./utils/logger.js");
|
|
11
11
|
Object.defineProperty(exports, "getLoggerFromState", { enumerable: true, get: function () { return logger_1.getLoggerFromState; } });
|
|
12
|
+
var parser_1 = require("./utils/parser.js");
|
|
13
|
+
Object.defineProperty(exports, "getParserFromState", { enumerable: true, get: function () { return parser_1.getParserFromState; } });
|
|
12
14
|
var metrics_1 = require("./utils/metrics.js");
|
|
13
15
|
Object.defineProperty(exports, "trackTransactionMetrics", { enumerable: true, get: function () { return metrics_1.trackTransactionMetrics; } });
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["core/index.ts"],"names":[],"mappings":";;;;AAAA,sDAAyB;AACzB,gEAAmC;AACnC,iEAAoC;AACpC,8CAA4C;AAApC,sGAAA,WAAW,OAAA;AACnB,4CAAkD;AAA1C,4GAAA,kBAAkB,OAAA;AAC1B,8CAAwD;AAAhD,kHAAA,uBAAuB,OAAA","sourcesContent":["export * from './Editor';\nexport * from './ExtensionBuilder';\nexport * from './ExtensionsManager';\nexport {bindActions} from './utils/actions';\nexport {getLoggerFromState} from './utils/logger';\nexport {trackTransactionMetrics} from './utils/metrics';\nexport type {Keymap} from './types/keymap';\nexport type {ActionSpec, Action, ActionStorage, CommandWithAttrs} from './types/actions';\nexport type {\n Extension,\n ExtensionAuto,\n ExtensionWithOptions,\n ExtensionDeps,\n ExtensionNodeSpec,\n ExtensionMarkSpec,\n} from './types/extension';\nexport type {Parser, ParserToken} from './types/parser';\nexport type {\n Serializer,\n SerializerState,\n SerializerNodeToken,\n SerializerMarkToken,\n} from './types/serializer';\nexport type {NodeViewConstructor, MarkViewConstructor} from './types/node-views';\n\nexport type {MarkdownParserDynamicModifierConfig} from './markdown/MarkdownParser';\nexport type {MarkdownSerializerDynamicModifierConfig} from './markdown/MarkdownSerializerDynamicModifier';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["core/index.ts"],"names":[],"mappings":";;;;AAAA,sDAAyB;AACzB,gEAAmC;AACnC,iEAAoC;AACpC,8CAA4C;AAApC,sGAAA,WAAW,OAAA;AACnB,4CAAkD;AAA1C,4GAAA,kBAAkB,OAAA;AAC1B,4CAAkD;AAA1C,4GAAA,kBAAkB,OAAA;AAC1B,8CAAwD;AAAhD,kHAAA,uBAAuB,OAAA","sourcesContent":["export * from './Editor';\nexport * from './ExtensionBuilder';\nexport * from './ExtensionsManager';\nexport {bindActions} from './utils/actions';\nexport {getLoggerFromState} from './utils/logger';\nexport {getParserFromState} from './utils/parser';\nexport {trackTransactionMetrics} from './utils/metrics';\nexport type {Keymap} from './types/keymap';\nexport type {ActionSpec, Action, ActionStorage, CommandWithAttrs} from './types/actions';\nexport type {\n Extension,\n ExtensionAuto,\n ExtensionWithOptions,\n ExtensionDeps,\n ExtensionNodeSpec,\n ExtensionMarkSpec,\n} from './types/extension';\nexport type {Parser, ParserToken} from './types/parser';\nexport type {\n Serializer,\n SerializerState,\n SerializerNodeToken,\n SerializerMarkToken,\n} from './types/serializer';\nexport type {NodeViewConstructor, MarkViewConstructor} from './types/node-views';\n\nexport type {MarkdownParserDynamicModifierConfig} from './markdown/MarkdownParser';\nexport type {MarkdownSerializerDynamicModifierConfig} from './markdown/MarkdownSerializerDynamicModifier';\n"]}
|
|
@@ -26,6 +26,7 @@ export declare class MarkdownParser implements Parser {
|
|
|
26
26
|
dynamicModifier: MarkdownParserDynamicModifier | null;
|
|
27
27
|
private logger;
|
|
28
28
|
constructor(schema: Schema, tokenizer: MarkdownIt, tokens: Record<string, ParserToken>, opts: MarkdownParserOptions);
|
|
29
|
+
isPunctChar(char: string): boolean;
|
|
29
30
|
validateLink(url: string): boolean;
|
|
30
31
|
normalizeLink(url: string): string;
|
|
31
32
|
normalizeLinkText(url: string): string;
|
|
@@ -38,6 +38,9 @@ class MarkdownParser {
|
|
|
38
38
|
this.dynamicModifier = opts.dynamicModifier ?? null;
|
|
39
39
|
this.logger = opts.logger.nested({ module: 'markdown-parser' });
|
|
40
40
|
}
|
|
41
|
+
isPunctChar(char) {
|
|
42
|
+
return this.tokenizer.utils.isPunctChar(char);
|
|
43
|
+
}
|
|
41
44
|
validateLink(url) {
|
|
42
45
|
return this.tokenizer.validateLink(url);
|
|
43
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownParser.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownParser.ts"],"names":[],"mappings":"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","sourcesContent":["import 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 {LinkMatch, 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<LinkMatch>[] | 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\n const processedToken =\n processor?.processToken?.reduce((currentToken, process) => {\n return process(currentToken, index, rawMarkup);\n }, token) || token;\n\n if (processedToken.children) {\n processedToken.children = this.processTokens(processedToken.children, rawMarkup);\n }\n\n return processedToken;\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 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 {LinkMatch, 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 isPunctChar(char: string): boolean {\n return this.tokenizer.utils.isPunctChar(char);\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<LinkMatch>[] | 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\n const processedToken =\n processor?.processToken?.reduce((currentToken, process) => {\n return process(currentToken, index, rawMarkup);\n }, token) || token;\n\n if (processedToken.children) {\n processedToken.children = this.processTokens(processedToken.children, rawMarkup);\n }\n\n return processedToken;\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 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"../../../../src","sources":["core/types/parser.ts"],"names":[],"mappings":"","sourcesContent":["import type MarkdownIt from 'markdown-it';\nimport type Token from 'markdown-it/lib/token';\nimport type {Node} from 'prosemirror-model';\n\nexport type LinkMatch = Readonly<NonNullable<ReturnType<MarkdownIt['linkify']['match']>>[number]>;\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): LinkMatch[] | 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 MarkdownIt from 'markdown-it';\nimport type Token from 'markdown-it/lib/token';\nimport type {Node} from 'prosemirror-model';\n\nexport type LinkMatch = Readonly<NonNullable<ReturnType<MarkdownIt['linkify']['match']>>[number]>;\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): LinkMatch[] | null;\n isPunctChar(char: string): boolean;\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"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getParserFromState = exports.ParserFacet = void 0;
|
|
4
|
+
const facet_1 = require("../../utils/facet.js");
|
|
5
|
+
/** @internal */
|
|
6
|
+
exports.ParserFacet = facet_1.Facet.define({
|
|
7
|
+
combine: (value) => value[0],
|
|
8
|
+
static: true,
|
|
9
|
+
});
|
|
10
|
+
const getParserFromState = (state) => exports.ParserFacet.getState(state);
|
|
11
|
+
exports.getParserFromState = getParserFromState;
|
|
12
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"../../../../src","sources":["core/utils/parser.ts"],"names":[],"mappings":";;;AAEA,gDAAwC;AAGxC,gBAAgB;AACH,QAAA,WAAW,GAAG,aAAK,CAAC,MAAM,CAAiB;IACpD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,IAAI;CACf,CAAC,CAAC;AAEI,MAAM,kBAAkB,GAAG,CAAC,KAAkB,EAAU,EAAE,CAAC,mBAAW,CAAC,QAAQ,CAAC,KAAK,CAAE,CAAC;AAAlF,QAAA,kBAAkB,sBAAgE","sourcesContent":["import type {EditorState} from 'prosemirror-state';\n\nimport {Facet} from '../../utils/facet';\nimport type {Parser} from '../types/parser';\n\n/** @internal */\nexport const ParserFacet = Facet.define<Parser, Parser>({\n combine: (value) => value[0],\n static: true,\n});\n\nexport const getParserFromState = (state: EditorState): Parser => ParserFacet.getState(state)!;\n"]}
|
|
@@ -46,6 +46,9 @@ class TooltipView {
|
|
|
46
46
|
}
|
|
47
47
|
hide(view) {
|
|
48
48
|
this.view = view;
|
|
49
|
+
// do not rerender popup if it is already hidden
|
|
50
|
+
if (!this.#isTooltipOpen && !this.baseProps.show)
|
|
51
|
+
return;
|
|
49
52
|
this.#isTooltipOpen = false;
|
|
50
53
|
this.baseProps = { show: false, poppupProps: {} };
|
|
51
54
|
this.renderPopup();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {VirtualElement} from '@floating-ui/react';\nimport {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport type TooltipViewParams = {\n /** @default 'bottom' */\n placement?: 'top' | 'bottom';\n /** @default false */\n flip?: boolean;\n};\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private readonly logger: Logger2.ILogger;\n private readonly actions: ActionStorage;\n private readonly menuConfig: ContextConfig;\n private readonly placement: PopupPlacement;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n params: TooltipViewParams,\n ) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n\n const {flip, placement = 'bottom'} = params;\n this.placement = flip ? placement : [placement];\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n qa: 'g-md-toolbar-selection',\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const virtualElem: VirtualElement = {\n getBoundingClientRect() {\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const top = start.top;\n const left = yCenter - 1;\n const width = 2;\n const height = end.bottom - start.top;\n\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n y: top,\n x: left,\n height,\n width,\n };\n },\n };\n\n return {\n placement: this.placement,\n anchorElement: virtualElem,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {VirtualElement} from '@floating-ui/react';\nimport {Popup, type PopupPlacement, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport type TooltipViewParams = {\n /** @default 'bottom' */\n placement?: 'top' | 'bottom';\n /** @default false */\n flip?: boolean;\n};\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private readonly logger: Logger2.ILogger;\n private readonly actions: ActionStorage;\n private readonly menuConfig: ContextConfig;\n private readonly placement: PopupPlacement;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(\n actions: ActionStorage,\n menuConfig: ContextConfig,\n logger: Logger2.ILogger,\n params: TooltipViewParams,\n ) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n\n const {flip, placement = 'bottom'} = params;\n this.placement = flip ? placement : [placement];\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n\n // do not rerender popup if it is already hidden\n if (!this.#isTooltipOpen && !this.baseProps.show) return;\n\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n qa: 'g-md-toolbar-selection',\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const virtualElem: VirtualElement = {\n getBoundingClientRect() {\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const yCenter = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const top = start.top;\n const left = yCenter - 1;\n const width = 2;\n const height = end.bottom - start.top;\n\n return {\n top,\n left,\n right: left + width,\n bottom: top + height,\n y: top,\n x: left,\n height,\n width,\n };\n },\n };\n\n return {\n placement: this.placement,\n anchorElement: virtualElem,\n };\n }\n}\n"]}
|
|
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "boldType", { enumerable: true, get: function ()
|
|
|
12
12
|
const bAction = 'bold';
|
|
13
13
|
const Bold = (builder, opts) => {
|
|
14
14
|
builder.use(BoldSpecs_1.BoldSpecs);
|
|
15
|
-
builder.addAction(bAction, ({ schema }) => (0, actions_1.
|
|
15
|
+
builder.addAction(bAction, ({ schema }) => (0, actions_1.createMarkdownInlineMarkAction)((0, BoldSpecs_1.boldType)(schema)));
|
|
16
16
|
if (opts?.boldKey) {
|
|
17
17
|
const { boldKey } = opts;
|
|
18
18
|
builder.addKeymap(({ schema }) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Bold/index.ts"],"names":[],"mappings":";;;AAAA,+DAAgD;AAGhD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Bold/index.ts"],"names":[],"mappings":";;;AAAA,+DAAgD;AAGhD,uDAAsE;AACtE,6DAAwD;AACxD,qDAAoD;AAEpD,oDAAgD;AAEhD,kDAAmD;AAA3C,yGAAA,YAAY,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAC9B,MAAM,OAAO,GAAG,MAAM,CAAC;AAMhB,MAAM,IAAI,GAA+B,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9D,OAAO,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC;IACvB,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,IAAA,wCAA8B,EAAC,IAAA,oBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE3F,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAChB,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;YAC7B,CAAC,OAAO,CAAC,EAAE,IAAA,sBAAa,EAAC,MAAM,EAAE,IAAA,iCAAU,EAAC,IAAA,oBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC;SACjE,CAAC,CAAC,CAAC;IACR,CAAC;IAED,OAAO,CAAC,aAAa,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;QACjC,KAAK,EAAE;YACH,IAAA,0BAAa,EAAC,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAC,EAAE,IAAA,oBAAQ,EAAC,MAAM,CAAC,CAAC;YAC9E,IAAA,0BAAa,EAAC,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAC,EAAE,IAAA,oBAAQ,EAAC,MAAM,CAAC,CAAC;SACjF;KACJ,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAjBW,QAAA,IAAI,QAiBf","sourcesContent":["import {toggleMark} from 'prosemirror-commands';\n\nimport type {Action, ExtensionAuto} from '../../../core';\nimport {createMarkdownInlineMarkAction} from '../../../utils/actions';\nimport {markInputRule} from '../../../utils/inputrules';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {BoldSpecs, boldType} from './BoldSpecs';\n\nexport {boldMarkName, boldType} from './BoldSpecs';\nconst bAction = 'bold';\n\nexport type BoldOptions = {\n boldKey?: string | null;\n};\n\nexport const Bold: ExtensionAuto<BoldOptions> = (builder, opts) => {\n builder.use(BoldSpecs);\n builder.addAction(bAction, ({schema}) => createMarkdownInlineMarkAction(boldType(schema)));\n\n if (opts?.boldKey) {\n const {boldKey} = opts;\n builder.addKeymap(({schema}) => ({\n [boldKey]: withLogAction('bold', toggleMark(boldType(schema))),\n }));\n }\n\n builder.addInputRules(({schema}) => ({\n rules: [\n markInputRule({open: '**', close: '**', ignoreBetween: '*'}, boldType(schema)),\n markInputRule({open: '__', close: '__', ignoreBetween: '_'}, boldType(schema)),\n ],\n }));\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [bAction]: Action;\n }\n }\n}\n"]}
|
|
@@ -15,7 +15,7 @@ Object.defineProperty(exports, "codeType", { enumerable: true, get: function ()
|
|
|
15
15
|
const codeAction = 'code';
|
|
16
16
|
const Code = (builder, opts) => {
|
|
17
17
|
builder.use(CodeSpecs_1.CodeSpecs);
|
|
18
|
-
builder.addAction(codeAction, ({ schema }) => (0, actions_1.
|
|
18
|
+
builder.addAction(codeAction, ({ schema }) => (0, actions_1.createMarkdownInlineMarkAction)((0, CodeSpecs_1.codeType)(schema)));
|
|
19
19
|
if (opts?.codeKey) {
|
|
20
20
|
const { codeKey } = opts;
|
|
21
21
|
builder.addKeymap(({ schema }) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Code/index.ts"],"names":[],"mappings":";;;;AAAA,wFAA4C;AAC5C,+DAAgD;AAChD,yDAAyC;AAGzC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Code/index.ts"],"names":[],"mappings":";;;;AAAA,wFAA4C;AAC5C,+DAAgD;AAChD,yDAAyC;AAGzC,uDAAsE;AACtE,qDAAoD;AAEpD,oDAAgD;AAEhD,sBAAqB;AAErB,kDAAmD;AAA3C,yGAAA,YAAY,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAC9B,MAAM,UAAU,GAAG,MAAM,CAAC;AAMnB,MAAM,IAAI,GAA+B,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9D,OAAO,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC;IACvB,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,IAAA,wCAA8B,EAAC,IAAA,oBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE9F,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;QAChB,MAAM,EAAC,OAAO,EAAC,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,CAAC;YAC7B,CAAC,OAAO,CAAC,EAAE,IAAA,sBAAa,EAAC,aAAa,EAAE,IAAA,iCAAU,EAAC,IAAA,oBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC;SACxE,CAAC,CAAC,CAAC;IACR,CAAC;IAED,OAAO;QACH,sCAAsC;QACtC,mEAAmE;QACnE,kEAAkE;QAClE,8DAA8D;SAC7D,SAAS,CAAC,CAAC,EAAC,MAAM,EAAC,EAAE,EAAE,CAAC,IAAA,8BAAQ,EAAC,EAAC,QAAQ,EAAE,IAAA,oBAAQ,EAAC,MAAM,CAAC,EAAC,CAAC,CAAC,CAAC;IAErE,OAAO,CAAC,SAAS,CACb,GAAG,EAAE;IACD,6CAA6C;IAC7C,IAAI,0BAAM,CAAC;QACP,KAAK,EAAE;YACH,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;gBACtC,MAAM,EACF,SAAS,EAAE,EAAC,OAAO,EAAC,EACpB,EAAE,EACF,MAAM,GACT,GAAG,IAAI,CAAC,KAAK,CAAC;gBACf,IACI,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC;oBACvC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,EAC1C,CAAC;oBACC,IAAI,CAAC,QAAQ,CACT,EAAE,CAAC,gBAAgB,CACf,IAAI,GAAG,CAAC,EACR,EAAE,GAAG,CAAC,EACN,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAA,oBAAQ,EAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAC5D,CACJ,CAAC;oBAEF,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC;SACJ;KACJ,CAAC,CACT,CAAC;AACN,CAAC,CAAC;AAhDW,QAAA,IAAI,QAgDf","sourcesContent":["import codemark from 'prosemirror-codemark';\nimport {toggleMark} from 'prosemirror-commands';\nimport {Plugin} from 'prosemirror-state';\n\nimport type {Action, ExtensionAuto} from '../../../core';\nimport {createMarkdownInlineMarkAction} from '../../../utils/actions';\nimport {withLogAction} from '../../../utils/keymap';\n\nimport {CodeSpecs, codeType} from './CodeSpecs';\n\nimport './code.scss';\n\nexport {codeMarkName, codeType} from './CodeSpecs';\nconst codeAction = 'code';\n\nexport type CodeOptions = {\n codeKey?: string | null;\n};\n\nexport const Code: ExtensionAuto<CodeOptions> = (builder, opts) => {\n builder.use(CodeSpecs);\n builder.addAction(codeAction, ({schema}) => createMarkdownInlineMarkAction(codeType(schema)));\n\n if (opts?.codeKey) {\n const {codeKey} = opts;\n builder.addKeymap(({schema}) => ({\n [codeKey]: withLogAction('code_inline', toggleMark(codeType(schema))),\n }));\n }\n\n builder\n // codemark adds inputRule for `code`,\n // adds fake cursor behaviour when crossing inline_code boundaries,\n // wrap current selected text to inline_code when '`' was pressed.\n // See demo: https://curvenote.github.io/prosemirror-codemark/\n .addPlugin(({schema}) => codemark({markType: codeType(schema)}));\n\n builder.addPlugin(\n () =>\n // apply codemark when typing text between ``\n new Plugin({\n props: {\n handleTextInput: (view, from, to, text) => {\n const {\n selection: {$anchor},\n tr,\n schema,\n } = view.state;\n if (\n $anchor.nodeBefore?.text?.endsWith('`') &&\n $anchor.nodeAfter?.text?.startsWith('`')\n ) {\n view.dispatch(\n tr.replaceRangeWith(\n from - 1,\n to + 1,\n view.state.schema.text(text, [codeType(schema).create()]),\n ),\n );\n\n return true;\n }\n return false;\n },\n },\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [codeAction]: Action;\n }\n }\n}\n"]}
|