Correctly insert embed when using YText.applyDelta
This commit is contained in:
parent
b0dbd84f7f
commit
b4e5c5cc1f
@ -226,7 +226,7 @@ const insertAttributes = (transaction, parent, left, right, currentAttributes, a
|
|||||||
* @param {Item|null} left
|
* @param {Item|null} left
|
||||||
* @param {Item|null} right
|
* @param {Item|null} right
|
||||||
* @param {Map<string,any>} currentAttributes
|
* @param {Map<string,any>} currentAttributes
|
||||||
* @param {string} text
|
* @param {string|object} text
|
||||||
* @param {Object<string,any>} attributes
|
* @param {Object<string,any>} attributes
|
||||||
* @return {ItemListPosition}
|
* @return {ItemListPosition}
|
||||||
*
|
*
|
||||||
@ -299,6 +299,17 @@ const formatText = (transaction, parent, left, right, currentAttributes, length,
|
|||||||
left = right
|
left = right
|
||||||
right = right.right
|
right = right.right
|
||||||
}
|
}
|
||||||
|
// Quill just assumes that the editor starts with a newline and that it always
|
||||||
|
// ends with a newline. We only insert that newline when a new newline is
|
||||||
|
// inserted - i.e when length is bigger than type.length
|
||||||
|
if (length > 0) {
|
||||||
|
let newlines = ''
|
||||||
|
for (; length > 0; length--) {
|
||||||
|
newlines += '\n'
|
||||||
|
}
|
||||||
|
left = new Item(nextID(transaction), left, left === null ? null : left.lastId, right, right === null ? null : right.id, parent, null, new ContentString(newlines))
|
||||||
|
left.integrate(transaction)
|
||||||
|
}
|
||||||
return insertNegatedAttributes(transaction, parent, left, right, negatedAttributes)
|
return insertNegatedAttributes(transaction, parent, left, right, negatedAttributes)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -664,7 +675,15 @@ export class YText extends AbstractType {
|
|||||||
for (let i = 0; i < delta.length; i++) {
|
for (let i = 0; i < delta.length; i++) {
|
||||||
const op = delta[i]
|
const op = delta[i]
|
||||||
if (op.insert !== undefined) {
|
if (op.insert !== undefined) {
|
||||||
pos = insertText(transaction, this, pos.left, pos.right, currentAttributes, op.insert, op.attributes || {})
|
// Quill assumes that the content starts with an empty paragraph.
|
||||||
|
// Yjs/Y.Text assumes that it starts empty. We always hide that
|
||||||
|
// there is a newline at the end of the content.
|
||||||
|
// If we omit this step, clients will see a different number of
|
||||||
|
// paragraphs, but nothing bad will happen.
|
||||||
|
const ins = (typeof op.insert === 'string' && i === delta.length - 1 && pos.right === null && op.insert.slice(-1) === '\n') ? op.insert.slice(0, -1) : op.insert
|
||||||
|
if (typeof ins !== 'string' || ins.length > 0) {
|
||||||
|
pos = insertText(transaction, this, pos.left, pos.right, currentAttributes, ins, op.attributes || {})
|
||||||
|
}
|
||||||
} else if (op.retain !== undefined) {
|
} else if (op.retain !== undefined) {
|
||||||
pos = formatText(transaction, this, pos.left, pos.right, currentAttributes, op.retain, op.attributes || {})
|
pos = formatText(transaction, this, pos.left, pos.right, currentAttributes, op.retain, op.attributes || {})
|
||||||
} else if (op.delete !== undefined) {
|
} else if (op.delete !== undefined) {
|
||||||
|
@ -282,7 +282,7 @@ export const compare = users => {
|
|||||||
t.compare(userArrayValues[i], userArrayValues[i + 1])
|
t.compare(userArrayValues[i], userArrayValues[i + 1])
|
||||||
t.compare(userMapValues[i], userMapValues[i + 1])
|
t.compare(userMapValues[i], userMapValues[i + 1])
|
||||||
t.compare(userXmlValues[i], userXmlValues[i + 1])
|
t.compare(userXmlValues[i], userXmlValues[i + 1])
|
||||||
t.compare(userTextValues[i].map(/** @param {any} a */ a => a.insert).join('').length, users[i].getText('text').length)
|
t.compare(userTextValues[i].map(/** @param {any} a */ a => typeof a.insert === 'string' ? a.insert : ' ').join('').length, users[i].getText('text').length)
|
||||||
t.compare(userTextValues[i], userTextValues[i + 1])
|
t.compare(userTextValues[i], userTextValues[i + 1])
|
||||||
t.compare(getStateVector(users[i].store), getStateVector(users[i + 1].store))
|
t.compare(getStateVector(users[i].store), getStateVector(users[i + 1].store))
|
||||||
compareDS(createDeleteSetFromStructStore(users[i].store), createDeleteSetFromStructStore(users[i + 1].store))
|
compareDS(createDeleteSetFromStructStore(users[i].store), createDeleteSetFromStructStore(users[i + 1].store))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user