Back to Payload

Converting Plaintext

docs/rich-text/converting-plaintext.mdx

3.84.11.8 KB
Original Source

Richtext to Plaintext

Here's how you can convert richtext data to plaintext using @payloadcms/richtext-lexical/plaintext.

ts
import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical'

import { convertLexicalToPlaintext } from '@payloadcms/richtext-lexical/plaintext'

// Your richtext data here
const data: SerializedEditorState = {}

const plaintext = convertLexicalToPlaintext({ data })

Custom Converters

The convertLexicalToPlaintext functions accepts a converters object that allows you to customize how specific nodes are converted to plaintext.

ts
import type {
  DefaultNodeTypes,
  SerializedBlockNode,
} from '@payloadcms/richtext-lexical'
import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical'
import type { MyTextBlock } from '@/payload-types'

import {
  convertLexicalToPlaintext,
  type PlaintextConverters,
} from '@payloadcms/richtext-lexical/plaintext'

// Your richtext data here
const data: SerializedEditorState = {}

const converters: PlaintextConverters<
  DefaultNodeTypes | SerializedBlockNode<MyTextBlock>
> = {
  blocks: {
    textBlock: ({ node }) => {
      return node.fields.text ?? ''
    },
  },
  link: ({ node }) => {
    return node.fields.url ?? ''
  },
}

const plaintext = convertLexicalToPlaintext({
  converters,
  data,
})

Unlike other converters, there are no default converters for plaintext.

If a node does not have a converter defined, the following heuristics are used to convert it to plaintext:

  • If the node has a text field, it will be used as the plaintext.
  • If the node has a children field, the children will be recursively converted to plaintext.
  • If the node has neither, it will be ignored.
  • Paragraph, text and tab nodes insert newline / tab characters.