y-prosemirror
Advanced tools
Comparing version 0.3.4 to 0.3.5
@@ -0,2 +1,3 @@ | ||
export function setMeta(view: any, key: any, value: any): void; | ||
export function absolutePositionToRelativePosition(pos: number, type: any, mapping: Map<any, import("prosemirror-model").Node<any> | import("prosemirror-model").Node<any>[]>): any; | ||
export function relativePositionToAbsolutePosition(y: any, documentType: any, relPos: any, mapping: Map<any, import("prosemirror-model").Node<any> | import("prosemirror-model").Node<any>[]>): number; |
@@ -9,5 +9,6 @@ /** | ||
export function createDecorations(state: any, awareness: any, createCursor: any): any; | ||
export function yCursorPlugin(awareness: any, { cursorBuilder }?: { | ||
export function yCursorPlugin(awareness: any, { cursorBuilder, getSelection }?: { | ||
cursorBuilder?: (arg0: any) => HTMLElement; | ||
getSelection?: (arg0: any) => any; | ||
}): any; | ||
import { PluginKey } from "prosemirror-state"; |
export * from "./plugins/cursor-plugin.js"; | ||
export * from "./plugins/sync-plugin.js"; | ||
export * from "./plugins/undo-plugin.js"; | ||
export { absolutePositionToRelativePosition, relativePositionToAbsolutePosition } from "./lib.js"; | ||
export { absolutePositionToRelativePosition, relativePositionToAbsolutePosition, setMeta } from "./lib.js"; |
{ | ||
"name": "y-prosemirror", | ||
"version": "0.3.4", | ||
"version": "0.3.5", | ||
"description": "Prosemirror bindings for Yjs", | ||
@@ -5,0 +5,0 @@ "main": "./dist/y-prosemirror.cjs", |
import { ProsemirrorMapping } from './plugins/sync-plugin.js' // eslint-disable-line | ||
import * as Y from 'yjs' | ||
// eslint-disable-next-line | ||
import { EditorView } from 'prosemirror-view' | ||
import * as error from 'lib0/error.js' | ||
import * as map from 'lib0/map.js' | ||
import * as eventloop from 'lib0/eventloop.js' | ||
/** | ||
* Is null if no timeout is in progress. | ||
* Is defined if a timeout is in progress. | ||
* Maps from view | ||
* @type {Map<EditorView, Map<any, any>>|null} | ||
*/ | ||
let viewsToUpdate = null | ||
const updateMetas = () => { | ||
const ups = /** @type {Map<EditorView, Map<any, any>>} */ (viewsToUpdate) | ||
viewsToUpdate = null | ||
ups.forEach((metas, view) => { | ||
const tr = view.state.tr | ||
metas.forEach((val, key) => { | ||
tr.setMeta(key, val) | ||
}) | ||
view.dispatch(tr) | ||
}) | ||
} | ||
export const setMeta = (view, key, value) => { | ||
if (!viewsToUpdate) { | ||
viewsToUpdate = new Map() | ||
eventloop.timeout(0, updateMetas) | ||
} | ||
map.setIfUndefined(viewsToUpdate, view, map.create).set(key, value) | ||
} | ||
/** | ||
* Transforms a Prosemirror based absolute position to a Yjs Cursor (relative position in the Yjs model). | ||
@@ -8,0 +40,0 @@ * |
@@ -7,3 +7,3 @@ | ||
import { ySyncPluginKey } from './sync-plugin.js' | ||
import { absolutePositionToRelativePosition, relativePositionToAbsolutePosition } from '../lib.js' | ||
import { absolutePositionToRelativePosition, relativePositionToAbsolutePosition, setMeta } from '../lib.js' | ||
@@ -85,5 +85,6 @@ import * as math from 'lib0/math.js' | ||
* @param {function(any):HTMLElement} [opts.cursorBuilder] | ||
* @param {function(any):any} [opts.getSelection] | ||
* @return {any} | ||
*/ | ||
export const yCursorPlugin = (awareness, { cursorBuilder = defaultCursorBuilder } = {}) => new Plugin({ | ||
export const yCursorPlugin = (awareness, { cursorBuilder = defaultCursorBuilder, getSelection = state => state.selection } = {}) => new Plugin({ | ||
key: yCursorPluginKey, | ||
@@ -110,8 +111,6 @@ state: { | ||
const awarenessListener = () => { | ||
setTimeout(() => { | ||
// @ts-ignore | ||
if (view.docView) { | ||
view.dispatch(view.state.tr.setMeta(yCursorPluginKey, { awarenessUpdated: true })) | ||
} | ||
}) | ||
// @ts-ignore | ||
if (view.docView) { | ||
setMeta(view, yCursorPluginKey, { awarenessUpdated: true }) | ||
} | ||
} | ||
@@ -123,10 +122,11 @@ const updateCursorInfo = () => { | ||
if (view.hasFocus() && ystate.binding !== null) { | ||
const selection = getSelection(view.state) | ||
/** | ||
* @type {Y.RelativePosition} | ||
*/ | ||
const anchor = absolutePositionToRelativePosition(view.state.selection.anchor, ystate.type, ystate.binding.mapping) | ||
const anchor = absolutePositionToRelativePosition(selection.anchor, ystate.type, ystate.binding.mapping) | ||
/** | ||
* @type {Y.RelativePosition} | ||
*/ | ||
const head = absolutePositionToRelativePosition(view.state.selection.head, ystate.type, ystate.binding.mapping) | ||
const head = absolutePositionToRelativePosition(selection.head, ystate.type, ystate.binding.mapping) | ||
if (current.cursor == null || !Y.compareRelativePositions(Y.createRelativePositionFromJSON(current.cursor.anchor), anchor) || !Y.compareRelativePositions(Y.createRelativePositionFromJSON(current.cursor.head), head)) { | ||
@@ -133,0 +133,0 @@ awareness.setLocalStateField('cursor', { |
export * from './plugins/cursor-plugin.js' | ||
export * from './plugins/sync-plugin.js' | ||
export * from './plugins/undo-plugin.js' | ||
export { absolutePositionToRelativePosition, relativePositionToAbsolutePosition } from './lib.js' | ||
export { absolutePositionToRelativePosition, relativePositionToAbsolutePosition, setMeta } from './lib.js' |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
3229227
30163