Skip to content

Commit

Permalink
feat: add Node linebreakReplacement support and enable on hardBreak…
Browse files Browse the repository at this point in the history
… nodes (#5821)

* Support the Node linebreakReplacement property

Support the [linebreakReplacement](https://prosemirror.net/docs/ref/#model.NodeSpec.linebreakReplacement) property on Nodes, allowing a node to be used wherever a newline character is, when converting between blocks that don't support the linebreak node, but have their whitespace set to "pre".

This is useful, for example, when converting between code blocks & normal paragraphs. Code blocks don't support the linebreak node, but do allow newline characters ('\n').
Marking the `hardBreak` node as the `linebreakReplacement` will mean the newline characters within codeBlock nodes will be converted to `hardBreak` nodes in the paragraph.

* Make hardBreak the default linebreakReplacement node

When converting between codeBlocks and normal paragraphs, the hardBreak node should be used in place of newline '\n' characters.
  • Loading branch information
glenn-allen authored Nov 11, 2024
1 parent 53673fb commit 2178118
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .changeset/shy-pigs-exercise.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@tiptap/core": patch
"@tiptap/extension-hard-break": patch
---

Add Node `linebreakReplacement` support and enable on hard-break nodes
19 changes: 19 additions & 0 deletions packages/core/src/Node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,25 @@ declare module '@tiptap/core' {
editor?: Editor
}) => NodeSpec['whitespace'])

/**
* Allows a **single** node to be set as linebreak equivalent (e.g. hardBreak).
* When converting between block types that have whitespace set to "pre"
* and don't support the linebreak node (e.g. codeBlock) and other block types
* that do support the linebreak node (e.g. paragraphs) - this node will be used
* as the linebreak instead of stripping the newline.
*
* See [linebreakReplacement](https://prosemirror.net/docs/ref/#model.NodeSpec.linebreakReplacement).
*/
linebreakReplacement?:
| NodeSpec['linebreakReplacement']
| ((this: {
name: string
options: Options
storage: Storage
parent: ParentConfig<NodeConfig<Options, Storage>>['linebreakReplacement']
editor?: Editor
}) => NodeSpec['linebreakReplacement'])

/**
* When enabled, enables both
* [`definingAsContext`](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext) and
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/helpers/getSchemaByResolvedExtensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ export function getSchemaByResolvedExtensions(extensions: Extensions, editor?: E
),
code: callOrReturn(getExtensionField<NodeConfig['code']>(extension, 'code', context)),
whitespace: callOrReturn(getExtensionField<NodeConfig['whitespace']>(extension, 'whitespace', context)),
linebreakReplacement: callOrReturn(getExtensionField<NodeConfig['linebreakReplacement']>(extension, 'linebreakReplacement', context)),
defining: callOrReturn(
getExtensionField<NodeConfig['defining']>(extension, 'defining', context),
),
Expand Down
2 changes: 2 additions & 0 deletions packages/extension-hard-break/src/hard-break.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ export const HardBreak = Node.create<HardBreakOptions>({

selectable: false,

linebreakReplacement: true,

parseHTML() {
return [
{ tag: 'br' },
Expand Down

0 comments on commit 2178118

Please sign in to comment.