Skip to content

Commit

Permalink
[WEB-372] fix: horizontal rule extension now always divider adds belo…
Browse files Browse the repository at this point in the history
…w nodes (#3890)

* fix: horizontal rule extension now always divider adds below nodes

* chore: removing duplicate horizontal rule extension
  • Loading branch information
Palanikannan1437 authored Mar 6, 2024
1 parent 3d09a69 commit cace132
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import { isNodeSelection, mergeAttributes, Node, nodeInputRule } from "@tiptap/core";
import { NodeSelection, TextSelection } from "@tiptap/pm/state";

export interface HorizontalRuleOptions {
HTMLAttributes: Record<string, any>;
}

declare module "@tiptap/core" {
interface Commands<ReturnType> {
horizontalRule: {
/**
* Add a horizontal rule
*/
setHorizontalRule: () => ReturnType;
};
}
}

export const CustomHorizontalRule = Node.create<HorizontalRuleOptions>({
name: "horizontalRule",

addOptions() {
return {
HTMLAttributes: {},
};
},

group: "block",

parseHTML() {
return [{ tag: "hr" }];
},

renderHTML({ HTMLAttributes }) {
return ["hr", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];
},

addCommands() {
return {
setHorizontalRule:
() =>
({ chain, state }) => {
const { selection } = state;
const { $from: $originFrom, $to: $originTo } = selection;

const currentChain = chain();

if ($originFrom.parentOffset === 0) {
currentChain.insertContentAt(
{
from: Math.max($originFrom.pos - 1, 0),
to: $originTo.pos,
},
{
type: this.name,
}
);
} else if (isNodeSelection(selection)) {
currentChain.insertContentAt($originTo.pos, {
type: this.name,
});
} else {
currentChain.insertContent({ type: this.name });
}

return (
currentChain
// set cursor after horizontal rule
.command(({ tr, dispatch }) => {
if (dispatch) {
const { $to } = tr.selection;
const posAfter = $to.end();

if ($to.nodeAfter) {
if ($to.nodeAfter.isTextblock) {
tr.setSelection(TextSelection.create(tr.doc, $to.pos + 1));
} else if ($to.nodeAfter.isBlock) {
tr.setSelection(NodeSelection.create(tr.doc, $to.pos));
} else {
tr.setSelection(TextSelection.create(tr.doc, $to.pos));
}
} else {
// add node after horizontal rule if it’s the end of the document
const node = $to.parent.type.contentMatch.defaultType?.create();

if (node) {
tr.insert(posAfter, node);
tr.setSelection(TextSelection.create(tr.doc, posAfter + 1));
}
}

tr.scrollIntoView();
}

return true;
})
.run()
);
},
};
},

addInputRules() {
return [
nodeInputRule({
find: /^(?:---|—-|___\s|\*\*\*\s)$/,
type: this.type,
}),
];
},
});
9 changes: 6 additions & 3 deletions packages/editor/core/src/ui/extensions/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import { RestoreImage } from "src/types/restore-image";
import { CustomLinkExtension } from "src/ui/extensions/custom-link";
import { CustomCodeInlineExtension } from "src/ui/extensions/code-inline";
import { CustomTypographyExtension } from "src/ui/extensions/typography";
import { CustomHorizontalRule } from "./horizontal-rule/horizontal-rule";

export const CoreEditorExtensions = (
mentionConfig: {
Expand Down Expand Up @@ -55,9 +56,7 @@ export const CoreEditorExtensions = (
},
code: false,
codeBlock: false,
horizontalRule: {
HTMLAttributes: { class: "mt-4 mb-4" },
},
horizontalRule: false,
blockquote: false,
dropcursor: {
color: "rgba(var(--color-text-100))",
Expand All @@ -67,6 +66,10 @@ export const CoreEditorExtensions = (
CustomQuoteExtension.configure({
HTMLAttributes: { className: "border-l-4 border-custom-border-300" },
}),

CustomHorizontalRule.configure({
HTMLAttributes: { class: "mt-4 mb-4" },
}),
CustomKeymap,
ListKeymap,
CustomLinkExtension.configure({
Expand Down

0 comments on commit cace132

Please sign in to comment.