| Server IP : 34.87.99.72 / Your IP : 216.73.217.31 Web Server : Apache/2.4.46 (Unix) OpenSSL/1.1.1n System : Linux zlock-bitnami-lamp-prod-v2-vm 4.19.0-16-cloud-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64 User : bitnami ( 1000) PHP Version : 7.4.18 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /opt/bitnami/apache/htdocs/app/node_modules/prosemirror-state/src/ |
Upload File : |
import {Transform} from "prosemirror-transform"
import {Mark} from "prosemirror-model"
import {Selection} from "./selection"
const UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4
// ::- An editor state transaction, which can be applied to a state to
// create an updated state. Use
// [`EditorState.tr`](#state.EditorState.tr) to create an instance.
//
// Transactions track changes to the document (they are a subclass of
// [`Transform`](#transform.Transform)), but also other state changes,
// like selection updates and adjustments of the set of [stored
// marks](#state.EditorState.storedMarks). In addition, you can store
// metadata properties in a transaction, which are extra pieces of
// information that client code or plugins can use to describe what a
// transacion represents, so that they can update their [own
// state](#state.StateField) accordingly.
//
// The [editor view](#view.EditorView) uses a few metadata properties:
// it will attach a property `"pointer"` with the value `true` to
// selection transactions directly caused by mouse or touch input, and
// a `"uiEvent"` property of that may be `"paste"`, `"cut"`, or `"drop"`.
export class Transaction extends Transform {
constructor(state) {
super(state.doc)
// :: number
// The timestamp associated with this transaction, in the same
// format as `Date.now()`.
this.time = Date.now()
this.curSelection = state.selection
// The step count for which the current selection is valid.
this.curSelectionFor = 0
// :: ?[Mark]
// The stored marks set by this transaction, if any.
this.storedMarks = state.storedMarks
// Bitfield to track which aspects of the state were updated by
// this transaction.
this.updated = 0
// Object used to store metadata properties for the transaction.
this.meta = Object.create(null)
}
// :: Selection
// The transaction's current selection. This defaults to the editor
// selection [mapped](#state.Selection.map) through the steps in the
// transaction, but can be overwritten with
// [`setSelection`](#state.Transaction.setSelection).
get selection() {
if (this.curSelectionFor < this.steps.length) {
this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor))
this.curSelectionFor = this.steps.length
}
return this.curSelection
}
// :: (Selection) → Transaction
// Update the transaction's current selection. Will determine the
// selection that the editor gets when the transaction is applied.
setSelection(selection) {
if (selection.$from.doc != this.doc)
throw new RangeError("Selection passed to setSelection must point at the current document")
this.curSelection = selection
this.curSelectionFor = this.steps.length
this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS
this.storedMarks = null
return this
}
// :: bool
// Whether the selection was explicitly updated by this transaction.
get selectionSet() {
return (this.updated & UPDATED_SEL) > 0
}
// :: (?[Mark]) → Transaction
// Set the current stored marks.
setStoredMarks(marks) {
this.storedMarks = marks
this.updated |= UPDATED_MARKS
return this
}
// :: ([Mark]) → Transaction
// Make sure the current stored marks or, if that is null, the marks
// at the selection, match the given set of marks. Does nothing if
// this is already the case.
ensureMarks(marks) {
if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))
this.setStoredMarks(marks)
return this
}
// :: (Mark) → Transaction
// Add a mark to the set of stored marks.
addStoredMark(mark) {
return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()))
}
// :: (union<Mark, MarkType>) → Transaction
// Remove a mark or mark type from the set of stored marks.
removeStoredMark(mark) {
return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()))
}
// :: bool
// Whether the stored marks were explicitly set for this transaction.
get storedMarksSet() {
return (this.updated & UPDATED_MARKS) > 0
}
addStep(step, doc) {
super.addStep(step, doc)
this.updated = this.updated & ~UPDATED_MARKS
this.storedMarks = null
}
// :: (number) → Transaction
// Update the timestamp for the transaction.
setTime(time) {
this.time = time
return this
}
// :: (Slice) → Transaction
// Replace the current selection with the given slice.
replaceSelection(slice) {
this.selection.replace(this, slice)
return this
}
// :: (Node, ?bool) → Transaction
// Replace the selection with the given node. When `inheritMarks` is
// true and the content is inline, it inherits the marks from the
// place where it is inserted.
replaceSelectionWith(node, inheritMarks) {
let selection = this.selection
if (inheritMarks !== false)
node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none)))
selection.replaceWith(this, node)
return this
}
// :: () → Transaction
// Delete the selection.
deleteSelection() {
this.selection.replace(this)
return this
}
// :: (string, from: ?number, to: ?number) → Transaction
// Replace the given range, or the selection if no range is given,
// with a text node containing the given string.
insertText(text, from, to = from) {
let schema = this.doc.type.schema
if (from == null) {
if (!text) return this.deleteSelection()
return this.replaceSelectionWith(schema.text(text), true)
} else {
if (!text) return this.deleteRange(from, to)
let marks = this.storedMarks
if (!marks) {
let $from = this.doc.resolve(from)
marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to))
}
this.replaceRangeWith(from, to, schema.text(text, marks))
if (!this.selection.empty) this.setSelection(Selection.near(this.selection.$to))
return this
}
}
// :: (union<string, Plugin, PluginKey>, any) → Transaction
// Store a metadata property in this transaction, keyed either by
// name or by plugin.
setMeta(key, value) {
this.meta[typeof key == "string" ? key : key.key] = value
return this
}
// :: (union<string, Plugin, PluginKey>) → any
// Retrieve a metadata property for a given name or plugin.
getMeta(key) {
return this.meta[typeof key == "string" ? key : key.key]
}
// :: bool
// Returns true if this transaction doesn't contain any metadata,
// and can thus safely be extended.
get isGeneric() {
for (let _ in this.meta) return false
return true
}
// :: () → Transaction
// Indicate that the editor should scroll the selection into view
// when updated to the state produced by this transaction.
scrollIntoView() {
this.updated |= UPDATED_SCROLL
return this
}
get scrolledIntoView() {
return (this.updated & UPDATED_SCROLL) > 0
}
}