@tiptap/static-renderer 3.0.0-beta.10 → 3.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -35,6 +35,7 @@ __export(index_exports, {
35
35
  domOutputSpecToReactElement: () => domOutputSpecToReactElement,
36
36
  getAttributes: () => getAttributes,
37
37
  getHTMLAttributes: () => getHTMLAttributes,
38
+ mapAttrsToHTMLAttributes: () => mapAttrsToHTMLAttributes,
38
39
  mapMarkExtensionToReactNode: () => mapMarkExtensionToReactNode,
39
40
  mapNodeExtensionToReactNode: () => mapNodeExtensionToReactNode,
40
41
  renderJSONContentToReactElement: () => renderJSONContentToReactElement,
@@ -508,6 +509,17 @@ function mapAttrsToHTMLAttributes(attrs, key) {
508
509
  if (name === "class") {
509
510
  return Object.assign(acc, { className: value });
510
511
  }
512
+ if (name === "style" && typeof value === "string") {
513
+ const styleObject = {};
514
+ value.split(";").forEach((style) => {
515
+ const [styleKey, val] = style.split(":");
516
+ if (styleKey && val) {
517
+ const camelCaseKey = styleKey.trim().replace(/-([a-z])/g, (g) => g[1].toUpperCase());
518
+ styleObject[camelCaseKey] = val.trim();
519
+ }
520
+ });
521
+ return Object.assign(acc, { style: styleObject });
522
+ }
511
523
  return Object.assign(acc, { [name]: value });
512
524
  },
513
525
  { key }
@@ -615,6 +627,7 @@ function renderToReactElement({
615
627
  domOutputSpecToReactElement,
616
628
  getAttributes,
617
629
  getHTMLAttributes,
630
+ mapAttrsToHTMLAttributes,
618
631
  mapMarkExtensionToReactNode,
619
632
  mapNodeExtensionToReactNode,
620
633
  renderJSONContentToReactElement,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/helpers.ts","../src/json/renderer.ts","../src/json/html-string/string.ts","../src/json/react/react.ts","../src/pm/extensionRenderer.ts","../src/pm/html-string/html-string.ts","../src/pm/markdown/markdown.ts","../src/pm/react/react.ts"],"sourcesContent":["export * from './helpers.js'\nexport * from './json/html-string/index.js'\nexport * from './json/react/index.js'\nexport * from './pm/html-string/index.js'\nexport * from './pm/markdown/index.js'\nexport * from './pm/react/index.js'\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ExtensionAttribute, type MarkType, type NodeType, mergeAttributes } from '@tiptap/core'\n\n/**\n * This function returns the attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n * @param onlyRenderedAttributes If true, only attributes that are rendered in the HTML are returned\n */\nexport function getAttributes(\n nodeOrMark: NodeType | MarkType,\n extensionAttributes: ExtensionAttribute[],\n onlyRenderedAttributes?: boolean,\n): Record<string, any> {\n const nodeOrMarkAttributes = nodeOrMark.attrs\n\n if (!nodeOrMarkAttributes) {\n return {}\n }\n\n return extensionAttributes\n .filter(item => {\n if (item.type !== (typeof nodeOrMark.type === 'string' ? nodeOrMark.type : nodeOrMark.type.name)) {\n return false\n }\n if (onlyRenderedAttributes) {\n return item.attribute.rendered\n }\n return true\n })\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n }\n\n return (\n item.attribute.renderHTML(nodeOrMarkAttributes) || {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n )\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n\n/**\n * This function returns the HTML attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n */\nexport function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAttributes: ExtensionAttribute[]) {\n return getAttributes(nodeOrMark, extensionAttributes, true)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\n/**\n * Props for a node renderer\n */\nexport type NodeProps<TNodeType = any, TChildren = any> = {\n /**\n * The current node to render\n */\n node: TNodeType\n /**\n * Unless the node is the root node, this will always be defined\n */\n parent?: TNodeType\n /**\n * The children of the current node\n */\n children?: TChildren\n /**\n * Render a child element\n */\n renderElement: (props: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }) => TChildren\n}\n\n/**\n * Props for a mark renderer\n */\nexport type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {\n /**\n * The current mark to render\n */\n mark: TMarkType\n /**\n * The children of the current mark\n */\n children?: TChildren\n /**\n * The node the current mark is applied to\n */\n node: TNodeType\n /**\n * The node the current mark is applied to\n */\n parent?: TNodeType\n}\n\nexport type TiptapStaticRendererOptions<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n> = {\n /**\n * Mapping of node types to react components\n */\n nodeMapping: Record<string, NoInfer<TNodeRender>>\n /**\n * Mapping of mark types to react components\n */\n markMapping: Record<string, NoInfer<TMarkRender>>\n /**\n * Component to render if a node type is not handled\n */\n unhandledNode?: NoInfer<TNodeRender>\n /**\n * Component to render if a mark type is not handled\n */\n unhandledMark?: NoInfer<TMarkRender>\n}\n\n/**\n * Tiptap Static Renderer\n * ----------------------\n *\n * This function is a basis to allow for different renderers to be created.\n * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.\n *\n * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document\n * and renders it using a mapping of node types to React components or even to a string.\n * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.\n */\nexport function TiptapStaticRenderer<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: string | { name: string } } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n>(\n /**\n * The function that actually renders the component\n */\n renderComponent: (\n ctx:\n | {\n component: TNodeRender\n props: NodeProps<TNodeType, TReturnType | TReturnType[]>\n }\n | {\n component: TMarkRender\n props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>\n },\n ) => TReturnType,\n {\n nodeMapping,\n markMapping,\n unhandledNode,\n unhandledMark,\n }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>,\n) {\n /**\n * Render Tiptap JSON and all its children using the provided node and mark mappings.\n */\n return function renderContent({\n content,\n parent,\n }: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }): TReturnType {\n const nodeType = typeof content.type === 'string' ? content.type : content.type.name\n const NodeHandler = nodeMapping[nodeType] ?? unhandledNode\n\n if (!NodeHandler) {\n throw new Error(`missing handler for node type ${nodeType}`)\n }\n\n const nodeContent = renderComponent({\n component: NodeHandler,\n props: {\n node: content,\n parent,\n renderElement: renderContent,\n // Lazily compute the children to avoid unnecessary recursion\n get children() {\n // recursively render child content nodes\n const children: TReturnType[] = []\n\n if (content.content) {\n content.content.forEach(child => {\n children.push(\n renderContent({\n content: child,\n parent: content,\n }),\n )\n })\n }\n\n return children\n },\n },\n })\n\n // apply marks to the content\n const markedContent = content.marks\n ? content.marks.reduce((acc, mark) => {\n const markType = typeof mark.type === 'string' ? mark.type : mark.type.name\n const MarkHandler = markMapping[markType] ?? unhandledMark\n\n if (!MarkHandler) {\n throw new Error(`missing handler for mark type ${markType}`)\n }\n\n return renderComponent({\n component: MarkHandler,\n props: {\n mark,\n parent,\n node: content,\n children: acc,\n },\n })\n }, nodeContent)\n : nodeContent\n\n return markedContent\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToString<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<string, TMarkType, TNodeType>) {\n return TiptapStaticRenderer(ctx => {\n return ctx.component(ctx.props as any)\n }, options)\n}\n\n/**\n * Serialize the attributes of a node or mark to a string\n * @param attrs The attributes to serialize\n * @returns The serialized attributes as a string\n */\nexport function serializeAttrsToHTMLString(attrs: Record<string, any> | undefined | null): string {\n const output = Object.entries(attrs || {})\n .map(([key, value]) => `${key.split(' ').at(-1)}=${JSON.stringify(value)}`)\n .join(' ')\n\n return output ? ` ${output}` : ''\n}\n\n/**\n * Serialize the children of a node or mark to a string\n * @param children The children to serialize\n * @returns The serialized children as a string\n */\nexport function serializeChildrenToHTMLString(children?: string | string[]): string {\n return ([] as string[])\n .concat(children || '')\n .filter(Boolean)\n .join('')\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { MarkType, NodeType } from '@tiptap/core'\nimport React from 'react'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToReactElement<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<React.ReactNode, TMarkType, TNodeType>) {\n let key = 0\n\n return TiptapStaticRenderer<React.ReactNode, TMarkType, TNodeType>(({ component, props: { children, ...props } }) => {\n return React.createElement(\n component as React.FC<typeof props>,\n // eslint-disable-next-line no-plusplus\n Object.assign(props, { key: key++ }),\n ([] as React.ReactNode[]).concat(children),\n )\n }, options)\n}\n","/* eslint-disable no-plusplus */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ExtensionAttribute,\n Extensions,\n JSONContent,\n Mark as MarkExtension,\n MarkConfig,\n Node as NodeExtension,\n NodeConfig,\n} from '@tiptap/core'\nimport {\n getAttributesFromExtensions,\n getExtensionField,\n getSchemaByResolvedExtensions,\n resolveExtensions,\n splitExtensions,\n} from '@tiptap/core'\nimport type { DOMOutputSpec, Mark } from '@tiptap/pm/model'\nimport { Node } from '@tiptap/pm/model'\n\nimport { getHTMLAttributes } from '../helpers.js'\nimport type { MarkProps, NodeProps, TiptapStaticRendererOptions } from '../json/renderer.js'\n\nexport type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T\n\n/**\n * This takes a NodeExtension and maps it to a React component\n * @param extension The node extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapNodeExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: NodeExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledNode'>>,\n): [string, (props: NodeProps<Node, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<NodeConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledNode) {\n return [extension.name, options.unhandledNode]\n }\n return [\n extension.name,\n () => {\n throw new Error(\n `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method, please implement it or override the corresponding \"nodeMapping\" method to have a custom rendering`,\n )\n },\n ]\n }\n\n return [\n extension.name,\n ({ node, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n node,\n HTMLAttributes: getHTMLAttributes(node, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Node ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This takes a MarkExtension and maps it to a React component\n * @param extension The mark extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapMarkExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: MarkExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledMark'>>,\n): [string, (props: MarkProps<Mark, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<MarkConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledMark) {\n return [extension.name, options.unhandledMark]\n }\n return [\n extension.name,\n () => {\n throw new Error(`Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method`)\n },\n ]\n }\n\n return [\n extension.name,\n ({ mark, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n mark,\n HTMLAttributes: getHTMLAttributes(mark, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Mark ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This function will statically render a Prosemirror Node to a target element type using the given extensions\n * @param renderer The renderer to use to render the Prosemirror Node to the target element type\n * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type\n * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type\n * @param content The Prosemirror Node to render\n * @param extensions The extensions to use to render the Prosemirror Node\n * @param options Additional options to pass to the renderer that can override the default behavior\n * @returns The rendered target element type\n */\nexport function renderToElement<T>({\n renderer,\n domOutputSpecToElement,\n mapDefinedTypes,\n content,\n extensions,\n options,\n}: {\n renderer: (options: TiptapStaticRendererOptions<T, Mark, Node>) => (ctx: { content: Node }) => T\n domOutputSpecToElement: DomOutputSpecToElement<T>\n mapDefinedTypes: {\n doc: (props: NodeProps<Node, T | T[]>) => T\n text: (props: NodeProps<Node, T | T[]>) => T\n }\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<T, Mark, Node>>\n}): T {\n // get all extensions in order & split them into nodes and marks\n extensions = resolveExtensions(extensions)\n const extensionAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n\n if (!(content instanceof Node)) {\n content = Node.fromJSON(getSchemaByResolvedExtensions(extensions), content)\n }\n\n return renderer({\n ...options,\n nodeMapping: {\n ...Object.fromEntries(\n nodeExtensions\n .filter(e => {\n if (e.name in mapDefinedTypes) {\n // These are predefined types that we don't need to map\n return false\n }\n // No need to generate mappings for nodes that are already mapped\n if (options?.nodeMapping) {\n return !(e.name in options.nodeMapping)\n }\n return true\n })\n .map(nodeExtension =>\n mapNodeExtensionToReactNode<T>(domOutputSpecToElement, nodeExtension, extensionAttributes, options),\n ),\n ),\n ...mapDefinedTypes,\n ...options?.nodeMapping,\n },\n markMapping: {\n ...Object.fromEntries(\n markExtensions\n .filter(e => {\n // No need to generate mappings for marks that are already mapped\n if (options?.markMapping) {\n return !(e.name in options.markMapping)\n }\n return true\n })\n .map(mark => mapMarkExtensionToReactNode<T>(domOutputSpecToElement, mark, extensionAttributes, options)),\n ),\n ...options?.markMapping,\n },\n })({ content })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\n\nimport {\n renderJSONContentToString,\n serializeAttrsToHTMLString,\n serializeChildrenToHTMLString,\n} from '../../json/html-string/string.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\nexport { serializeAttrsToHTMLString, serializeChildrenToHTMLString } from '../../json/html-string/string.js'\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a string\n * @param content The DOMOutputSpec to convert to a string\n * @returns A function that can render the DOMOutputSpec to a string\n */\nexport function domOutputSpecToHTMLString(content: DOMOutputSpec): (children?: string | string[]) => string {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n const [_tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n let tag = _tag\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = `${parts[1]} xmlns=\"${parts[0]}\"`\n }\n\n if (attrs === undefined) {\n return () => `<${tag}/>`\n }\n if (attrs === 0) {\n return child => `<${tag}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n if (children === 0) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n return child =>\n `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))}</${tag}>`\n }\n if (children === undefined) {\n return () => `<${tag}${serializeAttrsToHTMLString(attrs)}/>`\n }\n if (children === 0) {\n return child => `<${tag}${serializeAttrsToHTMLString(attrs)}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n\n return child =>\n `<${tag}${serializeAttrsToHTMLString(attrs)}>${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))\n .join('')}</${tag}>`\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to HTML using the provided extensions and options\n * @param content The content to render to HTML\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The rendered HTML string\n */\nexport function renderToHTMLString({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<string, Mark, Node>>\n}): string {\n return renderToElement<string>({\n renderer: renderJSONContentToString,\n domOutputSpecToElement: domOutputSpecToHTMLString,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => serializeChildrenToHTMLString(children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n","import type { Extensions, JSONContent } from '@tiptap/core'\nimport type { Mark, Node } from '@tiptap/pm/model'\n\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToHTMLString, serializeChildrenToHTMLString } from '../html-string/html-string.js'\n\n/**\n * This code is just to show the flexibility of this renderer. We can potentially render content to any format we want.\n * This is a simple example of how we can render content to markdown. This is not a full implementation of a markdown renderer.\n */\nexport function renderToMarkdown({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<string, Mark, Node>>\n}) {\n return renderToHTMLString({\n content,\n extensions,\n options: {\n nodeMapping: {\n bulletList({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}`\n },\n orderedList({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}`\n },\n listItem({ node, children, parent }) {\n if (parent?.type.name === 'bulletList') {\n return `- ${serializeChildrenToHTMLString(children).trim()}\\n`\n }\n if (parent?.type.name === 'orderedList') {\n let number = parent.attrs.start || 1\n\n parent.forEach((parentChild, _offset, index) => {\n if (node === parentChild) {\n number = index + 1\n }\n })\n\n return `${number}. ${serializeChildrenToHTMLString(children).trim()}\\n`\n }\n\n return serializeChildrenToHTMLString(children)\n },\n paragraph({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}\\n`\n },\n heading({ node, children }) {\n const level = node.attrs.level as number\n\n return `${new Array(level).fill('#').join('')} ${children}\\n`\n },\n codeBlock({ node, children }) {\n return `\\n\\`\\`\\`${node.attrs.language}\\n${serializeChildrenToHTMLString(children)}\\n\\`\\`\\`\\n`\n },\n blockquote({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)\n .trim()\n .split('\\n')\n .map(a => `> ${a}`)\n .join('\\n')}`\n },\n image({ node }) {\n return `![${node.attrs.alt}](${node.attrs.src})`\n },\n hardBreak() {\n return '\\n'\n },\n horizontalRule() {\n return '\\n---\\n'\n },\n table({ children, node }) {\n if (!Array.isArray(children)) {\n return `\\n${serializeChildrenToHTMLString(children)}\\n`\n }\n\n return `\\n${serializeChildrenToHTMLString(children[0])}| ${new Array(node.childCount - 2).fill('---').join(' | ')} |\\n${serializeChildrenToHTMLString(children.slice(1))}\\n`\n },\n tableRow({ children }) {\n if (Array.isArray(children)) {\n return `| ${children.join(' | ')} |\\n`\n }\n return `${serializeChildrenToHTMLString(children)}\\n`\n },\n tableHeader({ children }) {\n return serializeChildrenToHTMLString(children).trim()\n },\n tableCell({ children }) {\n return serializeChildrenToHTMLString(children).trim()\n },\n ...options?.nodeMapping,\n },\n markMapping: {\n bold({ children }) {\n return `**${serializeChildrenToHTMLString(children)}**`\n },\n italic({ children, node }) {\n let isBoldToo = false\n\n // Check if the node being wrapped also has a bold mark, if so, we need to use the bold markdown syntax\n if (node?.marks.some(m => m.type.name === 'bold')) {\n isBoldToo = true\n }\n\n if (isBoldToo) {\n // If the content is bold, just wrap the bold content in italic markdown syntax with another set of asterisks\n return `*${serializeChildrenToHTMLString(children)}*`\n }\n\n return `_${serializeChildrenToHTMLString(children)}_`\n },\n code({ children }) {\n return `\\`${serializeChildrenToHTMLString(children)}\\``\n },\n strike({ children }) {\n return `~~${serializeChildrenToHTMLString(children)}~~`\n },\n underline({ children }) {\n return `<u>${serializeChildrenToHTMLString(children)}</u>`\n },\n subscript({ children }) {\n return `<sub>${serializeChildrenToHTMLString(children)}</sub>`\n },\n superscript({ children }) {\n return `<sup>${serializeChildrenToHTMLString(children)}</sup>`\n },\n link({ node, children }) {\n return `[${serializeChildrenToHTMLString(children)}](${node.attrs.href})`\n },\n highlight({ children }) {\n return `==${serializeChildrenToHTMLString(children)}==`\n },\n ...options?.markMapping,\n },\n ...options,\n },\n })\n}\n","/* eslint-disable no-plusplus, @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\nimport React from 'react'\n\nimport { renderJSONContentToReactElement } from '../../json/react/react.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\n/**\n * This function maps the attributes of a node or mark to HTML attributes\n * @param attrs The attributes to map\n * @param key The key to use for the React element\n * @returns The mapped HTML attributes as an object\n */\nfunction mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {\n if (!attrs) {\n return { key }\n }\n return Object.entries(attrs).reduce(\n (acc, [name, value]) => {\n if (name === 'class') {\n return Object.assign(acc, { className: value })\n }\n return Object.assign(acc, { [name]: value })\n },\n { key },\n )\n}\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a React element\n * @param content The DOMOutputSpec to convert to a React element\n * @returns A function that can render the DOMOutputSpec to a React element\n */\nexport function domOutputSpecToReactElement(\n content: DOMOutputSpec,\n key = 0,\n): (children?: React.ReactNode) => React.ReactNode {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n // eslint-disable-next-line prefer-const\n let [tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = parts[1]\n if (attrs === undefined) {\n attrs = {\n xmlns: parts[0],\n }\n }\n if (attrs === 0) {\n attrs = {\n xmlns: parts[0],\n }\n children = 0\n }\n if (typeof attrs === 'object') {\n attrs = Object.assign(attrs, { xmlns: parts[0] })\n }\n }\n\n if (attrs === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()))\n }\n if (attrs === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()), child)\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n if (children === 0) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray)(child),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n if (children === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()))\n }\n if (children === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()), child)\n }\n\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(attrs, key.toString()),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to a React component using the given extensions\n * @param content The content to render to a React component\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The React element that represents the rendered content\n */\nexport function renderToReactElement({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node>>\n}): React.ReactNode {\n return renderToElement<React.ReactNode>({\n renderer: renderJSONContentToReactElement,\n domOutputSpecToElement: domOutputSpecToReactElement,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => React.createElement(React.Fragment, {}, children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n"],"mappings":"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","names":["_a","React","import_core","import_react","React"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/helpers.ts","../src/json/renderer.ts","../src/json/html-string/string.ts","../src/json/react/react.ts","../src/pm/extensionRenderer.ts","../src/pm/html-string/html-string.ts","../src/pm/markdown/markdown.ts","../src/pm/react/react.ts"],"sourcesContent":["export * from './helpers.js'\nexport * from './json/html-string/index.js'\nexport * from './json/react/index.js'\nexport * from './pm/html-string/index.js'\nexport * from './pm/markdown/index.js'\nexport * from './pm/react/index.js'\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ExtensionAttribute, type MarkType, type NodeType, mergeAttributes } from '@tiptap/core'\n\n/**\n * This function returns the attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n * @param onlyRenderedAttributes If true, only attributes that are rendered in the HTML are returned\n */\nexport function getAttributes(\n nodeOrMark: NodeType | MarkType,\n extensionAttributes: ExtensionAttribute[],\n onlyRenderedAttributes?: boolean,\n): Record<string, any> {\n const nodeOrMarkAttributes = nodeOrMark.attrs\n\n if (!nodeOrMarkAttributes) {\n return {}\n }\n\n return extensionAttributes\n .filter(item => {\n if (item.type !== (typeof nodeOrMark.type === 'string' ? nodeOrMark.type : nodeOrMark.type.name)) {\n return false\n }\n if (onlyRenderedAttributes) {\n return item.attribute.rendered\n }\n return true\n })\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n }\n\n return (\n item.attribute.renderHTML(nodeOrMarkAttributes) || {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n )\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n\n/**\n * This function returns the HTML attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n */\nexport function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAttributes: ExtensionAttribute[]) {\n return getAttributes(nodeOrMark, extensionAttributes, true)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\n/**\n * Props for a node renderer\n */\nexport type NodeProps<TNodeType = any, TChildren = any> = {\n /**\n * The current node to render\n */\n node: TNodeType\n /**\n * Unless the node is the root node, this will always be defined\n */\n parent?: TNodeType\n /**\n * The children of the current node\n */\n children?: TChildren\n /**\n * Render a child element\n */\n renderElement: (props: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }) => TChildren\n}\n\n/**\n * Props for a mark renderer\n */\nexport type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {\n /**\n * The current mark to render\n */\n mark: TMarkType\n /**\n * The children of the current mark\n */\n children?: TChildren\n /**\n * The node the current mark is applied to\n */\n node: TNodeType\n /**\n * The node the current mark is applied to\n */\n parent?: TNodeType\n}\n\nexport type TiptapStaticRendererOptions<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n> = {\n /**\n * Mapping of node types to react components\n */\n nodeMapping: Record<string, NoInfer<TNodeRender>>\n /**\n * Mapping of mark types to react components\n */\n markMapping: Record<string, NoInfer<TMarkRender>>\n /**\n * Component to render if a node type is not handled\n */\n unhandledNode?: NoInfer<TNodeRender>\n /**\n * Component to render if a mark type is not handled\n */\n unhandledMark?: NoInfer<TMarkRender>\n}\n\n/**\n * Tiptap Static Renderer\n * ----------------------\n *\n * This function is a basis to allow for different renderers to be created.\n * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.\n *\n * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document\n * and renders it using a mapping of node types to React components or even to a string.\n * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.\n */\nexport function TiptapStaticRenderer<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: string | { name: string } } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n>(\n /**\n * The function that actually renders the component\n */\n renderComponent: (\n ctx:\n | {\n component: TNodeRender\n props: NodeProps<TNodeType, TReturnType | TReturnType[]>\n }\n | {\n component: TMarkRender\n props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>\n },\n ) => TReturnType,\n {\n nodeMapping,\n markMapping,\n unhandledNode,\n unhandledMark,\n }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>,\n) {\n /**\n * Render Tiptap JSON and all its children using the provided node and mark mappings.\n */\n return function renderContent({\n content,\n parent,\n }: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }): TReturnType {\n const nodeType = typeof content.type === 'string' ? content.type : content.type.name\n const NodeHandler = nodeMapping[nodeType] ?? unhandledNode\n\n if (!NodeHandler) {\n throw new Error(`missing handler for node type ${nodeType}`)\n }\n\n const nodeContent = renderComponent({\n component: NodeHandler,\n props: {\n node: content,\n parent,\n renderElement: renderContent,\n // Lazily compute the children to avoid unnecessary recursion\n get children() {\n // recursively render child content nodes\n const children: TReturnType[] = []\n\n if (content.content) {\n content.content.forEach(child => {\n children.push(\n renderContent({\n content: child,\n parent: content,\n }),\n )\n })\n }\n\n return children\n },\n },\n })\n\n // apply marks to the content\n const markedContent = content.marks\n ? content.marks.reduce((acc, mark) => {\n const markType = typeof mark.type === 'string' ? mark.type : mark.type.name\n const MarkHandler = markMapping[markType] ?? unhandledMark\n\n if (!MarkHandler) {\n throw new Error(`missing handler for mark type ${markType}`)\n }\n\n return renderComponent({\n component: MarkHandler,\n props: {\n mark,\n parent,\n node: content,\n children: acc,\n },\n })\n }, nodeContent)\n : nodeContent\n\n return markedContent\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToString<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<string, TMarkType, TNodeType>) {\n return TiptapStaticRenderer(ctx => {\n return ctx.component(ctx.props as any)\n }, options)\n}\n\n/**\n * Serialize the attributes of a node or mark to a string\n * @param attrs The attributes to serialize\n * @returns The serialized attributes as a string\n */\nexport function serializeAttrsToHTMLString(attrs: Record<string, any> | undefined | null): string {\n const output = Object.entries(attrs || {})\n .map(([key, value]) => `${key.split(' ').at(-1)}=${JSON.stringify(value)}`)\n .join(' ')\n\n return output ? ` ${output}` : ''\n}\n\n/**\n * Serialize the children of a node or mark to a string\n * @param children The children to serialize\n * @returns The serialized children as a string\n */\nexport function serializeChildrenToHTMLString(children?: string | string[]): string {\n return ([] as string[])\n .concat(children || '')\n .filter(Boolean)\n .join('')\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { MarkType, NodeType } from '@tiptap/core'\nimport React from 'react'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToReactElement<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<React.ReactNode, TMarkType, TNodeType>) {\n let key = 0\n\n return TiptapStaticRenderer<React.ReactNode, TMarkType, TNodeType>(({ component, props: { children, ...props } }) => {\n return React.createElement(\n component as React.FC<typeof props>,\n // eslint-disable-next-line no-plusplus\n Object.assign(props, { key: key++ }),\n ([] as React.ReactNode[]).concat(children),\n )\n }, options)\n}\n","/* eslint-disable no-plusplus */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ExtensionAttribute,\n Extensions,\n JSONContent,\n Mark as MarkExtension,\n MarkConfig,\n Node as NodeExtension,\n NodeConfig,\n} from '@tiptap/core'\nimport {\n getAttributesFromExtensions,\n getExtensionField,\n getSchemaByResolvedExtensions,\n resolveExtensions,\n splitExtensions,\n} from '@tiptap/core'\nimport type { DOMOutputSpec, Mark } from '@tiptap/pm/model'\nimport { Node } from '@tiptap/pm/model'\n\nimport { getHTMLAttributes } from '../helpers.js'\nimport type { MarkProps, NodeProps, TiptapStaticRendererOptions } from '../json/renderer.js'\n\nexport type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T\n\n/**\n * This takes a NodeExtension and maps it to a React component\n * @param extension The node extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapNodeExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: NodeExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledNode'>>,\n): [string, (props: NodeProps<Node, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<NodeConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledNode) {\n return [extension.name, options.unhandledNode]\n }\n return [\n extension.name,\n () => {\n throw new Error(\n `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method, please implement it or override the corresponding \"nodeMapping\" method to have a custom rendering`,\n )\n },\n ]\n }\n\n return [\n extension.name,\n ({ node, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n node,\n HTMLAttributes: getHTMLAttributes(node, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Node ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This takes a MarkExtension and maps it to a React component\n * @param extension The mark extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapMarkExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: MarkExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledMark'>>,\n): [string, (props: MarkProps<Mark, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<MarkConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledMark) {\n return [extension.name, options.unhandledMark]\n }\n return [\n extension.name,\n () => {\n throw new Error(`Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method`)\n },\n ]\n }\n\n return [\n extension.name,\n ({ mark, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n mark,\n HTMLAttributes: getHTMLAttributes(mark, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Mark ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This function will statically render a Prosemirror Node to a target element type using the given extensions\n * @param renderer The renderer to use to render the Prosemirror Node to the target element type\n * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type\n * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type\n * @param content The Prosemirror Node to render\n * @param extensions The extensions to use to render the Prosemirror Node\n * @param options Additional options to pass to the renderer that can override the default behavior\n * @returns The rendered target element type\n */\nexport function renderToElement<T>({\n renderer,\n domOutputSpecToElement,\n mapDefinedTypes,\n content,\n extensions,\n options,\n}: {\n renderer: (options: TiptapStaticRendererOptions<T, Mark, Node>) => (ctx: { content: Node }) => T\n domOutputSpecToElement: DomOutputSpecToElement<T>\n mapDefinedTypes: {\n doc: (props: NodeProps<Node, T | T[]>) => T\n text: (props: NodeProps<Node, T | T[]>) => T\n }\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<T, Mark, Node>>\n}): T {\n // get all extensions in order & split them into nodes and marks\n extensions = resolveExtensions(extensions)\n const extensionAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n\n if (!(content instanceof Node)) {\n content = Node.fromJSON(getSchemaByResolvedExtensions(extensions), content)\n }\n\n return renderer({\n ...options,\n nodeMapping: {\n ...Object.fromEntries(\n nodeExtensions\n .filter(e => {\n if (e.name in mapDefinedTypes) {\n // These are predefined types that we don't need to map\n return false\n }\n // No need to generate mappings for nodes that are already mapped\n if (options?.nodeMapping) {\n return !(e.name in options.nodeMapping)\n }\n return true\n })\n .map(nodeExtension =>\n mapNodeExtensionToReactNode<T>(domOutputSpecToElement, nodeExtension, extensionAttributes, options),\n ),\n ),\n ...mapDefinedTypes,\n ...options?.nodeMapping,\n },\n markMapping: {\n ...Object.fromEntries(\n markExtensions\n .filter(e => {\n // No need to generate mappings for marks that are already mapped\n if (options?.markMapping) {\n return !(e.name in options.markMapping)\n }\n return true\n })\n .map(mark => mapMarkExtensionToReactNode<T>(domOutputSpecToElement, mark, extensionAttributes, options)),\n ),\n ...options?.markMapping,\n },\n })({ content })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\n\nimport {\n renderJSONContentToString,\n serializeAttrsToHTMLString,\n serializeChildrenToHTMLString,\n} from '../../json/html-string/string.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\nexport { serializeAttrsToHTMLString, serializeChildrenToHTMLString } from '../../json/html-string/string.js'\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a string\n * @param content The DOMOutputSpec to convert to a string\n * @returns A function that can render the DOMOutputSpec to a string\n */\nexport function domOutputSpecToHTMLString(content: DOMOutputSpec): (children?: string | string[]) => string {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n const [_tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n let tag = _tag\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = `${parts[1]} xmlns=\"${parts[0]}\"`\n }\n\n if (attrs === undefined) {\n return () => `<${tag}/>`\n }\n if (attrs === 0) {\n return child => `<${tag}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n if (children === 0) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n return child =>\n `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))}</${tag}>`\n }\n if (children === undefined) {\n return () => `<${tag}${serializeAttrsToHTMLString(attrs)}/>`\n }\n if (children === 0) {\n return child => `<${tag}${serializeAttrsToHTMLString(attrs)}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n\n return child =>\n `<${tag}${serializeAttrsToHTMLString(attrs)}>${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))\n .join('')}</${tag}>`\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to HTML using the provided extensions and options\n * @param content The content to render to HTML\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The rendered HTML string\n */\nexport function renderToHTMLString({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<string, Mark, Node>>\n}): string {\n return renderToElement<string>({\n renderer: renderJSONContentToString,\n domOutputSpecToElement: domOutputSpecToHTMLString,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => serializeChildrenToHTMLString(children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n","import type { Extensions, JSONContent } from '@tiptap/core'\nimport type { Mark, Node } from '@tiptap/pm/model'\n\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToHTMLString, serializeChildrenToHTMLString } from '../html-string/html-string.js'\n\n/**\n * This code is just to show the flexibility of this renderer. We can potentially render content to any format we want.\n * This is a simple example of how we can render content to markdown. This is not a full implementation of a markdown renderer.\n */\nexport function renderToMarkdown({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<string, Mark, Node>>\n}) {\n return renderToHTMLString({\n content,\n extensions,\n options: {\n nodeMapping: {\n bulletList({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}`\n },\n orderedList({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}`\n },\n listItem({ node, children, parent }) {\n if (parent?.type.name === 'bulletList') {\n return `- ${serializeChildrenToHTMLString(children).trim()}\\n`\n }\n if (parent?.type.name === 'orderedList') {\n let number = parent.attrs.start || 1\n\n parent.forEach((parentChild, _offset, index) => {\n if (node === parentChild) {\n number = index + 1\n }\n })\n\n return `${number}. ${serializeChildrenToHTMLString(children).trim()}\\n`\n }\n\n return serializeChildrenToHTMLString(children)\n },\n paragraph({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}\\n`\n },\n heading({ node, children }) {\n const level = node.attrs.level as number\n\n return `${new Array(level).fill('#').join('')} ${children}\\n`\n },\n codeBlock({ node, children }) {\n return `\\n\\`\\`\\`${node.attrs.language}\\n${serializeChildrenToHTMLString(children)}\\n\\`\\`\\`\\n`\n },\n blockquote({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)\n .trim()\n .split('\\n')\n .map(a => `> ${a}`)\n .join('\\n')}`\n },\n image({ node }) {\n return `![${node.attrs.alt}](${node.attrs.src})`\n },\n hardBreak() {\n return '\\n'\n },\n horizontalRule() {\n return '\\n---\\n'\n },\n table({ children, node }) {\n if (!Array.isArray(children)) {\n return `\\n${serializeChildrenToHTMLString(children)}\\n`\n }\n\n return `\\n${serializeChildrenToHTMLString(children[0])}| ${new Array(node.childCount - 2).fill('---').join(' | ')} |\\n${serializeChildrenToHTMLString(children.slice(1))}\\n`\n },\n tableRow({ children }) {\n if (Array.isArray(children)) {\n return `| ${children.join(' | ')} |\\n`\n }\n return `${serializeChildrenToHTMLString(children)}\\n`\n },\n tableHeader({ children }) {\n return serializeChildrenToHTMLString(children).trim()\n },\n tableCell({ children }) {\n return serializeChildrenToHTMLString(children).trim()\n },\n ...options?.nodeMapping,\n },\n markMapping: {\n bold({ children }) {\n return `**${serializeChildrenToHTMLString(children)}**`\n },\n italic({ children, node }) {\n let isBoldToo = false\n\n // Check if the node being wrapped also has a bold mark, if so, we need to use the bold markdown syntax\n if (node?.marks.some(m => m.type.name === 'bold')) {\n isBoldToo = true\n }\n\n if (isBoldToo) {\n // If the content is bold, just wrap the bold content in italic markdown syntax with another set of asterisks\n return `*${serializeChildrenToHTMLString(children)}*`\n }\n\n return `_${serializeChildrenToHTMLString(children)}_`\n },\n code({ children }) {\n return `\\`${serializeChildrenToHTMLString(children)}\\``\n },\n strike({ children }) {\n return `~~${serializeChildrenToHTMLString(children)}~~`\n },\n underline({ children }) {\n return `<u>${serializeChildrenToHTMLString(children)}</u>`\n },\n subscript({ children }) {\n return `<sub>${serializeChildrenToHTMLString(children)}</sub>`\n },\n superscript({ children }) {\n return `<sup>${serializeChildrenToHTMLString(children)}</sup>`\n },\n link({ node, children }) {\n return `[${serializeChildrenToHTMLString(children)}](${node.attrs.href})`\n },\n highlight({ children }) {\n return `==${serializeChildrenToHTMLString(children)}==`\n },\n ...options?.markMapping,\n },\n ...options,\n },\n })\n}\n","/* eslint-disable no-plusplus, @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\nimport React from 'react'\n\nimport { renderJSONContentToReactElement } from '../../json/react/react.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\n/**\n * This function maps the attributes of a node or mark to HTML attributes\n * @param attrs The attributes to map\n * @param key The key to use for the React element\n * @returns The mapped HTML attributes as an object\n */\nexport function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {\n if (!attrs) {\n return { key }\n }\n return Object.entries(attrs).reduce(\n (acc, [name, value]) => {\n if (name === 'class') {\n return Object.assign(acc, { className: value })\n }\n\n // React expects styles to be a object\n // so we need to convert it from string to object\n if (name === 'style' && typeof value === 'string') {\n const styleObject: Record<string, string> = {}\n value.split(';').forEach(style => {\n const [styleKey, val] = style.split(':')\n if (styleKey && val) {\n // we need to turn the key into camelCase\n const camelCaseKey = styleKey.trim().replace(/-([a-z])/g, g => g[1].toUpperCase())\n styleObject[camelCaseKey] = val.trim()\n }\n })\n\n return Object.assign(acc, { style: styleObject })\n }\n\n return Object.assign(acc, { [name]: value })\n },\n { key },\n )\n}\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a React element\n * @param content The DOMOutputSpec to convert to a React element\n * @returns A function that can render the DOMOutputSpec to a React element\n */\nexport function domOutputSpecToReactElement(\n content: DOMOutputSpec,\n key = 0,\n): (children?: React.ReactNode) => React.ReactNode {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n // eslint-disable-next-line prefer-const\n let [tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = parts[1]\n if (attrs === undefined) {\n attrs = {\n xmlns: parts[0],\n }\n }\n if (attrs === 0) {\n attrs = {\n xmlns: parts[0],\n }\n children = 0\n }\n if (typeof attrs === 'object') {\n attrs = Object.assign(attrs, { xmlns: parts[0] })\n }\n }\n\n if (attrs === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()))\n }\n if (attrs === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()), child)\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n if (children === 0) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray)(child),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n if (children === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()))\n }\n if (children === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()), child)\n }\n\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(attrs, key.toString()),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to a React component using the given extensions\n * @param content The content to render to a React component\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The React element that represents the rendered content\n */\nexport function renderToReactElement({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node>>\n}): React.ReactNode {\n return renderToElement<React.ReactNode>({\n renderer: renderJSONContentToReactElement,\n domOutputSpecToElement: domOutputSpecToReactElement,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => React.createElement(React.Fragment, {}, children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n"],"mappings":"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","names":["_a","React","import_core","import_react","React"]}
package/dist/index.d.cts CHANGED
@@ -305,6 +305,13 @@ declare function renderToMarkdown({ content, extensions, options, }: {
305
305
  options?: Partial<TiptapStaticRendererOptions<string, Mark, Node$1>>;
306
306
  }): string;
307
307
 
308
+ /**
309
+ * This function maps the attributes of a node or mark to HTML attributes
310
+ * @param attrs The attributes to map
311
+ * @param key The key to use for the React element
312
+ * @returns The mapped HTML attributes as an object
313
+ */
314
+ declare function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any>;
308
315
  /**
309
316
  * Take a DOMOutputSpec and return a function that can render it to a React element
310
317
  * @param content The DOMOutputSpec to convert to a React element
@@ -324,4 +331,4 @@ declare function renderToReactElement({ content, extensions, options, }: {
324
331
  options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node$1>>;
325
332
  }): React.ReactNode;
326
333
 
327
- export { type DomOutputSpecToElement, type MarkProps, type NodeProps, TiptapStaticRenderer, type TiptapStaticRendererOptions, domOutputSpecToHTMLString, domOutputSpecToReactElement, getAttributes, getHTMLAttributes, mapMarkExtensionToReactNode, mapNodeExtensionToReactNode, renderJSONContentToReactElement, renderJSONContentToString, renderToElement, renderToHTMLString, renderToMarkdown, renderToReactElement, serializeAttrsToHTMLString, serializeChildrenToHTMLString };
334
+ export { type DomOutputSpecToElement, type MarkProps, type NodeProps, TiptapStaticRenderer, type TiptapStaticRendererOptions, domOutputSpecToHTMLString, domOutputSpecToReactElement, getAttributes, getHTMLAttributes, mapAttrsToHTMLAttributes, mapMarkExtensionToReactNode, mapNodeExtensionToReactNode, renderJSONContentToReactElement, renderJSONContentToString, renderToElement, renderToHTMLString, renderToMarkdown, renderToReactElement, serializeAttrsToHTMLString, serializeChildrenToHTMLString };
package/dist/index.d.ts CHANGED
@@ -305,6 +305,13 @@ declare function renderToMarkdown({ content, extensions, options, }: {
305
305
  options?: Partial<TiptapStaticRendererOptions<string, Mark, Node$1>>;
306
306
  }): string;
307
307
 
308
+ /**
309
+ * This function maps the attributes of a node or mark to HTML attributes
310
+ * @param attrs The attributes to map
311
+ * @param key The key to use for the React element
312
+ * @returns The mapped HTML attributes as an object
313
+ */
314
+ declare function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any>;
308
315
  /**
309
316
  * Take a DOMOutputSpec and return a function that can render it to a React element
310
317
  * @param content The DOMOutputSpec to convert to a React element
@@ -324,4 +331,4 @@ declare function renderToReactElement({ content, extensions, options, }: {
324
331
  options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node$1>>;
325
332
  }): React.ReactNode;
326
333
 
327
- export { type DomOutputSpecToElement, type MarkProps, type NodeProps, TiptapStaticRenderer, type TiptapStaticRendererOptions, domOutputSpecToHTMLString, domOutputSpecToReactElement, getAttributes, getHTMLAttributes, mapMarkExtensionToReactNode, mapNodeExtensionToReactNode, renderJSONContentToReactElement, renderJSONContentToString, renderToElement, renderToHTMLString, renderToMarkdown, renderToReactElement, serializeAttrsToHTMLString, serializeChildrenToHTMLString };
334
+ export { type DomOutputSpecToElement, type MarkProps, type NodeProps, TiptapStaticRenderer, type TiptapStaticRendererOptions, domOutputSpecToHTMLString, domOutputSpecToReactElement, getAttributes, getHTMLAttributes, mapAttrsToHTMLAttributes, mapMarkExtensionToReactNode, mapNodeExtensionToReactNode, renderJSONContentToReactElement, renderJSONContentToString, renderToElement, renderToHTMLString, renderToMarkdown, renderToReactElement, serializeAttrsToHTMLString, serializeChildrenToHTMLString };
package/dist/index.js CHANGED
@@ -464,6 +464,17 @@ function mapAttrsToHTMLAttributes(attrs, key) {
464
464
  if (name === "class") {
465
465
  return Object.assign(acc, { className: value });
466
466
  }
467
+ if (name === "style" && typeof value === "string") {
468
+ const styleObject = {};
469
+ value.split(";").forEach((style) => {
470
+ const [styleKey, val] = style.split(":");
471
+ if (styleKey && val) {
472
+ const camelCaseKey = styleKey.trim().replace(/-([a-z])/g, (g) => g[1].toUpperCase());
473
+ styleObject[camelCaseKey] = val.trim();
474
+ }
475
+ });
476
+ return Object.assign(acc, { style: styleObject });
477
+ }
467
478
  return Object.assign(acc, { [name]: value });
468
479
  },
469
480
  { key }
@@ -570,6 +581,7 @@ export {
570
581
  domOutputSpecToReactElement,
571
582
  getAttributes,
572
583
  getHTMLAttributes,
584
+ mapAttrsToHTMLAttributes,
573
585
  mapMarkExtensionToReactNode,
574
586
  mapNodeExtensionToReactNode,
575
587
  renderJSONContentToReactElement,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/helpers.ts","../src/json/renderer.ts","../src/json/html-string/string.ts","../src/json/react/react.ts","../src/pm/extensionRenderer.ts","../src/pm/html-string/html-string.ts","../src/pm/markdown/markdown.ts","../src/pm/react/react.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ExtensionAttribute, type MarkType, type NodeType, mergeAttributes } from '@tiptap/core'\n\n/**\n * This function returns the attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n * @param onlyRenderedAttributes If true, only attributes that are rendered in the HTML are returned\n */\nexport function getAttributes(\n nodeOrMark: NodeType | MarkType,\n extensionAttributes: ExtensionAttribute[],\n onlyRenderedAttributes?: boolean,\n): Record<string, any> {\n const nodeOrMarkAttributes = nodeOrMark.attrs\n\n if (!nodeOrMarkAttributes) {\n return {}\n }\n\n return extensionAttributes\n .filter(item => {\n if (item.type !== (typeof nodeOrMark.type === 'string' ? nodeOrMark.type : nodeOrMark.type.name)) {\n return false\n }\n if (onlyRenderedAttributes) {\n return item.attribute.rendered\n }\n return true\n })\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n }\n\n return (\n item.attribute.renderHTML(nodeOrMarkAttributes) || {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n )\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n\n/**\n * This function returns the HTML attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n */\nexport function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAttributes: ExtensionAttribute[]) {\n return getAttributes(nodeOrMark, extensionAttributes, true)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\n/**\n * Props for a node renderer\n */\nexport type NodeProps<TNodeType = any, TChildren = any> = {\n /**\n * The current node to render\n */\n node: TNodeType\n /**\n * Unless the node is the root node, this will always be defined\n */\n parent?: TNodeType\n /**\n * The children of the current node\n */\n children?: TChildren\n /**\n * Render a child element\n */\n renderElement: (props: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }) => TChildren\n}\n\n/**\n * Props for a mark renderer\n */\nexport type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {\n /**\n * The current mark to render\n */\n mark: TMarkType\n /**\n * The children of the current mark\n */\n children?: TChildren\n /**\n * The node the current mark is applied to\n */\n node: TNodeType\n /**\n * The node the current mark is applied to\n */\n parent?: TNodeType\n}\n\nexport type TiptapStaticRendererOptions<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n> = {\n /**\n * Mapping of node types to react components\n */\n nodeMapping: Record<string, NoInfer<TNodeRender>>\n /**\n * Mapping of mark types to react components\n */\n markMapping: Record<string, NoInfer<TMarkRender>>\n /**\n * Component to render if a node type is not handled\n */\n unhandledNode?: NoInfer<TNodeRender>\n /**\n * Component to render if a mark type is not handled\n */\n unhandledMark?: NoInfer<TMarkRender>\n}\n\n/**\n * Tiptap Static Renderer\n * ----------------------\n *\n * This function is a basis to allow for different renderers to be created.\n * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.\n *\n * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document\n * and renders it using a mapping of node types to React components or even to a string.\n * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.\n */\nexport function TiptapStaticRenderer<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: string | { name: string } } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n>(\n /**\n * The function that actually renders the component\n */\n renderComponent: (\n ctx:\n | {\n component: TNodeRender\n props: NodeProps<TNodeType, TReturnType | TReturnType[]>\n }\n | {\n component: TMarkRender\n props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>\n },\n ) => TReturnType,\n {\n nodeMapping,\n markMapping,\n unhandledNode,\n unhandledMark,\n }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>,\n) {\n /**\n * Render Tiptap JSON and all its children using the provided node and mark mappings.\n */\n return function renderContent({\n content,\n parent,\n }: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }): TReturnType {\n const nodeType = typeof content.type === 'string' ? content.type : content.type.name\n const NodeHandler = nodeMapping[nodeType] ?? unhandledNode\n\n if (!NodeHandler) {\n throw new Error(`missing handler for node type ${nodeType}`)\n }\n\n const nodeContent = renderComponent({\n component: NodeHandler,\n props: {\n node: content,\n parent,\n renderElement: renderContent,\n // Lazily compute the children to avoid unnecessary recursion\n get children() {\n // recursively render child content nodes\n const children: TReturnType[] = []\n\n if (content.content) {\n content.content.forEach(child => {\n children.push(\n renderContent({\n content: child,\n parent: content,\n }),\n )\n })\n }\n\n return children\n },\n },\n })\n\n // apply marks to the content\n const markedContent = content.marks\n ? content.marks.reduce((acc, mark) => {\n const markType = typeof mark.type === 'string' ? mark.type : mark.type.name\n const MarkHandler = markMapping[markType] ?? unhandledMark\n\n if (!MarkHandler) {\n throw new Error(`missing handler for mark type ${markType}`)\n }\n\n return renderComponent({\n component: MarkHandler,\n props: {\n mark,\n parent,\n node: content,\n children: acc,\n },\n })\n }, nodeContent)\n : nodeContent\n\n return markedContent\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToString<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<string, TMarkType, TNodeType>) {\n return TiptapStaticRenderer(ctx => {\n return ctx.component(ctx.props as any)\n }, options)\n}\n\n/**\n * Serialize the attributes of a node or mark to a string\n * @param attrs The attributes to serialize\n * @returns The serialized attributes as a string\n */\nexport function serializeAttrsToHTMLString(attrs: Record<string, any> | undefined | null): string {\n const output = Object.entries(attrs || {})\n .map(([key, value]) => `${key.split(' ').at(-1)}=${JSON.stringify(value)}`)\n .join(' ')\n\n return output ? ` ${output}` : ''\n}\n\n/**\n * Serialize the children of a node or mark to a string\n * @param children The children to serialize\n * @returns The serialized children as a string\n */\nexport function serializeChildrenToHTMLString(children?: string | string[]): string {\n return ([] as string[])\n .concat(children || '')\n .filter(Boolean)\n .join('')\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { MarkType, NodeType } from '@tiptap/core'\nimport React from 'react'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToReactElement<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<React.ReactNode, TMarkType, TNodeType>) {\n let key = 0\n\n return TiptapStaticRenderer<React.ReactNode, TMarkType, TNodeType>(({ component, props: { children, ...props } }) => {\n return React.createElement(\n component as React.FC<typeof props>,\n // eslint-disable-next-line no-plusplus\n Object.assign(props, { key: key++ }),\n ([] as React.ReactNode[]).concat(children),\n )\n }, options)\n}\n","/* eslint-disable no-plusplus */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ExtensionAttribute,\n Extensions,\n JSONContent,\n Mark as MarkExtension,\n MarkConfig,\n Node as NodeExtension,\n NodeConfig,\n} from '@tiptap/core'\nimport {\n getAttributesFromExtensions,\n getExtensionField,\n getSchemaByResolvedExtensions,\n resolveExtensions,\n splitExtensions,\n} from '@tiptap/core'\nimport type { DOMOutputSpec, Mark } from '@tiptap/pm/model'\nimport { Node } from '@tiptap/pm/model'\n\nimport { getHTMLAttributes } from '../helpers.js'\nimport type { MarkProps, NodeProps, TiptapStaticRendererOptions } from '../json/renderer.js'\n\nexport type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T\n\n/**\n * This takes a NodeExtension and maps it to a React component\n * @param extension The node extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapNodeExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: NodeExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledNode'>>,\n): [string, (props: NodeProps<Node, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<NodeConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledNode) {\n return [extension.name, options.unhandledNode]\n }\n return [\n extension.name,\n () => {\n throw new Error(\n `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method, please implement it or override the corresponding \"nodeMapping\" method to have a custom rendering`,\n )\n },\n ]\n }\n\n return [\n extension.name,\n ({ node, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n node,\n HTMLAttributes: getHTMLAttributes(node, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Node ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This takes a MarkExtension and maps it to a React component\n * @param extension The mark extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapMarkExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: MarkExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledMark'>>,\n): [string, (props: MarkProps<Mark, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<MarkConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledMark) {\n return [extension.name, options.unhandledMark]\n }\n return [\n extension.name,\n () => {\n throw new Error(`Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method`)\n },\n ]\n }\n\n return [\n extension.name,\n ({ mark, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n mark,\n HTMLAttributes: getHTMLAttributes(mark, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Mark ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This function will statically render a Prosemirror Node to a target element type using the given extensions\n * @param renderer The renderer to use to render the Prosemirror Node to the target element type\n * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type\n * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type\n * @param content The Prosemirror Node to render\n * @param extensions The extensions to use to render the Prosemirror Node\n * @param options Additional options to pass to the renderer that can override the default behavior\n * @returns The rendered target element type\n */\nexport function renderToElement<T>({\n renderer,\n domOutputSpecToElement,\n mapDefinedTypes,\n content,\n extensions,\n options,\n}: {\n renderer: (options: TiptapStaticRendererOptions<T, Mark, Node>) => (ctx: { content: Node }) => T\n domOutputSpecToElement: DomOutputSpecToElement<T>\n mapDefinedTypes: {\n doc: (props: NodeProps<Node, T | T[]>) => T\n text: (props: NodeProps<Node, T | T[]>) => T\n }\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<T, Mark, Node>>\n}): T {\n // get all extensions in order & split them into nodes and marks\n extensions = resolveExtensions(extensions)\n const extensionAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n\n if (!(content instanceof Node)) {\n content = Node.fromJSON(getSchemaByResolvedExtensions(extensions), content)\n }\n\n return renderer({\n ...options,\n nodeMapping: {\n ...Object.fromEntries(\n nodeExtensions\n .filter(e => {\n if (e.name in mapDefinedTypes) {\n // These are predefined types that we don't need to map\n return false\n }\n // No need to generate mappings for nodes that are already mapped\n if (options?.nodeMapping) {\n return !(e.name in options.nodeMapping)\n }\n return true\n })\n .map(nodeExtension =>\n mapNodeExtensionToReactNode<T>(domOutputSpecToElement, nodeExtension, extensionAttributes, options),\n ),\n ),\n ...mapDefinedTypes,\n ...options?.nodeMapping,\n },\n markMapping: {\n ...Object.fromEntries(\n markExtensions\n .filter(e => {\n // No need to generate mappings for marks that are already mapped\n if (options?.markMapping) {\n return !(e.name in options.markMapping)\n }\n return true\n })\n .map(mark => mapMarkExtensionToReactNode<T>(domOutputSpecToElement, mark, extensionAttributes, options)),\n ),\n ...options?.markMapping,\n },\n })({ content })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\n\nimport {\n renderJSONContentToString,\n serializeAttrsToHTMLString,\n serializeChildrenToHTMLString,\n} from '../../json/html-string/string.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\nexport { serializeAttrsToHTMLString, serializeChildrenToHTMLString } from '../../json/html-string/string.js'\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a string\n * @param content The DOMOutputSpec to convert to a string\n * @returns A function that can render the DOMOutputSpec to a string\n */\nexport function domOutputSpecToHTMLString(content: DOMOutputSpec): (children?: string | string[]) => string {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n const [_tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n let tag = _tag\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = `${parts[1]} xmlns=\"${parts[0]}\"`\n }\n\n if (attrs === undefined) {\n return () => `<${tag}/>`\n }\n if (attrs === 0) {\n return child => `<${tag}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n if (children === 0) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n return child =>\n `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))}</${tag}>`\n }\n if (children === undefined) {\n return () => `<${tag}${serializeAttrsToHTMLString(attrs)}/>`\n }\n if (children === 0) {\n return child => `<${tag}${serializeAttrsToHTMLString(attrs)}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n\n return child =>\n `<${tag}${serializeAttrsToHTMLString(attrs)}>${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))\n .join('')}</${tag}>`\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to HTML using the provided extensions and options\n * @param content The content to render to HTML\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The rendered HTML string\n */\nexport function renderToHTMLString({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<string, Mark, Node>>\n}): string {\n return renderToElement<string>({\n renderer: renderJSONContentToString,\n domOutputSpecToElement: domOutputSpecToHTMLString,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => serializeChildrenToHTMLString(children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n","import type { Extensions, JSONContent } from '@tiptap/core'\nimport type { Mark, Node } from '@tiptap/pm/model'\n\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToHTMLString, serializeChildrenToHTMLString } from '../html-string/html-string.js'\n\n/**\n * This code is just to show the flexibility of this renderer. We can potentially render content to any format we want.\n * This is a simple example of how we can render content to markdown. This is not a full implementation of a markdown renderer.\n */\nexport function renderToMarkdown({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<string, Mark, Node>>\n}) {\n return renderToHTMLString({\n content,\n extensions,\n options: {\n nodeMapping: {\n bulletList({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}`\n },\n orderedList({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}`\n },\n listItem({ node, children, parent }) {\n if (parent?.type.name === 'bulletList') {\n return `- ${serializeChildrenToHTMLString(children).trim()}\\n`\n }\n if (parent?.type.name === 'orderedList') {\n let number = parent.attrs.start || 1\n\n parent.forEach((parentChild, _offset, index) => {\n if (node === parentChild) {\n number = index + 1\n }\n })\n\n return `${number}. ${serializeChildrenToHTMLString(children).trim()}\\n`\n }\n\n return serializeChildrenToHTMLString(children)\n },\n paragraph({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}\\n`\n },\n heading({ node, children }) {\n const level = node.attrs.level as number\n\n return `${new Array(level).fill('#').join('')} ${children}\\n`\n },\n codeBlock({ node, children }) {\n return `\\n\\`\\`\\`${node.attrs.language}\\n${serializeChildrenToHTMLString(children)}\\n\\`\\`\\`\\n`\n },\n blockquote({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)\n .trim()\n .split('\\n')\n .map(a => `> ${a}`)\n .join('\\n')}`\n },\n image({ node }) {\n return `![${node.attrs.alt}](${node.attrs.src})`\n },\n hardBreak() {\n return '\\n'\n },\n horizontalRule() {\n return '\\n---\\n'\n },\n table({ children, node }) {\n if (!Array.isArray(children)) {\n return `\\n${serializeChildrenToHTMLString(children)}\\n`\n }\n\n return `\\n${serializeChildrenToHTMLString(children[0])}| ${new Array(node.childCount - 2).fill('---').join(' | ')} |\\n${serializeChildrenToHTMLString(children.slice(1))}\\n`\n },\n tableRow({ children }) {\n if (Array.isArray(children)) {\n return `| ${children.join(' | ')} |\\n`\n }\n return `${serializeChildrenToHTMLString(children)}\\n`\n },\n tableHeader({ children }) {\n return serializeChildrenToHTMLString(children).trim()\n },\n tableCell({ children }) {\n return serializeChildrenToHTMLString(children).trim()\n },\n ...options?.nodeMapping,\n },\n markMapping: {\n bold({ children }) {\n return `**${serializeChildrenToHTMLString(children)}**`\n },\n italic({ children, node }) {\n let isBoldToo = false\n\n // Check if the node being wrapped also has a bold mark, if so, we need to use the bold markdown syntax\n if (node?.marks.some(m => m.type.name === 'bold')) {\n isBoldToo = true\n }\n\n if (isBoldToo) {\n // If the content is bold, just wrap the bold content in italic markdown syntax with another set of asterisks\n return `*${serializeChildrenToHTMLString(children)}*`\n }\n\n return `_${serializeChildrenToHTMLString(children)}_`\n },\n code({ children }) {\n return `\\`${serializeChildrenToHTMLString(children)}\\``\n },\n strike({ children }) {\n return `~~${serializeChildrenToHTMLString(children)}~~`\n },\n underline({ children }) {\n return `<u>${serializeChildrenToHTMLString(children)}</u>`\n },\n subscript({ children }) {\n return `<sub>${serializeChildrenToHTMLString(children)}</sub>`\n },\n superscript({ children }) {\n return `<sup>${serializeChildrenToHTMLString(children)}</sup>`\n },\n link({ node, children }) {\n return `[${serializeChildrenToHTMLString(children)}](${node.attrs.href})`\n },\n highlight({ children }) {\n return `==${serializeChildrenToHTMLString(children)}==`\n },\n ...options?.markMapping,\n },\n ...options,\n },\n })\n}\n","/* eslint-disable no-plusplus, @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\nimport React from 'react'\n\nimport { renderJSONContentToReactElement } from '../../json/react/react.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\n/**\n * This function maps the attributes of a node or mark to HTML attributes\n * @param attrs The attributes to map\n * @param key The key to use for the React element\n * @returns The mapped HTML attributes as an object\n */\nfunction mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {\n if (!attrs) {\n return { key }\n }\n return Object.entries(attrs).reduce(\n (acc, [name, value]) => {\n if (name === 'class') {\n return Object.assign(acc, { className: value })\n }\n return Object.assign(acc, { [name]: value })\n },\n { key },\n )\n}\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a React element\n * @param content The DOMOutputSpec to convert to a React element\n * @returns A function that can render the DOMOutputSpec to a React element\n */\nexport function domOutputSpecToReactElement(\n content: DOMOutputSpec,\n key = 0,\n): (children?: React.ReactNode) => React.ReactNode {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n // eslint-disable-next-line prefer-const\n let [tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = parts[1]\n if (attrs === undefined) {\n attrs = {\n xmlns: parts[0],\n }\n }\n if (attrs === 0) {\n attrs = {\n xmlns: parts[0],\n }\n children = 0\n }\n if (typeof attrs === 'object') {\n attrs = Object.assign(attrs, { xmlns: parts[0] })\n }\n }\n\n if (attrs === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()))\n }\n if (attrs === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()), child)\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n if (children === 0) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray)(child),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n if (children === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()))\n }\n if (children === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()), child)\n }\n\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(attrs, key.toString()),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to a React component using the given extensions\n * @param content The content to render to a React component\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The React element that represents the rendered content\n */\nexport function renderToReactElement({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node>>\n}): React.ReactNode {\n return renderToElement<React.ReactNode>({\n renderer: renderJSONContentToReactElement,\n domOutputSpecToElement: domOutputSpecToReactElement,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => React.createElement(React.Fragment, {}, children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n"],"mappings":"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","names":["_a","React","React"]}
1
+ {"version":3,"sources":["../src/helpers.ts","../src/json/renderer.ts","../src/json/html-string/string.ts","../src/json/react/react.ts","../src/pm/extensionRenderer.ts","../src/pm/html-string/html-string.ts","../src/pm/markdown/markdown.ts","../src/pm/react/react.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ExtensionAttribute, type MarkType, type NodeType, mergeAttributes } from '@tiptap/core'\n\n/**\n * This function returns the attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n * @param onlyRenderedAttributes If true, only attributes that are rendered in the HTML are returned\n */\nexport function getAttributes(\n nodeOrMark: NodeType | MarkType,\n extensionAttributes: ExtensionAttribute[],\n onlyRenderedAttributes?: boolean,\n): Record<string, any> {\n const nodeOrMarkAttributes = nodeOrMark.attrs\n\n if (!nodeOrMarkAttributes) {\n return {}\n }\n\n return extensionAttributes\n .filter(item => {\n if (item.type !== (typeof nodeOrMark.type === 'string' ? nodeOrMark.type : nodeOrMark.type.name)) {\n return false\n }\n if (onlyRenderedAttributes) {\n return item.attribute.rendered\n }\n return true\n })\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n }\n\n return (\n item.attribute.renderHTML(nodeOrMarkAttributes) || {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n )\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n\n/**\n * This function returns the HTML attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n */\nexport function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAttributes: ExtensionAttribute[]) {\n return getAttributes(nodeOrMark, extensionAttributes, true)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\n/**\n * Props for a node renderer\n */\nexport type NodeProps<TNodeType = any, TChildren = any> = {\n /**\n * The current node to render\n */\n node: TNodeType\n /**\n * Unless the node is the root node, this will always be defined\n */\n parent?: TNodeType\n /**\n * The children of the current node\n */\n children?: TChildren\n /**\n * Render a child element\n */\n renderElement: (props: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }) => TChildren\n}\n\n/**\n * Props for a mark renderer\n */\nexport type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {\n /**\n * The current mark to render\n */\n mark: TMarkType\n /**\n * The children of the current mark\n */\n children?: TChildren\n /**\n * The node the current mark is applied to\n */\n node: TNodeType\n /**\n * The node the current mark is applied to\n */\n parent?: TNodeType\n}\n\nexport type TiptapStaticRendererOptions<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n> = {\n /**\n * Mapping of node types to react components\n */\n nodeMapping: Record<string, NoInfer<TNodeRender>>\n /**\n * Mapping of mark types to react components\n */\n markMapping: Record<string, NoInfer<TMarkRender>>\n /**\n * Component to render if a node type is not handled\n */\n unhandledNode?: NoInfer<TNodeRender>\n /**\n * Component to render if a mark type is not handled\n */\n unhandledMark?: NoInfer<TMarkRender>\n}\n\n/**\n * Tiptap Static Renderer\n * ----------------------\n *\n * This function is a basis to allow for different renderers to be created.\n * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.\n *\n * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document\n * and renders it using a mapping of node types to React components or even to a string.\n * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.\n */\nexport function TiptapStaticRenderer<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: string | { name: string } } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n>(\n /**\n * The function that actually renders the component\n */\n renderComponent: (\n ctx:\n | {\n component: TNodeRender\n props: NodeProps<TNodeType, TReturnType | TReturnType[]>\n }\n | {\n component: TMarkRender\n props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>\n },\n ) => TReturnType,\n {\n nodeMapping,\n markMapping,\n unhandledNode,\n unhandledMark,\n }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>,\n) {\n /**\n * Render Tiptap JSON and all its children using the provided node and mark mappings.\n */\n return function renderContent({\n content,\n parent,\n }: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }): TReturnType {\n const nodeType = typeof content.type === 'string' ? content.type : content.type.name\n const NodeHandler = nodeMapping[nodeType] ?? unhandledNode\n\n if (!NodeHandler) {\n throw new Error(`missing handler for node type ${nodeType}`)\n }\n\n const nodeContent = renderComponent({\n component: NodeHandler,\n props: {\n node: content,\n parent,\n renderElement: renderContent,\n // Lazily compute the children to avoid unnecessary recursion\n get children() {\n // recursively render child content nodes\n const children: TReturnType[] = []\n\n if (content.content) {\n content.content.forEach(child => {\n children.push(\n renderContent({\n content: child,\n parent: content,\n }),\n )\n })\n }\n\n return children\n },\n },\n })\n\n // apply marks to the content\n const markedContent = content.marks\n ? content.marks.reduce((acc, mark) => {\n const markType = typeof mark.type === 'string' ? mark.type : mark.type.name\n const MarkHandler = markMapping[markType] ?? unhandledMark\n\n if (!MarkHandler) {\n throw new Error(`missing handler for mark type ${markType}`)\n }\n\n return renderComponent({\n component: MarkHandler,\n props: {\n mark,\n parent,\n node: content,\n children: acc,\n },\n })\n }, nodeContent)\n : nodeContent\n\n return markedContent\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToString<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<string, TMarkType, TNodeType>) {\n return TiptapStaticRenderer(ctx => {\n return ctx.component(ctx.props as any)\n }, options)\n}\n\n/**\n * Serialize the attributes of a node or mark to a string\n * @param attrs The attributes to serialize\n * @returns The serialized attributes as a string\n */\nexport function serializeAttrsToHTMLString(attrs: Record<string, any> | undefined | null): string {\n const output = Object.entries(attrs || {})\n .map(([key, value]) => `${key.split(' ').at(-1)}=${JSON.stringify(value)}`)\n .join(' ')\n\n return output ? ` ${output}` : ''\n}\n\n/**\n * Serialize the children of a node or mark to a string\n * @param children The children to serialize\n * @returns The serialized children as a string\n */\nexport function serializeChildrenToHTMLString(children?: string | string[]): string {\n return ([] as string[])\n .concat(children || '')\n .filter(Boolean)\n .join('')\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { MarkType, NodeType } from '@tiptap/core'\nimport React from 'react'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToReactElement<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<React.ReactNode, TMarkType, TNodeType>) {\n let key = 0\n\n return TiptapStaticRenderer<React.ReactNode, TMarkType, TNodeType>(({ component, props: { children, ...props } }) => {\n return React.createElement(\n component as React.FC<typeof props>,\n // eslint-disable-next-line no-plusplus\n Object.assign(props, { key: key++ }),\n ([] as React.ReactNode[]).concat(children),\n )\n }, options)\n}\n","/* eslint-disable no-plusplus */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ExtensionAttribute,\n Extensions,\n JSONContent,\n Mark as MarkExtension,\n MarkConfig,\n Node as NodeExtension,\n NodeConfig,\n} from '@tiptap/core'\nimport {\n getAttributesFromExtensions,\n getExtensionField,\n getSchemaByResolvedExtensions,\n resolveExtensions,\n splitExtensions,\n} from '@tiptap/core'\nimport type { DOMOutputSpec, Mark } from '@tiptap/pm/model'\nimport { Node } from '@tiptap/pm/model'\n\nimport { getHTMLAttributes } from '../helpers.js'\nimport type { MarkProps, NodeProps, TiptapStaticRendererOptions } from '../json/renderer.js'\n\nexport type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T\n\n/**\n * This takes a NodeExtension and maps it to a React component\n * @param extension The node extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapNodeExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: NodeExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledNode'>>,\n): [string, (props: NodeProps<Node, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<NodeConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledNode) {\n return [extension.name, options.unhandledNode]\n }\n return [\n extension.name,\n () => {\n throw new Error(\n `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method, please implement it or override the corresponding \"nodeMapping\" method to have a custom rendering`,\n )\n },\n ]\n }\n\n return [\n extension.name,\n ({ node, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n node,\n HTMLAttributes: getHTMLAttributes(node, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Node ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This takes a MarkExtension and maps it to a React component\n * @param extension The mark extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapMarkExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: MarkExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledMark'>>,\n): [string, (props: MarkProps<Mark, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<MarkConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledMark) {\n return [extension.name, options.unhandledMark]\n }\n return [\n extension.name,\n () => {\n throw new Error(`Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method`)\n },\n ]\n }\n\n return [\n extension.name,\n ({ mark, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n mark,\n HTMLAttributes: getHTMLAttributes(mark, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Mark ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This function will statically render a Prosemirror Node to a target element type using the given extensions\n * @param renderer The renderer to use to render the Prosemirror Node to the target element type\n * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type\n * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type\n * @param content The Prosemirror Node to render\n * @param extensions The extensions to use to render the Prosemirror Node\n * @param options Additional options to pass to the renderer that can override the default behavior\n * @returns The rendered target element type\n */\nexport function renderToElement<T>({\n renderer,\n domOutputSpecToElement,\n mapDefinedTypes,\n content,\n extensions,\n options,\n}: {\n renderer: (options: TiptapStaticRendererOptions<T, Mark, Node>) => (ctx: { content: Node }) => T\n domOutputSpecToElement: DomOutputSpecToElement<T>\n mapDefinedTypes: {\n doc: (props: NodeProps<Node, T | T[]>) => T\n text: (props: NodeProps<Node, T | T[]>) => T\n }\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<T, Mark, Node>>\n}): T {\n // get all extensions in order & split them into nodes and marks\n extensions = resolveExtensions(extensions)\n const extensionAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n\n if (!(content instanceof Node)) {\n content = Node.fromJSON(getSchemaByResolvedExtensions(extensions), content)\n }\n\n return renderer({\n ...options,\n nodeMapping: {\n ...Object.fromEntries(\n nodeExtensions\n .filter(e => {\n if (e.name in mapDefinedTypes) {\n // These are predefined types that we don't need to map\n return false\n }\n // No need to generate mappings for nodes that are already mapped\n if (options?.nodeMapping) {\n return !(e.name in options.nodeMapping)\n }\n return true\n })\n .map(nodeExtension =>\n mapNodeExtensionToReactNode<T>(domOutputSpecToElement, nodeExtension, extensionAttributes, options),\n ),\n ),\n ...mapDefinedTypes,\n ...options?.nodeMapping,\n },\n markMapping: {\n ...Object.fromEntries(\n markExtensions\n .filter(e => {\n // No need to generate mappings for marks that are already mapped\n if (options?.markMapping) {\n return !(e.name in options.markMapping)\n }\n return true\n })\n .map(mark => mapMarkExtensionToReactNode<T>(domOutputSpecToElement, mark, extensionAttributes, options)),\n ),\n ...options?.markMapping,\n },\n })({ content })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\n\nimport {\n renderJSONContentToString,\n serializeAttrsToHTMLString,\n serializeChildrenToHTMLString,\n} from '../../json/html-string/string.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\nexport { serializeAttrsToHTMLString, serializeChildrenToHTMLString } from '../../json/html-string/string.js'\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a string\n * @param content The DOMOutputSpec to convert to a string\n * @returns A function that can render the DOMOutputSpec to a string\n */\nexport function domOutputSpecToHTMLString(content: DOMOutputSpec): (children?: string | string[]) => string {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n const [_tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n let tag = _tag\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = `${parts[1]} xmlns=\"${parts[0]}\"`\n }\n\n if (attrs === undefined) {\n return () => `<${tag}/>`\n }\n if (attrs === 0) {\n return child => `<${tag}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n if (children === 0) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n return child =>\n `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))}</${tag}>`\n }\n if (children === undefined) {\n return () => `<${tag}${serializeAttrsToHTMLString(attrs)}/>`\n }\n if (children === 0) {\n return child => `<${tag}${serializeAttrsToHTMLString(attrs)}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n\n return child =>\n `<${tag}${serializeAttrsToHTMLString(attrs)}>${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))\n .join('')}</${tag}>`\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to HTML using the provided extensions and options\n * @param content The content to render to HTML\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The rendered HTML string\n */\nexport function renderToHTMLString({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<string, Mark, Node>>\n}): string {\n return renderToElement<string>({\n renderer: renderJSONContentToString,\n domOutputSpecToElement: domOutputSpecToHTMLString,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => serializeChildrenToHTMLString(children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n","import type { Extensions, JSONContent } from '@tiptap/core'\nimport type { Mark, Node } from '@tiptap/pm/model'\n\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToHTMLString, serializeChildrenToHTMLString } from '../html-string/html-string.js'\n\n/**\n * This code is just to show the flexibility of this renderer. We can potentially render content to any format we want.\n * This is a simple example of how we can render content to markdown. This is not a full implementation of a markdown renderer.\n */\nexport function renderToMarkdown({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<string, Mark, Node>>\n}) {\n return renderToHTMLString({\n content,\n extensions,\n options: {\n nodeMapping: {\n bulletList({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}`\n },\n orderedList({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}`\n },\n listItem({ node, children, parent }) {\n if (parent?.type.name === 'bulletList') {\n return `- ${serializeChildrenToHTMLString(children).trim()}\\n`\n }\n if (parent?.type.name === 'orderedList') {\n let number = parent.attrs.start || 1\n\n parent.forEach((parentChild, _offset, index) => {\n if (node === parentChild) {\n number = index + 1\n }\n })\n\n return `${number}. ${serializeChildrenToHTMLString(children).trim()}\\n`\n }\n\n return serializeChildrenToHTMLString(children)\n },\n paragraph({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)}\\n`\n },\n heading({ node, children }) {\n const level = node.attrs.level as number\n\n return `${new Array(level).fill('#').join('')} ${children}\\n`\n },\n codeBlock({ node, children }) {\n return `\\n\\`\\`\\`${node.attrs.language}\\n${serializeChildrenToHTMLString(children)}\\n\\`\\`\\`\\n`\n },\n blockquote({ children }) {\n return `\\n${serializeChildrenToHTMLString(children)\n .trim()\n .split('\\n')\n .map(a => `> ${a}`)\n .join('\\n')}`\n },\n image({ node }) {\n return `![${node.attrs.alt}](${node.attrs.src})`\n },\n hardBreak() {\n return '\\n'\n },\n horizontalRule() {\n return '\\n---\\n'\n },\n table({ children, node }) {\n if (!Array.isArray(children)) {\n return `\\n${serializeChildrenToHTMLString(children)}\\n`\n }\n\n return `\\n${serializeChildrenToHTMLString(children[0])}| ${new Array(node.childCount - 2).fill('---').join(' | ')} |\\n${serializeChildrenToHTMLString(children.slice(1))}\\n`\n },\n tableRow({ children }) {\n if (Array.isArray(children)) {\n return `| ${children.join(' | ')} |\\n`\n }\n return `${serializeChildrenToHTMLString(children)}\\n`\n },\n tableHeader({ children }) {\n return serializeChildrenToHTMLString(children).trim()\n },\n tableCell({ children }) {\n return serializeChildrenToHTMLString(children).trim()\n },\n ...options?.nodeMapping,\n },\n markMapping: {\n bold({ children }) {\n return `**${serializeChildrenToHTMLString(children)}**`\n },\n italic({ children, node }) {\n let isBoldToo = false\n\n // Check if the node being wrapped also has a bold mark, if so, we need to use the bold markdown syntax\n if (node?.marks.some(m => m.type.name === 'bold')) {\n isBoldToo = true\n }\n\n if (isBoldToo) {\n // If the content is bold, just wrap the bold content in italic markdown syntax with another set of asterisks\n return `*${serializeChildrenToHTMLString(children)}*`\n }\n\n return `_${serializeChildrenToHTMLString(children)}_`\n },\n code({ children }) {\n return `\\`${serializeChildrenToHTMLString(children)}\\``\n },\n strike({ children }) {\n return `~~${serializeChildrenToHTMLString(children)}~~`\n },\n underline({ children }) {\n return `<u>${serializeChildrenToHTMLString(children)}</u>`\n },\n subscript({ children }) {\n return `<sub>${serializeChildrenToHTMLString(children)}</sub>`\n },\n superscript({ children }) {\n return `<sup>${serializeChildrenToHTMLString(children)}</sup>`\n },\n link({ node, children }) {\n return `[${serializeChildrenToHTMLString(children)}](${node.attrs.href})`\n },\n highlight({ children }) {\n return `==${serializeChildrenToHTMLString(children)}==`\n },\n ...options?.markMapping,\n },\n ...options,\n },\n })\n}\n","/* eslint-disable no-plusplus, @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\nimport React from 'react'\n\nimport { renderJSONContentToReactElement } from '../../json/react/react.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\n/**\n * This function maps the attributes of a node or mark to HTML attributes\n * @param attrs The attributes to map\n * @param key The key to use for the React element\n * @returns The mapped HTML attributes as an object\n */\nexport function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {\n if (!attrs) {\n return { key }\n }\n return Object.entries(attrs).reduce(\n (acc, [name, value]) => {\n if (name === 'class') {\n return Object.assign(acc, { className: value })\n }\n\n // React expects styles to be a object\n // so we need to convert it from string to object\n if (name === 'style' && typeof value === 'string') {\n const styleObject: Record<string, string> = {}\n value.split(';').forEach(style => {\n const [styleKey, val] = style.split(':')\n if (styleKey && val) {\n // we need to turn the key into camelCase\n const camelCaseKey = styleKey.trim().replace(/-([a-z])/g, g => g[1].toUpperCase())\n styleObject[camelCaseKey] = val.trim()\n }\n })\n\n return Object.assign(acc, { style: styleObject })\n }\n\n return Object.assign(acc, { [name]: value })\n },\n { key },\n )\n}\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a React element\n * @param content The DOMOutputSpec to convert to a React element\n * @returns A function that can render the DOMOutputSpec to a React element\n */\nexport function domOutputSpecToReactElement(\n content: DOMOutputSpec,\n key = 0,\n): (children?: React.ReactNode) => React.ReactNode {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n // eslint-disable-next-line prefer-const\n let [tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = parts[1]\n if (attrs === undefined) {\n attrs = {\n xmlns: parts[0],\n }\n }\n if (attrs === 0) {\n attrs = {\n xmlns: parts[0],\n }\n children = 0\n }\n if (typeof attrs === 'object') {\n attrs = Object.assign(attrs, { xmlns: parts[0] })\n }\n }\n\n if (attrs === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()))\n }\n if (attrs === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()), child)\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n if (children === 0) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray)(child),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n if (children === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()))\n }\n if (children === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()), child)\n }\n\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(attrs, key.toString()),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to a React component using the given extensions\n * @param content The content to render to a React component\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The React element that represents the rendered content\n */\nexport function renderToReactElement({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node>>\n}): React.ReactNode {\n return renderToElement<React.ReactNode>({\n renderer: renderJSONContentToReactElement,\n domOutputSpecToElement: domOutputSpecToReactElement,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => React.createElement(React.Fragment, {}, children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n"],"mappings":"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","names":["_a","React","React"]}
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  domOutputSpecToReactElement: () => domOutputSpecToReactElement,
34
+ mapAttrsToHTMLAttributes: () => mapAttrsToHTMLAttributes,
34
35
  mapMarkExtensionToReactNode: () => mapMarkExtensionToReactNode,
35
36
  mapNodeExtensionToReactNode: () => mapNodeExtensionToReactNode,
36
37
  renderToElement: () => renderToElement,
@@ -288,6 +289,17 @@ function mapAttrsToHTMLAttributes(attrs, key) {
288
289
  if (name === "class") {
289
290
  return Object.assign(acc, { className: value });
290
291
  }
292
+ if (name === "style" && typeof value === "string") {
293
+ const styleObject = {};
294
+ value.split(";").forEach((style) => {
295
+ const [styleKey, val] = style.split(":");
296
+ if (styleKey && val) {
297
+ const camelCaseKey = styleKey.trim().replace(/-([a-z])/g, (g) => g[1].toUpperCase());
298
+ styleObject[camelCaseKey] = val.trim();
299
+ }
300
+ });
301
+ return Object.assign(acc, { style: styleObject });
302
+ }
291
303
  return Object.assign(acc, { [name]: value });
292
304
  },
293
305
  { key }
@@ -391,6 +403,7 @@ function renderToReactElement({
391
403
  // Annotate the CommonJS export names for ESM import in node:
392
404
  0 && (module.exports = {
393
405
  domOutputSpecToReactElement,
406
+ mapAttrsToHTMLAttributes,
394
407
  mapMarkExtensionToReactNode,
395
408
  mapNodeExtensionToReactNode,
396
409
  renderToElement,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/pm/react/index.ts","../../../src/pm/extensionRenderer.ts","../../../src/helpers.ts","../../../src/pm/react/react.ts","../../../src/json/react/react.ts","../../../src/json/renderer.ts"],"sourcesContent":["export * from '../extensionRenderer.js'\nexport * from './react.js'\n","/* eslint-disable no-plusplus */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ExtensionAttribute,\n Extensions,\n JSONContent,\n Mark as MarkExtension,\n MarkConfig,\n Node as NodeExtension,\n NodeConfig,\n} from '@tiptap/core'\nimport {\n getAttributesFromExtensions,\n getExtensionField,\n getSchemaByResolvedExtensions,\n resolveExtensions,\n splitExtensions,\n} from '@tiptap/core'\nimport type { DOMOutputSpec, Mark } from '@tiptap/pm/model'\nimport { Node } from '@tiptap/pm/model'\n\nimport { getHTMLAttributes } from '../helpers.js'\nimport type { MarkProps, NodeProps, TiptapStaticRendererOptions } from '../json/renderer.js'\n\nexport type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T\n\n/**\n * This takes a NodeExtension and maps it to a React component\n * @param extension The node extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapNodeExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: NodeExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledNode'>>,\n): [string, (props: NodeProps<Node, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<NodeConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledNode) {\n return [extension.name, options.unhandledNode]\n }\n return [\n extension.name,\n () => {\n throw new Error(\n `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method, please implement it or override the corresponding \"nodeMapping\" method to have a custom rendering`,\n )\n },\n ]\n }\n\n return [\n extension.name,\n ({ node, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n node,\n HTMLAttributes: getHTMLAttributes(node, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Node ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This takes a MarkExtension and maps it to a React component\n * @param extension The mark extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapMarkExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: MarkExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledMark'>>,\n): [string, (props: MarkProps<Mark, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<MarkConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledMark) {\n return [extension.name, options.unhandledMark]\n }\n return [\n extension.name,\n () => {\n throw new Error(`Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method`)\n },\n ]\n }\n\n return [\n extension.name,\n ({ mark, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n mark,\n HTMLAttributes: getHTMLAttributes(mark, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Mark ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This function will statically render a Prosemirror Node to a target element type using the given extensions\n * @param renderer The renderer to use to render the Prosemirror Node to the target element type\n * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type\n * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type\n * @param content The Prosemirror Node to render\n * @param extensions The extensions to use to render the Prosemirror Node\n * @param options Additional options to pass to the renderer that can override the default behavior\n * @returns The rendered target element type\n */\nexport function renderToElement<T>({\n renderer,\n domOutputSpecToElement,\n mapDefinedTypes,\n content,\n extensions,\n options,\n}: {\n renderer: (options: TiptapStaticRendererOptions<T, Mark, Node>) => (ctx: { content: Node }) => T\n domOutputSpecToElement: DomOutputSpecToElement<T>\n mapDefinedTypes: {\n doc: (props: NodeProps<Node, T | T[]>) => T\n text: (props: NodeProps<Node, T | T[]>) => T\n }\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<T, Mark, Node>>\n}): T {\n // get all extensions in order & split them into nodes and marks\n extensions = resolveExtensions(extensions)\n const extensionAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n\n if (!(content instanceof Node)) {\n content = Node.fromJSON(getSchemaByResolvedExtensions(extensions), content)\n }\n\n return renderer({\n ...options,\n nodeMapping: {\n ...Object.fromEntries(\n nodeExtensions\n .filter(e => {\n if (e.name in mapDefinedTypes) {\n // These are predefined types that we don't need to map\n return false\n }\n // No need to generate mappings for nodes that are already mapped\n if (options?.nodeMapping) {\n return !(e.name in options.nodeMapping)\n }\n return true\n })\n .map(nodeExtension =>\n mapNodeExtensionToReactNode<T>(domOutputSpecToElement, nodeExtension, extensionAttributes, options),\n ),\n ),\n ...mapDefinedTypes,\n ...options?.nodeMapping,\n },\n markMapping: {\n ...Object.fromEntries(\n markExtensions\n .filter(e => {\n // No need to generate mappings for marks that are already mapped\n if (options?.markMapping) {\n return !(e.name in options.markMapping)\n }\n return true\n })\n .map(mark => mapMarkExtensionToReactNode<T>(domOutputSpecToElement, mark, extensionAttributes, options)),\n ),\n ...options?.markMapping,\n },\n })({ content })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ExtensionAttribute, type MarkType, type NodeType, mergeAttributes } from '@tiptap/core'\n\n/**\n * This function returns the attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n * @param onlyRenderedAttributes If true, only attributes that are rendered in the HTML are returned\n */\nexport function getAttributes(\n nodeOrMark: NodeType | MarkType,\n extensionAttributes: ExtensionAttribute[],\n onlyRenderedAttributes?: boolean,\n): Record<string, any> {\n const nodeOrMarkAttributes = nodeOrMark.attrs\n\n if (!nodeOrMarkAttributes) {\n return {}\n }\n\n return extensionAttributes\n .filter(item => {\n if (item.type !== (typeof nodeOrMark.type === 'string' ? nodeOrMark.type : nodeOrMark.type.name)) {\n return false\n }\n if (onlyRenderedAttributes) {\n return item.attribute.rendered\n }\n return true\n })\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n }\n\n return (\n item.attribute.renderHTML(nodeOrMarkAttributes) || {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n )\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n\n/**\n * This function returns the HTML attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n */\nexport function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAttributes: ExtensionAttribute[]) {\n return getAttributes(nodeOrMark, extensionAttributes, true)\n}\n","/* eslint-disable no-plusplus, @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\nimport React from 'react'\n\nimport { renderJSONContentToReactElement } from '../../json/react/react.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\n/**\n * This function maps the attributes of a node or mark to HTML attributes\n * @param attrs The attributes to map\n * @param key The key to use for the React element\n * @returns The mapped HTML attributes as an object\n */\nfunction mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {\n if (!attrs) {\n return { key }\n }\n return Object.entries(attrs).reduce(\n (acc, [name, value]) => {\n if (name === 'class') {\n return Object.assign(acc, { className: value })\n }\n return Object.assign(acc, { [name]: value })\n },\n { key },\n )\n}\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a React element\n * @param content The DOMOutputSpec to convert to a React element\n * @returns A function that can render the DOMOutputSpec to a React element\n */\nexport function domOutputSpecToReactElement(\n content: DOMOutputSpec,\n key = 0,\n): (children?: React.ReactNode) => React.ReactNode {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n // eslint-disable-next-line prefer-const\n let [tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = parts[1]\n if (attrs === undefined) {\n attrs = {\n xmlns: parts[0],\n }\n }\n if (attrs === 0) {\n attrs = {\n xmlns: parts[0],\n }\n children = 0\n }\n if (typeof attrs === 'object') {\n attrs = Object.assign(attrs, { xmlns: parts[0] })\n }\n }\n\n if (attrs === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()))\n }\n if (attrs === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()), child)\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n if (children === 0) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray)(child),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n if (children === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()))\n }\n if (children === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()), child)\n }\n\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(attrs, key.toString()),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to a React component using the given extensions\n * @param content The content to render to a React component\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The React element that represents the rendered content\n */\nexport function renderToReactElement({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node>>\n}): React.ReactNode {\n return renderToElement<React.ReactNode>({\n renderer: renderJSONContentToReactElement,\n domOutputSpecToElement: domOutputSpecToReactElement,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => React.createElement(React.Fragment, {}, children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { MarkType, NodeType } from '@tiptap/core'\nimport React from 'react'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToReactElement<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<React.ReactNode, TMarkType, TNodeType>) {\n let key = 0\n\n return TiptapStaticRenderer<React.ReactNode, TMarkType, TNodeType>(({ component, props: { children, ...props } }) => {\n return React.createElement(\n component as React.FC<typeof props>,\n // eslint-disable-next-line no-plusplus\n Object.assign(props, { key: key++ }),\n ([] as React.ReactNode[]).concat(children),\n )\n }, options)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\n/**\n * Props for a node renderer\n */\nexport type NodeProps<TNodeType = any, TChildren = any> = {\n /**\n * The current node to render\n */\n node: TNodeType\n /**\n * Unless the node is the root node, this will always be defined\n */\n parent?: TNodeType\n /**\n * The children of the current node\n */\n children?: TChildren\n /**\n * Render a child element\n */\n renderElement: (props: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }) => TChildren\n}\n\n/**\n * Props for a mark renderer\n */\nexport type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {\n /**\n * The current mark to render\n */\n mark: TMarkType\n /**\n * The children of the current mark\n */\n children?: TChildren\n /**\n * The node the current mark is applied to\n */\n node: TNodeType\n /**\n * The node the current mark is applied to\n */\n parent?: TNodeType\n}\n\nexport type TiptapStaticRendererOptions<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n> = {\n /**\n * Mapping of node types to react components\n */\n nodeMapping: Record<string, NoInfer<TNodeRender>>\n /**\n * Mapping of mark types to react components\n */\n markMapping: Record<string, NoInfer<TMarkRender>>\n /**\n * Component to render if a node type is not handled\n */\n unhandledNode?: NoInfer<TNodeRender>\n /**\n * Component to render if a mark type is not handled\n */\n unhandledMark?: NoInfer<TMarkRender>\n}\n\n/**\n * Tiptap Static Renderer\n * ----------------------\n *\n * This function is a basis to allow for different renderers to be created.\n * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.\n *\n * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document\n * and renders it using a mapping of node types to React components or even to a string.\n * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.\n */\nexport function TiptapStaticRenderer<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: string | { name: string } } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n>(\n /**\n * The function that actually renders the component\n */\n renderComponent: (\n ctx:\n | {\n component: TNodeRender\n props: NodeProps<TNodeType, TReturnType | TReturnType[]>\n }\n | {\n component: TMarkRender\n props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>\n },\n ) => TReturnType,\n {\n nodeMapping,\n markMapping,\n unhandledNode,\n unhandledMark,\n }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>,\n) {\n /**\n * Render Tiptap JSON and all its children using the provided node and mark mappings.\n */\n return function renderContent({\n content,\n parent,\n }: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }): TReturnType {\n const nodeType = typeof content.type === 'string' ? content.type : content.type.name\n const NodeHandler = nodeMapping[nodeType] ?? unhandledNode\n\n if (!NodeHandler) {\n throw new Error(`missing handler for node type ${nodeType}`)\n }\n\n const nodeContent = renderComponent({\n component: NodeHandler,\n props: {\n node: content,\n parent,\n renderElement: renderContent,\n // Lazily compute the children to avoid unnecessary recursion\n get children() {\n // recursively render child content nodes\n const children: TReturnType[] = []\n\n if (content.content) {\n content.content.forEach(child => {\n children.push(\n renderContent({\n content: child,\n parent: content,\n }),\n )\n })\n }\n\n return children\n },\n },\n })\n\n // apply marks to the content\n const markedContent = content.marks\n ? content.marks.reduce((acc, mark) => {\n const markType = typeof mark.type === 'string' ? mark.type : mark.type.name\n const MarkHandler = markMapping[markType] ?? unhandledMark\n\n if (!MarkHandler) {\n throw new Error(`missing handler for mark type ${markType}`)\n }\n\n return renderComponent({\n component: MarkHandler,\n props: {\n mark,\n parent,\n node: content,\n children: acc,\n },\n })\n }, nodeContent)\n : nodeContent\n\n return markedContent\n }\n}\n"],"mappings":"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","names":["import_core","import_react","_a","React","React"]}
1
+ {"version":3,"sources":["../../../src/pm/react/index.ts","../../../src/pm/extensionRenderer.ts","../../../src/helpers.ts","../../../src/pm/react/react.ts","../../../src/json/react/react.ts","../../../src/json/renderer.ts"],"sourcesContent":["export * from '../extensionRenderer.js'\nexport * from './react.js'\n","/* eslint-disable no-plusplus */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ExtensionAttribute,\n Extensions,\n JSONContent,\n Mark as MarkExtension,\n MarkConfig,\n Node as NodeExtension,\n NodeConfig,\n} from '@tiptap/core'\nimport {\n getAttributesFromExtensions,\n getExtensionField,\n getSchemaByResolvedExtensions,\n resolveExtensions,\n splitExtensions,\n} from '@tiptap/core'\nimport type { DOMOutputSpec, Mark } from '@tiptap/pm/model'\nimport { Node } from '@tiptap/pm/model'\n\nimport { getHTMLAttributes } from '../helpers.js'\nimport type { MarkProps, NodeProps, TiptapStaticRendererOptions } from '../json/renderer.js'\n\nexport type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T\n\n/**\n * This takes a NodeExtension and maps it to a React component\n * @param extension The node extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapNodeExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: NodeExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledNode'>>,\n): [string, (props: NodeProps<Node, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<NodeConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledNode) {\n return [extension.name, options.unhandledNode]\n }\n return [\n extension.name,\n () => {\n throw new Error(\n `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method, please implement it or override the corresponding \"nodeMapping\" method to have a custom rendering`,\n )\n },\n ]\n }\n\n return [\n extension.name,\n ({ node, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n node,\n HTMLAttributes: getHTMLAttributes(node, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Node ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This takes a MarkExtension and maps it to a React component\n * @param extension The mark extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapMarkExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: MarkExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledMark'>>,\n): [string, (props: MarkProps<Mark, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<MarkConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledMark) {\n return [extension.name, options.unhandledMark]\n }\n return [\n extension.name,\n () => {\n throw new Error(`Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method`)\n },\n ]\n }\n\n return [\n extension.name,\n ({ mark, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n mark,\n HTMLAttributes: getHTMLAttributes(mark, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Mark ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This function will statically render a Prosemirror Node to a target element type using the given extensions\n * @param renderer The renderer to use to render the Prosemirror Node to the target element type\n * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type\n * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type\n * @param content The Prosemirror Node to render\n * @param extensions The extensions to use to render the Prosemirror Node\n * @param options Additional options to pass to the renderer that can override the default behavior\n * @returns The rendered target element type\n */\nexport function renderToElement<T>({\n renderer,\n domOutputSpecToElement,\n mapDefinedTypes,\n content,\n extensions,\n options,\n}: {\n renderer: (options: TiptapStaticRendererOptions<T, Mark, Node>) => (ctx: { content: Node }) => T\n domOutputSpecToElement: DomOutputSpecToElement<T>\n mapDefinedTypes: {\n doc: (props: NodeProps<Node, T | T[]>) => T\n text: (props: NodeProps<Node, T | T[]>) => T\n }\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<T, Mark, Node>>\n}): T {\n // get all extensions in order & split them into nodes and marks\n extensions = resolveExtensions(extensions)\n const extensionAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n\n if (!(content instanceof Node)) {\n content = Node.fromJSON(getSchemaByResolvedExtensions(extensions), content)\n }\n\n return renderer({\n ...options,\n nodeMapping: {\n ...Object.fromEntries(\n nodeExtensions\n .filter(e => {\n if (e.name in mapDefinedTypes) {\n // These are predefined types that we don't need to map\n return false\n }\n // No need to generate mappings for nodes that are already mapped\n if (options?.nodeMapping) {\n return !(e.name in options.nodeMapping)\n }\n return true\n })\n .map(nodeExtension =>\n mapNodeExtensionToReactNode<T>(domOutputSpecToElement, nodeExtension, extensionAttributes, options),\n ),\n ),\n ...mapDefinedTypes,\n ...options?.nodeMapping,\n },\n markMapping: {\n ...Object.fromEntries(\n markExtensions\n .filter(e => {\n // No need to generate mappings for marks that are already mapped\n if (options?.markMapping) {\n return !(e.name in options.markMapping)\n }\n return true\n })\n .map(mark => mapMarkExtensionToReactNode<T>(domOutputSpecToElement, mark, extensionAttributes, options)),\n ),\n ...options?.markMapping,\n },\n })({ content })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ExtensionAttribute, type MarkType, type NodeType, mergeAttributes } from '@tiptap/core'\n\n/**\n * This function returns the attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n * @param onlyRenderedAttributes If true, only attributes that are rendered in the HTML are returned\n */\nexport function getAttributes(\n nodeOrMark: NodeType | MarkType,\n extensionAttributes: ExtensionAttribute[],\n onlyRenderedAttributes?: boolean,\n): Record<string, any> {\n const nodeOrMarkAttributes = nodeOrMark.attrs\n\n if (!nodeOrMarkAttributes) {\n return {}\n }\n\n return extensionAttributes\n .filter(item => {\n if (item.type !== (typeof nodeOrMark.type === 'string' ? nodeOrMark.type : nodeOrMark.type.name)) {\n return false\n }\n if (onlyRenderedAttributes) {\n return item.attribute.rendered\n }\n return true\n })\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n }\n\n return (\n item.attribute.renderHTML(nodeOrMarkAttributes) || {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n )\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n\n/**\n * This function returns the HTML attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n */\nexport function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAttributes: ExtensionAttribute[]) {\n return getAttributes(nodeOrMark, extensionAttributes, true)\n}\n","/* eslint-disable no-plusplus, @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\nimport React from 'react'\n\nimport { renderJSONContentToReactElement } from '../../json/react/react.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\n/**\n * This function maps the attributes of a node or mark to HTML attributes\n * @param attrs The attributes to map\n * @param key The key to use for the React element\n * @returns The mapped HTML attributes as an object\n */\nexport function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {\n if (!attrs) {\n return { key }\n }\n return Object.entries(attrs).reduce(\n (acc, [name, value]) => {\n if (name === 'class') {\n return Object.assign(acc, { className: value })\n }\n\n // React expects styles to be a object\n // so we need to convert it from string to object\n if (name === 'style' && typeof value === 'string') {\n const styleObject: Record<string, string> = {}\n value.split(';').forEach(style => {\n const [styleKey, val] = style.split(':')\n if (styleKey && val) {\n // we need to turn the key into camelCase\n const camelCaseKey = styleKey.trim().replace(/-([a-z])/g, g => g[1].toUpperCase())\n styleObject[camelCaseKey] = val.trim()\n }\n })\n\n return Object.assign(acc, { style: styleObject })\n }\n\n return Object.assign(acc, { [name]: value })\n },\n { key },\n )\n}\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a React element\n * @param content The DOMOutputSpec to convert to a React element\n * @returns A function that can render the DOMOutputSpec to a React element\n */\nexport function domOutputSpecToReactElement(\n content: DOMOutputSpec,\n key = 0,\n): (children?: React.ReactNode) => React.ReactNode {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n // eslint-disable-next-line prefer-const\n let [tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = parts[1]\n if (attrs === undefined) {\n attrs = {\n xmlns: parts[0],\n }\n }\n if (attrs === 0) {\n attrs = {\n xmlns: parts[0],\n }\n children = 0\n }\n if (typeof attrs === 'object') {\n attrs = Object.assign(attrs, { xmlns: parts[0] })\n }\n }\n\n if (attrs === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()))\n }\n if (attrs === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()), child)\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n if (children === 0) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray)(child),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n if (children === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()))\n }\n if (children === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()), child)\n }\n\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(attrs, key.toString()),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to a React component using the given extensions\n * @param content The content to render to a React component\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The React element that represents the rendered content\n */\nexport function renderToReactElement({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node>>\n}): React.ReactNode {\n return renderToElement<React.ReactNode>({\n renderer: renderJSONContentToReactElement,\n domOutputSpecToElement: domOutputSpecToReactElement,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => React.createElement(React.Fragment, {}, children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { MarkType, NodeType } from '@tiptap/core'\nimport React from 'react'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToReactElement<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<React.ReactNode, TMarkType, TNodeType>) {\n let key = 0\n\n return TiptapStaticRenderer<React.ReactNode, TMarkType, TNodeType>(({ component, props: { children, ...props } }) => {\n return React.createElement(\n component as React.FC<typeof props>,\n // eslint-disable-next-line no-plusplus\n Object.assign(props, { key: key++ }),\n ([] as React.ReactNode[]).concat(children),\n )\n }, options)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\n/**\n * Props for a node renderer\n */\nexport type NodeProps<TNodeType = any, TChildren = any> = {\n /**\n * The current node to render\n */\n node: TNodeType\n /**\n * Unless the node is the root node, this will always be defined\n */\n parent?: TNodeType\n /**\n * The children of the current node\n */\n children?: TChildren\n /**\n * Render a child element\n */\n renderElement: (props: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }) => TChildren\n}\n\n/**\n * Props for a mark renderer\n */\nexport type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {\n /**\n * The current mark to render\n */\n mark: TMarkType\n /**\n * The children of the current mark\n */\n children?: TChildren\n /**\n * The node the current mark is applied to\n */\n node: TNodeType\n /**\n * The node the current mark is applied to\n */\n parent?: TNodeType\n}\n\nexport type TiptapStaticRendererOptions<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n> = {\n /**\n * Mapping of node types to react components\n */\n nodeMapping: Record<string, NoInfer<TNodeRender>>\n /**\n * Mapping of mark types to react components\n */\n markMapping: Record<string, NoInfer<TMarkRender>>\n /**\n * Component to render if a node type is not handled\n */\n unhandledNode?: NoInfer<TNodeRender>\n /**\n * Component to render if a mark type is not handled\n */\n unhandledMark?: NoInfer<TMarkRender>\n}\n\n/**\n * Tiptap Static Renderer\n * ----------------------\n *\n * This function is a basis to allow for different renderers to be created.\n * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.\n *\n * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document\n * and renders it using a mapping of node types to React components or even to a string.\n * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.\n */\nexport function TiptapStaticRenderer<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: string | { name: string } } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n>(\n /**\n * The function that actually renders the component\n */\n renderComponent: (\n ctx:\n | {\n component: TNodeRender\n props: NodeProps<TNodeType, TReturnType | TReturnType[]>\n }\n | {\n component: TMarkRender\n props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>\n },\n ) => TReturnType,\n {\n nodeMapping,\n markMapping,\n unhandledNode,\n unhandledMark,\n }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>,\n) {\n /**\n * Render Tiptap JSON and all its children using the provided node and mark mappings.\n */\n return function renderContent({\n content,\n parent,\n }: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }): TReturnType {\n const nodeType = typeof content.type === 'string' ? content.type : content.type.name\n const NodeHandler = nodeMapping[nodeType] ?? unhandledNode\n\n if (!NodeHandler) {\n throw new Error(`missing handler for node type ${nodeType}`)\n }\n\n const nodeContent = renderComponent({\n component: NodeHandler,\n props: {\n node: content,\n parent,\n renderElement: renderContent,\n // Lazily compute the children to avoid unnecessary recursion\n get children() {\n // recursively render child content nodes\n const children: TReturnType[] = []\n\n if (content.content) {\n content.content.forEach(child => {\n children.push(\n renderContent({\n content: child,\n parent: content,\n }),\n )\n })\n }\n\n return children\n },\n },\n })\n\n // apply marks to the content\n const markedContent = content.marks\n ? content.marks.reduce((acc, mark) => {\n const markType = typeof mark.type === 'string' ? mark.type : mark.type.name\n const MarkHandler = markMapping[markType] ?? unhandledMark\n\n if (!MarkHandler) {\n throw new Error(`missing handler for mark type ${markType}`)\n }\n\n return renderComponent({\n component: MarkHandler,\n props: {\n mark,\n parent,\n node: content,\n children: acc,\n },\n })\n }, nodeContent)\n : nodeContent\n\n return markedContent\n }\n}\n"],"mappings":"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","names":["import_core","import_react","_a","React","React"]}
@@ -141,6 +141,13 @@ declare function renderToElement<T>({ renderer, domOutputSpecToElement, mapDefin
141
141
  options?: Partial<TiptapStaticRendererOptions<T, Mark, Node$1>>;
142
142
  }): T;
143
143
 
144
+ /**
145
+ * This function maps the attributes of a node or mark to HTML attributes
146
+ * @param attrs The attributes to map
147
+ * @param key The key to use for the React element
148
+ * @returns The mapped HTML attributes as an object
149
+ */
150
+ declare function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any>;
144
151
  /**
145
152
  * Take a DOMOutputSpec and return a function that can render it to a React element
146
153
  * @param content The DOMOutputSpec to convert to a React element
@@ -160,4 +167,4 @@ declare function renderToReactElement({ content, extensions, options, }: {
160
167
  options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node$1>>;
161
168
  }): React.ReactNode;
162
169
 
163
- export { type DomOutputSpecToElement, domOutputSpecToReactElement, mapMarkExtensionToReactNode, mapNodeExtensionToReactNode, renderToElement, renderToReactElement };
170
+ export { type DomOutputSpecToElement, domOutputSpecToReactElement, mapAttrsToHTMLAttributes, mapMarkExtensionToReactNode, mapNodeExtensionToReactNode, renderToElement, renderToReactElement };
@@ -141,6 +141,13 @@ declare function renderToElement<T>({ renderer, domOutputSpecToElement, mapDefin
141
141
  options?: Partial<TiptapStaticRendererOptions<T, Mark, Node$1>>;
142
142
  }): T;
143
143
 
144
+ /**
145
+ * This function maps the attributes of a node or mark to HTML attributes
146
+ * @param attrs The attributes to map
147
+ * @param key The key to use for the React element
148
+ * @returns The mapped HTML attributes as an object
149
+ */
150
+ declare function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any>;
144
151
  /**
145
152
  * Take a DOMOutputSpec and return a function that can render it to a React element
146
153
  * @param content The DOMOutputSpec to convert to a React element
@@ -160,4 +167,4 @@ declare function renderToReactElement({ content, extensions, options, }: {
160
167
  options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node$1>>;
161
168
  }): React.ReactNode;
162
169
 
163
- export { type DomOutputSpecToElement, domOutputSpecToReactElement, mapMarkExtensionToReactNode, mapNodeExtensionToReactNode, renderToElement, renderToReactElement };
170
+ export { type DomOutputSpecToElement, domOutputSpecToReactElement, mapAttrsToHTMLAttributes, mapMarkExtensionToReactNode, mapNodeExtensionToReactNode, renderToElement, renderToReactElement };
@@ -254,6 +254,17 @@ function mapAttrsToHTMLAttributes(attrs, key) {
254
254
  if (name === "class") {
255
255
  return Object.assign(acc, { className: value });
256
256
  }
257
+ if (name === "style" && typeof value === "string") {
258
+ const styleObject = {};
259
+ value.split(";").forEach((style) => {
260
+ const [styleKey, val] = style.split(":");
261
+ if (styleKey && val) {
262
+ const camelCaseKey = styleKey.trim().replace(/-([a-z])/g, (g) => g[1].toUpperCase());
263
+ styleObject[camelCaseKey] = val.trim();
264
+ }
265
+ });
266
+ return Object.assign(acc, { style: styleObject });
267
+ }
257
268
  return Object.assign(acc, { [name]: value });
258
269
  },
259
270
  { key }
@@ -356,6 +367,7 @@ function renderToReactElement({
356
367
  }
357
368
  export {
358
369
  domOutputSpecToReactElement,
370
+ mapAttrsToHTMLAttributes,
359
371
  mapMarkExtensionToReactNode,
360
372
  mapNodeExtensionToReactNode,
361
373
  renderToElement,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/pm/extensionRenderer.ts","../../../src/helpers.ts","../../../src/pm/react/react.ts","../../../src/json/react/react.ts","../../../src/json/renderer.ts"],"sourcesContent":["/* eslint-disable no-plusplus */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ExtensionAttribute,\n Extensions,\n JSONContent,\n Mark as MarkExtension,\n MarkConfig,\n Node as NodeExtension,\n NodeConfig,\n} from '@tiptap/core'\nimport {\n getAttributesFromExtensions,\n getExtensionField,\n getSchemaByResolvedExtensions,\n resolveExtensions,\n splitExtensions,\n} from '@tiptap/core'\nimport type { DOMOutputSpec, Mark } from '@tiptap/pm/model'\nimport { Node } from '@tiptap/pm/model'\n\nimport { getHTMLAttributes } from '../helpers.js'\nimport type { MarkProps, NodeProps, TiptapStaticRendererOptions } from '../json/renderer.js'\n\nexport type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T\n\n/**\n * This takes a NodeExtension and maps it to a React component\n * @param extension The node extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapNodeExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: NodeExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledNode'>>,\n): [string, (props: NodeProps<Node, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<NodeConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledNode) {\n return [extension.name, options.unhandledNode]\n }\n return [\n extension.name,\n () => {\n throw new Error(\n `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method, please implement it or override the corresponding \"nodeMapping\" method to have a custom rendering`,\n )\n },\n ]\n }\n\n return [\n extension.name,\n ({ node, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n node,\n HTMLAttributes: getHTMLAttributes(node, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Node ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This takes a MarkExtension and maps it to a React component\n * @param extension The mark extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapMarkExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: MarkExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledMark'>>,\n): [string, (props: MarkProps<Mark, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<MarkConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledMark) {\n return [extension.name, options.unhandledMark]\n }\n return [\n extension.name,\n () => {\n throw new Error(`Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method`)\n },\n ]\n }\n\n return [\n extension.name,\n ({ mark, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n mark,\n HTMLAttributes: getHTMLAttributes(mark, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Mark ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This function will statically render a Prosemirror Node to a target element type using the given extensions\n * @param renderer The renderer to use to render the Prosemirror Node to the target element type\n * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type\n * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type\n * @param content The Prosemirror Node to render\n * @param extensions The extensions to use to render the Prosemirror Node\n * @param options Additional options to pass to the renderer that can override the default behavior\n * @returns The rendered target element type\n */\nexport function renderToElement<T>({\n renderer,\n domOutputSpecToElement,\n mapDefinedTypes,\n content,\n extensions,\n options,\n}: {\n renderer: (options: TiptapStaticRendererOptions<T, Mark, Node>) => (ctx: { content: Node }) => T\n domOutputSpecToElement: DomOutputSpecToElement<T>\n mapDefinedTypes: {\n doc: (props: NodeProps<Node, T | T[]>) => T\n text: (props: NodeProps<Node, T | T[]>) => T\n }\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<T, Mark, Node>>\n}): T {\n // get all extensions in order & split them into nodes and marks\n extensions = resolveExtensions(extensions)\n const extensionAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n\n if (!(content instanceof Node)) {\n content = Node.fromJSON(getSchemaByResolvedExtensions(extensions), content)\n }\n\n return renderer({\n ...options,\n nodeMapping: {\n ...Object.fromEntries(\n nodeExtensions\n .filter(e => {\n if (e.name in mapDefinedTypes) {\n // These are predefined types that we don't need to map\n return false\n }\n // No need to generate mappings for nodes that are already mapped\n if (options?.nodeMapping) {\n return !(e.name in options.nodeMapping)\n }\n return true\n })\n .map(nodeExtension =>\n mapNodeExtensionToReactNode<T>(domOutputSpecToElement, nodeExtension, extensionAttributes, options),\n ),\n ),\n ...mapDefinedTypes,\n ...options?.nodeMapping,\n },\n markMapping: {\n ...Object.fromEntries(\n markExtensions\n .filter(e => {\n // No need to generate mappings for marks that are already mapped\n if (options?.markMapping) {\n return !(e.name in options.markMapping)\n }\n return true\n })\n .map(mark => mapMarkExtensionToReactNode<T>(domOutputSpecToElement, mark, extensionAttributes, options)),\n ),\n ...options?.markMapping,\n },\n })({ content })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ExtensionAttribute, type MarkType, type NodeType, mergeAttributes } from '@tiptap/core'\n\n/**\n * This function returns the attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n * @param onlyRenderedAttributes If true, only attributes that are rendered in the HTML are returned\n */\nexport function getAttributes(\n nodeOrMark: NodeType | MarkType,\n extensionAttributes: ExtensionAttribute[],\n onlyRenderedAttributes?: boolean,\n): Record<string, any> {\n const nodeOrMarkAttributes = nodeOrMark.attrs\n\n if (!nodeOrMarkAttributes) {\n return {}\n }\n\n return extensionAttributes\n .filter(item => {\n if (item.type !== (typeof nodeOrMark.type === 'string' ? nodeOrMark.type : nodeOrMark.type.name)) {\n return false\n }\n if (onlyRenderedAttributes) {\n return item.attribute.rendered\n }\n return true\n })\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n }\n\n return (\n item.attribute.renderHTML(nodeOrMarkAttributes) || {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n )\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n\n/**\n * This function returns the HTML attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n */\nexport function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAttributes: ExtensionAttribute[]) {\n return getAttributes(nodeOrMark, extensionAttributes, true)\n}\n","/* eslint-disable no-plusplus, @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\nimport React from 'react'\n\nimport { renderJSONContentToReactElement } from '../../json/react/react.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\n/**\n * This function maps the attributes of a node or mark to HTML attributes\n * @param attrs The attributes to map\n * @param key The key to use for the React element\n * @returns The mapped HTML attributes as an object\n */\nfunction mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {\n if (!attrs) {\n return { key }\n }\n return Object.entries(attrs).reduce(\n (acc, [name, value]) => {\n if (name === 'class') {\n return Object.assign(acc, { className: value })\n }\n return Object.assign(acc, { [name]: value })\n },\n { key },\n )\n}\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a React element\n * @param content The DOMOutputSpec to convert to a React element\n * @returns A function that can render the DOMOutputSpec to a React element\n */\nexport function domOutputSpecToReactElement(\n content: DOMOutputSpec,\n key = 0,\n): (children?: React.ReactNode) => React.ReactNode {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n // eslint-disable-next-line prefer-const\n let [tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = parts[1]\n if (attrs === undefined) {\n attrs = {\n xmlns: parts[0],\n }\n }\n if (attrs === 0) {\n attrs = {\n xmlns: parts[0],\n }\n children = 0\n }\n if (typeof attrs === 'object') {\n attrs = Object.assign(attrs, { xmlns: parts[0] })\n }\n }\n\n if (attrs === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()))\n }\n if (attrs === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()), child)\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n if (children === 0) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray)(child),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n if (children === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()))\n }\n if (children === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()), child)\n }\n\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(attrs, key.toString()),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to a React component using the given extensions\n * @param content The content to render to a React component\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The React element that represents the rendered content\n */\nexport function renderToReactElement({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node>>\n}): React.ReactNode {\n return renderToElement<React.ReactNode>({\n renderer: renderJSONContentToReactElement,\n domOutputSpecToElement: domOutputSpecToReactElement,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => React.createElement(React.Fragment, {}, children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { MarkType, NodeType } from '@tiptap/core'\nimport React from 'react'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToReactElement<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<React.ReactNode, TMarkType, TNodeType>) {\n let key = 0\n\n return TiptapStaticRenderer<React.ReactNode, TMarkType, TNodeType>(({ component, props: { children, ...props } }) => {\n return React.createElement(\n component as React.FC<typeof props>,\n // eslint-disable-next-line no-plusplus\n Object.assign(props, { key: key++ }),\n ([] as React.ReactNode[]).concat(children),\n )\n }, options)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\n/**\n * Props for a node renderer\n */\nexport type NodeProps<TNodeType = any, TChildren = any> = {\n /**\n * The current node to render\n */\n node: TNodeType\n /**\n * Unless the node is the root node, this will always be defined\n */\n parent?: TNodeType\n /**\n * The children of the current node\n */\n children?: TChildren\n /**\n * Render a child element\n */\n renderElement: (props: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }) => TChildren\n}\n\n/**\n * Props for a mark renderer\n */\nexport type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {\n /**\n * The current mark to render\n */\n mark: TMarkType\n /**\n * The children of the current mark\n */\n children?: TChildren\n /**\n * The node the current mark is applied to\n */\n node: TNodeType\n /**\n * The node the current mark is applied to\n */\n parent?: TNodeType\n}\n\nexport type TiptapStaticRendererOptions<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n> = {\n /**\n * Mapping of node types to react components\n */\n nodeMapping: Record<string, NoInfer<TNodeRender>>\n /**\n * Mapping of mark types to react components\n */\n markMapping: Record<string, NoInfer<TMarkRender>>\n /**\n * Component to render if a node type is not handled\n */\n unhandledNode?: NoInfer<TNodeRender>\n /**\n * Component to render if a mark type is not handled\n */\n unhandledMark?: NoInfer<TMarkRender>\n}\n\n/**\n * Tiptap Static Renderer\n * ----------------------\n *\n * This function is a basis to allow for different renderers to be created.\n * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.\n *\n * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document\n * and renders it using a mapping of node types to React components or even to a string.\n * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.\n */\nexport function TiptapStaticRenderer<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: string | { name: string } } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n>(\n /**\n * The function that actually renders the component\n */\n renderComponent: (\n ctx:\n | {\n component: TNodeRender\n props: NodeProps<TNodeType, TReturnType | TReturnType[]>\n }\n | {\n component: TMarkRender\n props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>\n },\n ) => TReturnType,\n {\n nodeMapping,\n markMapping,\n unhandledNode,\n unhandledMark,\n }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>,\n) {\n /**\n * Render Tiptap JSON and all its children using the provided node and mark mappings.\n */\n return function renderContent({\n content,\n parent,\n }: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }): TReturnType {\n const nodeType = typeof content.type === 'string' ? content.type : content.type.name\n const NodeHandler = nodeMapping[nodeType] ?? unhandledNode\n\n if (!NodeHandler) {\n throw new Error(`missing handler for node type ${nodeType}`)\n }\n\n const nodeContent = renderComponent({\n component: NodeHandler,\n props: {\n node: content,\n parent,\n renderElement: renderContent,\n // Lazily compute the children to avoid unnecessary recursion\n get children() {\n // recursively render child content nodes\n const children: TReturnType[] = []\n\n if (content.content) {\n content.content.forEach(child => {\n children.push(\n renderContent({\n content: child,\n parent: content,\n }),\n )\n })\n }\n\n return children\n },\n },\n })\n\n // apply marks to the content\n const markedContent = content.marks\n ? content.marks.reduce((acc, mark) => {\n const markType = typeof mark.type === 'string' ? mark.type : mark.type.name\n const MarkHandler = markMapping[markType] ?? unhandledMark\n\n if (!MarkHandler) {\n throw new Error(`missing handler for mark type ${markType}`)\n }\n\n return renderComponent({\n component: MarkHandler,\n props: {\n mark,\n parent,\n node: content,\n children: acc,\n },\n })\n }, nodeContent)\n : nodeContent\n\n return markedContent\n }\n}\n"],"mappings":"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","names":["React","_a","React"]}
1
+ {"version":3,"sources":["../../../src/pm/extensionRenderer.ts","../../../src/helpers.ts","../../../src/pm/react/react.ts","../../../src/json/react/react.ts","../../../src/json/renderer.ts"],"sourcesContent":["/* eslint-disable no-plusplus */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ExtensionAttribute,\n Extensions,\n JSONContent,\n Mark as MarkExtension,\n MarkConfig,\n Node as NodeExtension,\n NodeConfig,\n} from '@tiptap/core'\nimport {\n getAttributesFromExtensions,\n getExtensionField,\n getSchemaByResolvedExtensions,\n resolveExtensions,\n splitExtensions,\n} from '@tiptap/core'\nimport type { DOMOutputSpec, Mark } from '@tiptap/pm/model'\nimport { Node } from '@tiptap/pm/model'\n\nimport { getHTMLAttributes } from '../helpers.js'\nimport type { MarkProps, NodeProps, TiptapStaticRendererOptions } from '../json/renderer.js'\n\nexport type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T\n\n/**\n * This takes a NodeExtension and maps it to a React component\n * @param extension The node extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapNodeExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: NodeExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledNode'>>,\n): [string, (props: NodeProps<Node, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<NodeConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledNode) {\n return [extension.name, options.unhandledNode]\n }\n return [\n extension.name,\n () => {\n throw new Error(\n `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method, please implement it or override the corresponding \"nodeMapping\" method to have a custom rendering`,\n )\n },\n ]\n }\n\n return [\n extension.name,\n ({ node, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n node,\n HTMLAttributes: getHTMLAttributes(node, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Node ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This takes a MarkExtension and maps it to a React component\n * @param extension The mark extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapMarkExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: MarkExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledMark'>>,\n): [string, (props: MarkProps<Mark, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<MarkConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledMark) {\n return [extension.name, options.unhandledMark]\n }\n return [\n extension.name,\n () => {\n throw new Error(`Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method`)\n },\n ]\n }\n\n return [\n extension.name,\n ({ mark, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n mark,\n HTMLAttributes: getHTMLAttributes(mark, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Mark ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This function will statically render a Prosemirror Node to a target element type using the given extensions\n * @param renderer The renderer to use to render the Prosemirror Node to the target element type\n * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type\n * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type\n * @param content The Prosemirror Node to render\n * @param extensions The extensions to use to render the Prosemirror Node\n * @param options Additional options to pass to the renderer that can override the default behavior\n * @returns The rendered target element type\n */\nexport function renderToElement<T>({\n renderer,\n domOutputSpecToElement,\n mapDefinedTypes,\n content,\n extensions,\n options,\n}: {\n renderer: (options: TiptapStaticRendererOptions<T, Mark, Node>) => (ctx: { content: Node }) => T\n domOutputSpecToElement: DomOutputSpecToElement<T>\n mapDefinedTypes: {\n doc: (props: NodeProps<Node, T | T[]>) => T\n text: (props: NodeProps<Node, T | T[]>) => T\n }\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<T, Mark, Node>>\n}): T {\n // get all extensions in order & split them into nodes and marks\n extensions = resolveExtensions(extensions)\n const extensionAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n\n if (!(content instanceof Node)) {\n content = Node.fromJSON(getSchemaByResolvedExtensions(extensions), content)\n }\n\n return renderer({\n ...options,\n nodeMapping: {\n ...Object.fromEntries(\n nodeExtensions\n .filter(e => {\n if (e.name in mapDefinedTypes) {\n // These are predefined types that we don't need to map\n return false\n }\n // No need to generate mappings for nodes that are already mapped\n if (options?.nodeMapping) {\n return !(e.name in options.nodeMapping)\n }\n return true\n })\n .map(nodeExtension =>\n mapNodeExtensionToReactNode<T>(domOutputSpecToElement, nodeExtension, extensionAttributes, options),\n ),\n ),\n ...mapDefinedTypes,\n ...options?.nodeMapping,\n },\n markMapping: {\n ...Object.fromEntries(\n markExtensions\n .filter(e => {\n // No need to generate mappings for marks that are already mapped\n if (options?.markMapping) {\n return !(e.name in options.markMapping)\n }\n return true\n })\n .map(mark => mapMarkExtensionToReactNode<T>(domOutputSpecToElement, mark, extensionAttributes, options)),\n ),\n ...options?.markMapping,\n },\n })({ content })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ExtensionAttribute, type MarkType, type NodeType, mergeAttributes } from '@tiptap/core'\n\n/**\n * This function returns the attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n * @param onlyRenderedAttributes If true, only attributes that are rendered in the HTML are returned\n */\nexport function getAttributes(\n nodeOrMark: NodeType | MarkType,\n extensionAttributes: ExtensionAttribute[],\n onlyRenderedAttributes?: boolean,\n): Record<string, any> {\n const nodeOrMarkAttributes = nodeOrMark.attrs\n\n if (!nodeOrMarkAttributes) {\n return {}\n }\n\n return extensionAttributes\n .filter(item => {\n if (item.type !== (typeof nodeOrMark.type === 'string' ? nodeOrMark.type : nodeOrMark.type.name)) {\n return false\n }\n if (onlyRenderedAttributes) {\n return item.attribute.rendered\n }\n return true\n })\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n }\n\n return (\n item.attribute.renderHTML(nodeOrMarkAttributes) || {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n )\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n\n/**\n * This function returns the HTML attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n */\nexport function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAttributes: ExtensionAttribute[]) {\n return getAttributes(nodeOrMark, extensionAttributes, true)\n}\n","/* eslint-disable no-plusplus, @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\nimport React from 'react'\n\nimport { renderJSONContentToReactElement } from '../../json/react/react.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\n/**\n * This function maps the attributes of a node or mark to HTML attributes\n * @param attrs The attributes to map\n * @param key The key to use for the React element\n * @returns The mapped HTML attributes as an object\n */\nexport function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {\n if (!attrs) {\n return { key }\n }\n return Object.entries(attrs).reduce(\n (acc, [name, value]) => {\n if (name === 'class') {\n return Object.assign(acc, { className: value })\n }\n\n // React expects styles to be a object\n // so we need to convert it from string to object\n if (name === 'style' && typeof value === 'string') {\n const styleObject: Record<string, string> = {}\n value.split(';').forEach(style => {\n const [styleKey, val] = style.split(':')\n if (styleKey && val) {\n // we need to turn the key into camelCase\n const camelCaseKey = styleKey.trim().replace(/-([a-z])/g, g => g[1].toUpperCase())\n styleObject[camelCaseKey] = val.trim()\n }\n })\n\n return Object.assign(acc, { style: styleObject })\n }\n\n return Object.assign(acc, { [name]: value })\n },\n { key },\n )\n}\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a React element\n * @param content The DOMOutputSpec to convert to a React element\n * @returns A function that can render the DOMOutputSpec to a React element\n */\nexport function domOutputSpecToReactElement(\n content: DOMOutputSpec,\n key = 0,\n): (children?: React.ReactNode) => React.ReactNode {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n // eslint-disable-next-line prefer-const\n let [tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = parts[1]\n if (attrs === undefined) {\n attrs = {\n xmlns: parts[0],\n }\n }\n if (attrs === 0) {\n attrs = {\n xmlns: parts[0],\n }\n children = 0\n }\n if (typeof attrs === 'object') {\n attrs = Object.assign(attrs, { xmlns: parts[0] })\n }\n }\n\n if (attrs === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()))\n }\n if (attrs === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(undefined, key.toString()), child)\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n if (children === 0) {\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray, key++)(child),\n )\n }\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(undefined, key.toString()),\n domOutputSpecToReactElement(attrs as DOMOutputSpecArray)(child),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n if (children === undefined) {\n return () => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()))\n }\n if (children === 0) {\n return child => React.createElement(tag, mapAttrsToHTMLAttributes(attrs, key.toString()), child)\n }\n\n return child =>\n React.createElement(\n tag,\n mapAttrsToHTMLAttributes(attrs, key.toString()),\n [children].concat(rest).map(outputSpec => domOutputSpecToReactElement(outputSpec, key++)(child)),\n )\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to a React component using the given extensions\n * @param content The content to render to a React component\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The React element that represents the rendered content\n */\nexport function renderToReactElement({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<React.ReactNode, Mark, Node>>\n}): React.ReactNode {\n return renderToElement<React.ReactNode>({\n renderer: renderJSONContentToReactElement,\n domOutputSpecToElement: domOutputSpecToReactElement,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => React.createElement(React.Fragment, {}, children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { MarkType, NodeType } from '@tiptap/core'\nimport React from 'react'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToReactElement<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<React.ReactNode, TMarkType, TNodeType>) {\n let key = 0\n\n return TiptapStaticRenderer<React.ReactNode, TMarkType, TNodeType>(({ component, props: { children, ...props } }) => {\n return React.createElement(\n component as React.FC<typeof props>,\n // eslint-disable-next-line no-plusplus\n Object.assign(props, { key: key++ }),\n ([] as React.ReactNode[]).concat(children),\n )\n }, options)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\n/**\n * Props for a node renderer\n */\nexport type NodeProps<TNodeType = any, TChildren = any> = {\n /**\n * The current node to render\n */\n node: TNodeType\n /**\n * Unless the node is the root node, this will always be defined\n */\n parent?: TNodeType\n /**\n * The children of the current node\n */\n children?: TChildren\n /**\n * Render a child element\n */\n renderElement: (props: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }) => TChildren\n}\n\n/**\n * Props for a mark renderer\n */\nexport type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {\n /**\n * The current mark to render\n */\n mark: TMarkType\n /**\n * The children of the current mark\n */\n children?: TChildren\n /**\n * The node the current mark is applied to\n */\n node: TNodeType\n /**\n * The node the current mark is applied to\n */\n parent?: TNodeType\n}\n\nexport type TiptapStaticRendererOptions<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n> = {\n /**\n * Mapping of node types to react components\n */\n nodeMapping: Record<string, NoInfer<TNodeRender>>\n /**\n * Mapping of mark types to react components\n */\n markMapping: Record<string, NoInfer<TMarkRender>>\n /**\n * Component to render if a node type is not handled\n */\n unhandledNode?: NoInfer<TNodeRender>\n /**\n * Component to render if a mark type is not handled\n */\n unhandledMark?: NoInfer<TMarkRender>\n}\n\n/**\n * Tiptap Static Renderer\n * ----------------------\n *\n * This function is a basis to allow for different renderers to be created.\n * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.\n *\n * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document\n * and renders it using a mapping of node types to React components or even to a string.\n * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.\n */\nexport function TiptapStaticRenderer<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: string | { name: string } } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n>(\n /**\n * The function that actually renders the component\n */\n renderComponent: (\n ctx:\n | {\n component: TNodeRender\n props: NodeProps<TNodeType, TReturnType | TReturnType[]>\n }\n | {\n component: TMarkRender\n props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>\n },\n ) => TReturnType,\n {\n nodeMapping,\n markMapping,\n unhandledNode,\n unhandledMark,\n }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>,\n) {\n /**\n * Render Tiptap JSON and all its children using the provided node and mark mappings.\n */\n return function renderContent({\n content,\n parent,\n }: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }): TReturnType {\n const nodeType = typeof content.type === 'string' ? content.type : content.type.name\n const NodeHandler = nodeMapping[nodeType] ?? unhandledNode\n\n if (!NodeHandler) {\n throw new Error(`missing handler for node type ${nodeType}`)\n }\n\n const nodeContent = renderComponent({\n component: NodeHandler,\n props: {\n node: content,\n parent,\n renderElement: renderContent,\n // Lazily compute the children to avoid unnecessary recursion\n get children() {\n // recursively render child content nodes\n const children: TReturnType[] = []\n\n if (content.content) {\n content.content.forEach(child => {\n children.push(\n renderContent({\n content: child,\n parent: content,\n }),\n )\n })\n }\n\n return children\n },\n },\n })\n\n // apply marks to the content\n const markedContent = content.marks\n ? content.marks.reduce((acc, mark) => {\n const markType = typeof mark.type === 'string' ? mark.type : mark.type.name\n const MarkHandler = markMapping[markType] ?? unhandledMark\n\n if (!MarkHandler) {\n throw new Error(`missing handler for mark type ${markType}`)\n }\n\n return renderComponent({\n component: MarkHandler,\n props: {\n mark,\n parent,\n node: content,\n children: acc,\n },\n })\n }, nodeContent)\n : nodeContent\n\n return markedContent\n }\n}\n"],"mappings":";AAYA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,YAAY;;;ACnBrB,SAAgE,uBAAuB;AAQhF,SAAS,cACd,YACA,qBACA,wBACqB;AACrB,QAAM,uBAAuB,WAAW;AAExC,MAAI,CAAC,sBAAsB;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,oBACJ,OAAO,UAAQ;AACd,QAAI,KAAK,UAAU,OAAO,WAAW,SAAS,WAAW,WAAW,OAAO,WAAW,KAAK,OAAO;AAChG,aAAO;AAAA,IACT;AACA,QAAI,wBAAwB;AAC1B,aAAO,KAAK,UAAU;AAAA,IACxB;AACA,WAAO;AAAA,EACT,CAAC,EACA,IAAI,UAAQ;AACX,QAAI,CAAC,KAAK,UAAU,YAAY;AAC9B,aAAO;AAAA,QACL,CAAC,KAAK,IAAI,GAAG,KAAK,QAAQ,uBAAuB,qBAAqB,KAAK,IAAI,IAAI,KAAK,UAAU;AAAA,MACpG;AAAA,IACF;AAEA,WACE,KAAK,UAAU,WAAW,oBAAoB,KAAK;AAAA,MACjD,CAAC,KAAK,IAAI,GAAG,KAAK,QAAQ,uBAAuB,qBAAqB,KAAK,IAAI,IAAI,KAAK,UAAU;AAAA,IACpG;AAAA,EAEJ,CAAC,EACA,OAAO,CAAC,YAAY,cAAc,gBAAgB,YAAY,SAAS,GAAG,CAAC,CAAC;AACjF;AAOO,SAAS,kBAAkB,YAAiC,qBAA2C;AAC5G,SAAO,cAAc,YAAY,qBAAqB,IAAI;AAC5D;;;ADpBO,SAAS,4BACd,wBACA,WACA,qBACA,SACkD;AAClD,QAAM,UAAU;AAAA,IACd,MAAM,UAAU;AAAA,IAChB,SAAS,UAAU;AAAA,IACnB,SAAS,UAAU;AAAA,IACnB,QAAQ,UAAU;AAAA,EACpB;AAEA,QAAM,eAAe,kBAA4C,WAAW,cAAc,OAAO;AAEjG,MAAI,CAAC,cAAc;AACjB,QAAI,mCAAS,eAAe;AAC1B,aAAO,CAAC,UAAU,MAAM,QAAQ,aAAa;AAAA,IAC/C;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AACJ,cAAM,IAAI;AAAA,UACR,wBAAwB,UAAU,IAAI;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,CAAC,EAAE,MAAM,SAAS,MAAM;AACtB,UAAI;AACF,eAAO;AAAA,UACL,aAAa;AAAA,YACX;AAAA,YACA,gBAAgB,kBAAkB,MAAM,mBAAmB;AAAA,UAC7D,CAAC;AAAA,QACH,EAAE,QAAQ;AAAA,MACZ,SAAS,GAAG;AACV,cAAM,IAAI;AAAA,UACR,wBACE,UAAU,IACZ,mEAAoE,EAAY,OAAO;AAAA,UACvF,EAAE,OAAO,EAAE;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAQO,SAAS,4BACd,wBACA,WACA,qBACA,SACkD;AAClD,QAAM,UAAU;AAAA,IACd,MAAM,UAAU;AAAA,IAChB,SAAS,UAAU;AAAA,IACnB,SAAS,UAAU;AAAA,IACnB,QAAQ,UAAU;AAAA,EACpB;AAEA,QAAM,eAAe,kBAA4C,WAAW,cAAc,OAAO;AAEjG,MAAI,CAAC,cAAc;AACjB,QAAI,mCAAS,eAAe;AAC1B,aAAO,CAAC,UAAU,MAAM,QAAQ,aAAa;AAAA,IAC/C;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AACJ,cAAM,IAAI,MAAM,QAAQ,UAAU,IAAI,4DAA4D;AAAA,MACpG;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,CAAC,EAAE,MAAM,SAAS,MAAM;AACtB,UAAI;AACF,eAAO;AAAA,UACL,aAAa;AAAA,YACX;AAAA,YACA,gBAAgB,kBAAkB,MAAM,mBAAmB;AAAA,UAC7D,CAAC;AAAA,QACH,EAAE,QAAQ;AAAA,MACZ,SAAS,GAAG;AACV,cAAM,IAAI;AAAA,UACR,wBACE,UAAU,IACZ,mEAAoE,EAAY,OAAO;AAAA,UACvF,EAAE,OAAO,EAAE;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAYO,SAAS,gBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUM;AAEJ,eAAa,kBAAkB,UAAU;AACzC,QAAM,sBAAsB,4BAA4B,UAAU;AAClE,QAAM,EAAE,gBAAgB,eAAe,IAAI,gBAAgB,UAAU;AAErE,MAAI,EAAE,mBAAmB,OAAO;AAC9B,cAAU,KAAK,SAAS,8BAA8B,UAAU,GAAG,OAAO;AAAA,EAC5E;AAEA,SAAO,SAAS;AAAA,IACd,GAAG;AAAA,IACH,aAAa;AAAA,MACX,GAAG,OAAO;AAAA,QACR,eACG,OAAO,OAAK;AACX,cAAI,EAAE,QAAQ,iBAAiB;AAE7B,mBAAO;AAAA,UACT;AAEA,cAAI,mCAAS,aAAa;AACxB,mBAAO,EAAE,EAAE,QAAQ,QAAQ;AAAA,UAC7B;AACA,iBAAO;AAAA,QACT,CAAC,EACA;AAAA,UAAI,mBACH,4BAA+B,wBAAwB,eAAe,qBAAqB,OAAO;AAAA,QACpG;AAAA,MACJ;AAAA,MACA,GAAG;AAAA,MACH,GAAG,mCAAS;AAAA,IACd;AAAA,IACA,aAAa;AAAA,MACX,GAAG,OAAO;AAAA,QACR,eACG,OAAO,OAAK;AAEX,cAAI,mCAAS,aAAa;AACxB,mBAAO,EAAE,EAAE,QAAQ,QAAQ;AAAA,UAC7B;AACA,iBAAO;AAAA,QACT,CAAC,EACA,IAAI,UAAQ,4BAA+B,wBAAwB,MAAM,qBAAqB,OAAO,CAAC;AAAA,MAC3G;AAAA,MACA,GAAG,mCAAS;AAAA,IACd;AAAA,EACF,CAAC,EAAE,EAAE,QAAQ,CAAC;AAChB;;;AEnNA,OAAOA,YAAW;;;ACAlB,OAAO,WAAW;;;ACgHX,SAAS,qBAiCd,iBAWA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACA;AAIA,SAAO,SAAS,cAAc;AAAA,IAC5B;AAAA,IACA;AAAA,EACF,GASgB;AArLlB;AAsLI,UAAM,WAAW,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,QAAQ,KAAK;AAChF,UAAM,eAAc,iBAAY,QAAQ,MAApB,YAAyB;AAE7C,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,iCAAiC,QAAQ,EAAE;AAAA,IAC7D;AAEA,UAAM,cAAc,gBAAgB;AAAA,MAClC,WAAW;AAAA,MACX,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,eAAe;AAAA;AAAA,QAEf,IAAI,WAAW;AAEb,gBAAM,WAA0B,CAAC;AAEjC,cAAI,QAAQ,SAAS;AACnB,oBAAQ,QAAQ,QAAQ,WAAS;AAC/B,uBAAS;AAAA,gBACP,cAAc;AAAA,kBACZ,SAAS;AAAA,kBACT,QAAQ;AAAA,gBACV,CAAC;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAEA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAGD,UAAM,gBAAgB,QAAQ,QAC1B,QAAQ,MAAM,OAAO,CAAC,KAAK,SAAS;AA1N5C,UAAAC;AA2NU,YAAM,WAAW,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,KAAK,KAAK;AACvE,YAAM,eAAcA,MAAA,YAAY,QAAQ,MAApB,OAAAA,MAAyB;AAE7C,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,iCAAiC,QAAQ,EAAE;AAAA,MAC7D;AAEA,aAAO,gBAAgB;AAAA,QACrB,WAAW;AAAA,QACX,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH,GAAG,WAAW,IACd;AAEJ,WAAO;AAAA,EACT;AACF;;;ADxOO,SAAS,gCAad,SAA6E;AAC7E,MAAI,MAAM;AAEV,SAAO,qBAA4D,CAAC,EAAE,WAAW,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,MAAM;AACnH,WAAO,MAAM;AAAA,MACX;AAAA;AAAA,MAEA,OAAO,OAAO,OAAO,EAAE,KAAK,MAAM,CAAC;AAAA,MAClC,CAAC,EAAwB,OAAO,QAAQ;AAAA,IAC3C;AAAA,EACF,GAAG,OAAO;AACZ;;;ADjBO,SAAS,yBAAyB,OAA6B,KAAmC;AACvG,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,IAAI;AAAA,EACf;AACA,SAAO,OAAO,QAAQ,KAAK,EAAE;AAAA,IAC3B,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM;AACtB,UAAI,SAAS,SAAS;AACpB,eAAO,OAAO,OAAO,KAAK,EAAE,WAAW,MAAM,CAAC;AAAA,MAChD;AAIA,UAAI,SAAS,WAAW,OAAO,UAAU,UAAU;AACjD,cAAM,cAAsC,CAAC;AAC7C,cAAM,MAAM,GAAG,EAAE,QAAQ,WAAS;AAChC,gBAAM,CAAC,UAAU,GAAG,IAAI,MAAM,MAAM,GAAG;AACvC,cAAI,YAAY,KAAK;AAEnB,kBAAM,eAAe,SAAS,KAAK,EAAE,QAAQ,aAAa,OAAK,EAAE,CAAC,EAAE,YAAY,CAAC;AACjF,wBAAY,YAAY,IAAI,IAAI,KAAK;AAAA,UACvC;AAAA,QACF,CAAC;AAED,eAAO,OAAO,OAAO,KAAK,EAAE,OAAO,YAAY,CAAC;AAAA,MAClD;AAEA,aAAO,OAAO,OAAO,KAAK,EAAE,CAAC,IAAI,GAAG,MAAM,CAAC;AAAA,IAC7C;AAAA,IACA,EAAE,IAAI;AAAA,EACR;AACF;AAOO,SAAS,4BACd,SACA,MAAM,GAC2C;AACjD,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,SAAS;AAEtD,QAAI,CAAC,KAAK,OAAO,UAAU,GAAG,IAAI,IAAI;AACtC,UAAM,QAAQ,IAAI,MAAM,GAAG;AAE3B,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,MAAM,CAAC;AACb,UAAI,UAAU,QAAW;AACvB,gBAAQ;AAAA,UACN,OAAO,MAAM,CAAC;AAAA,QAChB;AAAA,MACF;AACA,UAAI,UAAU,GAAG;AACf,gBAAQ;AAAA,UACN,OAAO,MAAM,CAAC;AAAA,QAChB;AACA,mBAAW;AAAA,MACb;AACA,UAAI,OAAO,UAAU,UAAU;AAC7B,gBAAQ,OAAO,OAAO,OAAO,EAAE,OAAO,MAAM,CAAC,EAAE,CAAC;AAAA,MAClD;AAAA,IACF;AAEA,QAAI,UAAU,QAAW;AACvB,aAAO,MAAMC,OAAM,cAAc,KAAK,yBAAyB,QAAW,IAAI,SAAS,CAAC,CAAC;AAAA,IAC3F;AACA,QAAI,UAAU,GAAG;AACf,aAAO,WAASA,OAAM,cAAc,KAAK,yBAAyB,QAAW,IAAI,SAAS,CAAC,GAAG,KAAK;AAAA,IACrG;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAI,aAAa,QAAW;AAC1B,iBAAO,WACLA,OAAM;AAAA,YACJ;AAAA,YACA,yBAAyB,QAAW,IAAI,SAAS,CAAC;AAAA,YAClD,4BAA4B,OAA6B,KAAK,EAAE,KAAK;AAAA,UACvE;AAAA,QACJ;AACA,YAAI,aAAa,GAAG;AAClB,iBAAO,WACLA,OAAM;AAAA,YACJ;AAAA,YACA,yBAAyB,QAAW,IAAI,SAAS,CAAC;AAAA,YAClD,4BAA4B,OAA6B,KAAK,EAAE,KAAK;AAAA,UACvE;AAAA,QACJ;AACA,eAAO,WACLA,OAAM;AAAA,UACJ;AAAA,UACA,yBAAyB,QAAW,IAAI,SAAS,CAAC;AAAA,UAClD,4BAA4B,KAA2B,EAAE,KAAK;AAAA,UAC9D,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,IAAI,gBAAc,4BAA4B,YAAY,KAAK,EAAE,KAAK,CAAC;AAAA,QACjG;AAAA,MACJ;AACA,UAAI,aAAa,QAAW;AAC1B,eAAO,MAAMA,OAAM,cAAc,KAAK,yBAAyB,OAAO,IAAI,SAAS,CAAC,CAAC;AAAA,MACvF;AACA,UAAI,aAAa,GAAG;AAClB,eAAO,WAASA,OAAM,cAAc,KAAK,yBAAyB,OAAO,IAAI,SAAS,CAAC,GAAG,KAAK;AAAA,MACjG;AAEA,aAAO,WACLA,OAAM;AAAA,QACJ;AAAA,QACA,yBAAyB,OAAO,IAAI,SAAS,CAAC;AAAA,QAC9C,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,IAAI,gBAAc,4BAA4B,YAAY,KAAK,EAAE,KAAK,CAAC;AAAA,MACjG;AAAA,IACJ;AAAA,EACF;AAGA,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO;AAAA,IACT;AAAA,EACF;AACF;AASO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIoB;AAClB,SAAO,gBAAiC;AAAA,IACtC,UAAU;AAAA,IACV,wBAAwB;AAAA,IACxB,iBAAiB;AAAA;AAAA,MAEf,KAAK,CAAC,EAAE,SAAS,MAAMA,OAAM,cAAcA,OAAM,UAAU,CAAC,GAAG,QAAQ;AAAA;AAAA,MAEvE,MAAM,CAAC,EAAE,KAAK,MAAG;AAlKvB;AAkK0B,0BAAK,SAAL,YAAa;AAAA;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;","names":["React","_a","React"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tiptap/static-renderer",
3
3
  "description": "statically render Tiptap JSON",
4
- "version": "3.0.0-beta.10",
4
+ "version": "3.0.0-beta.11",
5
5
  "homepage": "https://tiptap.dev",
6
6
  "keywords": [
7
7
  "tiptap",
@@ -76,14 +76,14 @@
76
76
  "@types/react-dom": "^19.0.0",
77
77
  "react": "^19.0.0",
78
78
  "react-dom": "^19.0.0",
79
- "@tiptap/core": "3.0.0-beta.10",
80
- "@tiptap/pm": "3.0.0-beta.10"
79
+ "@tiptap/core": "3.0.0-beta.11",
80
+ "@tiptap/pm": "3.0.0-beta.11"
81
81
  },
82
82
  "peerDependencies": {
83
83
  "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
84
84
  "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0",
85
- "@tiptap/core": "3.0.0-beta.10",
86
- "@tiptap/pm": "3.0.0-beta.10"
85
+ "@tiptap/core": "3.0.0-beta.11",
86
+ "@tiptap/pm": "3.0.0-beta.11"
87
87
  },
88
88
  "repository": {
89
89
  "type": "git",
@@ -13,7 +13,7 @@ import { renderToElement } from '../extensionRenderer.js'
13
13
  * @param key The key to use for the React element
14
14
  * @returns The mapped HTML attributes as an object
15
15
  */
16
- function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {
16
+ export function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Record<string, any> {
17
17
  if (!attrs) {
18
18
  return { key }
19
19
  }
@@ -22,6 +22,23 @@ function mapAttrsToHTMLAttributes(attrs?: Record<string, any>, key?: string): Re
22
22
  if (name === 'class') {
23
23
  return Object.assign(acc, { className: value })
24
24
  }
25
+
26
+ // React expects styles to be a object
27
+ // so we need to convert it from string to object
28
+ if (name === 'style' && typeof value === 'string') {
29
+ const styleObject: Record<string, string> = {}
30
+ value.split(';').forEach(style => {
31
+ const [styleKey, val] = style.split(':')
32
+ if (styleKey && val) {
33
+ // we need to turn the key into camelCase
34
+ const camelCaseKey = styleKey.trim().replace(/-([a-z])/g, g => g[1].toUpperCase())
35
+ styleObject[camelCaseKey] = val.trim()
36
+ }
37
+ })
38
+
39
+ return Object.assign(acc, { style: styleObject })
40
+ }
41
+
25
42
  return Object.assign(acc, { [name]: value })
26
43
  },
27
44
  { key },