Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .yarn/versions/c510e675.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
releases:
"@handlewithcare/prosemirror-suggest-changes": patch
57 changes: 57 additions & 0 deletions src/__tests__/commands.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,63 @@ describe("applyTrackedChanges", () => {
testBuilders.paragraph("first paragraph"),
);

assert(
eq(newState.doc, expected),
`Expected ${newState.doc} to match ${expected}`,
);
});
it("should removed doubles spaces around deletions", async () => {
const doc = testBuilders.doc(
testBuilders.paragraph(
"first ",
testBuilders.deletion({ id: "1" }, "second"),
" third",
),
);

const editorState = EditorState.create({
doc,
});

const newState = await new Promise<EditorState>((resolve) => {
applySuggestions(editorState, (tr) => {
resolve(editorState.apply(tr));
});
});

const expected = testBuilders.doc(testBuilders.paragraph("first third"));

assert(
eq(newState.doc, expected),
`Expected ${newState.doc} to match ${expected}`,
);
});
it("should removed doubles spaces around deletions accross boundaries", async () => {
const doc = testBuilders.doc(
testBuilders.paragraph(
"first ",
testBuilders.deletion({ id: "1" }, "paragraph"),
),
testBuilders.paragraph(
testBuilders.deletion({ id: "1" }, "second"),
" paragraph",
),
);

const editorState = EditorState.create({
doc,
});

const newState = await new Promise<EditorState>((resolve) => {
applySuggestions(editorState, (tr) => {
resolve(editorState.apply(tr));
});
});

const expected = testBuilders.doc(
testBuilders.paragraph("first paragraph"),
);

assert(
eq(newState.doc, expected),
`Expected ${newState.doc} to match ${expected}`,
Expand Down
19 changes: 18 additions & 1 deletion src/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,28 @@ function applySuggestionsToTransform(
if (isToRevert) {
const { pos: deletionFrom, deleted } = tr.mapping.mapResult(pos);
if (deleted) return false;

const deletionTo = findSuggestionMarkEnd(
tr.doc.resolve(deletionFrom + child.nodeSize),
markTypeToRevert,
);
tr.deleteRange(deletionFrom, deletionTo);
// check if the previous and the next text part is a space
// if so, we can delete the whole text part
const prevChar = tr.doc.textBetween(
deletionFrom - 1,
deletionFrom,
"x",
"x",
);
const nextChar =
// textBetween is fine with negative positions (??),
// but it errors if passed a position greater than the
// size of the doc
deletionTo <= tr.doc.content.size
? tr.doc.textBetween(deletionTo, deletionTo + 1, "x", "x")
: "";
const addedRange = prevChar === " " && nextChar === " " ? 1 : 0;
tr.deleteRange(deletionFrom, deletionTo + addedRange);
return false;
}

Expand Down