Skip to content

Commit 8253496

Browse files
authored
feat(Breaks): parse <br/> to preffered break (#147)
1 parent aadf65f commit 8253496

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

src/extensions/markdown/Breaks/BreaksSpecs/index.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type {ParseRule} from 'prosemirror-model';
12
import type {ExtensionAuto} from '../../../../core';
23
import {nodeTypeFactory} from '../../../../utils/schema';
34

@@ -9,15 +10,26 @@ export enum BreakNodeName {
910
export const hbType = nodeTypeFactory(BreakNodeName.HardBreak);
1011
export const sbType = nodeTypeFactory(BreakNodeName.SoftBreak);
1112

12-
export const BreaksSpecs: ExtensionAuto = (builder) => {
13+
export type BreaksSpecsOptions = {
14+
/**
15+
* @default 'hard'
16+
*/
17+
preferredBreak?: 'hard' | 'soft';
18+
};
19+
20+
export const BreaksSpecs: ExtensionAuto<BreaksSpecsOptions> = (builder, opts) => {
21+
const {preferredBreak = 'hard'} = opts;
22+
23+
const parseDOM: ParseRule[] = [{tag: 'br'}];
24+
1325
builder.addNode(BreakNodeName.HardBreak, () => ({
1426
spec: {
1527
inline: true,
1628
group: 'inline break',
1729
marks: '',
1830
isBreak: true,
1931
selectable: false,
20-
parseDOM: [{tag: 'br'}],
32+
parseDOM: preferredBreak === 'hard' ? parseDOM : undefined,
2133
toDOM() {
2234
return ['br'];
2335
},
@@ -44,6 +56,7 @@ export const BreaksSpecs: ExtensionAuto = (builder) => {
4456
marks: '',
4557
isBreak: true,
4658
selectable: false,
59+
parseDOM: preferredBreak === 'soft' ? parseDOM : undefined,
4760
toDOM() {
4861
return ['br'];
4962
},

src/extensions/markdown/Breaks/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {chainCommands, exitCode} from 'prosemirror-commands';
33
import {logger} from '../../../logger';
44
import type {ExtensionAuto, Keymap} from '../../../core';
55
import {isMac} from '../../../utils/platform';
6-
import {BreaksSpecs, hbType, sbType} from './BreaksSpecs';
6+
import {BreaksSpecs, BreaksSpecsOptions, hbType, sbType} from './BreaksSpecs';
77

88
export {BreaksSpecs, BreakNodeName, hbType, sbType} from './BreaksSpecs';
99

@@ -17,8 +17,6 @@ export type BreaksOptions = {
1717
};
1818

1919
export const Breaks: ExtensionAuto<BreaksOptions> = (builder, opts) => {
20-
builder.use(BreaksSpecs);
21-
2220
let preferredBreak: 'hard' | 'soft';
2321
if (builder.context.has('breaks')) {
2422
preferredBreak = builder.context.get('breaks') ? 'soft' : 'hard';
@@ -29,6 +27,8 @@ export const Breaks: ExtensionAuto<BreaksOptions> = (builder, opts) => {
2927
);
3028
}
3129

30+
builder.use<BreaksSpecsOptions>(BreaksSpecs, {preferredBreak});
31+
3232
builder.addKeymap(({schema}) => {
3333
const cmd = addBr((preferredBreak === 'soft' ? sbType : hbType)(schema));
3434
const keys: Keymap = {

src/extensions/markdown/specs.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {Html} from './Html';
1515
import {TableSpecs} from './Table/TableSpecs';
1616
import {ImageSpecs} from './Image/ImageSpecs';
1717
import {ListsSpecs} from './Lists/ListsSpecs';
18-
import {BreaksSpecs} from './Breaks/BreaksSpecs';
18+
import {BreaksSpecs, BreaksSpecsOptions} from './Breaks/BreaksSpecs';
1919
import {BlockquoteSpecs} from './Blockquote/BlockquoteSpecs';
2020
import {DeflistSpecs, DeflistSpecsOptions} from './Deflist/DeflistSpecs';
2121
import {HeadingSpecs, HeadingSpecsOptions} from './Heading/HeadingSpecs';
@@ -63,6 +63,7 @@ export const MarkdownMarksSpecsPreset: ExtensionAuto<MarkdownMarksSpecsPresetOpt
6363

6464
export type MarkdownBlocksSpecsPresetOptions = {
6565
image?: false | Extension;
66+
breaks?: BreaksSpecsOptions;
6667
codeBlock?: CodeBlockSpecsOptions;
6768
deflist?: DeflistSpecsOptions;
6869
heading?: false | Extension | HeadingSpecsOptions;
@@ -76,7 +77,7 @@ export const MarkdownBlocksSpecsPreset: ExtensionAuto<MarkdownBlocksSpecsPresetO
7677
.use(Html)
7778
.use(ListsSpecs)
7879
.use(TableSpecs)
79-
.use(BreaksSpecs)
80+
.use(BreaksSpecs, opts.breaks ?? {})
8081
.use(BlockquoteSpecs)
8182
.use(HorizontalRuleSpecs)
8283
.use(DeflistSpecs, opts.deflist ?? {})

0 commit comments

Comments
 (0)