fix y-text

This commit is contained in:
Kevin Jahns
2019-03-30 01:08:09 +01:00
parent c188f813a4
commit 1bc1e88d6a
5 changed files with 351 additions and 192 deletions

View File

@@ -16,28 +16,6 @@ import { ItemBinary } from '../structs/ItemBinary.js'
import { ID, createID } from '../utils/ID.js' // eslint-disable-line
import { getItemCleanStart } from '../utils/StructStore.js'
/**
* Restructure children as if they were inserted one after another
* @param {Transaction} transaction
* @param {AbstractItem} start
*/
const integrateChildren = (transaction, start) => {
let right
while (true) {
right = start.right
start.id = nextID(transaction)
start.right = null
start.rightOrigin = null
start.origin = start.left
start.integrate(transaction)
if (right !== null) {
start = right
} else {
break
}
}
}
/**
* Abstract Yjs Type class
*/
@@ -81,21 +59,6 @@ export class AbstractType {
_integrate (transaction, item) {
this._y = transaction.y
this._item = item
// when integrating children we must make sure to
// integrate start
const start = this._start
if (start !== null) {
this._start = null
integrateChildren(transaction, start)
}
// integrate map children_integrate
const map = this._map
this._map = new Map()
map.forEach(t => {
t.right = null
t.rightOrigin = null
integrateChildren(transaction, t)
})
}
/**
@@ -336,6 +299,7 @@ export const typeArrayInsertGenericsAfter = (transaction, parent, referenceItem,
let jsonContent = []
content.forEach(c => {
switch (c.constructor) {
case Number:
case Object:
case Array:
case String:
@@ -398,3 +362,64 @@ export const typeMapDelete = (transaction, parent, key) => {
c.delete(transaction)
}
}
/**
* @param {Transaction} transaction
* @param {AbstractType} parent
* @param {string} key
* @param {Object|number|Array<any>|string|ArrayBuffer|AbstractType} value
*/
export const typeMapSet = (transaction, parent, key, value) => {
const right = parent._map.get(key) || null
switch (value.constructor) {
case Number:
case Object:
case Array:
case String:
new ItemJSON(nextID(transaction), null, right, parent, key, [value]).integrate(transaction)
break
case ArrayBuffer:
new ItemBinary(nextID(transaction), null, right, parent, key, value).integrate(transaction)
break
default:
if (value instanceof AbstractType) {
new ItemType(nextID(transaction), null, right, parent, key, value).integrate(transaction)
} else {
throw new Error('Unexpected content type')
}
}
}
/**
* @param {AbstractType} parent
* @param {string} key
* @return {Object<string,any>|number|Array<any>|string|ArrayBuffer|AbstractType|undefined}
*/
export const typeMapGet = (parent, key) => {
const val = parent._map.get(key)
return val !== undefined && !val.deleted ? val.getContent()[0] : undefined
}
/**
* @param {AbstractType} parent
* @param {string} key
* @return {boolean}
*/
export const typeMapHas = (parent, key) => {
const val = parent._map.get(key)
return val !== undefined && !val.deleted
}
/**
* @param {AbstractType} parent
* @param {string} key
* @param {Snapshot} snapshot
* @return {Object<string,any>|number|Array<any>|string|ArrayBuffer|AbstractType|undefined}
*/
export const typeMapGetSnapshot = (parent, key, snapshot) => {
let v = parent._map.get(key) || null
while (v !== null && (!snapshot.sm.has(v.id.client) || v.id.clock >= (snapshot.sm.get(v.id.client) || 0))) {
v = v.right
}
return v !== null && isVisible(v, snapshot) ? v.getContent()[0] : undefined
}