🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@milkdown/prose

Package Overview
Dependencies
Maintainers
1
Versions
115
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@milkdown/prose - npm Package Compare versions

Comparing version
7.21.2
to
7.21.3
+2
lib/__test__/mark.spec.d.ts
export {};
//# sourceMappingURL=mark.spec.d.ts.map
{"version":3,"file":"mark.spec.d.ts","sourceRoot":"","sources":["../../src/__test__/mark.spec.ts"],"names":[],"mappings":""}
export {};
//# sourceMappingURL=snapshot.spec.d.ts.map
{"version":3,"file":"snapshot.spec.d.ts","sourceRoot":"","sources":["../../src/__test__/snapshot.spec.ts"],"names":[],"mappings":""}
import type { Mark, MarkType, ResolvedPos } from '../../model';
export interface MarkRange {
mark: Mark;
from: number;
to: number;
}
export declare function getMarkRange($pos: ResolvedPos, type: MarkType): MarkRange | undefined;
//# sourceMappingURL=mark.d.ts.map
{"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/toolkit/prose/mark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAUD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,GACb,SAAS,GAAG,SAAS,CA8BvB"}
import type { Node as ProseNode } from '../../model';
import type { EditorState } from '../../state';
export declare const CARET_MARKER = "\u2503";
export declare const RANGE_OPEN_MARKER = "\u2770";
export declare const RANGE_CLOSE_MARKER = "\u2771";
export interface TextIndexOptions {
blockSeparator?: string;
leafText?: string;
}
export declare function posToTextOffset(doc: ProseNode, pos: number, options?: TextIndexOptions): number;
export declare function textOffsetToPos(doc: ProseNode, offset: number, options?: TextIndexOptions): number;
export declare function getSelectionSnapshot(state: EditorState, options?: TextIndexOptions): string;
//# sourceMappingURL=snapshot.d.ts.map
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/toolkit/prose/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,eAAO,MAAM,YAAY,WAAM,CAAA;AAC/B,eAAO,MAAM,iBAAiB,WAAM,CAAA;AACpC,eAAO,MAAM,kBAAkB,WAAM,CAAA;AAErC,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAsED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAgBR;AAKD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAcR;AAKD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,gBAAgB,GACzB,MAAM,CAiBR"}
import { describe, expect, it } from 'vitest'
import type { Mark, Node as ProseNode } from '../model'
import { Schema } from '../model'
import { getMarkRange } from '../toolkit/prose/mark'
const schema = new Schema({
nodes: {
doc: { content: 'block+' },
paragraph: { group: 'block', content: 'inline*' },
text: { group: 'inline' },
},
marks: {
strong: {},
em: {},
link: { attrs: { href: {} } },
},
})
const { strong, em, link } = schema.marks
function paragraph(...children: ProseNode[]) {
return schema.node('doc', null, [schema.node('paragraph', null, children)])
}
function text(content: string, ...marks: Mark[]) {
return schema.text(content, marks)
}
describe('getMarkRange', () => {
it('should find the whole run from a caret inside it', () => {
// <p>[strong "bold"] "text"</p> -> strong covers [1, 5)
const doc = paragraph(text('bold', strong.create()), text('text'))
const range = getMarkRange(doc.resolve(3), strong)
expect(range).toMatchObject({ from: 1, to: 5 })
expect(range?.mark.type).toBe(strong)
})
it('should include both edges of the run', () => {
const doc = paragraph(text('ab'), text('cd', strong.create()), text('ef'))
// strong covers [3, 5): caret at the left edge and the right edge both hit
expect(getMarkRange(doc.resolve(3), strong)).toMatchObject({
from: 3,
to: 5,
})
expect(getMarkRange(doc.resolve(5), strong)).toMatchObject({
from: 3,
to: 5,
})
})
it('should find a run ending at the parent boundary', () => {
const doc = paragraph(text('ab'), text('cd', strong.create()))
// caret at the very end of the paragraph, run before it
expect(getMarkRange(doc.resolve(5), strong)).toMatchObject({
from: 3,
to: 5,
})
})
it('should return undefined when the position carries no such mark', () => {
const doc = paragraph(text('ab', strong.create()), text('cd'))
expect(getMarkRange(doc.resolve(5), strong)).toBeUndefined()
expect(getMarkRange(doc.resolve(2), em)).toBeUndefined()
})
it('should span text nodes split by a nested mark', () => {
// **a *b* c** -> [strong "a "][strong+em "b"][strong " c"]
const doc = paragraph(
text('a ', strong.create()),
text('b', strong.create(), em.create()),
text(' c', strong.create())
)
expect(getMarkRange(doc.resolve(4), strong)).toMatchObject({
from: 1,
to: 6,
})
// while the em run stays confined to its own segment
expect(getMarkRange(doc.resolve(4), em)).toMatchObject({ from: 3, to: 4 })
})
it('should keep adjacent same-type marks with different attrs apart', () => {
// [a](x)[b](y) -> two link runs touching at position 2
const doc = paragraph(
text('a', link.create({ href: 'x' })),
text('b', link.create({ href: 'y' }))
)
// tie-break goes to the run after the caret
const range = getMarkRange(doc.resolve(2), link)
expect(range).toMatchObject({ from: 2, to: 3 })
expect(range?.mark.attrs.href).toBe('y')
// and the runs never merge from an interior position either
expect(getMarkRange(doc.resolve(1), link)).toMatchObject({
from: 1,
to: 2,
})
})
it('should merge adjacent runs of equal marks', () => {
const doc = paragraph(
text('a', link.create({ href: 'x' })),
text('b', link.create({ href: 'x' }), em.create()),
text('c', link.create({ href: 'x' }))
)
expect(getMarkRange(doc.resolve(2), link)).toMatchObject({
from: 1,
to: 4,
})
})
})
import { describe, expect, it } from 'vitest'
import type { Node as ProseNode } from '../model'
import type { Selection } from '../state'
import { Schema } from '../model'
import {
AllSelection,
EditorState,
NodeSelection,
TextSelection,
} from '../state'
import {
getSelectionSnapshot,
posToTextOffset,
textOffsetToPos,
} from '../toolkit/prose/snapshot'
const schema = new Schema({
nodes: {
doc: { content: 'block+' },
paragraph: { group: 'block', content: 'inline*' },
blockquote: { group: 'block', content: 'block+' },
hr: { group: 'block' },
image: { group: 'inline', inline: true, atom: true },
text: { group: 'inline' },
},
marks: {},
})
function doc(...children: ProseNode[]) {
return schema.node('doc', null, children)
}
function p(...children: (ProseNode | string)[]) {
return schema.node(
'paragraph',
null,
children.map((child) =>
typeof child === 'string' ? schema.text(child) : child
)
)
}
function snapshot(docNode: ProseNode, selection: Selection) {
return getSelectionSnapshot(EditorState.create({ doc: docNode, selection }))
}
describe('getSelectionSnapshot', () => {
it('should draw a caret inside a paragraph', () => {
const d = doc(p('abcd'))
expect(snapshot(d, TextSelection.create(d, 3))).toBe('ab┃cd')
})
it('should draw a range across paragraphs', () => {
const d = doc(p('ab'), p('cd'))
expect(snapshot(d, TextSelection.create(d, 2, 6))).toBe('a❰b\nc❱d')
})
it('should draw a caret in an empty paragraph', () => {
const d = doc(p('a'), p(), p('b'))
expect(snapshot(d, TextSelection.create(d, 4))).toBe('a\n┃\nb')
})
it('should draw a node selection around an inline atom', () => {
const d = doc(p('a', schema.node('image'), 'b'))
expect(snapshot(d, NodeSelection.create(d, 2))).toBe('a❰□❱b')
})
it('should render a leaf block with separators', () => {
const d = doc(p('a'), schema.node('hr'), p('b'))
expect(snapshot(d, TextSelection.create(d, 5))).toBe('a\n□\n┃b')
})
it('should separate nested textblocks', () => {
const d = doc(schema.node('blockquote', null, [p('a'), p('b')]), p('c'))
expect(snapshot(d, TextSelection.create(d, 3))).toBe('a┃\nb\nc')
})
it('should draw a whole-document selection', () => {
const d = doc(p('ab'))
expect(snapshot(d, new AllSelection(d))).toBe('❰ab❱')
})
it('should honor custom separator and leaf text', () => {
const d = doc(p('a', schema.node('image')), p('b'))
const state = EditorState.create({
doc: d,
selection: TextSelection.create(d, 2),
})
expect(
getSelectionSnapshot(state, { blockSeparator: '¶', leafText: '<img>' })
).toBe('a┃<img>¶b')
})
})
describe('text offset mapping', () => {
it('should round-trip offsets and positions inside text', () => {
const d = doc(p('ab'), p('cd'))
// string: 'ab\ncd'
expect(textOffsetToPos(d, 0)).toBe(1)
expect(textOffsetToPos(d, 1)).toBe(2)
expect(textOffsetToPos(d, 2)).toBe(3)
expect(textOffsetToPos(d, 3)).toBe(5)
expect(textOffsetToPos(d, 5)).toBe(7)
expect(posToTextOffset(d, 1)).toBe(0)
expect(posToTextOffset(d, 3)).toBe(2)
expect(posToTextOffset(d, 5)).toBe(3)
expect(posToTextOffset(d, 7)).toBe(5)
})
it('should resolve an offset at a separator into the empty block', () => {
const d = doc(p('a'), p(), p('b'))
// string: 'a\n\nb', offset 2 sits between the separators
expect(textOffsetToPos(d, 2)).toBe(4)
expect(posToTextOffset(d, 4)).toBe(2)
})
it('should resolve offsets around a leaf placeholder', () => {
const d = doc(p('a', schema.node('image'), 'b'))
// string: 'a□b'; the placeholder maps to the position before the atom
expect(textOffsetToPos(d, 1)).toBe(2)
expect(textOffsetToPos(d, 2)).toBe(3)
expect(posToTextOffset(d, 2)).toBe(1)
expect(posToTextOffset(d, 3)).toBe(2)
})
})
import type { Mark, MarkType, ResolvedPos } from '../../model'
export interface MarkRange {
mark: Mark
from: number
to: number
}
/// Find the extent of a mark of the given type around a resolved position.
///
/// The lookup is boundary-inclusive on both edges: a caret sitting right
/// before or right after a marked run still resolves to it. When marked runs
/// touch the position on both sides, the run after the position wins.
///
/// The run is extended by mark equality (`Mark.eq`, type + attrs), so two
/// adjacent links with different hrefs resolve as two separate ranges.
export function getMarkRange(
$pos: ResolvedPos,
type: MarkType
): MarkRange | undefined {
const parent = $pos.parent
let cursor = parent.childAfter($pos.parentOffset)
if (!cursor.node || !type.isInSet(cursor.node.marks))
cursor = parent.childBefore($pos.parentOffset)
if (!cursor.node) return undefined
const mark = type.isInSet(cursor.node.marks)
if (!mark) return undefined
let index = cursor.index
let from = $pos.start() + cursor.offset
let to = from + cursor.node.nodeSize
while (index > 0 && mark.isInSet(parent.child(index - 1).marks)) {
index -= 1
from -= parent.child(index).nodeSize
}
let endIndex = cursor.index + 1
while (
endIndex < parent.childCount &&
mark.isInSet(parent.child(endIndex).marks)
) {
to += parent.child(endIndex).nodeSize
endIndex += 1
}
return { mark, from, to }
}
import type { Node as ProseNode } from '../../model'
import type { EditorState } from '../../state'
export const CARET_MARKER = '┃'
export const RANGE_OPEN_MARKER = '❰'
export const RANGE_CLOSE_MARKER = '❱'
export interface TextIndexOptions {
blockSeparator?: string
leafText?: string
}
interface Emission {
text: string
kind: 'text' | 'leaf' | 'separator'
/// Doc range covered by the emitted text. For separators the range is
/// empty and anchored at the position of the block node they precede.
from: number
to: number
}
function walkText(doc: ProseNode, options?: TextIndexOptions): Emission[] {
const { blockSeparator = '\n', leafText = '□' } = options ?? {}
const emissions: Emission[] = []
let firstBlock = true
const pushSeparator = (pos: number) => {
if (firstBlock) {
firstBlock = false
return
}
emissions.push({
text: blockSeparator,
kind: 'separator',
from: pos,
to: pos,
})
}
doc.descendants((node, pos) => {
if (node.isText) {
emissions.push({
text: node.text ?? '',
kind: 'text',
from: pos,
to: pos + node.nodeSize,
})
return false
}
if (node.isInline && node.isLeaf) {
emissions.push({
text: leafText,
kind: 'leaf',
from: pos,
to: pos + node.nodeSize,
})
return false
}
if (node.isTextblock) {
pushSeparator(pos)
return true
}
if (node.isLeaf) {
pushSeparator(pos)
emissions.push({
text: leafText,
kind: 'leaf',
from: pos,
to: pos + node.nodeSize,
})
return false
}
return true
})
return emissions
}
/// Map a document position to an offset in the flattened text produced by
/// `getSelectionSnapshot` (without markers).
export function posToTextOffset(
doc: ProseNode,
pos: number,
options?: TextIndexOptions
): number {
let offset = 0
for (const emission of walkText(doc, options)) {
if (emission.kind === 'text' || emission.kind === 'leaf') {
if (pos < emission.from) return offset
if (pos <= emission.to) {
if (emission.kind === 'leaf')
return pos <= emission.from ? offset : offset + emission.text.length
return offset + (pos - emission.from)
}
} else if (pos <= emission.from) {
return offset
}
offset += emission.text.length
}
return offset
}
/// Map an offset in the flattened text back to a document position. Offsets
/// pointing at a block separator resolve to the end of the previous block;
/// offsets inside a leaf placeholder resolve to the position before the leaf.
export function textOffsetToPos(
doc: ProseNode,
offset: number,
options?: TextIndexOptions
): number {
let current = 0
let lastPos = 0
for (const emission of walkText(doc, options)) {
const end = current + emission.text.length
if (offset < end || (offset === end && emission.kind === 'text')) {
if (emission.kind === 'text') return emission.from + (offset - current)
if (emission.kind === 'leaf') return emission.from
return emission.from - 1
}
current = end
lastPos = emission.to
}
return lastPos
}
/// Render the document text with the selection drawn in: `┃` for a caret,
/// `❰…❱` for a range. Blocks are joined with `blockSeparator` and leaf nodes
/// render as `leafText`. Made for inline snapshot assertions in tests.
export function getSelectionSnapshot(
state: EditorState,
options?: TextIndexOptions
): string {
const { doc, selection } = state
const text = walkText(doc, options)
.map((emission) => emission.text)
.join('')
if (selection.empty) {
const index = posToTextOffset(doc, selection.head, options)
return `${text.slice(0, index)}${CARET_MARKER}${text.slice(index)}`
}
const from = posToTextOffset(doc, selection.from, options)
const to = posToTextOffset(doc, selection.to, options)
return `${text.slice(0, from)}${RANGE_OPEN_MARKER}${text.slice(
from,
to
)}${RANGE_CLOSE_MARKER}${text.slice(to)}`
}
+21
-3
import { InputRule } from 'prosemirror-inputrules';
import { Plugin, PluginKey, Transaction, EditorState, Selection } from 'prosemirror-state';
import { Attrs, MarkType, NodeType, Node, Slice, ResolvedPos, Schema } from 'prosemirror-model';
import { Attrs, MarkType, NodeType, Node, Slice, Mark, ResolvedPos, Schema } from 'prosemirror-model';
import { EditorView } from 'prosemirror-view';

@@ -94,2 +94,9 @@

interface MarkRange {
mark: Mark;
from: number;
to: number;
}
declare function getMarkRange($pos: ResolvedPos, type: MarkType): MarkRange | undefined;
type Predicate = (node: Node) => boolean;

@@ -131,4 +138,15 @@

export { browser, calculateNodePosition, calculateTextPosition, cloneTr, customInputRules, customInputRulesKey, equalNodeType, findChildren, findChildrenByMark, findNodeInSelection, findParent, findParentNode, findParentNodeClosestToPos, findParentNodeType, findSelectedNodeOfType, flatten, getMarkFromSchema, getNodeFromSchema, isTextOnlySlice, markRule, nodeRule, posToDOMRect };
export type { BeforeDispatch, Captured, ContentNodeWithPos, FindNodeInSelectionResult, NodeWithFromTo, NodeWithPos, Options };
declare const CARET_MARKER = "\u2503";
declare const RANGE_OPEN_MARKER = "\u2770";
declare const RANGE_CLOSE_MARKER = "\u2771";
interface TextIndexOptions {
blockSeparator?: string;
leafText?: string;
}
declare function posToTextOffset(doc: Node, pos: number, options?: TextIndexOptions): number;
declare function textOffsetToPos(doc: Node, offset: number, options?: TextIndexOptions): number;
declare function getSelectionSnapshot(state: EditorState, options?: TextIndexOptions): string;
export { CARET_MARKER, RANGE_CLOSE_MARKER, RANGE_OPEN_MARKER, browser, calculateNodePosition, calculateTextPosition, cloneTr, customInputRules, customInputRulesKey, equalNodeType, findChildren, findChildrenByMark, findNodeInSelection, findParent, findParentNode, findParentNodeClosestToPos, findParentNodeType, findSelectedNodeOfType, flatten, getMarkFromSchema, getMarkRange, getNodeFromSchema, getSelectionSnapshot, isTextOnlySlice, markRule, nodeRule, posToDOMRect, posToTextOffset, textOffsetToPos };
export type { BeforeDispatch, Captured, ContentNodeWithPos, FindNodeInSelectionResult, MarkRange, NodeWithFromTo, NodeWithPos, Options, TextIndexOptions };
//# sourceMappingURL=index.d.ts.map
+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sources":["../src/toolkit/browser.ts","../src/toolkit/input-rules/custom-input-rules.ts","../src/toolkit/input-rules/common.ts","../src/toolkit/input-rules/mark-rule.ts","../src/toolkit/input-rules/node-rule.ts","../src/toolkit/position/index.ts","../src/toolkit/prose/helper.ts","../src/toolkit/prose/types.ts","../src/toolkit/prose/node.ts","../src/toolkit/prose/schema.ts","../src/toolkit/prose/selection.ts"],"mappings":";;;;;AAAA;AACA;AACA;AACA;AACA,cAAc,EAAE;AAChB,cAAc,UAAU;AACxB,cAAc,KAAK;AACnB,cAAc,aAAa;AAC3B,cAAc,MAAM;AACpB,cAAc,cAAc;AAC5B,cAAc,MAAM;AACpB,cAAc,GAAG;AACjB,cAAc,GAAG;AACjB,cAAc,OAAO;AACrB,cAAc,MAAM;AACpB,cAAc,cAAc;;;;;;;;;;;;;;;;;;ACb5B,cAAc,mBAAmB,EAAE,SAAS;AAC5C,iBAAiB,gBAAgB;AACjC,WAAW,SAAS;AACpB,IAAI,MAAM;;ACHV,UAAU,QAAQ;AAClB;AACA;AACA;AACA;AACA;AACA,UAAU,cAAc;AACxB;AACA;AACA;AACA,QAAQ,WAAW;AACnB;AACA,UAAU,OAAO;AACjB,sBAAsB,gBAAgB,KAAK,KAAK;AAChD,gCAAgC,QAAQ,KAAK,OAAO,CAAC,QAAQ;AAC7D,+BAA+B,cAAc;AAC7C;;ACfA,iBAAiB,QAAQ,SAAS,MAAM,YAAY,QAAQ,YAAY,OAAO,GAAG,SAAS;;ACA3F,iBAAiB,QAAQ,SAAS,MAAM,YAAY,QAAQ,YAAY,OAAO,GAAG,SAAS;;ACF3F,KAAK,KAAK;AACV,iBAAiB,qBAAqB,OAAO,UAAU,UAAU,WAAW,0BAA0B,OAAO,cAAc,OAAO,cAAc,OAAO,KAAK,KAAK;AACjK,UAAU,IAAI;AACd;AACA;AACA;AACA;AACA;AACA,iBAAiB,qBAAqB,OAAO,UAAU,UAAU,WAAW,mBAAmB,IAAI,OAAO,IAAI,cAAc,OAAO,cAAc,OAAO,KAAK,KAAK;AAClK,iBAAiB,YAAY,OAAO,UAAU,6BAA6B,OAAO;;ACRlF,iBAAiB,OAAO,KAAK,WAAW,GAAG,WAAW;AACtD,iBAAiB,aAAa,WAAW,QAAQ,GAAG,QAAQ,UAAUA,IAAS;AAC/E,iBAAiB,eAAe,QAAQ,KAAK,GAAGA,IAAS;;ACHzD,KAAK,SAAS,UAAU,IAAI;;ACC5B,UAAU,WAAW;AACrB;AACA,UAAU,IAAI;AACd;AACA,UAAU,cAAc;AACxB;AACA;AACA,UAAU,IAAI;AACd;AACA,iBAAiB,OAAO,OAAO,IAAI,sBAAsB,WAAW;AACpE,iBAAiB,YAAY,YAAY,SAAS,UAAU,IAAI,wBAAwB,WAAW;AACnG,iBAAiB,kBAAkB,OAAO,IAAI,YAAY,QAAQ,sBAAsB,WAAW;AACnG,iBAAiB,UAAU,YAAY,SAAS,UAAU,WAAW,KAAK,cAAc;AACxF,iBAAiB,kBAAkB,OAAO,WAAW,YAAY,QAAQ,GAAG,cAAc;;ACd1F,iBAAiB,iBAAiB,uBAAuB,MAAM,GAAG,QAAQ;AAC1E,iBAAiB,iBAAiB,uBAAuB,MAAM,GAAG,QAAQ;;ACC1E,UAAU,kBAAkB;AAC5B;AACA;AACA;AACA,UAAUA,IAAS;AACnB;AACA,iBAAiB,0BAA0B,YAAY,SAAS,UAAU,WAAW,KAAK,kBAAkB;AAC5G,iBAAiB,cAAc,YAAY,SAAS,eAAe,SAAS,KAAK,kBAAkB;AACnG,iBAAiB,sBAAsB,YAAY,SAAS,YAAY,QAAQ,GAAG,kBAAkB;AACrG,KAAK,yBAAyB;AAC9B;AACA;AACA,YAAYA,IAAS;AACrB;AACA,cAAc,mBAAmB,UAAU,WAAW,QAAQ,QAAQ,KAAK,yBAAyB;;;;","names":["ProseNode"]}
{"version":3,"file":"index.d.ts","sources":["../src/toolkit/browser.ts","../src/toolkit/input-rules/custom-input-rules.ts","../src/toolkit/input-rules/common.ts","../src/toolkit/input-rules/mark-rule.ts","../src/toolkit/input-rules/node-rule.ts","../src/toolkit/position/index.ts","../src/toolkit/prose/helper.ts","../src/toolkit/prose/mark.ts","../src/toolkit/prose/types.ts","../src/toolkit/prose/node.ts","../src/toolkit/prose/schema.ts","../src/toolkit/prose/selection.ts","../src/toolkit/prose/snapshot.ts"],"mappings":"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","names":["ProseNode"]}

@@ -288,2 +288,25 @@ import { PluginKey, Plugin, NodeSelection } from 'prosemirror-state';

function getMarkRange($pos, type) {
const parent = $pos.parent;
let cursor = parent.childAfter($pos.parentOffset);
if (!cursor.node || !type.isInSet(cursor.node.marks))
cursor = parent.childBefore($pos.parentOffset);
if (!cursor.node) return void 0;
const mark = type.isInSet(cursor.node.marks);
if (!mark) return void 0;
let index = cursor.index;
let from = $pos.start() + cursor.offset;
let to = from + cursor.node.nodeSize;
while (index > 0 && mark.isInSet(parent.child(index - 1).marks)) {
index -= 1;
from -= parent.child(index).nodeSize;
}
let endIndex = cursor.index + 1;
while (endIndex < parent.childCount && mark.isInSet(parent.child(endIndex).marks)) {
to += parent.child(endIndex).nodeSize;
endIndex += 1;
}
return { mark, from, to };
}
function flatten(node, descend = true) {

@@ -402,3 +425,107 @@ const result = [];

export { browser, calculateNodePosition, calculateTextPosition, cloneTr, customInputRules, customInputRulesKey, equalNodeType, findChildren, findChildrenByMark, findNodeInSelection, findParent, findParentNode, findParentNodeClosestToPos, findParentNodeType, findSelectedNodeOfType, flatten, getMarkFromSchema, getNodeFromSchema, isTextOnlySlice, markRule, nodeRule, posToDOMRect };
const CARET_MARKER = "\u2503";
const RANGE_OPEN_MARKER = "\u2770";
const RANGE_CLOSE_MARKER = "\u2771";
function walkText(doc, options) {
const { blockSeparator = "\n", leafText = "\u25A1" } = options != null ? options : {};
const emissions = [];
let firstBlock = true;
const pushSeparator = (pos) => {
if (firstBlock) {
firstBlock = false;
return;
}
emissions.push({
text: blockSeparator,
kind: "separator",
from: pos,
to: pos
});
};
doc.descendants((node, pos) => {
var _a;
if (node.isText) {
emissions.push({
text: (_a = node.text) != null ? _a : "",
kind: "text",
from: pos,
to: pos + node.nodeSize
});
return false;
}
if (node.isInline && node.isLeaf) {
emissions.push({
text: leafText,
kind: "leaf",
from: pos,
to: pos + node.nodeSize
});
return false;
}
if (node.isTextblock) {
pushSeparator(pos);
return true;
}
if (node.isLeaf) {
pushSeparator(pos);
emissions.push({
text: leafText,
kind: "leaf",
from: pos,
to: pos + node.nodeSize
});
return false;
}
return true;
});
return emissions;
}
function posToTextOffset(doc, pos, options) {
let offset = 0;
for (const emission of walkText(doc, options)) {
if (emission.kind === "text" || emission.kind === "leaf") {
if (pos < emission.from) return offset;
if (pos <= emission.to) {
if (emission.kind === "leaf")
return pos <= emission.from ? offset : offset + emission.text.length;
return offset + (pos - emission.from);
}
} else if (pos <= emission.from) {
return offset;
}
offset += emission.text.length;
}
return offset;
}
function textOffsetToPos(doc, offset, options) {
let current = 0;
let lastPos = 0;
for (const emission of walkText(doc, options)) {
const end = current + emission.text.length;
if (offset < end || offset === end && emission.kind === "text") {
if (emission.kind === "text") return emission.from + (offset - current);
if (emission.kind === "leaf") return emission.from;
return emission.from - 1;
}
current = end;
lastPos = emission.to;
}
return lastPos;
}
function getSelectionSnapshot(state, options) {
const { doc, selection } = state;
const text = walkText(doc, options).map((emission) => emission.text).join("");
if (selection.empty) {
const index = posToTextOffset(doc, selection.head, options);
return `${text.slice(0, index)}${CARET_MARKER}${text.slice(index)}`;
}
const from = posToTextOffset(doc, selection.from, options);
const to = posToTextOffset(doc, selection.to, options);
return `${text.slice(0, from)}${RANGE_OPEN_MARKER}${text.slice(
from,
to
)}${RANGE_CLOSE_MARKER}${text.slice(to)}`;
}
export { CARET_MARKER, RANGE_CLOSE_MARKER, RANGE_OPEN_MARKER, browser, calculateNodePosition, calculateTextPosition, cloneTr, customInputRules, customInputRulesKey, equalNodeType, findChildren, findChildrenByMark, findNodeInSelection, findParent, findParentNode, findParentNodeClosestToPos, findParentNodeType, findSelectedNodeOfType, flatten, getMarkFromSchema, getMarkRange, getNodeFromSchema, getSelectionSnapshot, isTextOnlySlice, markRule, nodeRule, posToDOMRect, posToTextOffset, textOffsetToPos };
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../src/toolkit/browser.ts","../src/toolkit/input-rules/custom-input-rules.ts","../src/toolkit/input-rules/mark-rule.ts","../src/toolkit/input-rules/node-rule.ts","../src/toolkit/position/index.ts","../src/toolkit/prose/helper.ts","../src/toolkit/prose/node.ts","../src/toolkit/prose/schema.ts","../src/toolkit/prose/selection.ts"],"sourcesContent":["/**\n * Copy paste from:\n * https://github.com/ProseMirror/prosemirror-view/blob/master/src/browser.ts\n */\n\nconst nav = typeof navigator != 'undefined' ? navigator : null\nconst doc = typeof document != 'undefined' ? document : null\nconst agent = (nav && nav.userAgent) || ''\n\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent)\nconst ie_upto10 = /MSIE \\d/.exec(agent)\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent)\n\nexport const ie = !!(ie_upto10 || ie_11up || ie_edge)\nexport const ie_version = ie_upto10\n ? (document as typeof document & { documentMode: unknown }).documentMode\n : ie_11up\n ? +ie_11up[1]!\n : ie_edge\n ? +ie_edge[1]!\n : 0\nexport const gecko = !ie && /gecko\\/(\\d+)/i.test(agent)\nexport const gecko_version =\n gecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1]\n\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent)\nexport const chrome = !!_chrome\nexport const chrome_version = _chrome ? +_chrome[1]! : 0\nexport const safari = !ie && !!nav && /Apple Computer/.test(nav.vendor)\n// Is true for both iOS and iPadOS for convenience\nexport const ios =\n safari && (/Mobile\\/\\w+/.test(agent) || (!!nav && nav.maxTouchPoints > 2))\nexport const mac = ios || (nav ? /Mac/.test(nav.platform) : false)\nexport const android = /Android \\d/.test(agent)\nexport const webkit =\n !!doc && 'webkitFontSmoothing' in doc.documentElement.style\nexport const webkit_version = webkit\n ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1]\n : 0\n","import type { InputRule } from '../../inputrules'\nimport type { EditorState, TextSelection, Transaction } from '../../state'\nimport type { EditorView } from '../../view'\n\nimport { Plugin, PluginKey } from '../../state'\nimport { android, chrome } from '../browser'\n\nfunction run(\n view: EditorView,\n from: number,\n to: number,\n text: string,\n rules: InputRule[],\n plugin: Plugin\n) {\n if (view.composing) return false\n const state = view.state\n const $from = state.doc.resolve(from)\n if ($from.parent.type.spec.code) return false\n const textBefore =\n $from.parent.textBetween(\n Math.max(0, $from.parentOffset - 500),\n $from.parentOffset,\n undefined,\n '\\uFFFC'\n ) + text\n for (let _matcher of rules) {\n const matcher = _matcher as unknown as {\n match: RegExp\n handler: (\n state: EditorState,\n match: string[],\n from: number,\n to: number\n ) => Transaction\n undoable?: boolean\n }\n const match = matcher.match.exec(textBefore)\n const tr =\n match &&\n match[0] &&\n matcher.handler(state, match, from - (match[0].length - text.length), to)\n if (!tr) continue\n if (matcher.undoable !== false)\n tr.setMeta(plugin, { transform: tr, from, to, text })\n view.dispatch(tr)\n return true\n }\n return false\n}\n\nexport const customInputRulesKey = new PluginKey('MILKDOWN_CUSTOM_INPUTRULES')\nexport function customInputRules({ rules }: { rules: InputRule[] }): Plugin {\n const plugin: Plugin = new Plugin({\n key: customInputRulesKey,\n isInputRules: true,\n\n state: {\n init() {\n return null\n },\n apply(this: typeof plugin, tr, prev) {\n const stored = tr.getMeta(this)\n if (stored) return stored\n return tr.selectionSet || tr.docChanged ? null : prev\n },\n },\n props: {\n handleTextInput(view, from, to, text) {\n return run(view, from, to, text, rules, plugin)\n },\n handleDOMEvents: {\n compositionend: (view) => {\n setTimeout(() => {\n const { $cursor } = view.state.selection as TextSelection\n if ($cursor) run(view, $cursor.pos, $cursor.pos, '', rules, plugin)\n })\n return false\n },\n keydown: (view, event) => {\n // On Chrome Android, prosemirror-view suppresses Enter keydown events\n // to avoid input corruption during composition. It then relies on DOM\n // mutation detection to retroactively handle Enter. However, this\n // fallback fails with custom node views (e.g. list-item-block) whose\n // wrapper DOM structure prevents the Enter detection heuristics from\n // recognizing the mutation. We intercept Enter here — before\n // prosemirror-view's suppression — and manually route it through\n // handleKeyDown so that keymaps (splitListItem, etc.) work correctly.\n if (!(android && chrome && (event as KeyboardEvent).key === 'Enter'))\n return false\n if (view.composing) return false\n if (\n view.someProp('handleKeyDown', (f) =>\n f(view, event as KeyboardEvent)\n )\n ) {\n event.preventDefault()\n return true\n }\n return false\n },\n },\n handleKeyDown(view, event) {\n if (event.key !== 'Enter') return false\n const { $cursor } = view.state.selection as TextSelection\n if ($cursor)\n return run(view, $cursor.pos, $cursor.pos, '\\n', rules, plugin)\n return false\n },\n },\n })\n return plugin\n}\n","import type { Mark, MarkType } from '../../model'\nimport type { Captured, Options } from './common'\n\nimport { InputRule } from '../../inputrules'\n\n/// Create an input rule for a mark.\nexport function markRule(\n regexp: RegExp,\n markType: MarkType,\n options: Options = {}\n): InputRule {\n return new InputRule(regexp, (state, match, start, end) => {\n const { tr } = state\n const matchLength = match.length\n\n let group = match[matchLength - 1]\n let fullMatch = match[0]\n let initialStoredMarks: readonly Mark[] = []\n\n let markEnd: number\n\n const captured: Captured = {\n group,\n fullMatch,\n start,\n end,\n }\n\n const result = options.updateCaptured?.(captured)\n Object.assign(captured, result)\n ;({ group, fullMatch, start, end } = captured)\n\n if (fullMatch === null) return null\n\n if (group?.trim() === '') return null\n\n if (group) {\n const startSpaces = fullMatch.search(/\\S/)\n const textStart = start + fullMatch.indexOf(group)\n const textEnd = textStart + group.length\n\n initialStoredMarks = tr.storedMarks ?? []\n\n if (textEnd < end) tr.delete(textEnd, end)\n\n if (textStart > start) tr.delete(start + startSpaces, textStart)\n\n markEnd = start + startSpaces + group.length\n\n const attrs = options.getAttr?.(match)\n\n tr.addMark(start, markEnd, markType.create(attrs))\n tr.setStoredMarks(initialStoredMarks)\n\n options.beforeDispatch?.({ match, start, end, tr })\n }\n\n return tr\n })\n}\n","import type { NodeType } from '../../model'\nimport type { Captured, Options } from './common'\n\nimport { InputRule } from '../../inputrules'\n\n/// Create an input rule for a node.\nexport function nodeRule(\n regexp: RegExp,\n nodeType: NodeType,\n options: Options = {}\n): InputRule {\n return new InputRule(regexp, (state, match, start, end) => {\n const { tr } = state\n let group: string | undefined = match[1]\n let fullMatch = match[0]\n\n const captured: Captured = {\n group,\n fullMatch,\n start,\n end,\n }\n\n const result = options.updateCaptured?.(captured)\n Object.assign(captured, result)\n ;({ group, fullMatch, start, end } = captured)\n\n if (fullMatch === null) return null\n\n if (!group || group.trim() === '') return null\n\n const attrs = options.getAttr?.(match)\n const node = nodeType.createAndFill(attrs)\n\n if (node) {\n tr.replaceRangeWith(\n nodeType.isBlock ? tr.doc.resolve(start).before() : start,\n end,\n node\n )\n options.beforeDispatch?.({\n match: [fullMatch, group],\n start,\n end,\n tr,\n })\n }\n\n return tr\n })\n}\n","import { expectDomTypeError, missingRootElement } from '@milkdown/exception'\n\nimport type { EditorView } from '../../view'\n\ntype Point = [top: number, left: number]\n\nexport function calculateNodePosition(\n view: EditorView,\n target: HTMLElement,\n handler: (\n selectedRect: DOMRect,\n targetRect: DOMRect,\n parentRect: DOMRect\n ) => Point\n) {\n const state = view.state\n const { from } = state.selection\n\n const { node } = view.domAtPos(from)\n const element = node instanceof Text ? node.parentElement : node\n if (!(element instanceof HTMLElement)) throw expectDomTypeError(element)\n\n const selectedNodeRect = element.getBoundingClientRect()\n const targetNodeRect = target.getBoundingClientRect()\n const parent = target.parentElement\n if (!parent) throw expectDomTypeError(parent)\n\n const parentNodeRect = parent.getBoundingClientRect()\n\n const [top, left] = handler(selectedNodeRect, targetNodeRect, parentNodeRect)\n\n target.style.top = `${top}px`\n target.style.left = `${left}px`\n}\n\ninterface Rect {\n left: number\n right: number\n top: number\n bottom: number\n}\n\nexport function calculateTextPosition(\n view: EditorView,\n target: HTMLElement,\n handler: (\n start: Rect,\n end: Rect,\n targetRect: DOMRect,\n parentRect: DOMRect\n ) => Point\n) {\n const state = view.state\n const { from, to } = state.selection\n const start = view.coordsAtPos(from)\n const end = view.coordsAtPos(to)\n\n const targetNodeRect = target.getBoundingClientRect()\n const parent = target.parentElement\n if (!parent) throw missingRootElement()\n\n const parentNodeRect = parent.getBoundingClientRect()\n\n const [top, left] = handler(start, end, targetNodeRect, parentNodeRect)\n\n target.style.top = `${top}px`\n target.style.left = `${left}px`\n}\n\nfunction minMax(value = 0, min = 0, max = 0): number {\n return Math.min(Math.max(value, min), max)\n}\n\nexport function posToDOMRect(\n view: EditorView,\n from: number,\n to: number\n): DOMRect {\n const minPos = 0\n const maxPos = view.state.doc.content.size\n const resolvedFrom = minMax(from, minPos, maxPos)\n const resolvedEnd = minMax(to, minPos, maxPos)\n const start = view.coordsAtPos(resolvedFrom)\n const end = view.coordsAtPos(resolvedEnd, -1)\n const top = Math.min(start.top, end.top)\n const bottom = Math.max(start.bottom, end.bottom)\n const left = Math.min(start.left, end.left)\n const right = Math.max(start.right, end.right)\n const width = right - left\n const height = bottom - top\n const x = left\n const y = top\n const data = {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x,\n y,\n }\n\n return {\n ...data,\n toJSON: () => data,\n }\n}\n","import type { Slice, NodeType, Node as ProseNode } from '../../model'\nimport type { Transaction } from '../../state'\n\nexport function cloneTr(tr: Transaction): Transaction {\n return Object.assign(Object.create(tr), tr).setTime(Date.now())\n}\n\nexport function equalNodeType(\n nodeType: NodeType | NodeType[],\n node: ProseNode\n) {\n return (\n (Array.isArray(nodeType) && nodeType.includes(node.type)) ||\n node.type === nodeType\n )\n}\n\nexport function isTextOnlySlice(slice: Slice): ProseNode | false {\n if (slice.content.childCount === 1) {\n const node = slice.content.firstChild\n if (node?.type.name === 'text' && node.marks.length === 0) return node\n\n if (node?.type.name === 'paragraph' && node.childCount === 1) {\n const _node = node.firstChild\n if (_node?.type.name === 'text' && _node.marks.length === 0) return _node\n }\n }\n\n return false\n}\n","import type { MarkType, Node, NodeType, ResolvedPos } from '../../model'\nimport type { Predicate } from './types'\n\nexport interface NodeWithPos {\n pos: number\n node: Node\n}\nexport interface NodeWithFromTo {\n from: number\n to: number\n node: Node\n}\n\nexport function flatten(node: Node, descend = true): NodeWithPos[] {\n const result: NodeWithPos[] = []\n node.descendants((child, pos) => {\n result.push({ node: child, pos })\n if (!descend) return false\n\n return undefined\n })\n return result\n}\n\nexport function findChildren(predicate: Predicate) {\n return (node: Node, descend?: boolean): NodeWithPos[] =>\n flatten(node, descend).filter((child) => predicate(child.node))\n}\n\nexport function findChildrenByMark(\n node: Node,\n markType: MarkType,\n descend?: boolean\n): NodeWithPos[] {\n return findChildren((child) => Boolean(markType.isInSet(child.marks)))(\n node,\n descend\n )\n}\n\nexport function findParent(predicate: Predicate) {\n return ($pos: ResolvedPos): NodeWithFromTo | undefined => {\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth)\n\n if (predicate(node)) {\n const from = $pos.before(depth)\n const to = $pos.after(depth)\n return {\n from,\n to,\n node,\n }\n }\n }\n\n return undefined\n }\n}\n\nexport function findParentNodeType($pos: ResolvedPos, nodeType: NodeType) {\n return findParent((node) => node.type === nodeType)($pos)\n}\n","import { getAtomFromSchemaFail } from '@milkdown/exception'\n\nimport type { MarkType, NodeType, Schema } from '../../model'\n\nexport function getNodeFromSchema(type: string, schema: Schema): NodeType {\n const target = schema.nodes[type]\n\n if (!target) throw getAtomFromSchemaFail('node', type)\n\n return target\n}\n\nexport function getMarkFromSchema(type: string, schema: Schema): MarkType {\n const target = schema.marks[type]\n\n if (!target) throw getAtomFromSchemaFail('mark', type)\n\n return target\n}\n","import type { NodeType, Node as ProseNode, ResolvedPos } from '../../model'\nimport type { EditorState, Selection } from '../../state'\nimport type { Predicate } from './types'\n\nimport { NodeSelection } from '../../state'\nimport { equalNodeType } from './helper'\n\nexport interface ContentNodeWithPos {\n pos: number\n start: number\n depth: number\n node: ProseNode\n}\n\nexport function findParentNodeClosestToPos(predicate: Predicate) {\n return ($pos: ResolvedPos): ContentNodeWithPos | undefined => {\n for (let i = $pos.depth; i > 0; i--) {\n const node = $pos.node(i)\n if (predicate(node)) {\n return {\n pos: $pos.before(i),\n start: $pos.start(i),\n depth: i,\n node,\n }\n }\n }\n\n return undefined\n }\n}\n\nexport function findParentNode(predicate: Predicate) {\n return (selection: Selection): ContentNodeWithPos | undefined => {\n return findParentNodeClosestToPos(predicate)(selection.$from)\n }\n}\n\nexport function findSelectedNodeOfType(\n selection: Selection,\n nodeType: NodeType\n): ContentNodeWithPos | undefined {\n if (!(selection instanceof NodeSelection)) return\n\n const { node, $from } = selection\n if (equalNodeType(nodeType, node))\n return {\n node,\n pos: $from.pos,\n start: $from.start($from.depth),\n depth: $from.depth,\n }\n\n return undefined\n}\n\nexport type FindNodeInSelectionResult = {\n hasNode: boolean\n pos: number\n target: ProseNode | null\n}\n\nexport const findNodeInSelection = (\n state: EditorState,\n node: NodeType\n): FindNodeInSelectionResult => {\n const { selection, doc } = state\n if (selection instanceof NodeSelection) {\n return {\n hasNode: selection.node.type === node,\n pos: selection.from,\n target: selection.node,\n }\n }\n\n const { from, to } = selection\n\n let hasNode = false\n let pos = -1\n let target: ProseNode | null = null\n doc.nodesBetween(from, to, (n, p) => {\n if (target) return false\n if (n.type === node) {\n hasNode = true\n pos = p\n target = n\n return false\n }\n return true\n })\n\n return {\n hasNode,\n pos,\n target,\n }\n}\n"],"names":[],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../src/toolkit/browser.ts","../src/toolkit/input-rules/custom-input-rules.ts","../src/toolkit/input-rules/mark-rule.ts","../src/toolkit/input-rules/node-rule.ts","../src/toolkit/position/index.ts","../src/toolkit/prose/helper.ts","../src/toolkit/prose/mark.ts","../src/toolkit/prose/node.ts","../src/toolkit/prose/schema.ts","../src/toolkit/prose/selection.ts","../src/toolkit/prose/snapshot.ts"],"sourcesContent":["/**\n * Copy paste from:\n * https://github.com/ProseMirror/prosemirror-view/blob/master/src/browser.ts\n */\n\nconst nav = typeof navigator != 'undefined' ? navigator : null\nconst doc = typeof document != 'undefined' ? document : null\nconst agent = (nav && nav.userAgent) || ''\n\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent)\nconst ie_upto10 = /MSIE \\d/.exec(agent)\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent)\n\nexport const ie = !!(ie_upto10 || ie_11up || ie_edge)\nexport const ie_version = ie_upto10\n ? (document as typeof document & { documentMode: unknown }).documentMode\n : ie_11up\n ? +ie_11up[1]!\n : ie_edge\n ? +ie_edge[1]!\n : 0\nexport const gecko = !ie && /gecko\\/(\\d+)/i.test(agent)\nexport const gecko_version =\n gecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1]\n\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent)\nexport const chrome = !!_chrome\nexport const chrome_version = _chrome ? +_chrome[1]! : 0\nexport const safari = !ie && !!nav && /Apple Computer/.test(nav.vendor)\n// Is true for both iOS and iPadOS for convenience\nexport const ios =\n safari && (/Mobile\\/\\w+/.test(agent) || (!!nav && nav.maxTouchPoints > 2))\nexport const mac = ios || (nav ? /Mac/.test(nav.platform) : false)\nexport const android = /Android \\d/.test(agent)\nexport const webkit =\n !!doc && 'webkitFontSmoothing' in doc.documentElement.style\nexport const webkit_version = webkit\n ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1]\n : 0\n","import type { InputRule } from '../../inputrules'\nimport type { EditorState, TextSelection, Transaction } from '../../state'\nimport type { EditorView } from '../../view'\n\nimport { Plugin, PluginKey } from '../../state'\nimport { android, chrome } from '../browser'\n\nfunction run(\n view: EditorView,\n from: number,\n to: number,\n text: string,\n rules: InputRule[],\n plugin: Plugin\n) {\n if (view.composing) return false\n const state = view.state\n const $from = state.doc.resolve(from)\n if ($from.parent.type.spec.code) return false\n const textBefore =\n $from.parent.textBetween(\n Math.max(0, $from.parentOffset - 500),\n $from.parentOffset,\n undefined,\n '\\uFFFC'\n ) + text\n for (let _matcher of rules) {\n const matcher = _matcher as unknown as {\n match: RegExp\n handler: (\n state: EditorState,\n match: string[],\n from: number,\n to: number\n ) => Transaction\n undoable?: boolean\n }\n const match = matcher.match.exec(textBefore)\n const tr =\n match &&\n match[0] &&\n matcher.handler(state, match, from - (match[0].length - text.length), to)\n if (!tr) continue\n if (matcher.undoable !== false)\n tr.setMeta(plugin, { transform: tr, from, to, text })\n view.dispatch(tr)\n return true\n }\n return false\n}\n\nexport const customInputRulesKey = new PluginKey('MILKDOWN_CUSTOM_INPUTRULES')\nexport function customInputRules({ rules }: { rules: InputRule[] }): Plugin {\n const plugin: Plugin = new Plugin({\n key: customInputRulesKey,\n isInputRules: true,\n\n state: {\n init() {\n return null\n },\n apply(this: typeof plugin, tr, prev) {\n const stored = tr.getMeta(this)\n if (stored) return stored\n return tr.selectionSet || tr.docChanged ? null : prev\n },\n },\n props: {\n handleTextInput(view, from, to, text) {\n return run(view, from, to, text, rules, plugin)\n },\n handleDOMEvents: {\n compositionend: (view) => {\n setTimeout(() => {\n const { $cursor } = view.state.selection as TextSelection\n if ($cursor) run(view, $cursor.pos, $cursor.pos, '', rules, plugin)\n })\n return false\n },\n keydown: (view, event) => {\n // On Chrome Android, prosemirror-view suppresses Enter keydown events\n // to avoid input corruption during composition. It then relies on DOM\n // mutation detection to retroactively handle Enter. However, this\n // fallback fails with custom node views (e.g. list-item-block) whose\n // wrapper DOM structure prevents the Enter detection heuristics from\n // recognizing the mutation. We intercept Enter here — before\n // prosemirror-view's suppression — and manually route it through\n // handleKeyDown so that keymaps (splitListItem, etc.) work correctly.\n if (!(android && chrome && (event as KeyboardEvent).key === 'Enter'))\n return false\n if (view.composing) return false\n if (\n view.someProp('handleKeyDown', (f) =>\n f(view, event as KeyboardEvent)\n )\n ) {\n event.preventDefault()\n return true\n }\n return false\n },\n },\n handleKeyDown(view, event) {\n if (event.key !== 'Enter') return false\n const { $cursor } = view.state.selection as TextSelection\n if ($cursor)\n return run(view, $cursor.pos, $cursor.pos, '\\n', rules, plugin)\n return false\n },\n },\n })\n return plugin\n}\n","import type { Mark, MarkType } from '../../model'\nimport type { Captured, Options } from './common'\n\nimport { InputRule } from '../../inputrules'\n\n/// Create an input rule for a mark.\nexport function markRule(\n regexp: RegExp,\n markType: MarkType,\n options: Options = {}\n): InputRule {\n return new InputRule(regexp, (state, match, start, end) => {\n const { tr } = state\n const matchLength = match.length\n\n let group = match[matchLength - 1]\n let fullMatch = match[0]\n let initialStoredMarks: readonly Mark[] = []\n\n let markEnd: number\n\n const captured: Captured = {\n group,\n fullMatch,\n start,\n end,\n }\n\n const result = options.updateCaptured?.(captured)\n Object.assign(captured, result)\n ;({ group, fullMatch, start, end } = captured)\n\n if (fullMatch === null) return null\n\n if (group?.trim() === '') return null\n\n if (group) {\n const startSpaces = fullMatch.search(/\\S/)\n const textStart = start + fullMatch.indexOf(group)\n const textEnd = textStart + group.length\n\n initialStoredMarks = tr.storedMarks ?? []\n\n if (textEnd < end) tr.delete(textEnd, end)\n\n if (textStart > start) tr.delete(start + startSpaces, textStart)\n\n markEnd = start + startSpaces + group.length\n\n const attrs = options.getAttr?.(match)\n\n tr.addMark(start, markEnd, markType.create(attrs))\n tr.setStoredMarks(initialStoredMarks)\n\n options.beforeDispatch?.({ match, start, end, tr })\n }\n\n return tr\n })\n}\n","import type { NodeType } from '../../model'\nimport type { Captured, Options } from './common'\n\nimport { InputRule } from '../../inputrules'\n\n/// Create an input rule for a node.\nexport function nodeRule(\n regexp: RegExp,\n nodeType: NodeType,\n options: Options = {}\n): InputRule {\n return new InputRule(regexp, (state, match, start, end) => {\n const { tr } = state\n let group: string | undefined = match[1]\n let fullMatch = match[0]\n\n const captured: Captured = {\n group,\n fullMatch,\n start,\n end,\n }\n\n const result = options.updateCaptured?.(captured)\n Object.assign(captured, result)\n ;({ group, fullMatch, start, end } = captured)\n\n if (fullMatch === null) return null\n\n if (!group || group.trim() === '') return null\n\n const attrs = options.getAttr?.(match)\n const node = nodeType.createAndFill(attrs)\n\n if (node) {\n tr.replaceRangeWith(\n nodeType.isBlock ? tr.doc.resolve(start).before() : start,\n end,\n node\n )\n options.beforeDispatch?.({\n match: [fullMatch, group],\n start,\n end,\n tr,\n })\n }\n\n return tr\n })\n}\n","import { expectDomTypeError, missingRootElement } from '@milkdown/exception'\n\nimport type { EditorView } from '../../view'\n\ntype Point = [top: number, left: number]\n\nexport function calculateNodePosition(\n view: EditorView,\n target: HTMLElement,\n handler: (\n selectedRect: DOMRect,\n targetRect: DOMRect,\n parentRect: DOMRect\n ) => Point\n) {\n const state = view.state\n const { from } = state.selection\n\n const { node } = view.domAtPos(from)\n const element = node instanceof Text ? node.parentElement : node\n if (!(element instanceof HTMLElement)) throw expectDomTypeError(element)\n\n const selectedNodeRect = element.getBoundingClientRect()\n const targetNodeRect = target.getBoundingClientRect()\n const parent = target.parentElement\n if (!parent) throw expectDomTypeError(parent)\n\n const parentNodeRect = parent.getBoundingClientRect()\n\n const [top, left] = handler(selectedNodeRect, targetNodeRect, parentNodeRect)\n\n target.style.top = `${top}px`\n target.style.left = `${left}px`\n}\n\ninterface Rect {\n left: number\n right: number\n top: number\n bottom: number\n}\n\nexport function calculateTextPosition(\n view: EditorView,\n target: HTMLElement,\n handler: (\n start: Rect,\n end: Rect,\n targetRect: DOMRect,\n parentRect: DOMRect\n ) => Point\n) {\n const state = view.state\n const { from, to } = state.selection\n const start = view.coordsAtPos(from)\n const end = view.coordsAtPos(to)\n\n const targetNodeRect = target.getBoundingClientRect()\n const parent = target.parentElement\n if (!parent) throw missingRootElement()\n\n const parentNodeRect = parent.getBoundingClientRect()\n\n const [top, left] = handler(start, end, targetNodeRect, parentNodeRect)\n\n target.style.top = `${top}px`\n target.style.left = `${left}px`\n}\n\nfunction minMax(value = 0, min = 0, max = 0): number {\n return Math.min(Math.max(value, min), max)\n}\n\nexport function posToDOMRect(\n view: EditorView,\n from: number,\n to: number\n): DOMRect {\n const minPos = 0\n const maxPos = view.state.doc.content.size\n const resolvedFrom = minMax(from, minPos, maxPos)\n const resolvedEnd = minMax(to, minPos, maxPos)\n const start = view.coordsAtPos(resolvedFrom)\n const end = view.coordsAtPos(resolvedEnd, -1)\n const top = Math.min(start.top, end.top)\n const bottom = Math.max(start.bottom, end.bottom)\n const left = Math.min(start.left, end.left)\n const right = Math.max(start.right, end.right)\n const width = right - left\n const height = bottom - top\n const x = left\n const y = top\n const data = {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x,\n y,\n }\n\n return {\n ...data,\n toJSON: () => data,\n }\n}\n","import type { Slice, NodeType, Node as ProseNode } from '../../model'\nimport type { Transaction } from '../../state'\n\nexport function cloneTr(tr: Transaction): Transaction {\n return Object.assign(Object.create(tr), tr).setTime(Date.now())\n}\n\nexport function equalNodeType(\n nodeType: NodeType | NodeType[],\n node: ProseNode\n) {\n return (\n (Array.isArray(nodeType) && nodeType.includes(node.type)) ||\n node.type === nodeType\n )\n}\n\nexport function isTextOnlySlice(slice: Slice): ProseNode | false {\n if (slice.content.childCount === 1) {\n const node = slice.content.firstChild\n if (node?.type.name === 'text' && node.marks.length === 0) return node\n\n if (node?.type.name === 'paragraph' && node.childCount === 1) {\n const _node = node.firstChild\n if (_node?.type.name === 'text' && _node.marks.length === 0) return _node\n }\n }\n\n return false\n}\n","import type { Mark, MarkType, ResolvedPos } from '../../model'\n\nexport interface MarkRange {\n mark: Mark\n from: number\n to: number\n}\n\n/// Find the extent of a mark of the given type around a resolved position.\n///\n/// The lookup is boundary-inclusive on both edges: a caret sitting right\n/// before or right after a marked run still resolves to it. When marked runs\n/// touch the position on both sides, the run after the position wins.\n///\n/// The run is extended by mark equality (`Mark.eq`, type + attrs), so two\n/// adjacent links with different hrefs resolve as two separate ranges.\nexport function getMarkRange(\n $pos: ResolvedPos,\n type: MarkType\n): MarkRange | undefined {\n const parent = $pos.parent\n\n let cursor = parent.childAfter($pos.parentOffset)\n if (!cursor.node || !type.isInSet(cursor.node.marks))\n cursor = parent.childBefore($pos.parentOffset)\n if (!cursor.node) return undefined\n\n const mark = type.isInSet(cursor.node.marks)\n if (!mark) return undefined\n\n let index = cursor.index\n let from = $pos.start() + cursor.offset\n let to = from + cursor.node.nodeSize\n\n while (index > 0 && mark.isInSet(parent.child(index - 1).marks)) {\n index -= 1\n from -= parent.child(index).nodeSize\n }\n\n let endIndex = cursor.index + 1\n while (\n endIndex < parent.childCount &&\n mark.isInSet(parent.child(endIndex).marks)\n ) {\n to += parent.child(endIndex).nodeSize\n endIndex += 1\n }\n\n return { mark, from, to }\n}\n","import type { MarkType, Node, NodeType, ResolvedPos } from '../../model'\nimport type { Predicate } from './types'\n\nexport interface NodeWithPos {\n pos: number\n node: Node\n}\nexport interface NodeWithFromTo {\n from: number\n to: number\n node: Node\n}\n\nexport function flatten(node: Node, descend = true): NodeWithPos[] {\n const result: NodeWithPos[] = []\n node.descendants((child, pos) => {\n result.push({ node: child, pos })\n if (!descend) return false\n\n return undefined\n })\n return result\n}\n\nexport function findChildren(predicate: Predicate) {\n return (node: Node, descend?: boolean): NodeWithPos[] =>\n flatten(node, descend).filter((child) => predicate(child.node))\n}\n\nexport function findChildrenByMark(\n node: Node,\n markType: MarkType,\n descend?: boolean\n): NodeWithPos[] {\n return findChildren((child) => Boolean(markType.isInSet(child.marks)))(\n node,\n descend\n )\n}\n\nexport function findParent(predicate: Predicate) {\n return ($pos: ResolvedPos): NodeWithFromTo | undefined => {\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth)\n\n if (predicate(node)) {\n const from = $pos.before(depth)\n const to = $pos.after(depth)\n return {\n from,\n to,\n node,\n }\n }\n }\n\n return undefined\n }\n}\n\nexport function findParentNodeType($pos: ResolvedPos, nodeType: NodeType) {\n return findParent((node) => node.type === nodeType)($pos)\n}\n","import { getAtomFromSchemaFail } from '@milkdown/exception'\n\nimport type { MarkType, NodeType, Schema } from '../../model'\n\nexport function getNodeFromSchema(type: string, schema: Schema): NodeType {\n const target = schema.nodes[type]\n\n if (!target) throw getAtomFromSchemaFail('node', type)\n\n return target\n}\n\nexport function getMarkFromSchema(type: string, schema: Schema): MarkType {\n const target = schema.marks[type]\n\n if (!target) throw getAtomFromSchemaFail('mark', type)\n\n return target\n}\n","import type { NodeType, Node as ProseNode, ResolvedPos } from '../../model'\nimport type { EditorState, Selection } from '../../state'\nimport type { Predicate } from './types'\n\nimport { NodeSelection } from '../../state'\nimport { equalNodeType } from './helper'\n\nexport interface ContentNodeWithPos {\n pos: number\n start: number\n depth: number\n node: ProseNode\n}\n\nexport function findParentNodeClosestToPos(predicate: Predicate) {\n return ($pos: ResolvedPos): ContentNodeWithPos | undefined => {\n for (let i = $pos.depth; i > 0; i--) {\n const node = $pos.node(i)\n if (predicate(node)) {\n return {\n pos: $pos.before(i),\n start: $pos.start(i),\n depth: i,\n node,\n }\n }\n }\n\n return undefined\n }\n}\n\nexport function findParentNode(predicate: Predicate) {\n return (selection: Selection): ContentNodeWithPos | undefined => {\n return findParentNodeClosestToPos(predicate)(selection.$from)\n }\n}\n\nexport function findSelectedNodeOfType(\n selection: Selection,\n nodeType: NodeType\n): ContentNodeWithPos | undefined {\n if (!(selection instanceof NodeSelection)) return\n\n const { node, $from } = selection\n if (equalNodeType(nodeType, node))\n return {\n node,\n pos: $from.pos,\n start: $from.start($from.depth),\n depth: $from.depth,\n }\n\n return undefined\n}\n\nexport type FindNodeInSelectionResult = {\n hasNode: boolean\n pos: number\n target: ProseNode | null\n}\n\nexport const findNodeInSelection = (\n state: EditorState,\n node: NodeType\n): FindNodeInSelectionResult => {\n const { selection, doc } = state\n if (selection instanceof NodeSelection) {\n return {\n hasNode: selection.node.type === node,\n pos: selection.from,\n target: selection.node,\n }\n }\n\n const { from, to } = selection\n\n let hasNode = false\n let pos = -1\n let target: ProseNode | null = null\n doc.nodesBetween(from, to, (n, p) => {\n if (target) return false\n if (n.type === node) {\n hasNode = true\n pos = p\n target = n\n return false\n }\n return true\n })\n\n return {\n hasNode,\n pos,\n target,\n }\n}\n","import type { Node as ProseNode } from '../../model'\nimport type { EditorState } from '../../state'\n\nexport const CARET_MARKER = '┃'\nexport const RANGE_OPEN_MARKER = '❰'\nexport const RANGE_CLOSE_MARKER = '❱'\n\nexport interface TextIndexOptions {\n blockSeparator?: string\n leafText?: string\n}\n\ninterface Emission {\n text: string\n kind: 'text' | 'leaf' | 'separator'\n /// Doc range covered by the emitted text. For separators the range is\n /// empty and anchored at the position of the block node they precede.\n from: number\n to: number\n}\n\nfunction walkText(doc: ProseNode, options?: TextIndexOptions): Emission[] {\n const { blockSeparator = '\\n', leafText = '□' } = options ?? {}\n const emissions: Emission[] = []\n let firstBlock = true\n\n const pushSeparator = (pos: number) => {\n if (firstBlock) {\n firstBlock = false\n return\n }\n emissions.push({\n text: blockSeparator,\n kind: 'separator',\n from: pos,\n to: pos,\n })\n }\n\n doc.descendants((node, pos) => {\n if (node.isText) {\n emissions.push({\n text: node.text ?? '',\n kind: 'text',\n from: pos,\n to: pos + node.nodeSize,\n })\n return false\n }\n if (node.isInline && node.isLeaf) {\n emissions.push({\n text: leafText,\n kind: 'leaf',\n from: pos,\n to: pos + node.nodeSize,\n })\n return false\n }\n if (node.isTextblock) {\n pushSeparator(pos)\n return true\n }\n if (node.isLeaf) {\n pushSeparator(pos)\n emissions.push({\n text: leafText,\n kind: 'leaf',\n from: pos,\n to: pos + node.nodeSize,\n })\n return false\n }\n return true\n })\n\n return emissions\n}\n\n/// Map a document position to an offset in the flattened text produced by\n/// `getSelectionSnapshot` (without markers).\nexport function posToTextOffset(\n doc: ProseNode,\n pos: number,\n options?: TextIndexOptions\n): number {\n let offset = 0\n for (const emission of walkText(doc, options)) {\n if (emission.kind === 'text' || emission.kind === 'leaf') {\n if (pos < emission.from) return offset\n if (pos <= emission.to) {\n if (emission.kind === 'leaf')\n return pos <= emission.from ? offset : offset + emission.text.length\n return offset + (pos - emission.from)\n }\n } else if (pos <= emission.from) {\n return offset\n }\n offset += emission.text.length\n }\n return offset\n}\n\n/// Map an offset in the flattened text back to a document position. Offsets\n/// pointing at a block separator resolve to the end of the previous block;\n/// offsets inside a leaf placeholder resolve to the position before the leaf.\nexport function textOffsetToPos(\n doc: ProseNode,\n offset: number,\n options?: TextIndexOptions\n): number {\n let current = 0\n let lastPos = 0\n for (const emission of walkText(doc, options)) {\n const end = current + emission.text.length\n if (offset < end || (offset === end && emission.kind === 'text')) {\n if (emission.kind === 'text') return emission.from + (offset - current)\n if (emission.kind === 'leaf') return emission.from\n return emission.from - 1\n }\n current = end\n lastPos = emission.to\n }\n return lastPos\n}\n\n/// Render the document text with the selection drawn in: `┃` for a caret,\n/// `❰…❱` for a range. Blocks are joined with `blockSeparator` and leaf nodes\n/// render as `leafText`. Made for inline snapshot assertions in tests.\nexport function getSelectionSnapshot(\n state: EditorState,\n options?: TextIndexOptions\n): string {\n const { doc, selection } = state\n const text = walkText(doc, options)\n .map((emission) => emission.text)\n .join('')\n\n if (selection.empty) {\n const index = posToTextOffset(doc, selection.head, options)\n return `${text.slice(0, index)}${CARET_MARKER}${text.slice(index)}`\n }\n\n const from = posToTextOffset(doc, selection.from, options)\n const to = posToTextOffset(doc, selection.to, options)\n return `${text.slice(0, from)}${RANGE_OPEN_MARKER}${text.slice(\n from,\n to\n )}${RANGE_CLOSE_MARKER}${text.slice(to)}`\n}\n"],"names":[],"mappings":"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"}
export * from './helper';
export * from './mark';
export * from './node';
export * from './schema';
export * from './selection';
export * from './snapshot';
//# sourceMappingURL=index.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/toolkit/prose/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/toolkit/prose/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,QAAQ,CAAA;AACtB,cAAc,QAAQ,CAAA;AACtB,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA"}
{
"name": "@milkdown/prose",
"version": "7.21.2",
"version": "7.21.3",
"license": "MIT",

@@ -92,3 +92,3 @@ "repository": {

"prosemirror-view": "^1.41.3",
"@milkdown/exception": "7.21.2"
"@milkdown/exception": "7.21.3"
},

@@ -95,0 +95,0 @@ "scripts": {

export * from './helper'
export * from './mark'
export * from './node'
export * from './schema'
export * from './selection'
export * from './snapshot'

Sorry, the diff of this file is not supported yet