Skip to content

Commit

Permalink
fix(ui-markdown-editor): linebreak - accordproject#263, accordproject…
Browse files Browse the repository at this point in the history
…#267

Signed-off-by: d-e-v-esh <[email protected]>
  • Loading branch information
d-e-v-esh committed Apr 2, 2021
1 parent b80d7b8 commit eae39f6
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 26 deletions.
5 changes: 2 additions & 3 deletions packages/ui-markdown-editor/src/components/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { HorizontalRule } from './Span';
import {
PARAGRAPH, LINK, IMAGE, H1, H2, H3, H4, H5, H6, HR,
CODE_BLOCK, HTML_BLOCK, BLOCK_QUOTE, UL_LIST, OL_LIST, LIST_ITEM,
HTML_INLINE, SOFTBREAK, LINEBREAK, HEADINGS
HTML_INLINE, SOFTBREAK, HEADINGS
} from '../utilities/schema';
import {
DROPDOWN_STYLE_H1,
Expand All @@ -33,8 +33,7 @@ const Element = (props) => {
[H4]: () => (<Heading id={headingId} as="h4" style={DROPDOWN_STYLE_H4} {...attributes}>{children}</Heading>),
[H5]: () => (<Heading id={headingId} as="h5" style={DROPDOWN_STYLE_H5} {...attributes}>{children}</Heading>),
[H6]: () => (<Heading id={headingId} as="h6" style={DROPDOWN_STYLE_H6} {...attributes}>{children}</Heading>),
[SOFTBREAK]: () => (<span className={SOFTBREAK} {...attributes}> {children}</span>),
[LINEBREAK]: () => (<span {...attributes}>
[SOFTBREAK]: () => (<span {...attributes}>
<span contentEditable={false} style={{ userSelect: 'none' }}>
<br />
</span>
Expand Down
23 changes: 12 additions & 11 deletions packages/ui-markdown-editor/src/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import React, {
useCallback, useMemo, useState
} from 'react';
import React, { useCallback, useMemo, useState } from 'react';
import { CiceroMarkTransformer } from '@accordproject/markdown-cicero';
import { HtmlTransformer } from '@accordproject/markdown-html';
import { SlateTransformer } from '@accordproject/markdown-slate';
Expand All @@ -15,13 +13,14 @@ import withSchema from './utilities/schema';
import Element from './components';
import Leaf from './components/Leaf';
import { toggleMark, toggleBlock, insertThematicBreak,
insertLinebreak, insertHeadingbreak, isBlockHeading
insertSoftBreak, insertLineBreak, isBlockHeading, insertHeadingBreak
} from './utilities/toolbarHelpers';
import { withImages, insertImage } from './plugins/withImages';
import { withLinks, isSelectionLinkBody } from './plugins/withLinks';
import { withHtml } from './plugins/withHtml';
import { withLists } from './plugins/withLists';
import FormatBar from './FormattingToolbar';
import { HEADINGBREAK } from './utilities/schema';

export const markdownToSlate = (markdown) => {
const slateTransformer = new SlateTransformer();
Expand Down Expand Up @@ -74,10 +73,10 @@ export const MarkdownEditor = (props) => {
setShowLinkModal(true);
},
horizontal_rule: (code) => insertThematicBreak(editor, code),
linebreak: (code) => insertLinebreak(editor, code),
headingbreak: () => insertHeadingbreak(editor)
softbreak: (code) => insertSoftBreak(editor, code),
linebreak: () => insertLineBreak(editor),
headingbreak: () => insertHeadingBreak(editor)
};

const onKeyDown = useCallback((event) => {
if (!canKeyDown(editor, event)) {
event.preventDefault();
Expand All @@ -90,15 +89,17 @@ export const MarkdownEditor = (props) => {
return;
}

if (event.key === "Enter" && !isBlockHeading(editor)) {
return;
}

const hotkeys = Object.keys(HOTKEYS);
hotkeys.forEach((hotkey) => {
if (isHotkey(hotkey, event)) {
event.preventDefault();
const { code, type } = HOTKEYS[hotkey];
// if linebreak happens form a heading block then we run the insertHeadingBreak function
// other it is a linebreak every time
if(type === 'linebreak' && isBlockHeading(editor)){
hotkeyActions[HEADINGBREAK]()
return;
}
hotkeyActions[type](code);
}
});
Expand Down
10 changes: 5 additions & 5 deletions packages/ui-markdown-editor/src/utilities/hotkeys.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {
LINK, IMAGE, BLOCK_QUOTE, UL_LIST, OL_LIST,
MARK_BOLD, MARK_ITALIC, MARK_CODE, HR, LINEBREAK,
HEADINGBREAK
SOFTBREAK
} from './schema';

const HOTKEYS = {
Expand Down Expand Up @@ -50,12 +50,12 @@ const HOTKEYS = {
code: HR,
},
'shift+enter': {
type: 'linebreak',
code: LINEBREAK,
type: 'softbreak',
code: SOFTBREAK,
},
'enter': {
type: 'headingbreak',
code: HEADINGBREAK
type: 'linebreak',
code: LINEBREAK
}
};

Expand Down
19 changes: 12 additions & 7 deletions packages/ui-markdown-editor/src/utilities/toolbarHelpers.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { Node, Editor, Transforms } from 'slate';
import {
LIST_ITEM, BLOCK_QUOTE, LIST_TYPES, PARAGRAPH
} from './schema';
import { LIST_ITEM, BLOCK_QUOTE, LIST_TYPES, PARAGRAPH, LINEBREAK } from './schema';

export const isBlockActive = (editor, format) => {
const [match] = Editor.nodes(editor, {
Expand Down Expand Up @@ -91,18 +89,25 @@ export const insertThematicBreak = (editor, type) => {
Transforms.insertNodes(editor, tBreakNode);
};

export const insertLinebreak = (editor, type) => {
export const insertSoftBreak = (editor, type) => {
const text = { object: 'text', text: '' };
const br = { type, children: [text], data: {} };
Transforms.insertNodes(editor, br);
Transforms.move(editor, { distance: 1, unit: 'character' });
};

export const insertHeadingbreak = (editor) => {
export const insertLineBreak = (editor) => {
const text = { object: 'text', text: '' };
const lineBreakNode = { type: LINEBREAK, children: [text] };
Transforms.insertNodes(editor, lineBreakNode);
Transforms.move(editor, { distance: 1, unit: 'character' })
return;
}

export const insertHeadingBreak = (editor) => {
const text = { object: 'text', text: '' };
const n = { object: "block", type: 'paragraph', children: [text] };
Transforms.insertNodes(editor, n);
Transforms.move(editor, { distance: 1, unit: 'character' })
return;
}

Expand All @@ -115,4 +120,4 @@ export const isBlockHeading = (editor) => {
},
});
return !!match;
};
};

0 comments on commit eae39f6

Please sign in to comment.