|
|
import OrderedMap from 'orderedmap';
|
|
|
|
|
|
/**
|
|
|
A mark is a piece of information that can be attached to a node,
|
|
|
such as it being emphasized, in code font, or a link. It has a
|
|
|
type and optionally a set of attributes that provide further
|
|
|
information (such as the target of the link). Marks are created
|
|
|
through a `Schema`, which controls which types exist and which
|
|
|
attributes they have.
|
|
|
*/
|
|
|
declare class Mark {
|
|
|
/**
|
|
|
The type of this mark.
|
|
|
*/
|
|
|
readonly type: MarkType;
|
|
|
/**
|
|
|
The attributes associated with this mark.
|
|
|
*/
|
|
|
readonly attrs: Attrs;
|
|
|
/**
|
|
|
Given a set of marks, create a new set which contains this one as
|
|
|
well, in the right position. If this mark is already in the set,
|
|
|
the set itself is returned. If any marks that are set to be
|
|
|
[exclusive](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) with this mark are present,
|
|
|
those are replaced by this one.
|
|
|
*/
|
|
|
addToSet(set: readonly Mark[]): readonly Mark[];
|
|
|
/**
|
|
|
Remove this mark from the given set, returning a new set. If this
|
|
|
mark is not in the set, the set itself is returned.
|
|
|
*/
|
|
|
removeFromSet(set: readonly Mark[]): readonly Mark[];
|
|
|
/**
|
|
|
Test whether this mark is in the given set of marks.
|
|
|
*/
|
|
|
isInSet(set: readonly Mark[]): boolean;
|
|
|
/**
|
|
|
Test whether this mark has the same type and attributes as
|
|
|
another mark.
|
|
|
*/
|
|
|
eq(other: Mark): boolean;
|
|
|
/**
|
|
|
Convert this mark to a JSON-serializeable representation.
|
|
|
*/
|
|
|
toJSON(): any;
|
|
|
/**
|
|
|
Deserialize a mark from JSON.
|
|
|
*/
|
|
|
static fromJSON(schema: Schema, json: any): Mark;
|
|
|
/**
|
|
|
Test whether two sets of marks are identical.
|
|
|
*/
|
|
|
static sameSet(a: readonly Mark[], b: readonly Mark[]): boolean;
|
|
|
/**
|
|
|
Create a properly sorted mark set from null, a single mark, or an
|
|
|
unsorted array of marks.
|
|
|
*/
|
|
|
static setFrom(marks?: Mark | readonly Mark[] | null): readonly Mark[];
|
|
|
/**
|
|
|
The empty set of marks.
|
|
|
*/
|
|
|
static none: readonly Mark[];
|
|
|
}
|
|
|
|
|
|
declare type DOMNode = InstanceType<typeof window.Node>;
|
|
|
|
|
|
/**
|
|
|
A description of a DOM structure. Can be either a string, which is
|
|
|
interpreted as a text node, a DOM node, which is interpreted as
|
|
|
itself, a `{dom, contentDOM}` object, or an array.
|
|
|
|
|
|
An array describes a DOM element. The first value in the array
|
|
|
should be a string—the name of the DOM element, optionally prefixed
|
|
|
by a namespace URL and a space. If the second element is plain
|
|
|
object, it is interpreted as a set of attributes for the element.
|
|
|
Any elements after that (including the 2nd if it's not an attribute
|
|
|
object) are interpreted as children of the DOM elements, and must
|
|
|
either be valid `DOMOutputSpec` values, or the number zero.
|
|
|
|
|
|
The number zero (pronounced “hole”) is used to indicate the place
|
|
|
where a node's child nodes should be inserted. If it occurs in an
|
|
|
output spec, it should be the only child element in its parent
|
|
|
node.
|
|
|
*/
|
|
|
declare type DOMOutputSpec = string | DOMNode | {
|
|
|
dom: DOMNode;
|
|
|
contentDOM?: HTMLElement;
|
|
|
} | readonly [string, ...any[]];
|
|
|
/**
|
|
|
A DOM serializer knows how to convert ProseMirror nodes and
|
|
|
marks of various types to DOM nodes.
|
|
|
*/
|
|
|
declare class DOMSerializer {
|
|
|
/**
|
|
|
The node serialization functions.
|
|
|
*/
|
|
|
readonly nodes: {
|
|
|
[node: string]: (node: Node) => DOMOutputSpec;
|
|
|
};
|
|
|
/**
|
|
|
The mark serialization functions.
|
|
|
*/
|
|
|
readonly marks: {
|
|
|
[mark: string]: (mark: Mark, inline: boolean) => DOMOutputSpec;
|
|
|
};
|
|
|
/**
|
|
|
Create a serializer. `nodes` should map node names to functions
|
|
|
that take a node and return a description of the corresponding
|
|
|
DOM. `marks` does the same for mark names, but also gets an
|
|
|
argument that tells it whether the mark's content is block or
|
|
|
inline content (for typical use, it'll always be inline). A mark
|
|
|
serializer may be `null` to indicate that marks of that type
|
|
|
should not be serialized.
|
|
|
*/
|
|
|
constructor(
|
|
|
/**
|
|
|
The node serialization functions.
|
|
|
*/
|
|
|
nodes: {
|
|
|
[node: string]: (node: Node) => DOMOutputSpec;
|
|
|
},
|
|
|
/**
|
|
|
The mark serialization functions.
|
|
|
*/
|
|
|
marks: {
|
|
|
[mark: string]: (mark: Mark, inline: boolean) => DOMOutputSpec;
|
|
|
});
|
|
|
/**
|
|
|
Serialize the content of this fragment to a DOM fragment. When
|
|
|
not in the browser, the `document` option, containing a DOM
|
|
|
document, should be passed so that the serializer can create
|
|
|
nodes.
|
|
|
*/
|
|
|
serializeFragment(fragment: Fragment, options?: {
|
|
|
document?: Document;
|
|
|
}, target?: HTMLElement | DocumentFragment): HTMLElement | DocumentFragment;
|
|
|
/**
|
|
|
Serialize this node to a DOM node. This can be useful when you
|
|
|
need to serialize a part of a document, as opposed to the whole
|
|
|
document. To serialize a whole document, use
|
|
|
[`serializeFragment`](https://prosemirror.net/docs/ref/#model.DOMSerializer.serializeFragment) on
|
|
|
its [content](https://prosemirror.net/docs/ref/#model.Node.content).
|
|
|
*/
|
|
|
serializeNode(node: Node, options?: {
|
|
|
document?: Document;
|
|
|
}): globalThis.Node;
|
|
|
/**
|
|
|
Render an [output spec](https://prosemirror.net/docs/ref/#model.DOMOutputSpec) to a DOM node. If
|
|
|
the spec has a hole (zero) in it, `contentDOM` will point at the
|
|
|
node with the hole.
|
|
|
*/
|
|
|
static renderSpec(doc: Document, structure: DOMOutputSpec, xmlNS?: string | null): {
|
|
|
dom: DOMNode;
|
|
|
contentDOM?: HTMLElement;
|
|
|
};
|
|
|
/**
|
|
|
Build a serializer using the [`toDOM`](https://prosemirror.net/docs/ref/#model.NodeSpec.toDOM)
|
|
|
properties in a schema's node and mark specs.
|
|
|
*/
|
|
|
static fromSchema(schema: Schema): DOMSerializer;
|
|
|
/**
|
|
|
Gather the serializers in a schema's node specs into an object.
|
|
|
This can be useful as a base to build a custom serializer from.
|
|
|
*/
|
|
|
static nodesFromSchema(schema: Schema): {
|
|
|
[node: string]: (node: Node) => DOMOutputSpec;
|
|
|
};
|
|
|
/**
|
|
|
Gather the serializers in a schema's mark specs into an object.
|
|
|
*/
|
|
|
static marksFromSchema(schema: Schema): {
|
|
|
[mark: string]: (mark: Mark, inline: boolean) => DOMOutputSpec;
|
|
|
};
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
You can [_resolve_](https://prosemirror.net/docs/ref/#model.Node.resolve) a position to get more
|
|
|
information about it. Objects of this class represent such a
|
|
|
resolved position, providing various pieces of context
|
|
|
information, and some helper methods.
|
|
|
|
|
|
Throughout this interface, methods that take an optional `depth`
|
|
|
parameter will interpret undefined as `this.depth` and negative
|
|
|
numbers as `this.depth + value`.
|
|
|
*/
|
|
|
declare class ResolvedPos {
|
|
|
/**
|
|
|
The position that was resolved.
|
|
|
*/
|
|
|
readonly pos: number;
|
|
|
/**
|
|
|
The offset this position has into its parent node.
|
|
|
*/
|
|
|
readonly parentOffset: number;
|
|
|
/**
|
|
|
The number of levels the parent node is from the root. If this
|
|
|
position points directly into the root node, it is 0. If it
|
|
|
points into a top-level paragraph, 1, and so on.
|
|
|
*/
|
|
|
depth: number;
|
|
|
/**
|
|
|
The parent node that the position points into. Note that even if
|
|
|
a position points into a text node, that node is not considered
|
|
|
the parent—text nodes are ‘flat’ in this model, and have no content.
|
|
|
*/
|
|
|
get parent(): Node;
|
|
|
/**
|
|
|
The root node in which the position was resolved.
|
|
|
*/
|
|
|
get doc(): Node;
|
|
|
/**
|
|
|
The ancestor node at the given level. `p.node(p.depth)` is the
|
|
|
same as `p.parent`.
|
|
|
*/
|
|
|
node(depth?: number | null): Node;
|
|
|
/**
|
|
|
The index into the ancestor at the given level. If this points
|
|
|
at the 3rd node in the 2nd paragraph on the top level, for
|
|
|
example, `p.index(0)` is 1 and `p.index(1)` is 2.
|
|
|
*/
|
|
|
index(depth?: number | null): number;
|
|
|
/**
|
|
|
The index pointing after this position into the ancestor at the
|
|
|
given level.
|
|
|
*/
|
|
|
indexAfter(depth?: number | null): number;
|
|
|
/**
|
|
|
The (absolute) position at the start of the node at the given
|
|
|
level.
|
|
|
*/
|
|
|
start(depth?: number | null): number;
|
|
|
/**
|
|
|
The (absolute) position at the end of the node at the given
|
|
|
level.
|
|
|
*/
|
|
|
end(depth?: number | null): number;
|
|
|
/**
|
|
|
The (absolute) position directly before the wrapping node at the
|
|
|
given level, or, when `depth` is `this.depth + 1`, the original
|
|
|
position.
|
|
|
*/
|
|
|
before(depth?: number | null): number;
|
|
|
/**
|
|
|
The (absolute) position directly after the wrapping node at the
|
|
|
given level, or the original position when `depth` is `this.depth + 1`.
|
|
|
*/
|
|
|
after(depth?: number | null): number;
|
|
|
/**
|
|
|
When this position points into a text node, this returns the
|
|
|
distance between the position and the start of the text node.
|
|
|
Will be zero for positions that point between nodes.
|
|
|
*/
|
|
|
get textOffset(): number;
|
|
|
/**
|
|
|
Get the node directly after the position, if any. If the position
|
|
|
points into a text node, only the part of that node after the
|
|
|
position is returned.
|
|
|
*/
|
|
|
get nodeAfter(): Node | null;
|
|
|
/**
|
|
|
Get the node directly before the position, if any. If the
|
|
|
position points into a text node, only the part of that node
|
|
|
before the position is returned.
|
|
|
*/
|
|
|
get nodeBefore(): Node | null;
|
|
|
/**
|
|
|
Get the position at the given index in the parent node at the
|
|
|
given depth (which defaults to `this.depth`).
|
|
|
*/
|
|
|
posAtIndex(index: number, depth?: number | null): number;
|
|
|
/**
|
|
|
Get the marks at this position, factoring in the surrounding
|
|
|
marks' [`inclusive`](https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive) property. If the
|
|
|
position is at the start of a non-empty node, the marks of the
|
|
|
node after it (if any) are returned.
|
|
|
*/
|
|
|
marks(): readonly Mark[];
|
|
|
/**
|
|
|
Get the marks after the current position, if any, except those
|
|
|
that are non-inclusive and not present at position `$end`. This
|
|
|
is mostly useful for getting the set of marks to preserve after a
|
|
|
deletion. Will return `null` if this position is at the end of
|
|
|
its parent node or its parent node isn't a textblock (in which
|
|
|
case no marks should be preserved).
|
|
|
*/
|
|
|
marksAcross($end: ResolvedPos): readonly Mark[] | null;
|
|
|
/**
|
|
|
The depth up to which this position and the given (non-resolved)
|
|
|
position share the same parent nodes.
|
|
|
*/
|
|
|
sharedDepth(pos: number): number;
|
|
|
/**
|
|
|
Returns a range based on the place where this position and the
|
|
|
given position diverge around block content. If both point into
|
|
|
the same textblock, for example, a range around that textblock
|
|
|
will be returned. If they point into different blocks, the range
|
|
|
around those blocks in their shared ancestor is returned. You can
|
|
|
pass in an optional predicate that will be called with a parent
|
|
|
node to see if a range into that parent is acceptable.
|
|
|
*/
|
|
|
blockRange(other?: ResolvedPos, pred?: (node: Node) => boolean): NodeRange | null;
|
|
|
/**
|
|
|
Query whether the given position shares the same parent node.
|
|
|
*/
|
|
|
sameParent(other: ResolvedPos): boolean;
|
|
|
/**
|
|
|
Return the greater of this and the given position.
|
|
|
*/
|
|
|
max(other: ResolvedPos): ResolvedPos;
|
|
|
/**
|
|
|
Return the smaller of this and the given position.
|
|
|
*/
|
|
|
min(other: ResolvedPos): ResolvedPos;
|
|
|
}
|
|
|
/**
|
|
|
Represents a flat range of content, i.e. one that starts and
|
|
|
ends in the same node.
|
|
|
*/
|
|
|
declare class NodeRange {
|
|
|
/**
|
|
|
A resolved position along the start of the content. May have a
|
|
|
`depth` greater than this object's `depth` property, since
|
|
|
these are the positions that were used to compute the range,
|
|
|
not re-resolved positions directly at its boundaries.
|
|
|
*/
|
|
|
readonly $from: ResolvedPos;
|
|
|
/**
|
|
|
A position along the end of the content. See
|
|
|
caveat for [`$from`](https://prosemirror.net/docs/ref/#model.NodeRange.$from).
|
|
|
*/
|
|
|
readonly $to: ResolvedPos;
|
|
|
/**
|
|
|
The depth of the node that this range points into.
|
|
|
*/
|
|
|
readonly depth: number;
|
|
|
/**
|
|
|
Construct a node range. `$from` and `$to` should point into the
|
|
|
same node until at least the given `depth`, since a node range
|
|
|
denotes an adjacent set of nodes in a single parent node.
|
|
|
*/
|
|
|
constructor(
|
|
|
/**
|
|
|
A resolved position along the start of the content. May have a
|
|
|
`depth` greater than this object's `depth` property, since
|
|
|
these are the positions that were used to compute the range,
|
|
|
not re-resolved positions directly at its boundaries.
|
|
|
*/
|
|
|
$from: ResolvedPos,
|
|
|
/**
|
|
|
A position along the end of the content. See
|
|
|
caveat for [`$from`](https://prosemirror.net/docs/ref/#model.NodeRange.$from).
|
|
|
*/
|
|
|
$to: ResolvedPos,
|
|
|
/**
|
|
|
The depth of the node that this range points into.
|
|
|
*/
|
|
|
depth: number);
|
|
|
/**
|
|
|
The position at the start of the range.
|
|
|
*/
|
|
|
get start(): number;
|
|
|
/**
|
|
|
The position at the end of the range.
|
|
|
*/
|
|
|
get end(): number;
|
|
|
/**
|
|
|
The parent node that the range points into.
|
|
|
*/
|
|
|
get parent(): Node;
|
|
|
/**
|
|
|
The start index of the range in the parent node.
|
|
|
*/
|
|
|
get startIndex(): number;
|
|
|
/**
|
|
|
The end index of the range in the parent node.
|
|
|
*/
|
|
|
get endIndex(): number;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
Error type raised by [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) when
|
|
|
given an invalid replacement.
|
|
|
*/
|
|
|
declare class ReplaceError extends Error {
|
|
|
}
|
|
|
/**
|
|
|
A slice represents a piece cut out of a larger document. It
|
|
|
stores not only a fragment, but also the depth up to which nodes on
|
|
|
both side are ‘open’ (cut through).
|
|
|
*/
|
|
|
declare class Slice {
|
|
|
/**
|
|
|
The slice's content.
|
|
|
*/
|
|
|
readonly content: Fragment;
|
|
|
/**
|
|
|
The open depth at the start of the fragment.
|
|
|
*/
|
|
|
readonly openStart: number;
|
|
|
/**
|
|
|
The open depth at the end.
|
|
|
*/
|
|
|
readonly openEnd: number;
|
|
|
/**
|
|
|
Create a slice. When specifying a non-zero open depth, you must
|
|
|
make sure that there are nodes of at least that depth at the
|
|
|
appropriate side of the fragment—i.e. if the fragment is an
|
|
|
empty paragraph node, `openStart` and `openEnd` can't be greater
|
|
|
than 1.
|
|
|
|
|
|
It is not necessary for the content of open nodes to conform to
|
|
|
the schema's content constraints, though it should be a valid
|
|
|
start/end/middle for such a node, depending on which sides are
|
|
|
open.
|
|
|
*/
|
|
|
constructor(
|
|
|
/**
|
|
|
The slice's content.
|
|
|
*/
|
|
|
content: Fragment,
|
|
|
/**
|
|
|
The open depth at the start of the fragment.
|
|
|
*/
|
|
|
openStart: number,
|
|
|
/**
|
|
|
The open depth at the end.
|
|
|
*/
|
|
|
openEnd: number);
|
|
|
/**
|
|
|
The size this slice would add when inserted into a document.
|
|
|
*/
|
|
|
get size(): number;
|
|
|
/**
|
|
|
Tests whether this slice is equal to another slice.
|
|
|
*/
|
|
|
eq(other: Slice): boolean;
|
|
|
/**
|
|
|
Convert a slice to a JSON-serializable representation.
|
|
|
*/
|
|
|
toJSON(): any;
|
|
|
/**
|
|
|
Deserialize a slice from its JSON representation.
|
|
|
*/
|
|
|
static fromJSON(schema: Schema, json: any): Slice;
|
|
|
/**
|
|
|
Create a slice from a fragment by taking the maximum possible
|
|
|
open value on both side of the fragment.
|
|
|
*/
|
|
|
static maxOpen(fragment: Fragment, openIsolating?: boolean): Slice;
|
|
|
/**
|
|
|
The empty slice.
|
|
|
*/
|
|
|
static empty: Slice;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
These are the options recognized by the
|
|
|
[`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse) and
|
|
|
[`parseSlice`](https://prosemirror.net/docs/ref/#model.DOMParser.parseSlice) methods.
|
|
|
*/
|
|
|
interface ParseOptions {
|
|
|
/**
|
|
|
By default, whitespace is collapsed as per HTML's rules. Pass
|
|
|
`true` to preserve whitespace, but normalize newlines to
|
|
|
spaces, and `"full"` to preserve whitespace entirely.
|
|
|
*/
|
|
|
preserveWhitespace?: boolean | "full";
|
|
|
/**
|
|
|
When given, the parser will, beside parsing the content,
|
|
|
record the document positions of the given DOM positions. It
|
|
|
will do so by writing to the objects, adding a `pos` property
|
|
|
that holds the document position. DOM positions that are not
|
|
|
in the parsed content will not be written to.
|
|
|
*/
|
|
|
findPositions?: {
|
|
|
node: DOMNode;
|
|
|
offset: number;
|
|
|
pos?: number;
|
|
|
}[];
|
|
|
/**
|
|
|
The child node index to start parsing from.
|
|
|
*/
|
|
|
from?: number;
|
|
|
/**
|
|
|
The child node index to stop parsing at.
|
|
|
*/
|
|
|
to?: number;
|
|
|
/**
|
|
|
By default, the content is parsed into the schema's default
|
|
|
[top node type](https://prosemirror.net/docs/ref/#model.Schema.topNodeType). You can pass this
|
|
|
option to use the type and attributes from a different node
|
|
|
as the top container.
|
|
|
*/
|
|
|
topNode?: Node;
|
|
|
/**
|
|
|
Provide the starting content match that content parsed into the
|
|
|
top node is matched against.
|
|
|
*/
|
|
|
topMatch?: ContentMatch;
|
|
|
/**
|
|
|
A set of additional nodes to count as
|
|
|
[context](https://prosemirror.net/docs/ref/#model.ParseRule.context) when parsing, above the
|
|
|
given [top node](https://prosemirror.net/docs/ref/#model.ParseOptions.topNode).
|
|
|
*/
|
|
|
context?: ResolvedPos;
|
|
|
}
|
|
|
/**
|
|
|
A value that describes how to parse a given DOM node or inline
|
|
|
style as a ProseMirror node or mark.
|
|
|
*/
|
|
|
interface ParseRule {
|
|
|
/**
|
|
|
A CSS selector describing the kind of DOM elements to match. A
|
|
|
single rule should have _either_ a `tag` or a `style` property.
|
|
|
*/
|
|
|
tag?: string;
|
|
|
/**
|
|
|
The namespace to match. This should be used with `tag`.
|
|
|
Nodes are only matched when the namespace matches or this property
|
|
|
is null.
|
|
|
*/
|
|
|
namespace?: string;
|
|
|
/**
|
|
|
A CSS property name to match. When given, this rule matches
|
|
|
inline styles that list that property. May also have the form
|
|
|
`"property=value"`, in which case the rule only matches if the
|
|
|
property's value exactly matches the given value. (For more
|
|
|
complicated filters, use [`getAttrs`](https://prosemirror.net/docs/ref/#model.ParseRule.getAttrs)
|
|
|
and return false to indicate that the match failed.) Rules
|
|
|
matching styles may only produce [marks](https://prosemirror.net/docs/ref/#model.ParseRule.mark),
|
|
|
not nodes.
|
|
|
*/
|
|
|
style?: string;
|
|
|
/**
|
|
|
Can be used to change the order in which the parse rules in a
|
|
|
schema are tried. Those with higher priority come first. Rules
|
|
|
without a priority are counted as having priority 50. This
|
|
|
property is only meaningful in a schema—when directly
|
|
|
constructing a parser, the order of the rule array is used.
|
|
|
*/
|
|
|
priority?: number;
|
|
|
/**
|
|
|
By default, when a rule matches an element or style, no further
|
|
|
rules get a chance to match it. By setting this to `false`, you
|
|
|
indicate that even when this rule matches, other rules that come
|
|
|
after it should also run.
|
|
|
*/
|
|
|
consuming?: boolean;
|
|
|
/**
|
|
|
When given, restricts this rule to only match when the current
|
|
|
context—the parent nodes into which the content is being
|
|
|
parsed—matches this expression. Should contain one or more node
|
|
|
names or node group names followed by single or double slashes.
|
|
|
For example `"paragraph/"` means the rule only matches when the
|
|
|
parent node is a paragraph, `"blockquote/paragraph/"` restricts
|
|
|
it to be in a paragraph that is inside a blockquote, and
|
|
|
`"section//"` matches any position inside a section—a double
|
|
|
slash matches any sequence of ancestor nodes. To allow multiple
|
|
|
different contexts, they can be separated by a pipe (`|`)
|
|
|
character, as in `"blockquote/|list_item/"`.
|
|
|
*/
|
|
|
context?: string;
|
|
|
/**
|
|
|
The name of the node type to create when this rule matches. Only
|
|
|
valid for rules with a `tag` property, not for style rules. Each
|
|
|
rule should have one of a `node`, `mark`, or `ignore` property
|
|
|
(except when it appears in a [node](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM) or
|
|
|
[mark spec](https://prosemirror.net/docs/ref/#model.MarkSpec.parseDOM), in which case the `node`
|
|
|
or `mark` property will be derived from its position).
|
|
|
*/
|
|
|
node?: string;
|
|
|
/**
|
|
|
The name of the mark type to wrap the matched content in.
|
|
|
*/
|
|
|
mark?: string;
|
|
|
/**
|
|
|
When true, ignore content that matches this rule.
|
|
|
*/
|
|
|
ignore?: boolean;
|
|
|
/**
|
|
|
When true, finding an element that matches this rule will close
|
|
|
the current node.
|
|
|
*/
|
|
|
closeParent?: boolean;
|
|
|
/**
|
|
|
When true, ignore the node that matches this rule, but do parse
|
|
|
its content.
|
|
|
*/
|
|
|
skip?: boolean;
|
|
|
/**
|
|
|
Attributes for the node or mark created by this rule. When
|
|
|
`getAttrs` is provided, it takes precedence.
|
|
|
*/
|
|
|
attrs?: Attrs;
|
|
|
/**
|
|
|
A function used to compute the attributes for the node or mark
|
|
|
created by this rule. Can also be used to describe further
|
|
|
conditions the DOM element or style must match. When it returns
|
|
|
`false`, the rule won't match. When it returns null or undefined,
|
|
|
that is interpreted as an empty/default set of attributes.
|
|
|
|
|
|
Called with a DOM Element for `tag` rules, and with a string (the
|
|
|
style's value) for `style` rules.
|
|
|
*/
|
|
|
getAttrs?: (node: HTMLElement | string) => Attrs | false | null;
|
|
|
/**
|
|
|
For `tag` rules that produce non-leaf nodes or marks, by default
|
|
|
the content of the DOM element is parsed as content of the mark
|
|
|
or node. If the child nodes are in a descendent node, this may be
|
|
|
a CSS selector string that the parser must use to find the actual
|
|
|
content element, or a function that returns the actual content
|
|
|
element to the parser.
|
|
|
*/
|
|
|
contentElement?: string | HTMLElement | ((node: DOMNode) => HTMLElement);
|
|
|
/**
|
|
|
Can be used to override the content of a matched node. When
|
|
|
present, instead of parsing the node's child nodes, the result of
|
|
|
this function is used.
|
|
|
*/
|
|
|
getContent?: (node: DOMNode, schema: Schema) => Fragment;
|
|
|
/**
|
|
|
Controls whether whitespace should be preserved when parsing the
|
|
|
content inside the matched element. `false` means whitespace may
|
|
|
be collapsed, `true` means that whitespace should be preserved
|
|
|
but newlines normalized to spaces, and `"full"` means that
|
|
|
newlines should also be preserved.
|
|
|
*/
|
|
|
preserveWhitespace?: boolean | "full";
|
|
|
}
|
|
|
/**
|
|
|
A DOM parser represents a strategy for parsing DOM content into a
|
|
|
ProseMirror document conforming to a given schema. Its behavior is
|
|
|
defined by an array of [rules](https://prosemirror.net/docs/ref/#model.ParseRule).
|
|
|
*/
|
|
|
declare class DOMParser {
|
|
|
/**
|
|
|
The schema into which the parser parses.
|
|
|
*/
|
|
|
readonly schema: Schema;
|
|
|
/**
|
|
|
The set of [parse rules](https://prosemirror.net/docs/ref/#model.ParseRule) that the parser
|
|
|
uses, in order of precedence.
|
|
|
*/
|
|
|
readonly rules: readonly ParseRule[];
|
|
|
/**
|
|
|
Create a parser that targets the given schema, using the given
|
|
|
parsing rules.
|
|
|
*/
|
|
|
constructor(
|
|
|
/**
|
|
|
The schema into which the parser parses.
|
|
|
*/
|
|
|
schema: Schema,
|
|
|
/**
|
|
|
The set of [parse rules](https://prosemirror.net/docs/ref/#model.ParseRule) that the parser
|
|
|
uses, in order of precedence.
|
|
|
*/
|
|
|
rules: readonly ParseRule[]);
|
|
|
/**
|
|
|
Parse a document from the content of a DOM node.
|
|
|
*/
|
|
|
parse(dom: DOMNode, options?: ParseOptions): Node;
|
|
|
/**
|
|
|
Parses the content of the given DOM node, like
|
|
|
[`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse), and takes the same set of
|
|
|
options. But unlike that method, which produces a whole node,
|
|
|
this one returns a slice that is open at the sides, meaning that
|
|
|
the schema constraints aren't applied to the start of nodes to
|
|
|
the left of the input and the end of nodes at the end.
|
|
|
*/
|
|
|
parseSlice(dom: DOMNode, options?: ParseOptions): Slice;
|
|
|
/**
|
|
|
Construct a DOM parser using the parsing rules listed in a
|
|
|
schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by
|
|
|
[priority](https://prosemirror.net/docs/ref/#model.ParseRule.priority).
|
|
|
*/
|
|
|
static fromSchema(schema: Schema): DOMParser;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
An object holding the attributes of a node.
|
|
|
*/
|
|
|
declare type Attrs = {
|
|
|
readonly [attr: string]: any;
|
|
|
};
|
|
|
/**
|
|
|
Node types are objects allocated once per `Schema` and used to
|
|
|
[tag](https://prosemirror.net/docs/ref/#model.Node.type) `Node` instances. They contain information
|
|
|
about the node type, such as its name and what kind of node it
|
|
|
represents.
|
|
|
*/
|
|
|
declare class NodeType {
|
|
|
/**
|
|
|
The name the node type has in this schema.
|
|
|
*/
|
|
|
readonly name: string;
|
|
|
/**
|
|
|
A link back to the `Schema` the node type belongs to.
|
|
|
*/
|
|
|
readonly schema: Schema;
|
|
|
/**
|
|
|
The spec that this type is based on
|
|
|
*/
|
|
|
readonly spec: NodeSpec;
|
|
|
/**
|
|
|
True if this node type has inline content.
|
|
|
*/
|
|
|
inlineContent: boolean;
|
|
|
/**
|
|
|
True if this is a block type
|
|
|
*/
|
|
|
isBlock: boolean;
|
|
|
/**
|
|
|
True if this is the text node type.
|
|
|
*/
|
|
|
isText: boolean;
|
|
|
/**
|
|
|
True if this is an inline type.
|
|
|
*/
|
|
|
get isInline(): boolean;
|
|
|
/**
|
|
|
True if this is a textblock type, a block that contains inline
|
|
|
content.
|
|
|
*/
|
|
|
get isTextblock(): boolean;
|
|
|
/**
|
|
|
True for node types that allow no content.
|
|
|
*/
|
|
|
get isLeaf(): boolean;
|
|
|
/**
|
|
|
True when this node is an atom, i.e. when it does not have
|
|
|
directly editable content.
|
|
|
*/
|
|
|
get isAtom(): boolean;
|
|
|
/**
|
|
|
The starting match of the node type's content expression.
|
|
|
*/
|
|
|
contentMatch: ContentMatch;
|
|
|
/**
|
|
|
The set of marks allowed in this node. `null` means all marks
|
|
|
are allowed.
|
|
|
*/
|
|
|
markSet: readonly MarkType[] | null;
|
|
|
/**
|
|
|
The node type's [whitespace](https://prosemirror.net/docs/ref/#model.NodeSpec.whitespace) option.
|
|
|
*/
|
|
|
get whitespace(): "pre" | "normal";
|
|
|
/**
|
|
|
Tells you whether this node type has any required attributes.
|
|
|
*/
|
|
|
hasRequiredAttrs(): boolean;
|
|
|
/**
|
|
|
Indicates whether this node allows some of the same content as
|
|
|
the given node type.
|
|
|
*/
|
|
|
compatibleContent(other: NodeType): boolean;
|
|
|
/**
|
|
|
Create a `Node` of this type. The given attributes are
|
|
|
checked and defaulted (you can pass `null` to use the type's
|
|
|
defaults entirely, if no required attributes exist). `content`
|
|
|
may be a `Fragment`, a node, an array of nodes, or
|
|
|
`null`. Similarly `marks` may be `null` to default to the empty
|
|
|
set of marks.
|
|
|
*/
|
|
|
create(attrs?: Attrs | null, content?: Fragment | Node | readonly Node[] | null, marks?: readonly Mark[]): Node;
|
|
|
/**
|
|
|
Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but check the given content
|
|
|
against the node type's content restrictions, and throw an error
|
|
|
if it doesn't match.
|
|
|
*/
|
|
|
createChecked(attrs?: Attrs | null, content?: Fragment | Node | readonly Node[] | null, marks?: readonly Mark[]): Node;
|
|
|
/**
|
|
|
Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but see if it is
|
|
|
necessary to add nodes to the start or end of the given fragment
|
|
|
to make it fit the node. If no fitting wrapping can be found,
|
|
|
return null. Note that, due to the fact that required nodes can
|
|
|
always be created, this will always succeed if you pass null or
|
|
|
`Fragment.empty` as content.
|
|
|
*/
|
|
|
createAndFill(attrs?: Attrs | null, content?: Fragment | Node | readonly Node[] | null, marks?: readonly Mark[]): Node | null;
|
|
|
/**
|
|
|
Returns true if the given fragment is valid content for this node
|
|
|
type with the given attributes.
|
|
|
*/
|
|
|
validContent(content: Fragment): boolean;
|
|
|
/**
|
|
|
Check whether the given mark type is allowed in this node.
|
|
|
*/
|
|
|
allowsMarkType(markType: MarkType): boolean;
|
|
|
/**
|
|
|
Test whether the given set of marks are allowed in this node.
|
|
|
*/
|
|
|
allowsMarks(marks: readonly Mark[]): boolean;
|
|
|
/**
|
|
|
Removes the marks that are not allowed in this node from the given set.
|
|
|
*/
|
|
|
allowedMarks(marks: readonly Mark[]): readonly Mark[];
|
|
|
}
|
|
|
/**
|
|
|
Like nodes, marks (which are associated with nodes to signify
|
|
|
things like emphasis or being part of a link) are
|
|
|
[tagged](https://prosemirror.net/docs/ref/#model.Mark.type) with type objects, which are
|
|
|
instantiated once per `Schema`.
|
|
|
*/
|
|
|
declare class MarkType {
|
|
|
/**
|
|
|
The name of the mark type.
|
|
|
*/
|
|
|
readonly name: string;
|
|
|
/**
|
|
|
The schema that this mark type instance is part of.
|
|
|
*/
|
|
|
readonly schema: Schema;
|
|
|
/**
|
|
|
The spec on which the type is based.
|
|
|
*/
|
|
|
readonly spec: MarkSpec;
|
|
|
/**
|
|
|
Create a mark of this type. `attrs` may be `null` or an object
|
|
|
containing only some of the mark's attributes. The others, if
|
|
|
they have defaults, will be added.
|
|
|
*/
|
|
|
create(attrs?: Attrs | null): Mark;
|
|
|
/**
|
|
|
When there is a mark of this type in the given set, a new set
|
|
|
without it is returned. Otherwise, the input set is returned.
|
|
|
*/
|
|
|
removeFromSet(set: readonly Mark[]): readonly Mark[];
|
|
|
/**
|
|
|
Tests whether there is a mark of this type in the given set.
|
|
|
*/
|
|
|
isInSet(set: readonly Mark[]): Mark | undefined;
|
|
|
/**
|
|
|
Queries whether a given mark type is
|
|
|
[excluded](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) by this one.
|
|
|
*/
|
|
|
excludes(other: MarkType): boolean;
|
|
|
}
|
|
|
/**
|
|
|
An object describing a schema, as passed to the [`Schema`](https://prosemirror.net/docs/ref/#model.Schema)
|
|
|
constructor.
|
|
|
*/
|
|
|
interface SchemaSpec<Nodes extends string = any, Marks extends string = any> {
|
|
|
/**
|
|
|
The node types in this schema. Maps names to
|
|
|
[`NodeSpec`](https://prosemirror.net/docs/ref/#model.NodeSpec) objects that describe the node type
|
|
|
associated with that name. Their order is significant—it
|
|
|
determines which [parse rules](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM) take
|
|
|
precedence by default, and which nodes come first in a given
|
|
|
[group](https://prosemirror.net/docs/ref/#model.NodeSpec.group).
|
|
|
*/
|
|
|
nodes: {
|
|
|
[name in Nodes]: NodeSpec;
|
|
|
} | OrderedMap<NodeSpec>;
|
|
|
/**
|
|
|
The mark types that exist in this schema. The order in which they
|
|
|
are provided determines the order in which [mark
|
|
|
sets](https://prosemirror.net/docs/ref/#model.Mark.addToSet) are sorted and in which [parse
|
|
|
rules](https://prosemirror.net/docs/ref/#model.MarkSpec.parseDOM) are tried.
|
|
|
*/
|
|
|
marks?: {
|
|
|
[name in Marks]: MarkSpec;
|
|
|
} | OrderedMap<MarkSpec>;
|
|
|
/**
|
|
|
The name of the default top-level node for the schema. Defaults
|
|
|
to `"doc"`.
|
|
|
*/
|
|
|
topNode?: string;
|
|
|
}
|
|
|
/**
|
|
|
A description of a node type, used when defining a schema.
|
|
|
*/
|
|
|
interface NodeSpec {
|
|
|
/**
|
|
|
The content expression for this node, as described in the [schema
|
|
|
guide](/docs/guide/#schema.content_expressions). When not given,
|
|
|
the node does not allow any content.
|
|
|
*/
|
|
|
content?: string;
|
|
|
/**
|
|
|
The marks that are allowed inside of this node. May be a
|
|
|
space-separated string referring to mark names or groups, `"_"`
|
|
|
to explicitly allow all marks, or `""` to disallow marks. When
|
|
|
not given, nodes with inline content default to allowing all
|
|
|
marks, other nodes default to not allowing marks.
|
|
|
*/
|
|
|
marks?: string;
|
|
|
/**
|
|
|
The group or space-separated groups to which this node belongs,
|
|
|
which can be referred to in the content expressions for the
|
|
|
schema.
|
|
|
*/
|
|
|
group?: string;
|
|
|
/**
|
|
|
Should be set to true for inline nodes. (Implied for text nodes.)
|
|
|
*/
|
|
|
inline?: boolean;
|
|
|
/**
|
|
|
Can be set to true to indicate that, though this isn't a [leaf
|
|
|
node](https://prosemirror.net/docs/ref/#model.NodeType.isLeaf), it doesn't have directly editable
|
|
|
content and should be treated as a single unit in the view.
|
|
|
*/
|
|
|
atom?: boolean;
|
|
|
/**
|
|
|
The attributes that nodes of this type get.
|
|
|
*/
|
|
|
attrs?: {
|
|
|
[name: string]: AttributeSpec;
|
|
|
};
|
|
|
/**
|
|
|
Controls whether nodes of this type can be selected as a [node
|
|
|
selection](https://prosemirror.net/docs/ref/#state.NodeSelection). Defaults to true for non-text
|
|
|
nodes.
|
|
|
*/
|
|
|
selectable?: boolean;
|
|
|
/**
|
|
|
Determines whether nodes of this type can be dragged without
|
|
|
being selected. Defaults to false.
|
|
|
*/
|
|
|
draggable?: boolean;
|
|
|
/**
|
|
|
Can be used to indicate that this node contains code, which
|
|
|
causes some commands to behave differently.
|
|
|
*/
|
|
|
code?: boolean;
|
|
|
/**
|
|
|
Controls way whitespace in this a node is parsed. The default is
|
|
|
`"normal"`, which causes the [DOM parser](https://prosemirror.net/docs/ref/#model.DOMParser) to
|
|
|
collapse whitespace in normal mode, and normalize it (replacing
|
|
|
newlines and such with spaces) otherwise. `"pre"` causes the
|
|
|
parser to preserve spaces inside the node. When this option isn't
|
|
|
given, but [`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) is true, `whitespace`
|
|
|
will default to `"pre"`. Note that this option doesn't influence
|
|
|
the way the node is rendered—that should be handled by `toDOM`
|
|
|
and/or styling.
|
|
|
*/
|
|
|
whitespace?: "pre" | "normal";
|
|
|
/**
|
|
|
Determines whether this node is considered an important parent
|
|
|
node during replace operations (such as paste). Non-defining (the
|
|
|
default) nodes get dropped when their entire content is replaced,
|
|
|
whereas defining nodes persist and wrap the inserted content.
|
|
|
*/
|
|
|
definingAsContext?: boolean;
|
|
|
/**
|
|
|
In inserted content the defining parents of the content are
|
|
|
preserved when possible. Typically, non-default-paragraph
|
|
|
textblock types, and possibly list items, are marked as defining.
|
|
|
*/
|
|
|
definingForContent?: boolean;
|
|
|
/**
|
|
|
When enabled, enables both
|
|
|
[`definingAsContext`](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext) and
|
|
|
[`definingForContent`](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).
|
|
|
*/
|
|
|
defining?: boolean;
|
|
|
/**
|
|
|
When enabled (default is false), the sides of nodes of this type
|
|
|
count as boundaries that regular editing operations, like
|
|
|
backspacing or lifting, won't cross. An example of a node that
|
|
|
should probably have this enabled is a table cell.
|
|
|
*/
|
|
|
isolating?: boolean;
|
|
|
/**
|
|
|
Defines the default way a node of this type should be serialized
|
|
|
to DOM/HTML (as used by
|
|
|
[`DOMSerializer.fromSchema`](https://prosemirror.net/docs/ref/#model.DOMSerializer^fromSchema)).
|
|
|
Should return a DOM node or an [array
|
|
|
structure](https://prosemirror.net/docs/ref/#model.DOMOutputSpec) that describes one, with an
|
|
|
optional number zero (“hole”) in it to indicate where the node's
|
|
|
content should be inserted.
|
|
|
|
|
|
For text nodes, the default is to create a text DOM node. Though
|
|
|
it is possible to create a serializer where text is rendered
|
|
|
differently, this is not supported inside the editor, so you
|
|
|
shouldn't override that in your text node spec.
|
|
|
*/
|
|
|
toDOM?: (node: Node) => DOMOutputSpec;
|
|
|
/**
|
|
|
Associates DOM parser information with this node, which can be
|
|
|
used by [`DOMParser.fromSchema`](https://prosemirror.net/docs/ref/#model.DOMParser^fromSchema) to
|
|
|
automatically derive a parser. The `node` field in the rules is
|
|
|
implied (the name of this node will be filled in automatically).
|
|
|
If you supply your own parser, you do not need to also specify
|
|
|
parsing rules in your schema.
|
|
|
*/
|
|
|
parseDOM?: readonly ParseRule[];
|
|
|
/**
|
|
|
Defines the default way a node of this type should be serialized
|
|
|
to a string representation for debugging (e.g. in error messages).
|
|
|
*/
|
|
|
toDebugString?: (node: Node) => string;
|
|
|
/**
|
|
|
Defines the default way a [leaf node](https://prosemirror.net/docs/ref/#model.NodeType.isLeaf) of
|
|
|
this type should be serialized to a string (as used by
|
|
|
[`Node.textBetween`](https://prosemirror.net/docs/ref/#model.Node^textBetween) and
|
|
|
[`Node.textContent`](https://prosemirror.net/docs/ref/#model.Node^textContent)).
|
|
|
*/
|
|
|
leafText?: (node: Node) => string;
|
|
|
/**
|
|
|
Node specs may include arbitrary properties that can be read by
|
|
|
other code via [`NodeType.spec`](https://prosemirror.net/docs/ref/#model.NodeType.spec).
|
|
|
*/
|
|
|
[key: string]: any;
|
|
|
}
|
|
|
/**
|
|
|
Used to define marks when creating a schema.
|
|
|
*/
|
|
|
interface MarkSpec {
|
|
|
/**
|
|
|
The attributes that marks of this type get.
|
|
|
*/
|
|
|
attrs?: {
|
|
|
[name: string]: AttributeSpec;
|
|
|
};
|
|
|
/**
|
|
|
Whether this mark should be active when the cursor is positioned
|
|
|
at its end (or at its start when that is also the start of the
|
|
|
parent node). Defaults to true.
|
|
|
*/
|
|
|
inclusive?: boolean;
|
|
|
/**
|
|
|
Determines which other marks this mark can coexist with. Should
|
|
|
be a space-separated strings naming other marks or groups of marks.
|
|
|
When a mark is [added](https://prosemirror.net/docs/ref/#model.Mark.addToSet) to a set, all marks
|
|
|
that it excludes are removed in the process. If the set contains
|
|
|
any mark that excludes the new mark but is not, itself, excluded
|
|
|
by the new mark, the mark can not be added an the set. You can
|
|
|
use the value `"_"` to indicate that the mark excludes all
|
|
|
marks in the schema.
|
|
|
|
|
|
Defaults to only being exclusive with marks of the same type. You
|
|
|
can set it to an empty string (or any string not containing the
|
|
|
mark's own name) to allow multiple marks of a given type to
|
|
|
coexist (as long as they have different attributes).
|
|
|
*/
|
|
|
excludes?: string;
|
|
|
/**
|
|
|
The group or space-separated groups to which this mark belongs.
|
|
|
*/
|
|
|
group?: string;
|
|
|
/**
|
|
|
Determines whether marks of this type can span multiple adjacent
|
|
|
nodes when serialized to DOM/HTML. Defaults to true.
|
|
|
*/
|
|
|
spanning?: boolean;
|
|
|
/**
|
|
|
Defines the default way marks of this type should be serialized
|
|
|
to DOM/HTML. When the resulting spec contains a hole, that is
|
|
|
where the marked content is placed. Otherwise, it is appended to
|
|
|
the top node.
|
|
|
*/
|
|
|
toDOM?: (mark: Mark, inline: boolean) => DOMOutputSpec;
|
|
|
/**
|
|
|
Associates DOM parser information with this mark (see the
|
|
|
corresponding [node spec field](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM)). The
|
|
|
`mark` field in the rules is implied.
|
|
|
*/
|
|
|
parseDOM?: readonly ParseRule[];
|
|
|
/**
|
|
|
Mark specs can include additional properties that can be
|
|
|
inspected through [`MarkType.spec`](https://prosemirror.net/docs/ref/#model.MarkType.spec) when
|
|
|
working with the mark.
|
|
|
*/
|
|
|
[key: string]: any;
|
|
|
}
|
|
|
/**
|
|
|
Used to [define](https://prosemirror.net/docs/ref/#model.NodeSpec.attrs) attributes on nodes or
|
|
|
marks.
|
|
|
*/
|
|
|
interface AttributeSpec {
|
|
|
/**
|
|
|
The default value for this attribute, to use when no explicit
|
|
|
value is provided. Attributes that have no default must be
|
|
|
provided whenever a node or mark of a type that has them is
|
|
|
created.
|
|
|
*/
|
|
|
default?: any;
|
|
|
}
|
|
|
/**
|
|
|
A document schema. Holds [node](https://prosemirror.net/docs/ref/#model.NodeType) and [mark
|
|
|
type](https://prosemirror.net/docs/ref/#model.MarkType) objects for the nodes and marks that may
|
|
|
occur in conforming documents, and provides functionality for
|
|
|
creating and deserializing such documents.
|
|
|
|
|
|
When given, the type parameters provide the names of the nodes and
|
|
|
marks in this schema.
|
|
|
*/
|
|
|
declare class Schema<Nodes extends string = any, Marks extends string = any> {
|
|
|
/**
|
|
|
The [spec](https://prosemirror.net/docs/ref/#model.SchemaSpec) on which the schema is based,
|
|
|
with the added guarantee that its `nodes` and `marks`
|
|
|
properties are
|
|
|
[`OrderedMap`](https://github.com/marijnh/orderedmap) instances
|
|
|
(not raw objects).
|
|
|
*/
|
|
|
spec: {
|
|
|
nodes: OrderedMap<NodeSpec>;
|
|
|
marks: OrderedMap<MarkSpec>;
|
|
|
topNode?: string;
|
|
|
};
|
|
|
/**
|
|
|
An object mapping the schema's node names to node type objects.
|
|
|
*/
|
|
|
nodes: {
|
|
|
readonly [name in Nodes]: NodeType;
|
|
|
} & {
|
|
|
readonly [key: string]: NodeType;
|
|
|
};
|
|
|
/**
|
|
|
A map from mark names to mark type objects.
|
|
|
*/
|
|
|
marks: {
|
|
|
readonly [name in Marks]: MarkType;
|
|
|
} & {
|
|
|
readonly [key: string]: MarkType;
|
|
|
};
|
|
|
/**
|
|
|
Construct a schema from a schema [specification](https://prosemirror.net/docs/ref/#model.SchemaSpec).
|
|
|
*/
|
|
|
constructor(spec: SchemaSpec<Nodes, Marks>);
|
|
|
/**
|
|
|
The type of the [default top node](https://prosemirror.net/docs/ref/#model.SchemaSpec.topNode)
|
|
|
for this schema.
|
|
|
*/
|
|
|
topNodeType: NodeType;
|
|
|
/**
|
|
|
An object for storing whatever values modules may want to
|
|
|
compute and cache per schema. (If you want to store something
|
|
|
in it, try to use property names unlikely to clash.)
|
|
|
*/
|
|
|
cached: {
|
|
|
[key: string]: any;
|
|
|
};
|
|
|
/**
|
|
|
Create a node in this schema. The `type` may be a string or a
|
|
|
`NodeType` instance. Attributes will be extended with defaults,
|
|
|
`content` may be a `Fragment`, `null`, a `Node`, or an array of
|
|
|
nodes.
|
|
|
*/
|
|
|
node(type: string | NodeType, attrs?: Attrs | null, content?: Fragment | Node | readonly Node[], marks?: readonly Mark[]): Node;
|
|
|
/**
|
|
|
Create a text node in the schema. Empty text nodes are not
|
|
|
allowed.
|
|
|
*/
|
|
|
text(text: string, marks?: readonly Mark[] | null): Node;
|
|
|
/**
|
|
|
Create a mark with the given type and attributes.
|
|
|
*/
|
|
|
mark(type: string | MarkType, attrs?: Attrs | null): Mark;
|
|
|
/**
|
|
|
Deserialize a node from its JSON representation. This method is
|
|
|
bound.
|
|
|
*/
|
|
|
nodeFromJSON(json: any): Node;
|
|
|
/**
|
|
|
Deserialize a mark from its JSON representation. This method is
|
|
|
bound.
|
|
|
*/
|
|
|
markFromJSON(json: any): Mark;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
A fragment represents a node's collection of child nodes.
|
|
|
|
|
|
Like nodes, fragments are persistent data structures, and you
|
|
|
should not mutate them or their content. Rather, you create new
|
|
|
instances whenever needed. The API tries to make this easy.
|
|
|
*/
|
|
|
declare class Fragment {
|
|
|
/**
|
|
|
The size of the fragment, which is the total of the size of
|
|
|
its content nodes.
|
|
|
*/
|
|
|
readonly size: number;
|
|
|
/**
|
|
|
Invoke a callback for all descendant nodes between the given two
|
|
|
positions (relative to start of this fragment). Doesn't descend
|
|
|
into a node when the callback returns `false`.
|
|
|
*/
|
|
|
nodesBetween(from: number, to: number, f: (node: Node, start: number, parent: Node | null, index: number) => boolean | void, nodeStart?: number, parent?: Node): void;
|
|
|
/**
|
|
|
Call the given callback for every descendant node. `pos` will be
|
|
|
relative to the start of the fragment. The callback may return
|
|
|
`false` to prevent traversal of a given node's children.
|
|
|
*/
|
|
|
descendants(f: (node: Node, pos: number, parent: Node | null) => boolean | void): void;
|
|
|
/**
|
|
|
Extract the text between `from` and `to`. See the same method on
|
|
|
[`Node`](https://prosemirror.net/docs/ref/#model.Node.textBetween).
|
|
|
*/
|
|
|
textBetween(from: number, to: number, blockSeparator?: string | null, leafText?: string | null | ((leafNode: Node) => string)): string;
|
|
|
/**
|
|
|
Create a new fragment containing the combined content of this
|
|
|
fragment and the other.
|
|
|
*/
|
|
|
append(other: Fragment): Fragment;
|
|
|
/**
|
|
|
Cut out the sub-fragment between the two given positions.
|
|
|
*/
|
|
|
cut(from: number, to?: number): Fragment;
|
|
|
/**
|
|
|
Create a new fragment in which the node at the given index is
|
|
|
replaced by the given node.
|
|
|
*/
|
|
|
replaceChild(index: number, node: Node): Fragment;
|
|
|
/**
|
|
|
Create a new fragment by prepending the given node to this
|
|
|
fragment.
|
|
|
*/
|
|
|
addToStart(node: Node): Fragment;
|
|
|
/**
|
|
|
Create a new fragment by appending the given node to this
|
|
|
fragment.
|
|
|
*/
|
|
|
addToEnd(node: Node): Fragment;
|
|
|
/**
|
|
|
Compare this fragment to another one.
|
|
|
*/
|
|
|
eq(other: Fragment): boolean;
|
|
|
/**
|
|
|
The first child of the fragment, or `null` if it is empty.
|
|
|
*/
|
|
|
get firstChild(): Node | null;
|
|
|
/**
|
|
|
The last child of the fragment, or `null` if it is empty.
|
|
|
*/
|
|
|
get lastChild(): Node | null;
|
|
|
/**
|
|
|
The number of child nodes in this fragment.
|
|
|
*/
|
|
|
get childCount(): number;
|
|
|
/**
|
|
|
Get the child node at the given index. Raise an error when the
|
|
|
index is out of range.
|
|
|
*/
|
|
|
child(index: number): Node;
|
|
|
/**
|
|
|
Get the child node at the given index, if it exists.
|
|
|
*/
|
|
|
maybeChild(index: number): Node | null;
|
|
|
/**
|
|
|
Call `f` for every child node, passing the node, its offset
|
|
|
into this parent node, and its index.
|
|
|
*/
|
|
|
forEach(f: (node: Node, offset: number, index: number) => void): void;
|
|
|
/**
|
|
|
Find the first position at which this fragment and another
|
|
|
fragment differ, or `null` if they are the same.
|
|
|
*/
|
|
|
findDiffStart(other: Fragment, pos?: number): number | null;
|
|
|
/**
|
|
|
Find the first position, searching from the end, at which this
|
|
|
fragment and the given fragment differ, or `null` if they are
|
|
|
the same. Since this position will not be the same in both
|
|
|
nodes, an object with two separate positions is returned.
|
|
|
*/
|
|
|
findDiffEnd(other: Fragment, pos?: number, otherPos?: number): {
|
|
|
a: number;
|
|
|
b: number;
|
|
|
} | null;
|
|
|
/**
|
|
|
Find the index and inner offset corresponding to a given relative
|
|
|
position in this fragment. The result object will be reused
|
|
|
(overwritten) the next time the function is called. (Not public.)
|
|
|
*/
|
|
|
findIndex(pos: number, round?: number): {
|
|
|
index: number;
|
|
|
offset: number;
|
|
|
};
|
|
|
/**
|
|
|
Return a debugging string that describes this fragment.
|
|
|
*/
|
|
|
toString(): string;
|
|
|
/**
|
|
|
Create a JSON-serializeable representation of this fragment.
|
|
|
*/
|
|
|
toJSON(): any;
|
|
|
/**
|
|
|
Deserialize a fragment from its JSON representation.
|
|
|
*/
|
|
|
static fromJSON(schema: Schema, value: any): Fragment;
|
|
|
/**
|
|
|
Build a fragment from an array of nodes. Ensures that adjacent
|
|
|
text nodes with the same marks are joined together.
|
|
|
*/
|
|
|
static fromArray(array: readonly Node[]): Fragment;
|
|
|
/**
|
|
|
Create a fragment from something that can be interpreted as a
|
|
|
set of nodes. For `null`, it returns the empty fragment. For a
|
|
|
fragment, the fragment itself. For a node or array of nodes, a
|
|
|
fragment containing those nodes.
|
|
|
*/
|
|
|
static from(nodes?: Fragment | Node | readonly Node[] | null): Fragment;
|
|
|
/**
|
|
|
An empty fragment. Intended to be reused whenever a node doesn't
|
|
|
contain anything (rather than allocating a new empty fragment for
|
|
|
each leaf node).
|
|
|
*/
|
|
|
static empty: Fragment;
|
|
|
}
|
|
|
|
|
|
declare type MatchEdge = {
|
|
|
type: NodeType;
|
|
|
next: ContentMatch;
|
|
|
};
|
|
|
/**
|
|
|
Instances of this class represent a match state of a node type's
|
|
|
[content expression](https://prosemirror.net/docs/ref/#model.NodeSpec.content), and can be used to
|
|
|
find out whether further content matches here, and whether a given
|
|
|
position is a valid end of the node.
|
|
|
*/
|
|
|
declare class ContentMatch {
|
|
|
/**
|
|
|
True when this match state represents a valid end of the node.
|
|
|
*/
|
|
|
readonly validEnd: boolean;
|
|
|
/**
|
|
|
Match a node type, returning a match after that node if
|
|
|
successful.
|
|
|
*/
|
|
|
matchType(type: NodeType): ContentMatch | null;
|
|
|
/**
|
|
|
Try to match a fragment. Returns the resulting match when
|
|
|
successful.
|
|
|
*/
|
|
|
matchFragment(frag: Fragment, start?: number, end?: number): ContentMatch | null;
|
|
|
/**
|
|
|
Get the first matching node type at this match position that can
|
|
|
be generated.
|
|
|
*/
|
|
|
get defaultType(): NodeType | null;
|
|
|
/**
|
|
|
Try to match the given fragment, and if that fails, see if it can
|
|
|
be made to match by inserting nodes in front of it. When
|
|
|
successful, return a fragment of inserted nodes (which may be
|
|
|
empty if nothing had to be inserted). When `toEnd` is true, only
|
|
|
return a fragment if the resulting match goes to the end of the
|
|
|
content expression.
|
|
|
*/
|
|
|
fillBefore(after: Fragment, toEnd?: boolean, startIndex?: number): Fragment | null;
|
|
|
/**
|
|
|
Find a set of wrapping node types that would allow a node of the
|
|
|
given type to appear at this position. The result may be empty
|
|
|
(when it fits directly) and will be null when no such wrapping
|
|
|
exists.
|
|
|
*/
|
|
|
findWrapping(target: NodeType): readonly NodeType[] | null;
|
|
|
/**
|
|
|
The number of outgoing edges this node has in the finite
|
|
|
automaton that describes the content expression.
|
|
|
*/
|
|
|
get edgeCount(): number;
|
|
|
/**
|
|
|
Get the _n_th outgoing edge from this node in the finite
|
|
|
automaton that describes the content expression.
|
|
|
*/
|
|
|
edge(n: number): MatchEdge;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
This class represents a node in the tree that makes up a
|
|
|
ProseMirror document. So a document is an instance of `Node`, with
|
|
|
children that are also instances of `Node`.
|
|
|
|
|
|
Nodes are persistent data structures. Instead of changing them, you
|
|
|
create new ones with the content you want. Old ones keep pointing
|
|
|
at the old document shape. This is made cheaper by sharing
|
|
|
structure between the old and new data as much as possible, which a
|
|
|
tree shape like this (without back pointers) makes easy.
|
|
|
|
|
|
**Do not** directly mutate the properties of a `Node` object. See
|
|
|
[the guide](/docs/guide/#doc) for more information.
|
|
|
*/
|
|
|
declare class Node {
|
|
|
/**
|
|
|
The type of node that this is.
|
|
|
*/
|
|
|
readonly type: NodeType;
|
|
|
/**
|
|
|
An object mapping attribute names to values. The kind of
|
|
|
attributes allowed and required are
|
|
|
[determined](https://prosemirror.net/docs/ref/#model.NodeSpec.attrs) by the node type.
|
|
|
*/
|
|
|
readonly attrs: Attrs;
|
|
|
/**
|
|
|
The marks (things like whether it is emphasized or part of a
|
|
|
link) applied to this node.
|
|
|
*/
|
|
|
readonly marks: readonly Mark[];
|
|
|
/**
|
|
|
A container holding the node's children.
|
|
|
*/
|
|
|
readonly content: Fragment;
|
|
|
/**
|
|
|
For text nodes, this contains the node's text content.
|
|
|
*/
|
|
|
readonly text: string | undefined;
|
|
|
/**
|
|
|
The size of this node, as defined by the integer-based [indexing
|
|
|
scheme](/docs/guide/#doc.indexing). For text nodes, this is the
|
|
|
amount of characters. For other leaf nodes, it is one. For
|
|
|
non-leaf nodes, it is the size of the content plus two (the
|
|
|
start and end token).
|
|
|
*/
|
|
|
get nodeSize(): number;
|
|
|
/**
|
|
|
The number of children that the node has.
|
|
|
*/
|
|
|
get childCount(): number;
|
|
|
/**
|
|
|
Get the child node at the given index. Raises an error when the
|
|
|
index is out of range.
|
|
|
*/
|
|
|
child(index: number): Node;
|
|
|
/**
|
|
|
Get the child node at the given index, if it exists.
|
|
|
*/
|
|
|
maybeChild(index: number): Node | null;
|
|
|
/**
|
|
|
Call `f` for every child node, passing the node, its offset
|
|
|
into this parent node, and its index.
|
|
|
*/
|
|
|
forEach(f: (node: Node, offset: number, index: number) => void): void;
|
|
|
/**
|
|
|
Invoke a callback for all descendant nodes recursively between
|
|
|
the given two positions that are relative to start of this
|
|
|
node's content. The callback is invoked with the node, its
|
|
|
parent-relative position, its parent node, and its child index.
|
|
|
When the callback returns false for a given node, that node's
|
|
|
children will not be recursed over. The last parameter can be
|
|
|
used to specify a starting position to count from.
|
|
|
*/
|
|
|
nodesBetween(from: number, to: number, f: (node: Node, pos: number, parent: Node | null, index: number) => void | boolean, startPos?: number): void;
|
|
|
/**
|
|
|
Call the given callback for every descendant node. Doesn't
|
|
|
descend into a node when the callback returns `false`.
|
|
|
*/
|
|
|
descendants(f: (node: Node, pos: number, parent: Node | null, index: number) => void | boolean): void;
|
|
|
/**
|
|
|
Concatenates all the text nodes found in this fragment and its
|
|
|
children.
|
|
|
*/
|
|
|
get textContent(): string;
|
|
|
/**
|
|
|
Get all text between positions `from` and `to`. When
|
|
|
`blockSeparator` is given, it will be inserted to separate text
|
|
|
from different block nodes. If `leafText` is given, it'll be
|
|
|
inserted for every non-text leaf node encountered, otherwise
|
|
|
[`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec^leafText) will be used.
|
|
|
*/
|
|
|
textBetween(from: number, to: number, blockSeparator?: string | null, leafText?: null | string | ((leafNode: Node) => string)): string;
|
|
|
/**
|
|
|
Returns this node's first child, or `null` if there are no
|
|
|
children.
|
|
|
*/
|
|
|
get firstChild(): Node | null;
|
|
|
/**
|
|
|
Returns this node's last child, or `null` if there are no
|
|
|
children.
|
|
|
*/
|
|
|
get lastChild(): Node | null;
|
|
|
/**
|
|
|
Test whether two nodes represent the same piece of document.
|
|
|
*/
|
|
|
eq(other: Node): boolean;
|
|
|
/**
|
|
|
Compare the markup (type, attributes, and marks) of this node to
|
|
|
those of another. Returns `true` if both have the same markup.
|
|
|
*/
|
|
|
sameMarkup(other: Node): boolean;
|
|
|
/**
|
|
|
Check whether this node's markup correspond to the given type,
|
|
|
attributes, and marks.
|
|
|
*/
|
|
|
hasMarkup(type: NodeType, attrs?: Attrs | null, marks?: readonly Mark[]): boolean;
|
|
|
/**
|
|
|
Create a new node with the same markup as this node, containing
|
|
|
the given content (or empty, if no content is given).
|
|
|
*/
|
|
|
copy(content?: Fragment | null): Node;
|
|
|
/**
|
|
|
Create a copy of this node, with the given set of marks instead
|
|
|
of the node's own marks.
|
|
|
*/
|
|
|
mark(marks: readonly Mark[]): Node;
|
|
|
/**
|
|
|
Create a copy of this node with only the content between the
|
|
|
given positions. If `to` is not given, it defaults to the end of
|
|
|
the node.
|
|
|
*/
|
|
|
cut(from: number, to?: number): Node;
|
|
|
/**
|
|
|
Cut out the part of the document between the given positions, and
|
|
|
return it as a `Slice` object.
|
|
|
*/
|
|
|
slice(from: number, to?: number, includeParents?: boolean): Slice;
|
|
|
/**
|
|
|
Replace the part of the document between the given positions with
|
|
|
the given slice. The slice must 'fit', meaning its open sides
|
|
|
must be able to connect to the surrounding content, and its
|
|
|
content nodes must be valid children for the node they are placed
|
|
|
into. If any of this is violated, an error of type
|
|
|
[`ReplaceError`](https://prosemirror.net/docs/ref/#model.ReplaceError) is thrown.
|
|
|
*/
|
|
|
replace(from: number, to: number, slice: Slice): Node;
|
|
|
/**
|
|
|
Find the node directly after the given position.
|
|
|
*/
|
|
|
nodeAt(pos: number): Node | null;
|
|
|
/**
|
|
|
Find the (direct) child node after the given offset, if any,
|
|
|
and return it along with its index and offset relative to this
|
|
|
node.
|
|
|
*/
|
|
|
childAfter(pos: number): {
|
|
|
node: Node | null;
|
|
|
index: number;
|
|
|
offset: number;
|
|
|
};
|
|
|
/**
|
|
|
Find the (direct) child node before the given offset, if any,
|
|
|
and return it along with its index and offset relative to this
|
|
|
node.
|
|
|
*/
|
|
|
childBefore(pos: number): {
|
|
|
node: Node | null;
|
|
|
index: number;
|
|
|
offset: number;
|
|
|
};
|
|
|
/**
|
|
|
Resolve the given position in the document, returning an
|
|
|
[object](https://prosemirror.net/docs/ref/#model.ResolvedPos) with information about its context.
|
|
|
*/
|
|
|
resolve(pos: number): ResolvedPos;
|
|
|
/**
|
|
|
Test whether a given mark or mark type occurs in this document
|
|
|
between the two given positions.
|
|
|
*/
|
|
|
rangeHasMark(from: number, to: number, type: Mark | MarkType): boolean;
|
|
|
/**
|
|
|
True when this is a block (non-inline node)
|
|
|
*/
|
|
|
get isBlock(): boolean;
|
|
|
/**
|
|
|
True when this is a textblock node, a block node with inline
|
|
|
content.
|
|
|
*/
|
|
|
get isTextblock(): boolean;
|
|
|
/**
|
|
|
True when this node allows inline content.
|
|
|
*/
|
|
|
get inlineContent(): boolean;
|
|
|
/**
|
|
|
True when this is an inline node (a text node or a node that can
|
|
|
appear among text).
|
|
|
*/
|
|
|
get isInline(): boolean;
|
|
|
/**
|
|
|
True when this is a text node.
|
|
|
*/
|
|
|
get isText(): boolean;
|
|
|
/**
|
|
|
True when this is a leaf node.
|
|
|
*/
|
|
|
get isLeaf(): boolean;
|
|
|
/**
|
|
|
True when this is an atom, i.e. when it does not have directly
|
|
|
editable content. This is usually the same as `isLeaf`, but can
|
|
|
be configured with the [`atom` property](https://prosemirror.net/docs/ref/#model.NodeSpec.atom)
|
|
|
on a node's spec (typically used when the node is displayed as
|
|
|
an uneditable [node view](https://prosemirror.net/docs/ref/#view.NodeView)).
|
|
|
*/
|
|
|
get isAtom(): boolean;
|
|
|
/**
|
|
|
Return a string representation of this node for debugging
|
|
|
purposes.
|
|
|
*/
|
|
|
toString(): string;
|
|
|
/**
|
|
|
Get the content match in this node at the given index.
|
|
|
*/
|
|
|
contentMatchAt(index: number): ContentMatch;
|
|
|
/**
|
|
|
Test whether replacing the range between `from` and `to` (by
|
|
|
child index) with the given replacement fragment (which defaults
|
|
|
to the empty fragment) would leave the node's content valid. You
|
|
|
can optionally pass `start` and `end` indices into the
|
|
|
replacement fragment.
|
|
|
*/
|
|
|
canReplace(from: number, to: number, replacement?: Fragment, start?: number, end?: number): boolean;
|
|
|
/**
|
|
|
Test whether replacing the range `from` to `to` (by index) with
|
|
|
a node of the given type would leave the node's content valid.
|
|
|
*/
|
|
|
canReplaceWith(from: number, to: number, type: NodeType, marks?: readonly Mark[]): boolean;
|
|
|
/**
|
|
|
Test whether the given node's content could be appended to this
|
|
|
node. If that node is empty, this will only return true if there
|
|
|
is at least one node type that can appear in both nodes (to avoid
|
|
|
merging completely incompatible nodes).
|
|
|
*/
|
|
|
canAppend(other: Node): boolean;
|
|
|
/**
|
|
|
Check whether this node and its descendants conform to the
|
|
|
schema, and raise error when they do not.
|
|
|
*/
|
|
|
check(): void;
|
|
|
/**
|
|
|
Return a JSON-serializeable representation of this node.
|
|
|
*/
|
|
|
toJSON(): any;
|
|
|
/**
|
|
|
Deserialize a node from its JSON representation.
|
|
|
*/
|
|
|
static fromJSON(schema: Schema, json: any): Node;
|
|
|
}
|
|
|
|
|
|
export { AttributeSpec, Attrs, ContentMatch, DOMOutputSpec, DOMParser, DOMSerializer, Fragment, Mark, MarkSpec, MarkType, Node, NodeRange, NodeSpec, NodeType, ParseOptions, ParseRule, ReplaceError, ResolvedPos, Schema, SchemaSpec, Slice };
|