json-joy
Version:
Collection of libraries for building collaborative editing apps.
109 lines (108 loc) • 3.3 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.chunk = exports.normalize = exports.trim = exports.isDeleteComponent = exports.componentLength = exports.append = void 0;
const append = (op, component) => {
if (!component)
return;
if (!op.length) {
op.push(component);
return;
}
const lastIndex = op.length - 1;
const last = op[lastIndex];
switch (typeof component) {
case 'number': {
if (typeof last === 'number') {
if (component > 0 && last > 0)
op[lastIndex] = last + component;
else if (component < 0 && last < 0)
op[lastIndex] = last + component;
else
op.push(component);
}
else
op.push(component);
break;
}
case 'string': {
if (typeof last === 'string')
op[lastIndex] = last + component;
else
op.push(component);
break;
}
case 'object': {
if (last instanceof Array)
last[0] = last + component[0];
else
op.push(component);
break;
}
}
};
exports.append = append;
const componentLength = (component) => {
switch (typeof component) {
case 'number':
return Math.abs(component);
case 'string':
return component.length;
default:
return component[0].length;
}
};
exports.componentLength = componentLength;
const isDeleteComponent = (component) => {
switch (typeof component) {
case 'number':
return component < 0;
case 'object':
return true;
default:
return false;
}
};
exports.isDeleteComponent = isDeleteComponent;
const trim = (op) => {
if (!op.length)
return;
const last = op[op.length - 1];
const isLastRetain = typeof last === 'number' && last > 0;
if (isLastRetain)
op.pop();
};
exports.trim = trim;
const normalize = (op) => {
const op2 = [];
const length = op.length;
for (let i = 0; i < length; i++)
(0, exports.append)(op2, op[i]);
(0, exports.trim)(op2);
return op2;
};
exports.normalize = normalize;
/**
* Extracts a full or a part of a component from an operation.
*
* @param component Component from which to extract a chunk.
* @param offset Position within the component to start from.
* @param maxLength Maximum length of the component to extract.
* @returns Full or partial component at index `index` of operation `op`.
*/
const chunk = (component, offset, maxLength) => {
switch (typeof component) {
case 'number': {
return component > 0 ? Math.min(component - offset, maxLength) : -Math.min(-component - offset, maxLength);
}
case 'string': {
const end = Math.min(offset + maxLength, component.length);
return component.substring(offset, end);
}
case 'object': {
const str = component[0];
const end = Math.min(offset + maxLength, str.length);
return [str.substring(offset, end)];
}
}
};
exports.chunk = chunk;
;