UNPKG

@portabletext/to-html

Version:
1 lines 26.3 kB
{"version":3,"file":"pt-to-html.mjs","sources":["../src/components/list.ts","../src/escape.ts","../src/components/marks.ts","../src/warnings.ts","../src/components/unknown.ts","../src/components/defaults.ts","../src/components/merge.ts","../src/to-html.ts"],"sourcesContent":["import type {PortableTextListComponent, PortableTextListItemComponent} from '../types'\n\nexport const defaultLists: Record<'number' | 'bullet', PortableTextListComponent> = {\n number: ({children}) => `<ol>${children}</ol>`,\n bullet: ({children}) => `<ul>${children}</ul>`,\n}\n\nexport const DefaultListItem: PortableTextListItemComponent = ({children}) => `<li>${children}</li>`\n","const allowedProtocols = ['http', 'https', 'mailto', 'tel']\nconst charMap: Record<string, string> = {\n '&': 'amp',\n '<': 'lt',\n '>': 'gt',\n '\"': 'quot',\n \"'\": '#x27',\n}\n\nexport function escapeHTML(str: string): string {\n return str.replace(/[&<>\"']/g, (s) => `&${charMap[s]};`)\n}\n\nexport function uriLooksSafe(uri: string): boolean {\n const url = (uri || '').trim()\n const first = url.charAt(0)\n\n // Allow hash-links, absolute paths and \"same-protocol\" (//foo.bar) URLs\n if (first === '#' || first === '/') {\n return true\n }\n\n // If the URL does not contain a `:`, allow it\n const colonIndex = url.indexOf(':')\n if (colonIndex === -1) {\n return true\n }\n\n // If the protocol is in the allowed list, treat it as OK\n const proto = url.slice(0, colonIndex).toLowerCase()\n if (allowedProtocols.indexOf(proto) !== -1) {\n return true\n }\n\n // If the URL is `site/search?query=author:espen`, allow it\n const queryIndex = url.indexOf('?')\n if (queryIndex !== -1 && colonIndex > queryIndex) {\n return true\n }\n\n // If the URL is `site/search#my:encoded:data`, allow it\n const hashIndex = url.indexOf('#')\n if (hashIndex !== -1 && colonIndex > hashIndex) {\n return true\n }\n\n return false\n}\n","import type {TypedObject} from '@portabletext/types'\n\nimport {escapeHTML, uriLooksSafe} from '../escape'\nimport type {PortableTextMarkComponent} from '../types'\n\ninterface DefaultLink extends TypedObject {\n _type: 'link'\n href: string\n}\n\nconst link: PortableTextMarkComponent<DefaultLink> = ({children, value}) => {\n const href = value?.href || ''\n const looksSafe = uriLooksSafe(href)\n return looksSafe ? `<a href=\"${escapeHTML(href)}\">${children}</a>` : children\n}\n\nexport const defaultMarks: Record<string, PortableTextMarkComponent | undefined> = {\n em: ({children}) => `<em>${children}</em>`,\n strong: ({children}) => `<strong>${children}</strong>`,\n code: ({children}) => `<code>${children}</code>`,\n underline: ({children}) => `<span style=\"text-decoration:underline\">${children}</span>`,\n 'strike-through': ({children}) => `<del>${children}</del>`,\n link,\n}\n","const getTemplate = (type: string, prop: string): string =>\n `Unknown ${type}, specify a component for it in the \\`components.${prop}\\` option`\n\nexport const unknownTypeWarning = (typeName: string): string =>\n getTemplate(`block type \"${typeName}\"`, 'types')\n\nexport const unknownMarkWarning = (markType: string): string =>\n getTemplate(`mark type \"${markType}\"`, 'marks')\n\nexport const unknownBlockStyleWarning = (blockStyle: string): string =>\n getTemplate(`block style \"${blockStyle}\"`, 'block')\n\nexport const unknownListStyleWarning = (listStyle: string): string =>\n getTemplate(`list style \"${listStyle}\"`, 'list')\n\nexport const unknownListItemStyleWarning = (listStyle: string): string =>\n getTemplate(`list item style \"${listStyle}\"`, 'listItem')\n\nexport function printWarning(message: string): void {\n console.warn(message)\n}\n","import type {PortableTextHtmlComponents} from '../types'\nimport {unknownTypeWarning} from '../warnings'\n\nexport const DefaultUnknownType: PortableTextHtmlComponents['unknownType'] = ({\n value,\n isInline,\n}) => {\n const warning = unknownTypeWarning(value._type)\n return isInline\n ? `<span style=\"display:none\">${warning}</span>`\n : `<div style=\"display:none\">${warning}</div>`\n}\n\nexport const DefaultUnknownMark: PortableTextHtmlComponents['unknownMark'] = ({\n markType,\n children,\n}) => {\n return `<span class=\"unknown__pt__mark__${markType}\">${children}</span>`\n}\n\nexport const DefaultUnknownBlockStyle: PortableTextHtmlComponents['unknownBlockStyle'] = ({\n children,\n}) => {\n return `<p>${children}</p>`\n}\n\nexport const DefaultUnknownList: PortableTextHtmlComponents['unknownList'] = ({children}) => {\n return `<ul>${children}</ul>`\n}\n\nexport const DefaultUnknownListItem: PortableTextHtmlComponents['unknownListItem'] = ({\n children,\n}) => {\n return `<li>${children}</li>`\n}\n","import type {PortableTextBlockStyle} from '@portabletext/types'\n\nimport type {PortableTextBlockComponent, PortableTextHtmlComponents} from '../types'\nimport {DefaultListItem, defaultLists} from './list'\nimport {defaultMarks} from './marks'\nimport {\n DefaultUnknownBlockStyle,\n DefaultUnknownList,\n DefaultUnknownListItem,\n DefaultUnknownMark,\n DefaultUnknownType,\n} from './unknown'\n\nexport const DefaultHardBreak = (): string => '<br/>'\n\nexport const defaultPortableTextBlockStyles: Record<\n PortableTextBlockStyle,\n PortableTextBlockComponent | undefined\n> = {\n normal: ({children}) => `<p>${children}</p>`,\n blockquote: ({children}) => `<blockquote>${children}</blockquote>`,\n h1: ({children}) => `<h1>${children}</h1>`,\n h2: ({children}) => `<h2>${children}</h2>`,\n h3: ({children}) => `<h3>${children}</h3>`,\n h4: ({children}) => `<h4>${children}</h4>`,\n h5: ({children}) => `<h5>${children}</h5>`,\n h6: ({children}) => `<h6>${children}</h6>`,\n}\n\nexport const defaultComponents: PortableTextHtmlComponents = {\n types: {},\n\n block: defaultPortableTextBlockStyles,\n marks: defaultMarks,\n list: defaultLists,\n listItem: DefaultListItem,\n hardBreak: DefaultHardBreak,\n\n unknownType: DefaultUnknownType,\n unknownMark: DefaultUnknownMark,\n unknownList: DefaultUnknownList,\n unknownListItem: DefaultUnknownListItem,\n unknownBlockStyle: DefaultUnknownBlockStyle,\n}\n","import type {PortableTextComponents, PortableTextHtmlComponents} from '../types'\n\nexport function mergeComponents(\n parent: PortableTextHtmlComponents,\n overrides: PortableTextComponents,\n): PortableTextHtmlComponents {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {block, list, listItem, marks, types, ...rest} = overrides\n // @todo figure out how to not `as ...` these\n return {\n ...parent,\n block: mergeDeeply(parent, overrides, 'block') as PortableTextHtmlComponents['block'],\n list: mergeDeeply(parent, overrides, 'list') as PortableTextHtmlComponents['list'],\n listItem: mergeDeeply(parent, overrides, 'listItem') as PortableTextHtmlComponents['listItem'],\n marks: mergeDeeply(parent, overrides, 'marks') as PortableTextHtmlComponents['marks'],\n types: mergeDeeply(parent, overrides, 'types') as PortableTextHtmlComponents['types'],\n ...rest,\n }\n}\n\nfunction mergeDeeply(\n parent: PortableTextHtmlComponents,\n overrides: PortableTextComponents,\n key: 'block' | 'list' | 'listItem' | 'marks' | 'types',\n): PortableTextHtmlComponents[typeof key] {\n const override = overrides[key]\n const parentVal = parent[key]\n\n if (typeof override === 'function') {\n return override\n }\n\n if (override && typeof parentVal === 'function') {\n return override\n }\n\n if (override) {\n return {...parentVal, ...override} as PortableTextHtmlComponents[typeof key]\n }\n\n return parentVal\n}\n","import {\n buildMarksTree,\n isPortableTextBlock,\n isPortableTextListItemBlock,\n isPortableTextToolkitList,\n isPortableTextToolkitSpan,\n isPortableTextToolkitTextNode,\n nestLists,\n spanToPlainText,\n type ToolkitNestedPortableTextSpan,\n type ToolkitTextNode,\n} from '@portabletext/toolkit'\nimport type {\n ArbitraryTypedObject,\n PortableTextBlock,\n PortableTextListItemBlock,\n PortableTextMarkDefinition,\n PortableTextSpan,\n TypedObject,\n} from '@portabletext/types'\n\nimport {defaultComponents} from './components/defaults'\nimport {mergeComponents} from './components/merge'\nimport {escapeHTML} from './escape'\nimport type {\n HtmlPortableTextList,\n MissingComponentHandler,\n NodeRenderer,\n PortableTextHtmlComponents,\n PortableTextOptions,\n Serializable,\n SerializedBlock,\n} from './types'\nimport {\n printWarning,\n unknownBlockStyleWarning,\n unknownListItemStyleWarning,\n unknownListStyleWarning,\n unknownMarkWarning,\n unknownTypeWarning,\n} from './warnings'\n\nexport function toHTML<B extends TypedObject = PortableTextBlock | ArbitraryTypedObject>(\n value: B | B[],\n options: PortableTextOptions = {},\n): string {\n const {\n components: componentOverrides,\n onMissingComponent: missingComponentHandler = printWarning,\n } = options\n\n const handleMissingComponent = missingComponentHandler || noop\n const blocks = Array.isArray(value) ? value : [value]\n const nested = nestLists(blocks, 'html')\n const components = componentOverrides\n ? mergeComponents(defaultComponents, componentOverrides)\n : defaultComponents\n\n const renderNode = getNodeRenderer(components, handleMissingComponent)\n const rendered = nested.map((node, index) =>\n renderNode({node: node, index, isInline: false, renderNode}),\n )\n\n return rendered.join('')\n}\n\nconst getNodeRenderer = (\n components: PortableTextHtmlComponents,\n handleMissingComponent: MissingComponentHandler,\n): NodeRenderer => {\n function renderNode<N extends TypedObject>(options: Serializable<N>): string {\n const {node, index, isInline} = options\n\n if (isPortableTextToolkitList(node)) {\n return renderList(node, index)\n }\n\n if (isPortableTextListItemBlock(node)) {\n return renderListItem(node, index)\n }\n\n if (isPortableTextToolkitSpan(node)) {\n return renderSpan(node)\n }\n\n if (isPortableTextBlock(node)) {\n return renderBlock(node, index, isInline)\n }\n\n if (isPortableTextToolkitTextNode(node)) {\n return renderText(node)\n }\n\n return renderCustomBlock(node, index, isInline)\n }\n\n function renderListItem(\n node: PortableTextListItemBlock<PortableTextMarkDefinition, PortableTextSpan>,\n index: number,\n ): string {\n const tree = serializeBlock({node, index, isInline: false, renderNode})\n const renderer = components.listItem\n const handler = typeof renderer === 'function' ? renderer : renderer[node.listItem]\n const itemHandler = handler || components.unknownListItem\n\n if (itemHandler === components.unknownListItem) {\n const style = node.listItem || 'bullet'\n handleMissingComponent(unknownListItemStyleWarning(style), {\n type: style,\n nodeType: 'listItemStyle',\n })\n }\n\n let children = tree.children\n if (node.style && node.style !== 'normal') {\n // Wrap any other style in whatever the block component says to use\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {listItem, ...blockNode} = node\n children = renderNode({node: blockNode, index, isInline: false, renderNode})\n }\n\n return itemHandler({value: node, index, isInline: false, renderNode, children})\n }\n\n function renderList(node: HtmlPortableTextList, index: number): string {\n const children = node.children.map((child, childIndex) =>\n renderNode({\n node: child._key ? child : {...child, _key: `li-${index}-${childIndex}`},\n index: index,\n isInline: false,\n renderNode,\n }),\n )\n\n const component = components.list\n const handler = typeof component === 'function' ? component : component[node.listItem]\n const list = handler || components.unknownList\n\n if (list === components.unknownList) {\n const style = node.listItem || 'bullet'\n handleMissingComponent(unknownListStyleWarning(style), {nodeType: 'listStyle', type: style})\n }\n\n return list({value: node, index, isInline: false, renderNode, children: children.join('')})\n }\n\n function renderSpan(node: ToolkitNestedPortableTextSpan): string {\n const {markDef, markType, markKey} = node\n const span = components.marks[markType] || components.unknownMark\n const children = node.children.map((child, childIndex) =>\n renderNode({node: child, index: childIndex, isInline: true, renderNode}),\n )\n\n if (span === components.unknownMark) {\n handleMissingComponent(unknownMarkWarning(markType), {nodeType: 'mark', type: markType})\n }\n\n return span({\n text: spanToPlainText(node),\n value: markDef,\n markType,\n markKey,\n renderNode,\n children: children.join(''),\n })\n }\n\n function renderBlock(node: PortableTextBlock, index: number, isInline: boolean): string {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {_key, ...props} = serializeBlock({node, index, isInline, renderNode})\n const style = props.node.style || 'normal'\n const handler =\n typeof components.block === 'function' ? components.block : components.block[style]\n const block = handler || components.unknownBlockStyle\n\n if (block === components.unknownBlockStyle) {\n handleMissingComponent(unknownBlockStyleWarning(style), {\n nodeType: 'blockStyle',\n type: style,\n })\n }\n\n return block({...props, value: props.node, renderNode})\n }\n\n function renderText(node: ToolkitTextNode): string {\n if (node.text === '\\n') {\n const hardBreak = components.hardBreak\n return hardBreak ? hardBreak() : '\\n'\n }\n\n return escapeHTML(node.text)\n }\n\n function renderCustomBlock(value: TypedObject, index: number, isInline: boolean): string {\n const node = components.types[value._type]\n\n if (!node) {\n handleMissingComponent(unknownTypeWarning(value._type), {\n nodeType: 'block',\n type: value._type,\n })\n }\n\n const component = node || components.unknownType\n return component({\n value,\n isInline,\n index,\n renderNode,\n })\n }\n\n return renderNode\n}\n\nfunction serializeBlock(options: Serializable<PortableTextBlock>): SerializedBlock {\n const {node, index, isInline, renderNode} = options\n const tree = buildMarksTree(node)\n const children = tree.map((child, i) =>\n renderNode({node: child, isInline: true, index: i, renderNode}),\n )\n\n return {\n _key: node._key || `block-${index}`,\n children: children.join(''),\n index,\n isInline,\n node,\n }\n}\n\nfunction noop() {\n // Intentional noop\n}\n"],"names":["defaultLists","number","children","bullet","DefaultListItem","allowedProtocols","charMap","escapeHTML","str","replace","s","uriLooksSafe","uri","url","trim","first","charAt","colonIndex","indexOf","proto","slice","toLowerCase","queryIndex","hashIndex","link","value","href","defaultMarks","em","strong","code","underline","strike-through","getTemplate","type","prop","unknownTypeWarning","typeName","unknownMarkWarning","markType","unknownBlockStyleWarning","blockStyle","unknownListStyleWarning","listStyle","unknownListItemStyleWarning","printWarning","message","console","warn","DefaultUnknownType","isInline","warning","_type","DefaultUnknownMark","DefaultUnknownBlockStyle","DefaultUnknownList","DefaultUnknownListItem","DefaultHardBreak","defaultPortableTextBlockStyles","normal","blockquote","h1","h2","h3","h4","h5","h6","defaultComponents","types","block","marks","list","listItem","hardBreak","unknownType","unknownMark","unknownList","unknownListItem","unknownBlockStyle","mergeComponents","parent","overrides","rest","_excluded","_objectSpread","mergeDeeply","key","override","parentVal","toHTML","options","components","componentOverrides","onMissingComponent","missingComponentHandler","handleMissingComponent","noop","blocks","Array","isArray","nested","nestLists","renderNode","getNodeRenderer","map","node","index","join","isPortableTextToolkitList","renderList","isPortableTextListItemBlock","renderListItem","isPortableTextToolkitSpan","renderSpan","isPortableTextBlock","renderBlock","isPortableTextToolkitTextNode","renderText","renderCustomBlock","tree","serializeBlock","renderer","itemHandler","style","nodeType","blockNode","_objectWithoutProperties","_excluded2","child","childIndex","_key","component","markDef","markKey","span","text","spanToPlainText","_serializeBlock","props","_excluded3","buildMarksTree","i"],"mappings":"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"}