Trilium Frontend API
    Preparing search index...

    Class ModelNodeAbstract

    Model node. Most basic structure of model tree.

    This is an abstract class that is a base for other classes representing different nodes in model.

    Note: If a node is detached from the model tree, you can manipulate it using it's API. However, it is very important that nodes already attached to model tree should be only changed through module:engine/model/writer~ModelWriter Writer API.

    Changes done by Node methods, like module:engine/model/element~ModelElement#_insertChild _insertChild or module:engine/model/node~ModelNode#_setAttribute _setAttribute do not generate module:engine/model/operation/operation~Operation operations which are essential for correct editor work if you modify nodes in module:engine/model/document~ModelDocument document root.

    The flow of working on Node (and classes that inherits from it) is as such:

    1. You can create a Node instance, modify it using it's API.
    2. Add Node to the model using Batch API.
    3. Change Node that was already added to the model using Batch API.

    Similarly, you cannot use Batch API on a node that has not been added to the model tree, with the exception of module:engine/model/writer~ModelWriter#insert inserting that node to the model tree.

    Be aware that using module:engine/model/writer~ModelWriter#remove remove from Batch API does not allow to use Node API because the information about Node is still kept in model document.

    In case of module:engine/model/element~ModelElement element node, adding and removing children also counts as changing a node and follows same rules.

    Hierarchy (View Summary)

    Index

    Constructors

    Properties

    _index: number

    Index of this node in its parent or null if the node has no parent.

    _startOffset: number

    Offset at which this node starts in its parent or null if the node has no parent.

    Parent of this node. It could be module:engine/model/element~ModelElement or module:engine/model/documentfragment~ModelDocumentFragment. Equals to null if the node has no parent.

    rootName: string

    Unique root name used to identify this root element by module:engine/model/document~ModelDocument.

    Accessors

    • get document(): ModelDocument

      module:engine/model/document~ModelDocument Document that owns this root element.

      Returns ModelDocument

    • get endOffset(): number

      Offset at which this node ends in its parent. It is equal to the sum of this node's module:engine/model/node~ModelNode#startOffset start offset and #offsetSize offset size. Equals to null if the node has no parent.

      Returns number

    • get index(): number

      Index of this node in its parent or null if the node has no parent.

      Returns number

    • get nextSibling(): ModelNode

      Node's next sibling or null if the node is a last child of it's parent or if the node has no parent.

      Returns ModelNode

    • get offsetSize(): number

      Offset size of this node.

      Represents how much "offset space" is occupied by the node in its parent. It is important for module:engine/model/position~ModelPosition position. When node has offsetSize greater than 1, position can be placed between that node start and end. offsetSize greater than 1 is for nodes that represents more than one entity, i.e. a module:engine/model/text~ModelText text node.

      Returns number

    • get previousSibling(): ModelNode

      Node's previous sibling or null if the node is a first child of it's parent or if the node has no parent.

      Returns ModelNode

    • The top-most ancestor of the node. If node has no parent it is the root itself. If the node is a part of module:engine/model/documentfragment~ModelDocumentFragment, it's root is equal to that DocumentFragment.

      Returns ModelDocumentFragment | ModelNode

    • get startOffset(): number

      Offset at which this node starts in its parent. It is equal to the sum of #offsetSize offsetSize of all its previous siblings. Equals to null if node has no parent.

      Returns number

    Methods

    • Internal

      Removes all attributes from the node.

      Returns void

      module:engine/model/writer~ModelWriter#clearAttributes

    • Internal

      Creates a copy of this node, that is a node with exactly same attributes, and returns it.

      Parameters

      • Optional_deep: boolean

      Returns ModelNode

      Node with same attributes as this node.

    • Internal

      Removes this node from its parent.

      Returns void

      module:engine/model/writer~ModelWriter#remove

    • Internal

      Removes an attribute with given key from the node.

      Parameters

      • key: string

        Key of attribute to remove.

      Returns boolean

      true if the attribute was set on the element, false otherwise.

      module:engine/model/writer~ModelWriter#removeAttribute

    • Internal

      Sets attribute on the node. If attribute with the same key already is set, it's value is overwritten.

      Parameters

      • key: string

        Key of attribute to set.

      • value: unknown

        Attribute value.

      Returns void

      module:engine/model/writer~ModelWriter#setAttribute

    • Internal

      Removes all attributes from the node and sets given attributes.

      Parameters

      • attrs: ModelNodeAttributes

        Attributes to set. See module:utils/tomap~toMap for a list of accepted values.

      Returns void

      module:engine/model/writer~ModelWriter#setAttributes

    • Returns ancestors array of this node.

      Parameters

      • Optionaloptions: { includeSelf?: boolean; parentFirst?: boolean }

        Options object.

        • OptionalincludeSelf?: boolean

          When set to true this node will be also included in parent's array.

        • OptionalparentFirst?: boolean

          When set to true, array will be sorted from node's parent to root element, otherwise root element will be the first item in the array.

      Returns (ModelDocumentFragment | ModelNode)[]

      Array with ancestors.

    • Gets an attribute value for given key or undefined if that attribute is not set on node.

      Parameters

      • key: string

        Key of attribute to look for.

      Returns unknown

      Attribute value or undefined.

    • Returns iterator that iterates over this node's attribute keys.

      Returns IterableIterator<string>

    • Returns iterator that iterates over this node's attributes.

      Attributes are returned as arrays containing two items. First one is attribute key and second is attribute value. This format is accepted by native Map object and also can be passed in Node constructor.

      Returns IterableIterator<[string, unknown]>

    • Returns a module:engine/model/element~ModelElement or module:engine/model/documentfragment~ModelDocumentFragment which is a common ancestor of both nodes.

      Parameters

      • node: ModelNode

        The second node.

      • Optionaloptions: { includeSelf?: boolean }

        Options object.

        • OptionalincludeSelf?: boolean

          When set to true both nodes will be considered "ancestors" too. Which means that if e.g. node A is inside B, then their common ancestor will be B.

      Returns ModelElement | ModelDocumentFragment

    • Gets path to the node. The path is an array containing starting offsets of consecutive ancestors of this node, beginning from module:engine/model/node~ModelNode#root root, down to this node's starting offset. The path can be used to create module:engine/model/position~ModelPosition Position instance.

      const abc = new Text( 'abc' );
      const foo = new Text( 'foo' );
      const h1 = new ModelElement( 'h1', null, new Text( 'header' ) );
      const p = new ModelElement( 'p', null, [ abc, foo ] );
      const div = new ModelElement( 'div', null, [ h1, p ] );
      foo.getPath(); // Returns [ 1, 3 ]. `foo` is in `p` which is in `div`. `p` starts at offset 1, while `foo` at 3.
      h1.getPath(); // Returns [ 0 ].
      div.getPath(); // Returns [].

      Returns number[]

    • Checks if the node has an attribute with given key.

      Parameters

      • key: string

        Key of attribute to check.

      Returns boolean

      true if attribute with given key is set on node, false otherwise.

    • Checks whether the object is of type module:engine/model/node~ModelNode or its subclass.

      This method is useful when processing model objects that are of unknown type. For example, a function may return a module:engine/model/documentfragment~ModelDocumentFragment or a module:engine/model/node~ModelNode that can be either a text node or an element. This method can be used to check what kind of object is returned.

      someObject.is( 'element' ); // -> true if this is an element
      someObject.is( 'node' ); // -> true if this is a node (a text node or an element)
      someObject.is( 'documentFragment' ); // -> true if this is a document fragment

      Since this method is also available on a range of view objects, you can prefix the type of the object with model: or view: to check, for example, if this is the model's or view's element:

      modelElement.is( 'model:element' ); // -> true
      modelElement.is( 'view:element' ); // -> false

      By using this method it is also possible to check a name of an element:

      imageElement.is( 'element', 'imageBlock' ); // -> true
      imageElement.is( 'element', 'imageBlock' ); // -> same as above
      imageElement.is( 'model:element', 'imageBlock' ); // -> same as above, but more precise

      Parameters

      • type: "node" | "model:node"

      Returns this is ModelElement | ModelNode | ModelText | ModelRootElement

      NODE

    • Checks whether the object is of type module:engine/model/element~ModelElement or its subclass.

      element.is( 'element' ); // -> true
      element.is( 'node' ); // -> true
      element.is( 'model:element' ); // -> true
      element.is( 'model:node' ); // -> true

      element.is( 'view:element' ); // -> false
      element.is( 'documentSelection' ); // -> false

      Assuming that the object being checked is an element, you can also check its module:engine/model/element~ModelElement#name name:

      element.is( 'element', 'imageBlock' ); // -> true if this is an <imageBlock> element
      text.is( 'element', 'imageBlock' ); -> false

      Parameters

      • type: "element" | "model:element"

      Returns this is ModelElement | ModelRootElement

      ELEMENT

    • Checks whether the object is of type module:engine/model/rootelement~ModelRootElement.

      rootElement.is( 'rootElement' ); // -> true
      rootElement.is( 'element' ); // -> true
      rootElement.is( 'node' ); // -> true
      rootElement.is( 'model:rootElement' ); // -> true
      rootElement.is( 'model:element' ); // -> true
      rootElement.is( 'model:node' ); // -> true

      rootElement.is( 'view:element' ); // -> false
      rootElement.is( 'documentFragment' ); // -> false

      Assuming that the object being checked is an element, you can also check its module:engine/model/element~ModelElement#name name:

      rootElement.is( 'rootElement', '$root' ); // -> same as above
      

      Parameters

      • type: "rootElement" | "model:rootElement"

      Returns this is ModelRootElement

      ROOT_ELEMENT

    • Checks whether the object is of type module:engine/model/text~ModelText.

      text.is( '$text' ); // -> true
      text.is( 'node' ); // -> true
      text.is( 'model:$text' ); // -> true
      text.is( 'model:node' ); // -> true

      text.is( 'view:$text' ); // -> false
      text.is( 'documentSelection' ); // -> false

      Note: Until version 20.0.0 this method wasn't accepting '$text' type. The legacy 'text' type is still accepted for backward compatibility.

      Parameters

      • type: "$text" | "model:$text"

      Returns this is ModelText

      TEXT

    • Checks whether the object is of type module:engine/model/position~ModelPosition or its subclass.

      position.is( 'position' ); // -> true
      position.is( 'model:position' ); // -> true

      position.is( 'view:position' ); // -> false
      position.is( 'documentSelection' ); // -> false

      Parameters

      • type: "position" | "model:position"

      Returns this is ModelPosition | ModelLivePosition

      POSITION

    • Checks whether the object is of type module:engine/model/liveposition~ModelLivePosition.

      livePosition.is( 'position' ); // -> true
      livePosition.is( 'model:position' ); // -> true
      livePosition.is( 'liveposition' ); // -> true
      livePosition.is( 'model:livePosition' ); // -> true

      livePosition.is( 'view:position' ); // -> false
      livePosition.is( 'documentSelection' ); // -> false

      Parameters

      • type: "livePosition" | "model:livePosition"

      Returns this is ModelLivePosition

      LIVE_POSITION

    • Checks whether the object is of type module:engine/model/range~ModelRange or its subclass.

      range.is( 'range' ); // -> true
      range.is( 'model:range' ); // -> true

      range.is( 'view:range' ); // -> false
      range.is( 'documentSelection' ); // -> false

      Parameters

      • type: "range" | "model:range"

      Returns this is ModelRange | ModelLiveRange

      RANGE

    • Checks whether the object is of type module:engine/model/liverange~ModelLiveRange.

      liveRange.is( 'range' ); // -> true
      liveRange.is( 'model:range' ); // -> true
      liveRange.is( 'liveRange' ); // -> true
      liveRange.is( 'model:liveRange' ); // -> true

      liveRange.is( 'view:range' ); // -> false
      liveRange.is( 'documentSelection' ); // -> false

      Parameters

      • type: "liveRange" | "model:liveRange"

      Returns this is ModelLiveRange

      LIVE_RANGE

    • Checks whether the object is of type module:engine/model/documentfragment~ModelDocumentFragment.

      docFrag.is( 'documentFragment' ); // -> true
      docFrag.is( 'model:documentFragment' ); // -> true

      docFrag.is( 'view:documentFragment' ); // -> false
      docFrag.is( 'element' ); // -> false
      docFrag.is( 'node' ); // -> false

      Parameters

      • type: "documentFragment" | "model:documentFragment"

      Returns this is ModelDocumentFragment

      DOCUMENT_FRAGMENT

    • Checks whether the object is of type module:engine/model/selection~ModelSelection or module:engine/model/documentselection~ModelDocumentSelection.

      selection.is( 'selection' ); // -> true
      selection.is( 'model:selection' ); // -> true

      selection.is( 'view:selection' ); // -> false
      selection.is( 'range' ); // -> false

      Parameters

      • type: "selection" | "model:selection"

      Returns this is ModelSelection | ModelDocumentSelection

      SELECTION

    • Checks whether the object is of type module:engine/model/documentselection~ModelDocumentSelection.

      selection.is( 'selection' ); // -> true
      selection.is( 'documentSelection' ); // -> true
      selection.is( 'model:selection' ); // -> true
      selection.is( 'model:documentSelection' ); // -> true

      selection.is( 'view:selection' ); // -> false
      selection.is( 'element' ); // -> false
      selection.is( 'node' ); // -> false

      Parameters

      • type: "documentSelection" | "model:documentSelection"

      Returns this is ModelDocumentSelection

      DOCUMENT_SELECTION

    • Checks whether the object is of type module:engine/model/markercollection~Marker.

      marker.is( 'marker' ); // -> true
      marker.is( 'model:marker' ); // -> true

      marker.is( 'view:element' ); // -> false
      marker.is( 'documentSelection' ); // -> false

      Parameters

      • type: "marker" | "model:marker"

      Returns this is Marker

      MARKER

    • Checks whether the object is of type module:engine/model/textproxy~ModelTextProxy.

      textProxy.is( '$textProxy' ); // -> true
      textProxy.is( 'model:$textProxy' ); // -> true

      textProxy.is( 'view:$textProxy' ); // -> false
      textProxy.is( 'range' ); // -> false

      Note: Until version 20.0.0 this method wasn't accepting '$textProxy' type. The legacy 'textProxt' type is still accepted for backward compatibility.

      Parameters

      • type: "$textProxy" | "model:$textProxy"

      Returns this is ModelTextProxy

      TEXT_PROXY

    • Checks whether the object is of type module:engine/model/element~ModelElement or its subclass and has the specified name.

      element.is( 'element', 'imageBlock' ); // -> true if this is an <imageBlock> element
      text.is( 'element', 'imageBlock' ); -> false

      Type Parameters

      • N extends string

      Parameters

      • type: "element" | "model:element"
      • name: N

      Returns this is (ModelElement | ModelRootElement) & { name: N }

      ELEMENT_NAME

    • Checks whether the object is of type module:engine/model/rootelement~ModelRootElement and has the specified name.

      rootElement.is( 'rootElement', '$root' );
      

      Type Parameters

      • N extends string

      Parameters

      • type: "rootElement" | "model:rootElement"
      • name: N

      Returns this is ModelRootElement & { name: N }

      ROOT_ELEMENT_NAME

    • Returns whether this node is after given node. false is returned if nodes are in different trees (for example, in different module:engine/model/documentfragment~ModelDocumentFragments).

      Parameters

      Returns boolean

    • Returns true if the node is inside a document root that is attached to the document.

      Returns boolean

    • Returns whether this node is before given node. false is returned if nodes are in different trees (for example, in different module:engine/model/documentfragment~ModelDocumentFragments).

      Parameters

      Returns boolean

    • Converts Node to plain object and returns it.

      Returns unknown

      Node converted to plain object.