Skip to content

Commit 26bf465

Browse files
committed
fix: removes duplicate blank lines in the end
1 parent 5cef092 commit 26bf465

5 files changed

Lines changed: 46 additions & 50 deletions

File tree

packages/pluggableWidgets/rich-text-web/src/components/CustomToolbars/useEmbedModal.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import Quill, { Range } from "quill";
2+
import { Delta } from "quill/core";
3+
import Emitter from "quill/core/emitter";
24
import { Dispatch, MutableRefObject, SetStateAction, useState } from "react";
5+
import { RichTextContainerProps } from "typings/RichTextProps";
6+
import { IMG_MIME_TYPES } from "./constants";
37
import {
48
imageConfigType,
59
type linkConfigType,
@@ -9,10 +13,6 @@ import {
913
} from "../../utils/formats";
1014
import { type ChildDialogProps } from "../ModalDialog/Dialog";
1115
import { type VideoFormType } from "../ModalDialog/VideoDialog";
12-
import { Delta } from "quill/core";
13-
import { IMG_MIME_TYPES } from "./constants";
14-
import Emitter from "quill/core/emitter";
15-
import { RichTextContainerProps } from "typings/RichTextProps";
1616

1717
type ModalReturnType = {
1818
showDialog: boolean;
@@ -48,8 +48,8 @@ export function useEmbedModal(
4848
const index = selection?.index ?? 0;
4949
const length = selection?.length ?? 0;
5050
const textToDisplay = value.text ?? value.href;
51-
const linkDelta = new Delta().retain(index).insert(textToDisplay).delete(length);
52-
ref.current?.updateContents(linkDelta);
51+
const linkDelta = new Delta().retain(index).delete(length).insert(textToDisplay);
52+
ref.current?.updateContents(linkDelta, Emitter.sources.SILENT);
5353
ref.current?.setSelection(index, textToDisplay.length);
5454
ref.current?.format("link", value);
5555
closeDialog();

packages/pluggableWidgets/rich-text-web/src/utils/MxQuill.ts

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3636
* this file overrides Quill instance.
3737
* allowing us to override certain function that is not easy to extend.
3838
*/
39-
import { type Blot, ParentBlot, ScrollBlot } from "parchment";
39+
import { type Blot, ParentBlot } from "parchment";
4040
import Quill, { EmitterSource, QuillOptions } from "quill";
4141
import TextBlot, { escapeText } from "quill/blots/text";
4242
import { Delta, Op } from "quill/core";
4343
import Editor from "quill/core/editor";
44-
import { CustomFontsType } from "../../typings/RichTextProps";
45-
import MxBlock from "./formats/block";
4644
import { STANDARD_LIST_TYPES } from "./formats/customList";
4745
import { FontStyleAttributor, formatCustomFonts } from "./formats/fonts";
4846
import CustomLink, { CustomLinkNoValidation } from "./formats/link";
47+
import { CustomFontsType } from "../../typings/RichTextProps";
4948

5049
interface ListItem {
5150
child: Blot;
@@ -65,9 +64,6 @@ class MxEditor extends Editor {
6564
* https://github.com/slab/quill/blob/main/packages/quill/src/core/editor.ts
6665
*/
6766
getHTML(index: number, length: number): string {
68-
if (this.isBlank()) {
69-
return "";
70-
}
7167
const [line, lineOffset] = this.scroll.line(index);
7268
if (line) {
7369
const lineLength = line.length();
@@ -154,28 +150,6 @@ function getExpectedType(type: string | undefined, indent: number): string {
154150
return expectedType === "ordered" ? "decimal" : expectedType === "bullet" ? "disc" : expectedType;
155151
}
156152

157-
// removes empty tail block that quill adds at the end of document
158-
// which causes extra newline when copying content with trailing newline
159-
function findEmptyTailBlock(blot: Blot): Blot | null {
160-
let skippedBlots = null;
161-
162-
if (blot instanceof ScrollBlot && blot.statics.blotName === "scroll" && !blot.parent) {
163-
if (MxBlock.IsMxBlock(blot.children.tail) && (blot.children.tail as MxBlock).isEmptyTailBlock()) {
164-
if (blot.children.tail.prev) {
165-
if (
166-
MxBlock.IsMxBlock(blot.children.tail.prev) &&
167-
(blot.children.tail.prev as MxBlock).isEmptyTailBlock()
168-
) {
169-
skippedBlots = blot.children.tail;
170-
}
171-
} else {
172-
skippedBlots = blot.children.tail;
173-
}
174-
}
175-
}
176-
return skippedBlots;
177-
}
178-
179153
/**
180154
* Copy with modification from https://github.com/slab/quill/blob/main/packages/quill/src/core/editor.ts
181155
*/
@@ -241,11 +215,7 @@ function convertHTML(blot: Blot, index: number, length: number, isRoot = false):
241215
return convertListHTML(items, -1, []);
242216
}
243217
const parts: string[] = [];
244-
const skippedBlots = findEmptyTailBlock(blot);
245218
blot.children.forEachAt(index, length, (child, offset, childLength) => {
246-
if (child === skippedBlots) {
247-
return;
248-
}
249219
parts.push(convertHTML(child, offset, childLength));
250220
});
251221
if (isRoot || blot.statics.blotName === "list") {

packages/pluggableWidgets/rich-text-web/src/utils/customPluginRegisters.ts

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1+
import { Attributor } from "parchment";
12
import Quill from "quill";
2-
import MendixTheme from "./themes/mxTheme";
3+
import QuillResize from "quill-resize-module";
4+
import MxBlock from "./formats/block";
5+
import Button from "./formats/button";
6+
import CustomListItem from "./formats/customList";
37
import "./formats/fonts";
48
import "./formats/fontsize";
5-
import CustomListItem from "./formats/customList";
6-
import CustomVideo from "./formats/video";
9+
import Formula from "./formats/formula";
710
import CustomImage from "./formats/image";
8-
import SoftBreak from "./formats/softBreak";
9-
import Button from "./formats/button";
10-
import { Attributor } from "parchment";
11-
const direction = Quill.import("attributors/style/direction") as Attributor;
12-
const alignment = Quill.import("attributors/style/align") as Attributor;
1311
import { IndentLeftStyle, IndentRightStyle } from "./formats/indent";
14-
import Formula from "./formats/formula";
15-
import QuillResize from "quill-resize-module";
1612
import QuillTableBetter from "./formats/quill-table-better/quill-table-better";
17-
import MxUploader from "./modules/uploader";
18-
import MxBlock from "./formats/block";
13+
import SoftBreak from "./formats/softBreak";
14+
import CustomVideo from "./formats/video";
1915
import { WhiteSpaceStyle } from "./formats/whiteSpace";
16+
import MxUploader from "./modules/uploader";
17+
import MendixTheme from "./themes/mxTheme";
18+
import MxScroll from "./modules/scroll";
19+
const direction = Quill.import("attributors/style/direction") as Attributor;
20+
const alignment = Quill.import("attributors/style/align") as Attributor;
2021

2122
class Empty {
2223
doSomething(): string {
@@ -41,6 +42,7 @@ Quill.register(Formula, true);
4142
Quill.register(Button, true);
4243
Quill.register(MxBlock, true);
4344
Quill.register({ "modules/uploader": MxUploader }, true);
45+
Quill.register({ "blots/scroll": MxScroll }, true);
4446
Quill.register("modules/resize", QuillResize, true);
4547
// add empty handler for view code, this format is handled by toolbar's custom config via ViewCodeDialog
4648
Quill.register({ "ui/view-code": Empty });

packages/pluggableWidgets/rich-text-web/src/utils/formats/block.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ class MxBlock extends Block {
2525
static IsMxBlock(blot: Blot | null): blot is MxBlock {
2626
return blot?.statics.blotName === "mx-block";
2727
}
28+
29+
static IsEmptyBlock(blot: Blot | null): boolean {
30+
return blot != null && MxBlock.IsMxBlock(blot) && blot.isEmptyTailBlock();
31+
}
2832
}
2933

3034
MxBlock.blotName = "mx-block";
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import Scroll from "quill/blots/scroll";
2+
import MxBlock from "../formats/block";
3+
4+
export default class MxScroll extends Scroll {
5+
optimize(context?: { [key: string]: any }): void;
6+
optimize(mutations?: MutationRecord[], context?: { [key: string]: any }): void;
7+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
8+
optimize(mutations = [], context = {}) {
9+
// remove multiple empty line placed in the end
10+
// this is usually occurs with multi level ListContainer
11+
if (
12+
this.children.tail &&
13+
MxBlock.IsEmptyBlock(this.children.tail) &&
14+
MxBlock.IsEmptyBlock(this.children.tail.prev)
15+
) {
16+
this.children.tail.parent.removeChild(this.children.tail);
17+
}
18+
super.optimize(mutations, context);
19+
}
20+
}

0 commit comments

Comments
 (0)