{"version":3,"file":"y-quill.cjs","sources":["../src/y-quill.js"],"sourcesContent":["/**\n * @module bindings/quill\n */\n\nimport * as Y from 'yjs' // eslint-disable-line\n\n/**\n * @typedef {import('y-protocols/awareness').Awareness} Awareness\n\n/**\n * Removes the pending '\\n's if it has no attributes.\n */\nexport const normQuillDelta = delta => {\n  if (delta.length > 0) {\n    const d = delta[delta.length - 1]\n    const insert = d.insert\n    if (d.attributes === undefined && insert !== undefined && insert.slice(-1) === '\\n') {\n      delta = delta.slice()\n      let ins = insert.slice(0, -1)\n      while (ins.slice(-1) === '\\n') {\n        ins = ins.slice(0, -1)\n      }\n      delta[delta.length - 1] = { insert: ins }\n      if (ins.length === 0) {\n        delta.pop()\n      }\n      return delta\n    }\n  }\n  return delta\n}\n\n/**\n * @param {any} quillCursors\n */\nconst updateCursor = (quillCursors, aw, clientId, doc, type) => {\n  try {\n    if (aw && aw.cursor && clientId !== doc.clientID) {\n      const user = aw.user || {}\n      const color = user.color || '#ffa500'\n      const name = user.name || `User: ${clientId}`\n      quillCursors.createCursor(clientId.toString(), name, color)\n      const anchor = Y.createAbsolutePositionFromRelativePosition(Y.createRelativePositionFromJSON(aw.cursor.anchor), doc)\n      const head = Y.createAbsolutePositionFromRelativePosition(Y.createRelativePositionFromJSON(aw.cursor.head), doc)\n      if (anchor && head && anchor.type === type) {\n        quillCursors.moveCursor(clientId.toString(), { index: anchor.index, length: head.index - anchor.index })\n      }\n    } else {\n      quillCursors.removeCursor(clientId.toString())\n    }\n  } catch (err) {\n    console.error(err)\n  }\n}\n\nexport class QuillBinding {\n  /**\n   * @param {Y.Text} type\n   * @param {any} quill\n   * @param {Awareness} [awareness]\n   */\n  constructor (type, quill, awareness) {\n    const doc = /** @type {Y.Doc} */ (type.doc)\n    this.type = type\n    this.doc = doc\n    this.quill = quill\n    const quillCursors = quill.getModule('cursors') || null\n    this.quillCursors = quillCursors\n    // This object contains all attributes used in the quill instance\n    this._negatedUsedFormats = {}\n    this.awareness = awareness\n    this._awarenessChange = ({ added, removed, updated }) => {\n      const states = /** @type {Awareness} */ (awareness).getStates()\n      added.forEach(id => {\n        updateCursor(quillCursors, states.get(id), id, doc, type)\n      })\n      updated.forEach(id => {\n        updateCursor(quillCursors, states.get(id), id, doc, type)\n      })\n      removed.forEach(id => {\n        quillCursors.removeCursor(id.toString())\n      })\n    }\n    /**\n     * @param {Y.YTextEvent} event\n     */\n    this._typeObserver = event => {\n      if (event.transaction.origin !== this) {\n        const eventDelta = event.delta\n        // We always explicitly set attributes, otherwise concurrent edits may\n        // result in quill assuming that a text insertion shall inherit existing\n        // attributes.\n        const delta = []\n        for (let i = 0; i < eventDelta.length; i++) {\n          const d = eventDelta[i]\n          if (d.insert !== undefined) {\n            delta.push(Object.assign({}, d, { attributes: Object.assign({}, this._negatedUsedFormats, d.attributes || {}) }))\n          } else {\n            delta.push(d)\n          }\n        }\n        quill.updateContents(delta, this)\n      }\n    }\n    type.observe(this._typeObserver)\n    this._quillObserver = (eventType, delta, state, origin) => {\n      if (delta && delta.ops) {\n        // update content\n        const ops = delta.ops\n        ops.forEach(op => {\n          if (op.attributes !== undefined) {\n            for (const key in op.attributes) {\n              if (this._negatedUsedFormats[key] === undefined) {\n                this._negatedUsedFormats[key] = false\n              }\n            }\n          }\n        })\n        if (origin !== this) {\n          doc.transact(() => {\n            type.applyDelta(ops)\n          }, this)\n        }\n      }\n      // always check selection\n      if (awareness && quillCursors) {\n        const sel = quill.getSelection()\n        const aw = /** @type {any} */ (awareness.getLocalState())\n        if (sel === null) {\n          if (awareness.getLocalState() !== null) {\n            awareness.setLocalStateField('cursor', /** @type {any} */ (null))\n          }\n        } else {\n          const anchor = Y.createRelativePositionFromTypeIndex(type, sel.index)\n          const head = Y.createRelativePositionFromTypeIndex(type, sel.index + sel.length)\n          if (!aw || !aw.cursor || !Y.compareRelativePositions(anchor, aw.cursor.anchor) || !Y.compareRelativePositions(head, aw.cursor.head)) {\n            awareness.setLocalStateField('cursor', {\n              anchor,\n              head\n            })\n          }\n        }\n        // update all remote cursor locations\n        awareness.getStates().forEach((aw, clientId) => {\n          updateCursor(quillCursors, aw, clientId, doc, type)\n        })\n      }\n    }\n    quill.on('editor-change', this._quillObserver)\n    // This indirectly initializes _negatedUsedFormats.\n    // Make sure that this call this after the _quillObserver is set.\n    quill.setContents(type.toDelta(), this)\n    // init remote cursors\n    if (quillCursors !== null && awareness) {\n      awareness.getStates().forEach((aw, clientId) => {\n        updateCursor(quillCursors, aw, clientId, doc, type)\n      })\n      awareness.on('change', this._awarenessChange)\n    }\n  }\n\n  destroy () {\n    this.type.unobserve(this._typeObserver)\n    this.quill.off('editor-change', this._quillObserver)\n    if (this.awareness) {\n      this.awareness.off('change', this._awarenessChange)\n    }\n  }\n}\n"],"names":["Y"],"mappings":"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"}