From 63b4ad72d3b79239a15edc5d635c4b95540a2241 Mon Sep 17 00:00:00 2001 From: d3m1d0v Date: Thu, 16 Oct 2025 18:09:31 +0300 Subject: [PATCH 1/2] fix(wysiwyg): dont apply wrapping input rules within non-default textblocks --- src/utils/inputrules.ts | 18 ++++++++++++++---- src/utils/rulebuilders.ts | 3 ++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/utils/inputrules.ts b/src/utils/inputrules.ts index 5300547b5..1e43c49eb 100644 --- a/src/utils/inputrules.ts +++ b/src/utils/inputrules.ts @@ -2,10 +2,11 @@ import {InputRule} from 'prosemirror-inputrules'; import {Fragment, type Mark, type MarkType, type Node} from 'prosemirror-model'; import {type EditorState, TextSelection} from 'prosemirror-state'; -import {codeType} from '../extensions/markdown/specs'; -import {isFunction} from '../lodash'; -import {isMarkActive} from '../utils/marks'; -// TODO: remove explicit import from code extension +// TODO: remove explicit import from base and code extensions +import {pType} from 'src/extensions/base/specs'; +import {codeType} from 'src/extensions/markdown/specs'; +import {isFunction} from 'src/lodash'; +import {isMarkActive} from 'src/utils/marks'; export function hasCodeMark( state: EditorState, @@ -20,6 +21,15 @@ export function hasCodeMark( return false; } +export function inDefaultTextblock( + state: EditorState, + _match: RegExpMatchArray, + start: number, + _end: number, +): boolean { + return state.doc.resolve(start).parent.type === pType(state.schema); +} + export {textblockTypeInputRule, wrappingInputRule} from './rulebuilders'; function getMarksBetween(start: number, end: number, state: EditorState) { diff --git a/src/utils/rulebuilders.ts b/src/utils/rulebuilders.ts index b2cc2c0d5..9feca65eb 100644 --- a/src/utils/rulebuilders.ts +++ b/src/utils/rulebuilders.ts @@ -7,7 +7,7 @@ import {InputRule} from 'prosemirror-inputrules'; import type {Attrs, Node, NodeType} from 'prosemirror-model'; import {canJoin, findWrapping} from 'prosemirror-transform'; -import {hasCodeMark} from './inputrules'; +import {hasCodeMark, inDefaultTextblock} from './inputrules'; /// Build an input rule for automatically wrapping a textblock when a /// given string is typed. The `regexp` argument is @@ -32,6 +32,7 @@ export function wrappingInputRule( ) { return new InputRule(regexp, (state, match, start, end) => { if (hasCodeMark(state, match, start, end)) return null; + if (!inDefaultTextblock(state, match, start, end)) return null; const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs; const tr = state.tr.delete(start, end); From 43ad2a9ba436e317f75a4978209fb27ffa24d594 Mon Sep 17 00:00:00 2001 From: d3m1d0v Date: Thu, 16 Oct 2025 18:32:40 +0300 Subject: [PATCH 2/2] fix: circular deps guard --- .../base/BaseSchema/BaseSchemaSpecs/index.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/extensions/base/BaseSchema/BaseSchemaSpecs/index.ts b/src/extensions/base/BaseSchema/BaseSchemaSpecs/index.ts index d42fbb7ec..69c3fe591 100644 --- a/src/extensions/base/BaseSchema/BaseSchemaSpecs/index.ts +++ b/src/extensions/base/BaseSchema/BaseSchemaSpecs/index.ts @@ -1,9 +1,7 @@ -import type {NodeSpec} from 'prosemirror-model'; - -import {isEmptyString} from 'src/utils'; - -import type {ExtensionAuto} from '../../../../core'; -import {nodeTypeFactory} from '../../../../utils/schema'; +import type {ExtensionAuto} from '#core'; +import type {NodeSpec} from '#pm/model'; +import {isEmptyString} from 'src/utils/nodes'; +import {nodeTypeFactory} from 'src/utils/schema'; export enum BaseNode { Doc = 'doc',