Skip to content

Commit a7750fd

Browse files
committed
Changeset: Turn builder() into a real class
1 parent e299edd commit a7750fd

File tree

8 files changed

+101
-98
lines changed

8 files changed

+101
-98
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
generator function (combined with `serializeOps()`).
3333
* `appendATextToAssembler()`: Deprecated in favor of the new `opsFromAText()`
3434
generator function.
35+
* `builder()`: Deprecated in favor of the new `Builder` class.
3536
* `newOp()`: Deprecated in favor of the new `Op` class.
3637

3738
# 1.8.16

src/node/db/API.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ exports.restoreRevision = async (padID, rev) => {
540540
};
541541

542542
// create a new changeset with a helper builder object
543-
const builder = Changeset.builder(oldText.length);
543+
const builder = new Changeset.Builder(oldText.length);
544544

545545
// assemble each line into the builder
546546
eachAttribRun(atext.attribs, (start, end, attribs) => {

src/node/handler/PadMessageHandler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -759,7 +759,7 @@ const _correctMarkersInPad = (atext, apool) => {
759759
// create changeset that removes these bad markers
760760
offset = 0;
761761

762-
const builder = Changeset.builder(text.length);
762+
const builder = new Changeset.Builder(text.length);
763763

764764
badMarkers.forEach((pos) => {
765765
builder.keepText(text.substring(offset, pos));

src/node/utils/ImportHtml.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ exports.setPadHTML = async (pad, html) => {
6464
const newAttribs = `${result.lineAttribs.join('|1+1')}|1+1`;
6565

6666
// create a new changeset with a helper builder object
67-
const builder = Changeset.builder(1);
67+
const builder = new Changeset.Builder(1);
6868

6969
// assemble each line into the builder
7070
let textIndex = 0;

src/node/utils/padDiff.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ PadDiff.prototype._createClearAuthorship = async function (rev) {
6969
const atext = await this._pad.getInternalRevisionAText(rev);
7070

7171
// build clearAuthorship changeset
72-
const builder = Changeset.builder(atext.text.length);
72+
const builder = new Changeset.Builder(atext.text.length);
7373
builder.keepText(atext.text, [['author', '']], this._pad.pool);
7474
const changeset = builder.toString();
7575

@@ -262,7 +262,7 @@ PadDiff.prototype._createDeletionChangeset = function (cs, startAText, apool) {
262262
let curLineNextOp = new Changeset.Op('+');
263263

264264
const unpacked = Changeset.unpack(cs);
265-
const builder = Changeset.builder(unpacked.newLen);
265+
const builder = new Changeset.Builder(unpacked.newLen);
266266

267267
const consumeAttribRuns = (numChars, func /* (len, attribs, endsLine)*/) => {
268268
if (!curLineOps || curLineOpsLine !== curLine) {

src/static/js/AttributeManager.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
125125
* @param attribs an array of attributes
126126
*/
127127
_setAttributesOnRangeByLine(row, startCol, endCol, attribs) {
128-
const builder = Changeset.builder(this.rep.lines.totalWidth());
128+
const builder = new Changeset.Builder(this.rep.lines.totalWidth());
129129
ChangesetUtils.buildKeepToStartOfRange(this.rep, builder, [row, startCol]);
130130
ChangesetUtils.buildKeepRange(
131131
this.rep, builder, [row, startCol], [row, endCol], attribs, this.rep.apool);
@@ -285,7 +285,7 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
285285
*/
286286
setAttributeOnLine(lineNum, attributeName, attributeValue) {
287287
let loc = [0, 0];
288-
const builder = Changeset.builder(this.rep.lines.totalWidth());
288+
const builder = new Changeset.Builder(this.rep.lines.totalWidth());
289289
const hasMarker = this.lineHasMarker(lineNum);
290290

291291
ChangesetUtils.buildKeepRange(this.rep, builder, loc, (loc = [lineNum, 0]));
@@ -314,7 +314,7 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({
314314
* @param attributeValue if given only attributes with equal value will be removed
315315
*/
316316
removeAttributeOnLine(lineNum, attributeName, attributeValue) {
317-
const builder = Changeset.builder(this.rep.lines.totalWidth());
317+
const builder = new Changeset.Builder(this.rep.lines.totalWidth());
318318
const hasMarker = this.lineHasMarker(lineNum);
319319
let found = false;
320320

src/static/js/Changeset.js

Lines changed: 88 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1920,98 +1920,100 @@ exports.attribsAttributeValue = (attribs, key, pool) => {
19201920

19211921
/**
19221922
* Incrementally builds a Changeset.
1923-
*
1924-
* @typedef {object} Builder
1925-
* @property {Function} insert -
1926-
* @property {Function} keep -
1927-
* @property {Function} keepText -
1928-
* @property {Function} remove -
1929-
* @property {Function} toString -
19301923
*/
1924+
class Builder {
1925+
/**
1926+
* @param {number} oldLen - Old length
1927+
*/
1928+
constructor(oldLen) {
1929+
this._oldLen = oldLen;
1930+
this._ops = [];
1931+
this._charBank = exports.stringAssembler();
1932+
}
19311933

1932-
/**
1933-
* @param {number} oldLen - Old length
1934-
* @returns {Builder}
1935-
*/
1936-
exports.builder = (oldLen) => {
1937-
const ops = [];
1938-
const charBank = exports.stringAssembler();
1934+
/**
1935+
* @param {number} N - Number of characters to keep.
1936+
* @param {number} L - Number of newlines among the `N` characters. If positive, the last
1937+
* character must be a newline.
1938+
* @param {(string|Attribute[])} attribs - Either [[key1,value1],[key2,value2],...] or '*0*1...'
1939+
* (no pool needed in latter case).
1940+
* @param {?AttributePool} pool - Attribute pool, only required if `attribs` is a list of
1941+
* attribute key, value pairs.
1942+
* @returns {Builder} this
1943+
*/
1944+
keep(N, L, attribs, pool) {
1945+
const o = new Op('=');
1946+
o.attribs = typeof attribs === 'string'
1947+
? attribs : new AttributeMap(pool).update(attribs || []).toString();
1948+
o.chars = N;
1949+
o.lines = (L || 0);
1950+
this._ops.push(o);
1951+
return this;
1952+
}
19391953

1940-
const self = {
1941-
/**
1942-
* @param {number} N - Number of characters to keep.
1943-
* @param {number} L - Number of newlines among the `N` characters. If positive, the last
1944-
* character must be a newline.
1945-
* @param {(string|Attribute[])} attribs - Either [[key1,value1],[key2,value2],...] or '*0*1...'
1946-
* (no pool needed in latter case).
1947-
* @param {?AttributePool} pool - Attribute pool, only required if `attribs` is a list of
1948-
* attribute key, value pairs.
1949-
* @returns {Builder} this
1950-
*/
1951-
keep: (N, L, attribs, pool) => {
1952-
const o = new Op('=');
1953-
o.attribs = typeof attribs === 'string'
1954-
? attribs : new AttributeMap(pool).update(attribs || []).toString();
1955-
o.chars = N;
1956-
o.lines = (L || 0);
1957-
ops.push(o);
1958-
return self;
1959-
},
1954+
/**
1955+
* @param {string} text - Text to keep.
1956+
* @param {(string|Attribute[])} attribs - Either [[key1,value1],[key2,value2],...] or '*0*1...'
1957+
* (no pool needed in latter case).
1958+
* @param {?AttributePool} pool - Attribute pool, only required if `attribs` is a list of
1959+
* attribute key, value pairs.
1960+
* @returns {Builder} this
1961+
*/
1962+
keepText(text, attribs, pool) {
1963+
this._ops.push(...opsFromText('=', text, attribs, pool));
1964+
return this;
1965+
}
19601966

1961-
/**
1962-
* @param {string} text - Text to keep.
1963-
* @param {(string|Attribute[])} attribs - Either [[key1,value1],[key2,value2],...] or '*0*1...'
1964-
* (no pool needed in latter case).
1965-
* @param {?AttributePool} pool - Attribute pool, only required if `attribs` is a list of
1966-
* attribute key, value pairs.
1967-
* @returns {Builder} this
1968-
*/
1969-
keepText: (text, attribs, pool) => {
1970-
ops.push(...opsFromText('=', text, attribs, pool));
1971-
return self;
1972-
},
1967+
/**
1968+
* @param {string} text - Text to insert.
1969+
* @param {(string|Attribute[])} attribs - Either [[key1,value1],[key2,value2],...] or '*0*1...'
1970+
* (no pool needed in latter case).
1971+
* @param {?AttributePool} pool - Attribute pool, only required if `attribs` is a list of
1972+
* attribute key, value pairs.
1973+
* @returns {Builder} this
1974+
*/
1975+
insert(text, attribs, pool) {
1976+
this._ops.push(...opsFromText('+', text, attribs, pool));
1977+
this._charBank.append(text);
1978+
return this;
1979+
}
19731980

1974-
/**
1975-
* @param {string} text - Text to insert.
1976-
* @param {(string|Attribute[])} attribs - Either [[key1,value1],[key2,value2],...] or '*0*1...'
1977-
* (no pool needed in latter case).
1978-
* @param {?AttributePool} pool - Attribute pool, only required if `attribs` is a list of
1979-
* attribute key, value pairs.
1980-
* @returns {Builder} this
1981-
*/
1982-
insert: (text, attribs, pool) => {
1983-
ops.push(...opsFromText('+', text, attribs, pool));
1984-
charBank.append(text);
1985-
return self;
1986-
},
1981+
/**
1982+
* @param {number} N - Number of characters to remove.
1983+
* @param {number} L - Number of newlines among the `N` characters. If positive, the last
1984+
* character must be a newline.
1985+
* @returns {Builder} this
1986+
*/
1987+
remove(N, L) {
1988+
const o = new Op('-');
1989+
o.attribs = '';
1990+
o.chars = N;
1991+
o.lines = (L || 0);
1992+
this._ops.push(o);
1993+
return this;
1994+
}
19871995

1988-
/**
1989-
* @param {number} N - Number of characters to remove.
1990-
* @param {number} L - Number of newlines among the `N` characters. If positive, the last
1991-
* character must be a newline.
1992-
* @returns {Builder} this
1993-
*/
1994-
remove: (N, L) => {
1995-
const o = new Op('-');
1996-
o.attribs = '';
1997-
o.chars = N;
1998-
o.lines = (L || 0);
1999-
ops.push(o);
2000-
return self;
2001-
},
2002-
2003-
toString: () => {
2004-
/** @type {number} */
2005-
let lengthChange;
2006-
const serializedOps = exports.serializeOps((function* () {
2007-
lengthChange = yield* exports.canonicalizeOps(ops, true);
2008-
})());
2009-
const newLen = oldLen + lengthChange;
2010-
return exports.pack(oldLen, newLen, serializedOps, charBank.toString());
2011-
},
2012-
};
1996+
toString() {
1997+
/** @type {number} */
1998+
let lengthChange;
1999+
const serializedOps = exports.serializeOps((function* () {
2000+
lengthChange = yield* exports.canonicalizeOps(this._ops, true);
2001+
}).call(this));
2002+
const newLen = this._oldLen + lengthChange;
2003+
return exports.pack(this._oldLen, newLen, serializedOps, this._charBank.toString());
2004+
}
2005+
}
2006+
exports.Builder = Builder;
20132007

2014-
return self;
2008+
/**
2009+
* @deprecated Use the `Builder` class instead.
2010+
* @param {number} oldLen - Old length
2011+
* @returns {Builder}
2012+
*/
2013+
exports.builder = (oldLen) => {
2014+
padutils.warnWithStack(
2015+
'Changeset.builder() is deprecated; use the Changeset.Builder class instead');
2016+
return new Builder(oldLen);
20152017
};
20162018

20172019
/**
@@ -2112,7 +2114,7 @@ exports.inverse = (cs, lines, alines, pool) => {
21122114
let curLineNextOp = new Op('+');
21132115

21142116
const unpacked = exports.unpack(cs);
2115-
const builder = exports.builder(unpacked.newLen);
2117+
const builder = new Builder(unpacked.newLen);
21162118

21172119
const consumeAttribRuns = (numChars, func /* (len, attribs, endsLine)*/) => {
21182120
if (!curLineOps || curLineOpsLine !== curLine) {

src/static/js/ace2_inner.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ function Ace2Inner(editorInfo, cssManagers) {
170170
// CCCCCCCCCCCCCCCCCCCC\n
171171
// CCCC\n
172172
// end[0]: <CCC end[1] CCC>-------\n
173-
const builder = Changeset.builder(rep.lines.totalWidth());
173+
const builder = new Changeset.Builder(rep.lines.totalWidth());
174174
ChangesetUtils.buildKeepToStartOfRange(rep, builder, start);
175175
ChangesetUtils.buildRemoveRange(rep, builder, start, end);
176176
builder.insert(newText, [
@@ -1272,7 +1272,7 @@ function Ace2Inner(editorInfo, cssManagers) {
12721272
if (shouldIndent && /[[(:{]\s*$/.exec(prevLineText)) {
12731273
theIndent += THE_TAB;
12741274
}
1275-
const cs = Changeset.builder(rep.lines.totalWidth()).keep(
1275+
const cs = new Changeset.Builder(rep.lines.totalWidth()).keep(
12761276
rep.lines.offsetOfIndex(lineNum), lineNum).insert(
12771277
theIndent, [
12781278
['author', thisAuthor],
@@ -1746,7 +1746,7 @@ function Ace2Inner(editorInfo, cssManagers) {
17461746
const spliceStartLineStart = rep.lines.offsetOfIndex(spliceStartLine);
17471747

17481748
const startBuilder = () => {
1749-
const builder = Changeset.builder(oldLen);
1749+
const builder = new Changeset.Builder(oldLen);
17501750
builder.keep(spliceStartLineStart, spliceStartLine);
17511751
builder.keep(spliceStart - spliceStartLineStart);
17521752
return builder;
@@ -2297,7 +2297,7 @@ function Ace2Inner(editorInfo, cssManagers) {
22972297

22982298
// 3-renumber every list item of the same level from the beginning, level 1
22992299
// IMPORTANT: never skip a level because there imbrication may be arbitrary
2300-
const builder = Changeset.builder(rep.lines.totalWidth());
2300+
const builder = new Changeset.Builder(rep.lines.totalWidth());
23012301
let loc = [0, 0];
23022302
const applyNumberList = (line, level) => {
23032303
// init

0 commit comments

Comments
 (0)