@nanogiants/react-native-render-html 1.0.0 → 1.0.1

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.js CHANGED
@@ -719,29 +719,25 @@ var isExternalURL = (url) => {
719
719
  };
720
720
 
721
721
  // src/renderers/_DefaultBlockRenderer.tsx
722
+ var import_react3 = require("react");
722
723
  var import_react_native3 = require("react-native");
723
724
  var import_jsx_runtime4 = require("react/jsx-runtime");
724
- var import_react3 = require("react");
725
725
  var DefaultBlockRenderer = ({
726
726
  node,
727
727
  viewProps = {},
728
728
  textProps = {}
729
729
  }) => {
730
- const { getStyle } = useHtmlContext();
730
+ const { getStyle, renderText } = useHtmlContext();
731
731
  const { style: viewStyle, ...restViewProps } = viewProps;
732
732
  const { style: textStyle, ...restTextProps } = textProps;
733
733
  const groupedChildren = groupByInlineBlock(node.children);
734
734
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native3.View, { ...restViewProps, style: [getStyle(node).block, viewStyle], children: groupedChildren.map((childrenGroup, index) => {
735
735
  if (childrenGroup.type === "text") {
736
- return /* @__PURE__ */ (0, import_react3.createElement)(
737
- import_react_native3.Text,
738
- {
739
- ...restTextProps,
740
- key: `${node.type}-${index}`,
741
- style: [getStyle(node).text, textStyle]
742
- },
743
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NodesRenderer, { nodes: childrenGroup.nodes })
744
- );
736
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react3.Fragment, { children: renderText({
737
+ ...restTextProps,
738
+ style: [getStyle(node).text, textStyle],
739
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NodesRenderer, { nodes: childrenGroup.nodes })
740
+ }) }, `${node.type}-${index}`);
745
741
  }
746
742
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(NodesRenderer, { nodes: childrenGroup.nodes }, `${node.type}-${index}`);
747
743
  }) });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/RenderHTML.tsx","../src/context/HtmlProvider.tsx","../src/HTMLValidator.ts","../src/renderers/_NodeRenderer.tsx","../src/context/AlignedWidthItem.tsx","../src/context/AlignedWidthProvider.tsx","../src/types.ts","../src/utils.ts","../src/renderers/_DefaultBlockRenderer.tsx","../src/renderers/_DefaultTextRenderer.tsx","../src/assets.ts","../src/renderers/ATagRenderer.tsx","../src/renderers/ImgTagRenderer.tsx","../src/renderers/LiTagRenderer.tsx","../src/renderers/PTagRenderer.tsx","../src/renderers/_NodesRenderer.tsx"],"sourcesContent":["export type { OnHTMLLinkPress } from './context/HtmlProvider';\nexport type { RenderHTMLProps } from './RenderHTML';\nexport { RenderHTML } from './RenderHTML';\nexport type { HTMLTag, HtmlStyle, TagStyles } from './types';\n","import { parseDocument } from 'htmlparser2';\nimport { type ComponentType, type FunctionComponent, type ReactNode, useMemo } from 'react';\nimport {\n type ColorValue,\n type ImageProps,\n type TextProps,\n type TextStyle,\n View,\n} from 'react-native';\n\nimport { HtmlProvider, type OnHTMLLinkPress } from './context/HtmlProvider';\nimport { HTMLValidator } from './HTMLValidator';\nimport { NodesRenderer } from './renderers/_NodesRenderer';\nimport type { CommonProps, HtmlStyle, TagStyles } from './types';\n\nexport interface RenderHTMLProps extends CommonProps {\n html: string;\n}\n\nexport const RenderHTML: FunctionComponent<RenderHTMLProps> = (props) => {\n const nodes = useMemo(() => {\n if (!props.html) {\n return [];\n }\n const cleaned = props.html.replace(/\\n/g, '');\n const n = parseDocument(cleaned);\n return new HTMLValidator(n.children).cleanup();\n }, [props.html]);\n\n return (\n <View>\n <HtmlProvider\n tagStyles={props.tagStyles}\n baseStyle={props.baseStyle}\n classesStyles={props.classesStyles}\n listGap={props.listGap}\n overrideExternalLinkTintColor={props.overrideExternalLinkTintColor}\n markerColor={props.markerColor}\n onLinkPress={props.onLinkPress}\n renderImage={props.renderImage}\n renderTextComponent={props.renderTextComponent}\n >\n <NodesRenderer nodes={nodes} />\n </HtmlProvider>\n </View>\n );\n};\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { createContext, type ReactNode, useCallback, useContext, useMemo } from 'react';\nimport type { ColorValue, ImageProps, TextProps, TextStyle, ViewStyle } from 'react-native';\nimport { Image, Text } from 'react-native';\n\nimport type { CommonProps, HTMLTag, TagStyles } from '../types';\n\nexport interface OnHTMLLinkPress {\n url: string;\n title: string;\n}\n\ninterface ContextValue {\n getStyle: (node: AnyNode | ChildNode) => {\n text: TextStyle;\n block: ViewStyle;\n };\n baseStyle: TextStyle;\n tagsStyles: TagStyles;\n overrideExternalLinkTintColor?: ColorValue;\n onLinkPress?: (options: OnHTMLLinkPress) => void;\n markerColor?: string;\n renderImage: (props: ImageProps) => ReactNode;\n renderText: (props: TextProps) => ReactNode;\n}\n\nconst HtmlContext = createContext<ContextValue | null>(null);\n\ninterface ProviderProps extends CommonProps {\n children: ReactNode;\n}\n\nexport const HtmlProvider: FunctionComponent<ProviderProps> = (options) => {\n const baseStyle = useMemo<TextStyle>(() => {\n return {\n ...options.baseStyle,\n };\n }, [options.baseStyle]);\n\n const tagsStyles = useMemo<TagStyles>(() => {\n // Sorted by renderer type: block first, then text\n return {\n // BLOCK RENDERER TAGS\n thead: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.thead?.text,\n },\n block: {\n ...options.tagStyles?.thead?.block,\n },\n },\n tbody: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tbody?.text,\n },\n block: {\n ...options.tagStyles?.tbody?.block,\n },\n },\n tfoot: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tfoot?.text,\n },\n block: {\n ...options.tagStyles?.tfoot?.block,\n },\n },\n blockquote: {\n text: {\n ...baseStyle,\n fontStyle: 'italic',\n ...options.tagStyles?.blockquote?.text,\n },\n block: {\n borderLeftWidth: 4,\n borderLeftColor: 'black',\n marginLeft: 8,\n paddingLeft: 12,\n backgroundColor: '#cccccc',\n ...options.tagStyles?.blockquote?.block,\n },\n },\n ul: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.ul?.text,\n },\n block: {\n paddingLeft: 12,\n paddingVertical: 0,\n gap: options.listGap ?? 0,\n ...options.tagStyles?.ul?.block,\n },\n },\n ol: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.ol?.text,\n },\n block: {\n paddingLeft: 12,\n paddingVertical: 0,\n gap: options.listGap ?? 0,\n ...options.tagStyles?.ol?.block,\n },\n },\n dl: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.dl?.text,\n },\n block: {\n ...options.tagStyles?.dl?.block,\n },\n },\n div: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.div?.text,\n },\n block: {\n ...options.tagStyles?.div?.block,\n },\n },\n main: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.main?.text,\n },\n block: {\n ...options.tagStyles?.main?.block,\n },\n },\n section: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.section?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.section?.block,\n },\n },\n article: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.article?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.article?.block,\n },\n },\n aside: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.aside?.text,\n },\n block: {\n ...options.tagStyles?.aside?.block,\n },\n },\n nav: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.nav?.text,\n },\n block: {\n ...options.tagStyles?.nav?.block,\n },\n },\n header: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.header?.text,\n },\n block: {\n marginBottom: 8,\n ...options.tagStyles?.header?.block,\n },\n },\n footer: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.footer?.text,\n },\n block: {\n marginTop: 8,\n ...options.tagStyles?.footer?.block,\n },\n },\n hr: {\n text: {\n ...options.tagStyles?.hr?.text,\n },\n block: {\n borderBottomWidth: 1,\n borderBottomColor: 'black',\n marginVertical: 12,\n ...options.tagStyles?.hr?.block,\n },\n },\n br: {\n text: {\n ...options.tagStyles?.br?.text,\n },\n block: {\n height: 16,\n ...options.tagStyles?.br?.block,\n },\n },\n\n img: {\n text: {\n ...options.tagStyles?.img?.text,\n },\n block: {\n marginVertical: 8,\n\n flex: 1,\n width: undefined,\n height: 100,\n\n ...options.tagStyles?.img?.block,\n },\n },\n table: {\n text: {\n ...options.tagStyles?.table?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.table?.block,\n },\n },\n tr: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tr?.text,\n },\n block: {\n ...options.tagStyles?.tr?.block,\n },\n },\n\n // TEXT RENDERER TAGS\n h1: {\n text: {\n ...baseStyle,\n fontSize: 32,\n lineHeight: 38.4,\n ...options.tagStyles?.h1?.text,\n },\n block: {\n marginTop: 12,\n marginBottom: 8,\n ...options.tagStyles?.h1?.block,\n },\n },\n h2: {\n text: {\n ...baseStyle,\n fontSize: 24,\n lineHeight: 28.8,\n ...options.tagStyles?.h2?.text,\n },\n block: {\n marginTop: 10,\n marginBottom: 6,\n ...options.tagStyles?.h2?.block,\n },\n },\n h3: {\n text: {\n ...baseStyle,\n fontSize: 18.72,\n lineHeight: 22.46,\n ...options.tagStyles?.h3?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 6,\n ...options.tagStyles?.h3?.block,\n },\n },\n h4: {\n text: {\n ...baseStyle,\n fontSize: 16,\n lineHeight: 19.2,\n ...options.tagStyles?.h4?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 4,\n ...options.tagStyles?.h4?.block,\n },\n },\n h5: {\n text: {\n ...baseStyle,\n fontSize: 13.28,\n lineHeight: 15.94,\n ...options.tagStyles?.h5?.text,\n },\n block: {\n marginTop: 6,\n marginBottom: 4,\n ...options.tagStyles?.h5?.block,\n },\n },\n h6: {\n text: {\n ...baseStyle,\n fontSize: 10.72,\n lineHeight: 12.86,\n ...options.tagStyles?.h6?.text,\n },\n block: {\n marginTop: 6,\n marginBottom: 4,\n ...options.tagStyles?.h6?.block,\n },\n },\n p: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.p?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 8,\n ...options.tagStyles?.p?.block,\n },\n },\n a: {\n text: {\n ...baseStyle,\n textDecorationLine: 'underline',\n ...options.tagStyles?.a?.text,\n },\n },\n li: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.li?.text,\n },\n block: {\n paddingLeft: 0,\n ...options.tagStyles?.li?.block,\n },\n },\n pre: {\n text: {\n ...baseStyle,\n fontFamily: 'monospace',\n backgroundColor: '#bbbbbb',\n ...options.tagStyles?.pre?.text,\n },\n },\n code: {\n text: {\n ...baseStyle,\n fontFamily: 'monospace',\n backgroundColor: '#bbbbbb',\n ...options.tagStyles?.code?.text,\n },\n },\n\n // inline text styles\n b: {\n text: {\n fontWeight: 'bold',\n ...options.tagStyles?.b?.text,\n },\n },\n strong: {\n text: {\n fontWeight: 'bold',\n ...options.tagStyles?.strong?.text,\n },\n },\n i: {\n text: {\n fontStyle: 'italic',\n ...options.tagStyles?.i?.text,\n },\n },\n em: {\n text: {\n fontStyle: 'italic',\n ...options.tagStyles?.em?.text,\n },\n },\n u: {\n text: {\n textDecorationLine: 'underline',\n ...options.tagStyles?.u?.text,\n },\n },\n mark: {\n text: {\n ...baseStyle,\n backgroundColor: '#fff59d',\n ...options.tagStyles?.mark?.text,\n },\n },\n small: {\n text: {\n ...baseStyle,\n fontSize: Math.max((baseStyle.fontSize as number) - 2, 12),\n ...options.tagStyles?.small?.text,\n },\n },\n s: {\n text: {\n ...baseStyle,\n textDecorationLine: 'line-through',\n ...options.tagStyles?.s?.text,\n },\n },\n del: {\n text: {\n ...baseStyle,\n textDecorationLine: 'line-through',\n ...options.tagStyles?.del?.text,\n },\n },\n sup: {\n text: {\n ...baseStyle,\n textAlignVertical: 'top',\n fontSize: Math.max((baseStyle.fontSize as number) - 4, 10),\n ...options.tagStyles?.sup?.text,\n },\n },\n sub: {\n text: {\n ...baseStyle,\n textAlignVertical: 'bottom',\n fontSize: Math.max((baseStyle.fontSize as number) - 4, 10),\n ...options.tagStyles?.sub?.text,\n },\n },\n th: {\n text: {\n ...baseStyle,\n fontWeight: 'bold',\n padding: 8,\n borderWidth: 1,\n borderColor: 'black',\n ...options.tagStyles?.th?.text,\n },\n },\n td: {\n text: {\n ...baseStyle,\n padding: 8,\n ...options.tagStyles?.td?.text,\n },\n },\n dt: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.dt?.text,\n },\n },\n dd: {\n text: {\n ...baseStyle,\n marginLeft: 20,\n ...options.tagStyles?.dd?.text,\n },\n },\n span: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.span?.text,\n },\n },\n };\n }, [baseStyle, options.tagStyles, options.listGap]);\n\n const getStyle = useCallback(\n (\n node: AnyNode | ChildNode,\n ): {\n text: TextStyle;\n block: ViewStyle;\n } => {\n if (node.type === 'tag') {\n const classStyle = node.attribs.class\n ? options.classesStyles?.[node.attribs.class] || {}\n : {};\n return {\n text: {\n ...tagsStyles[node.tagName as HTMLTag].text,\n ...classStyle.text,\n },\n block: {\n ...(tagsStyles[node.tagName as HTMLTag].block ?? {}),\n ...classStyle.block,\n },\n };\n }\n return {\n text: {},\n block: {},\n };\n },\n [tagsStyles, options.classesStyles],\n );\n\n const renderImage = useMemo<(props: ImageProps) => ReactNode>(() => {\n if (options.renderImage) {\n return options.renderImage;\n }\n return (props: ImageProps) => <Image {...props} />;\n }, [options.renderImage]);\n\n const renderText = useMemo<(props: TextProps) => ReactNode>(() => {\n if (options.renderTextComponent) {\n return options.renderTextComponent;\n }\n return (props: TextProps) => <Text {...props} />;\n }, [options.renderTextComponent]);\n\n const providerValue = useMemo(\n () => ({\n getStyle,\n baseStyle,\n tagsStyles,\n overrideExternalLinkTintColor: options.overrideExternalLinkTintColor,\n onLinkPress: options.onLinkPress,\n markerColor: options.markerColor,\n renderImage,\n renderText,\n }),\n [\n getStyle,\n baseStyle,\n tagsStyles,\n options.overrideExternalLinkTintColor,\n options.onLinkPress,\n options.markerColor,\n renderImage,\n renderText,\n ],\n );\n\n return <HtmlContext.Provider value={providerValue}>{options.children}</HtmlContext.Provider>;\n};\n\nexport const useHtmlContext = () => {\n const context = useContext(HtmlContext);\n if (!context) {\n throw new Error('useHtml must be used within a HtmlProvider');\n }\n return context;\n};\n","import type { AnyNode } from 'domhandler';\n\n/**\n * Cleans up `<ul>` and `<ol>` nodes by removing any empty text nodes\n */\nconst cleanUlNodesUtil = (nodes: AnyNode[]): AnyNode[] => {\n return nodes.map((node) => {\n if (node.type !== 'tag') {\n return node;\n }\n if (node.name === 'ul' || node.name === 'ol') {\n if (!node.children) {\n return node;\n }\n node.children = node.children.filter((child) => {\n return child.type !== 'text' || (child.type === 'text' && child.data.trim() !== '');\n });\n }\n // Recursively process children if present\n if (node.children) {\n node.children = cleanUlNodesUtil(node.children);\n return node;\n }\n return node;\n });\n};\n\nexport class HTMLValidator {\n constructor(private nodes: AnyNode[]) {}\n\n cleanup(): AnyNode[] {\n this.nodes = cleanUlNodesUtil(this.nodes);\n return this.nodes;\n }\n}\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { Text, View } from 'react-native';\n\nimport { AlignedWidthItem } from '../context/AlignedWidthItem';\nimport { AlignedWidthProvider } from '../context/AlignedWidthProvider';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { isTextRenderer } from '../utils';\nimport { DefaultBlockRenderer } from './_DefaultBlockRenderer';\nimport { DefaultTextRenderer } from './_DefaultTextRenderer';\nimport { ATagRenderer } from './ATagRenderer';\nimport { ImgTagRenderer } from './ImgTagRenderer';\nimport { LiTagRenderer } from './LiTagRenderer';\nimport { PTagRenderer } from './PTagRenderer';\n\ninterface Props {\n node: AnyNode | ChildNode;\n}\n\nexport const NodeRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle } = useHtmlContext();\n\n if (node.type === 'tag') {\n switch (node.tagName) {\n case 'thead':\n case 'tbody':\n case 'tfoot':\n case 'blockquote':\n case 'ul':\n case 'ol':\n case 'dl':\n case 'dt':\n case 'dd':\n case 'div':\n case 'main':\n case 'section':\n case 'article':\n case 'aside':\n case 'nav':\n case 'header':\n case 'footer':\n case 'tr':\n return <DefaultBlockRenderer node={node} />;\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return (\n <DefaultBlockRenderer\n node={node}\n textProps={{\n accessible: true,\n accessibilityRole: 'header',\n }}\n />\n );\n case 'p':\n return <PTagRenderer node={node} />;\n case 'li':\n return <LiTagRenderer node={node} />;\n case 'hr':\n return <View style={[getStyle(node).block]} />;\n case 'br':\n if (isTextRenderer(node.prev)) {\n return null;\n }\n return <View style={[getStyle(node).block]} />;\n case 'table':\n return (\n <AlignedWidthProvider>\n <DefaultBlockRenderer node={node} />\n </AlignedWidthProvider>\n );\n case 'img':\n return <ImgTagRenderer node={node} />;\n // text renderers\n case 'b':\n case 'strong':\n case 'i':\n case 'em':\n case 'u':\n case 'mark':\n case 'small':\n case 's':\n case 'del':\n case 'sup':\n case 'sub':\n case 'span':\n case 'pre':\n case 'code':\n return <DefaultTextRenderer node={node} />;\n case 'a':\n return <ATagRenderer node={node} />;\n case 'th':\n case 'td': {\n const currentIndex = node.parent?.children.indexOf(node) || 0;\n return (\n <AlignedWidthItem index={currentIndex}>\n <DefaultTextRenderer node={node} />\n </AlignedWidthItem>\n );\n }\n default:\n // Ignore unsupported tags (script, style, iframe, etc.)\n return null;\n }\n }\n if (node.type === 'text') {\n const text = node.data\n // crush multiple spaces into one\n .replace(/\\s+/g, ' ')\n .replace(/&nbsp;/g, ' ');\n\n return <Text>{text}</Text>;\n }\n return null;\n};\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { type StyleProp, View, type ViewStyle } from 'react-native';\n\nimport { useAlignedWidth } from './AlignedWidthProvider';\n\ninterface Props extends PropsWithChildren {\n index: number;\n style?: StyleProp<ViewStyle>;\n}\n\n/**\n * This component is used to wrap items that need to have aligned widths.\n * It uses the AlignedWidthProvider context to measure and set the width\n * of each item based on the widest item in the same index position.\n * For example, in a table column.\n */\nexport const AlignedWidthItem: FunctionComponent<Props> = ({ children, index, style }) => {\n const { getLayoutHandlerForIndex, getWidthStyle } = useAlignedWidth();\n\n return (\n <View style={[getWidthStyle(index), style]} onLayout={getLayoutHandlerForIndex(index)}>\n {children}\n </View>\n );\n};\n","import { createContext, type ReactNode, useContext, useState } from 'react';\nimport type { LayoutChangeEvent } from 'react-native';\n\ninterface AlignedWidthContextProps {\n getLayoutHandlerForIndex: (colIdx: number) => (event: LayoutChangeEvent) => void;\n getWidthStyle: (colIdx: number) => { minWidth?: number; width?: number };\n}\n\nconst AlignedWidthContext = createContext<AlignedWidthContextProps | undefined>(undefined);\n\nexport const AlignedWidthProvider = ({ children }: { children: ReactNode }) => {\n const [colWidths, setColWidths] = useState<{ [colIdx: number]: number }>({});\n\n const getLayoutHandlerForIndex = (colIdx: number) => {\n return (event: LayoutChangeEvent) => {\n const { width } = event.nativeEvent.layout;\n setColWidths((prev) => {\n const previousWidth = prev[colIdx] || 0;\n return {\n ...prev,\n [colIdx]: Math.max(previousWidth, width),\n };\n });\n };\n };\n\n const getWidthStyle = (colIdx: number) => {\n return {\n minWidth: colWidths[colIdx] || undefined,\n width: colWidths[colIdx] || undefined,\n };\n };\n\n return (\n <AlignedWidthContext.Provider\n value={{\n getLayoutHandlerForIndex,\n getWidthStyle,\n }}\n >\n {children}\n </AlignedWidthContext.Provider>\n );\n};\n\nexport const useAlignedWidth = () => {\n const context = useContext(AlignedWidthContext);\n if (!context) {\n throw new Error('useAlignedWidth must be used within a AlignedWidthProvider');\n }\n return context;\n};\n","import { ComponentType, ReactNode } from 'react';\nimport type { ColorValue, ImageProps, TextProps, TextStyle, ViewStyle } from 'react-native';\n\nimport { OnHTMLLinkPress } from './context/HtmlProvider';\n\nexport type HTMLTag =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'p'\n | 'a'\n | 'ul'\n | 'ol'\n | 'li'\n | 'img'\n | 'table'\n | 'tr'\n | 'th'\n | 'td'\n | 'pre'\n | 'code'\n | 'blockquote'\n | 'hr'\n | 'br'\n | 'div'\n | 'b'\n | 'strong'\n | 'i'\n | 'em'\n | 'u'\n | 'mark'\n | 'small'\n | 's'\n | 'del'\n | 'sup'\n | 'sub'\n | 'span'\n | 'dt'\n | 'dd'\n | 'thead'\n | 'tbody'\n | 'tfoot'\n | 'dl'\n | 'main'\n | 'section'\n | 'article'\n | 'aside'\n | 'nav'\n | 'header'\n | 'footer';\n\nexport type RendererType = 'text' | 'block';\n\nexport const rendererTypeMap = {\n // Elements rendered with a View (block)\n thead: 'block',\n tbody: 'block',\n tfoot: 'block',\n blockquote: 'block',\n ul: 'block',\n ol: 'block',\n dl: 'block',\n li: 'block',\n div: 'block',\n hr: 'block',\n br: 'block',\n pre: 'block',\n code: 'block',\n img: 'block',\n table: 'block',\n tr: 'block',\n dt: 'block',\n dd: 'block',\n p: 'block',\n h1: 'block',\n h2: 'block',\n h3: 'block',\n h4: 'block',\n h5: 'block',\n h6: 'block',\n main: 'block',\n section: 'block',\n article: 'block',\n aside: 'block',\n nav: 'block',\n header: 'block',\n footer: 'block',\n\n // All other elements are text\n b: 'text',\n strong: 'text',\n i: 'text',\n em: 'text',\n u: 'text',\n mark: 'text',\n small: 'text',\n s: 'text',\n del: 'text',\n sup: 'text',\n sub: 'text',\n span: 'text',\n a: 'text',\n th: 'text',\n td: 'text',\n} satisfies Record<HTMLTag, RendererType>;\n\nexport type HtmlStyle = {\n text?: TextStyle;\n block?: ViewStyle;\n};\n\nexport type TagStyles = {\n [key in HTMLTag]: HtmlStyle;\n};\n\nexport interface CommonProps {\n /**\n * Render prop for all images rendered by the HTML renderer\n * (<img> tags, bullet markers, and external link icons).\n * Keeps the package free of any specific image library dependency.\n *\n * @example\n * renderImage={(props) => <Image {...props} />}\n */\n renderImage?: (props: ImageProps) => ReactNode;\n\n /**\n * Custom component to use instead of the built-in React Native `Text`.\n * Useful for applying a global font or integrating a design-system text component.\n * Must accept the same props as `Text` (i.e. `TextProps`).\n *\n * @example\n * TextComponent={MyAppText}\n */\n TextComponent?: ComponentType<TextProps & { children?: ReactNode }>;\n\n /**\n * Render prop for all text nodes rendered by the HTML renderer.\n * Receives the full `TextProps` (including `style`, `children`, accessibility props, etc.)\n * and must return a renderable node. Takes priority over `TextComponent` when both are set.\n *\n * @example\n * renderTextComponent={(props) => <MyText {...props} />}\n */\n renderTextComponent?: (props: TextProps) => ReactNode;\n\n // style props\n baseStyle?: TextStyle;\n tagStyles?: Partial<TagStyles>;\n classesStyles?: {\n [className: string]: HtmlStyle;\n };\n listGap?: number;\n\n // interaction/functional props\n onLinkPress?: (options: OnHTMLLinkPress) => void;\n markerColor?: string;\n overrideExternalLinkTintColor?: ColorValue;\n}\n","import type { AnyNode, ChildNode, Element } from 'domhandler';\n\nimport { type HTMLTag, rendererTypeMap } from './types';\n\nexport const isTextRenderer = (node: AnyNode | ChildNode | null): boolean => {\n if (!node) {\n return false;\n }\n if (node.type === 'tag') {\n return rendererTypeMap[node.tagName as HTMLTag] === 'text';\n }\n return node.type === 'text';\n};\n\n// Concatenate all text nodes from children\nexport const concatTextNodes = (children: (AnyNode | ChildNode)[]): string => {\n let result = '';\n for (const child of children) {\n if (child.type === 'text') {\n result += child.data;\n }\n // Recursively check for text nodes in element children\n if (child.type === 'tag' && Array.isArray(child.children)) {\n result += concatTextNodes(child.children);\n }\n }\n return result;\n};\n\nexport const isList = (child: ChildNode) => {\n return child.type === 'tag' && (child.tagName === 'ol' || child.tagName === 'ul');\n};\n\nexport const getTextFromNode = (node: Element): string => {\n return node.children.map((c) => (c.type === 'text' ? c.data : '')).join('');\n};\n\nexport const isExternalURL = (url?: string): boolean => {\n if (!url) {\n return false;\n }\n return url.startsWith('https://') || url.startsWith('http://');\n};\n","import type { ChildNode, Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { Text, type TextProps, View, type ViewProps } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { type HTMLTag, type RendererType, rendererTypeMap } from '../types';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n viewProps?: ViewProps;\n textProps?: TextProps;\n}\n\nexport const DefaultBlockRenderer: FunctionComponent<Props> = ({\n node,\n viewProps = {},\n textProps = {},\n}) => {\n const { getStyle } = useHtmlContext();\n const { style: viewStyle, ...restViewProps } = viewProps;\n const { style: textStyle, ...restTextProps } = textProps;\n\n const groupedChildren = groupByInlineBlock(node.children);\n\n return (\n <View {...restViewProps} style={[getStyle(node).block, viewStyle]}>\n {groupedChildren.map((childrenGroup, index) => {\n if (childrenGroup.type === 'text') {\n return (\n <Text\n {...restTextProps}\n key={`${node.type}-${index}`}\n style={[getStyle(node).text, textStyle]}\n >\n <NodesRenderer nodes={childrenGroup.nodes} />\n </Text>\n );\n }\n return <NodesRenderer key={`${node.type}-${index}`} nodes={childrenGroup.nodes} />;\n })}\n </View>\n );\n};\n\nfunction groupByInlineBlock(arr: ChildNode[]): {\n type: RendererType;\n nodes: ChildNode[];\n}[] {\n const result: {\n type: RendererType;\n nodes: ChildNode[];\n }[] = [];\n let currentGroup: ChildNode[] = [];\n\n for (const item of arr) {\n const isTextNode = item.type === 'text';\n const isTextTag = item.type === 'tag' && rendererTypeMap[item.name as HTMLTag] === 'text';\n if (isTextNode || isTextTag) {\n currentGroup.push(item);\n } else {\n if (currentGroup.length) {\n result.push({\n type: 'text',\n nodes: currentGroup,\n });\n currentGroup = [];\n }\n result.push({\n type: 'block',\n nodes: [item],\n });\n }\n }\n if (currentGroup.length) {\n result.push({\n type: 'text',\n nodes: currentGroup,\n });\n }\n return result;\n}\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { type TextProps } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n textProps?: TextProps;\n}\n\nexport const DefaultTextRenderer: FunctionComponent<Props> = ({ node, textProps = {} }) => {\n const { style, ...restProps } = textProps;\n const { getStyle, renderText } = useHtmlContext();\n\n return (\n <>\n {renderText({\n ...restProps,\n style: [getStyle(node).text, style],\n children: <NodesRenderer nodes={node.children} />,\n })}\n </>\n );\n};\n","export const EXTERNAL_LINK_URI =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kJCwwjMljq2h8AAAD4SURBVEjH7dY9SgNBGMbxn7vpIngXwc5SbG39KjxCLDyCnY0nUFGIH0Uu4CU8gXZ2iYU2IsRmiiCz+u4sBpQ8sLwMDPPf53mWYVnoP2sH44bn8evmXgfQM+5n1jW20lz6LXc9DDHFByYRR2foBw4/xkM64xLbuMYy1iNvN8H7N/mPMcg4Gab1KOeoCTQK7KuTkyluZ9LJgqrCTmqcYx932E3dtNJPjnJxwWqamzjoCqpxlYlrEIw7BGqChHqtWnRygb3STqKgkwS5KS0+egWdpnlUAmkDesJhlzuqMifNDdQU3Vr6hKPql4BesIKNFqBXvC3+Bf62PgFLzkKE8ZczlwAAAABJRU5ErkJggg==';\n\nexport const UL_MARKER_URI =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAwCAYAAAAsJjtLAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAACKADAAQAAAABAAAAMAAAAAAE1YgVAAAAZklEQVQ4EWNgGAWjITC4QoDxiYRE/H9GxgkM//8LIDuNkYHhAZDfAFJw/z8DgwKyJJzNyPiBCackSBXQVCa4ahwMaigAOgSH6QwgnzD9//+/EOolVHVAjf8YGBpRBUd5oyEw8CEAAGO5FkZ9+flOAAAAAElFTkSuQmCC';\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { EXTERNAL_LINK_URI } from '../assets';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { concatTextNodes, isExternalURL } from '../utils';\n\ninterface Props {\n node: Element;\n}\n\nexport const ATagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { overrideExternalLinkTintColor, onLinkPress, getStyle, renderImage, renderText } =\n useHtmlContext();\n\n const text = concatTextNodes(node.children);\n if (!text) {\n return null;\n }\n const style = getStyle(node);\n\n const fontSize = style.text?.fontSize ?? 18;\n\n const isExternal = node.attribs.href ? isExternalURL(node.attribs.href) : false;\n\n return (\n <>\n {renderText({\n accessible: true,\n onPress: () => {\n onLinkPress?.({\n url: node.attribs.href,\n title: text,\n });\n },\n accessibilityRole: 'link',\n accessibilityHint: isExternal ? 'External link' : undefined,\n importantForAccessibility: 'yes',\n accessibilityElementsHidden: false,\n style: style.text,\n children: (\n <>\n {text}\n {isExternal\n ? renderImage({\n source: { uri: EXTERNAL_LINK_URI },\n style: {\n tintColor: overrideExternalLinkTintColor ?? style.text.color ?? 'black',\n height: fontSize,\n width: fontSize,\n paddingTop: 5,\n },\n })\n : null}\n </>\n ),\n })}\n </>\n );\n};\n","import type { Element } from 'domhandler';\nimport { type FunctionComponent, useEffect, useState } from 'react';\nimport { Image, type ImageStyle, View } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\n\ninterface Props {\n node: Element;\n}\n\nexport const ImgTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle, renderImage } = useHtmlContext();\n const [size, setSize] = useState<{\n w: number;\n h: number;\n } | null>(null);\n const [containerWidth, setContainerWidth] = useState<number>(0);\n\n const { src, alt } = node.attribs || {};\n\n useEffect(() => {\n if (!src) {\n return;\n }\n Image.getSize(\n src,\n (width, height) => {\n setSize({ w: width, h: height });\n },\n () => {\n // ignore errors — image simply won't render\n },\n );\n }, [src]);\n\n if (!size) return null;\n\n const { w, h } = size;\n\n const finalWidth = Math.min(w, containerWidth);\n const ratio = h / w;\n\n const imageStyle = {\n ...(getStyle(node).block as ImageStyle),\n width: finalWidth,\n height: finalWidth * ratio,\n };\n\n return (\n <View\n onLayout={(e) => {\n const width = e.nativeEvent.layout.width;\n setContainerWidth(width);\n }}\n style={{ width: '100%' }}\n >\n {renderImage({\n source: { uri: src },\n style: imageStyle,\n alt,\n })}\n </View>\n );\n};\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { View } from 'react-native';\n\nimport { UL_MARKER_URI } from '../assets';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { concatTextNodes, isList } from '../utils';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n}\n\nexport const LiTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle, markerColor, renderImage, renderText } = useHtmlContext();\n\n const isParentOl = node.parent?.type === 'tag' && node.parent?.tagName === 'ol';\n const parentLiTags = node.parent?.children || [];\n const currentIndex = parentLiTags.indexOf(node) + 1;\n const items = node.children;\n const style = getStyle(node);\n const { lineHeight = 20, fontSize = 16 } = style.text;\n const markerHeight = 5;\n const markerColorResult = markerColor ?? style.text.color ?? 'pink';\n const renderMarker = () => {\n if (isParentOl) {\n return renderText({ style: [style.text], children: `${currentIndex}.` });\n } else {\n return renderImage({\n source: { uri: UL_MARKER_URI },\n style: {\n width: markerHeight,\n height: lineHeight,\n tintColor: markerColorResult,\n },\n });\n }\n };\n\n // Separate nested lists and main content\n const nestedLists = items.filter((child) => isList(child));\n const mainContent = items.filter((child) => !isList(child));\n\n return (\n <View>\n <View\n style={{\n flexDirection: 'row',\n }}\n >\n <View\n style={{\n marginRight: 8,\n marginBottom: lineHeight - fontSize,\n }}\n >\n {renderMarker()}\n </View>\n {renderText({\n accessible: true,\n accessibilityLabel: `List item ${currentIndex} of ${parentLiTags.length}: ${concatTextNodes(mainContent)}`,\n style: [style.text, { flex: 1 }],\n children: <NodesRenderer nodes={mainContent} />,\n })}\n </View>\n {nestedLists.length > 0 && (\n <View style={{ width: '100%' }}>\n <NodesRenderer nodes={nestedLists} />\n </View>\n )}\n </View>\n );\n};\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { DefaultBlockRenderer } from './_DefaultBlockRenderer';\n\ninterface Props {\n node: Element;\n}\n\nexport const PTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle } = useHtmlContext();\n\n const isFirstChild = !node.previousSibling;\n const isLastChild = !node.nextSibling;\n const style = getStyle(node);\n // collapse top margin for first child and bottom margin for last child\n const marginTop = isFirstChild ? 0 : style.block.marginTop;\n const marginBottom = isLastChild ? 0 : style.block.marginBottom;\n return (\n <DefaultBlockRenderer\n node={node}\n viewProps={{\n style: {\n marginTop,\n marginBottom,\n },\n }}\n />\n );\n};\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { NodeRenderer } from './_NodeRenderer';\n\ninterface Props {\n nodes: (AnyNode | ChildNode)[];\n}\n\nexport const NodesRenderer: FunctionComponent<Props> = ({ nodes }) => {\n return nodes.map((node, index) => <NodeRenderer key={`${node.type}-${index}`} node={node} />);\n};\n"],"mappings":"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","names":["import_react","import_react_native","import_react_native","import_react_native","import_react","import_jsx_runtime","import_jsx_runtime","import_react_native","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","import_react_native","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/RenderHTML.tsx","../src/context/HtmlProvider.tsx","../src/HTMLValidator.ts","../src/renderers/_NodeRenderer.tsx","../src/context/AlignedWidthItem.tsx","../src/context/AlignedWidthProvider.tsx","../src/types.ts","../src/utils.ts","../src/renderers/_DefaultBlockRenderer.tsx","../src/renderers/_DefaultTextRenderer.tsx","../src/assets.ts","../src/renderers/ATagRenderer.tsx","../src/renderers/ImgTagRenderer.tsx","../src/renderers/LiTagRenderer.tsx","../src/renderers/PTagRenderer.tsx","../src/renderers/_NodesRenderer.tsx"],"sourcesContent":["export type { OnHTMLLinkPress } from './context/HtmlProvider';\nexport type { RenderHTMLProps } from './RenderHTML';\nexport { RenderHTML } from './RenderHTML';\nexport type { HTMLTag, HtmlStyle, TagStyles } from './types';\n","import { parseDocument } from 'htmlparser2';\nimport { type ComponentType, type FunctionComponent, type ReactNode, useMemo } from 'react';\nimport {\n type ColorValue,\n type ImageProps,\n type TextProps,\n type TextStyle,\n View,\n} from 'react-native';\n\nimport { HtmlProvider, type OnHTMLLinkPress } from './context/HtmlProvider';\nimport { HTMLValidator } from './HTMLValidator';\nimport { NodesRenderer } from './renderers/_NodesRenderer';\nimport type { CommonProps, HtmlStyle, TagStyles } from './types';\n\nexport interface RenderHTMLProps extends CommonProps {\n html: string;\n}\n\nexport const RenderHTML: FunctionComponent<RenderHTMLProps> = (props) => {\n const nodes = useMemo(() => {\n if (!props.html) {\n return [];\n }\n const cleaned = props.html.replace(/\\n/g, '');\n const n = parseDocument(cleaned);\n return new HTMLValidator(n.children).cleanup();\n }, [props.html]);\n\n return (\n <View>\n <HtmlProvider\n tagStyles={props.tagStyles}\n baseStyle={props.baseStyle}\n classesStyles={props.classesStyles}\n listGap={props.listGap}\n overrideExternalLinkTintColor={props.overrideExternalLinkTintColor}\n markerColor={props.markerColor}\n onLinkPress={props.onLinkPress}\n renderImage={props.renderImage}\n renderTextComponent={props.renderTextComponent}\n >\n <NodesRenderer nodes={nodes} />\n </HtmlProvider>\n </View>\n );\n};\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { createContext, type ReactNode, useCallback, useContext, useMemo } from 'react';\nimport type { ColorValue, ImageProps, TextProps, TextStyle, ViewStyle } from 'react-native';\nimport { Image, Text } from 'react-native';\n\nimport type { CommonProps, HTMLTag, TagStyles } from '../types';\n\nexport interface OnHTMLLinkPress {\n url: string;\n title: string;\n}\n\ninterface ContextValue {\n getStyle: (node: AnyNode | ChildNode) => {\n text: TextStyle;\n block: ViewStyle;\n };\n baseStyle: TextStyle;\n tagsStyles: TagStyles;\n overrideExternalLinkTintColor?: ColorValue;\n onLinkPress?: (options: OnHTMLLinkPress) => void;\n markerColor?: string;\n renderImage: (props: ImageProps) => ReactNode;\n renderText: (props: TextProps) => ReactNode;\n}\n\nconst HtmlContext = createContext<ContextValue | null>(null);\n\ninterface ProviderProps extends CommonProps {\n children: ReactNode;\n}\n\nexport const HtmlProvider: FunctionComponent<ProviderProps> = (options) => {\n const baseStyle = useMemo<TextStyle>(() => {\n return {\n ...options.baseStyle,\n };\n }, [options.baseStyle]);\n\n const tagsStyles = useMemo<TagStyles>(() => {\n // Sorted by renderer type: block first, then text\n return {\n // BLOCK RENDERER TAGS\n thead: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.thead?.text,\n },\n block: {\n ...options.tagStyles?.thead?.block,\n },\n },\n tbody: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tbody?.text,\n },\n block: {\n ...options.tagStyles?.tbody?.block,\n },\n },\n tfoot: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tfoot?.text,\n },\n block: {\n ...options.tagStyles?.tfoot?.block,\n },\n },\n blockquote: {\n text: {\n ...baseStyle,\n fontStyle: 'italic',\n ...options.tagStyles?.blockquote?.text,\n },\n block: {\n borderLeftWidth: 4,\n borderLeftColor: 'black',\n marginLeft: 8,\n paddingLeft: 12,\n backgroundColor: '#cccccc',\n ...options.tagStyles?.blockquote?.block,\n },\n },\n ul: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.ul?.text,\n },\n block: {\n paddingLeft: 12,\n paddingVertical: 0,\n gap: options.listGap ?? 0,\n ...options.tagStyles?.ul?.block,\n },\n },\n ol: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.ol?.text,\n },\n block: {\n paddingLeft: 12,\n paddingVertical: 0,\n gap: options.listGap ?? 0,\n ...options.tagStyles?.ol?.block,\n },\n },\n dl: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.dl?.text,\n },\n block: {\n ...options.tagStyles?.dl?.block,\n },\n },\n div: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.div?.text,\n },\n block: {\n ...options.tagStyles?.div?.block,\n },\n },\n main: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.main?.text,\n },\n block: {\n ...options.tagStyles?.main?.block,\n },\n },\n section: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.section?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.section?.block,\n },\n },\n article: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.article?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.article?.block,\n },\n },\n aside: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.aside?.text,\n },\n block: {\n ...options.tagStyles?.aside?.block,\n },\n },\n nav: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.nav?.text,\n },\n block: {\n ...options.tagStyles?.nav?.block,\n },\n },\n header: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.header?.text,\n },\n block: {\n marginBottom: 8,\n ...options.tagStyles?.header?.block,\n },\n },\n footer: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.footer?.text,\n },\n block: {\n marginTop: 8,\n ...options.tagStyles?.footer?.block,\n },\n },\n hr: {\n text: {\n ...options.tagStyles?.hr?.text,\n },\n block: {\n borderBottomWidth: 1,\n borderBottomColor: 'black',\n marginVertical: 12,\n ...options.tagStyles?.hr?.block,\n },\n },\n br: {\n text: {\n ...options.tagStyles?.br?.text,\n },\n block: {\n height: 16,\n ...options.tagStyles?.br?.block,\n },\n },\n\n img: {\n text: {\n ...options.tagStyles?.img?.text,\n },\n block: {\n marginVertical: 8,\n\n flex: 1,\n width: undefined,\n height: 100,\n\n ...options.tagStyles?.img?.block,\n },\n },\n table: {\n text: {\n ...options.tagStyles?.table?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.table?.block,\n },\n },\n tr: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tr?.text,\n },\n block: {\n ...options.tagStyles?.tr?.block,\n },\n },\n\n // TEXT RENDERER TAGS\n h1: {\n text: {\n ...baseStyle,\n fontSize: 32,\n lineHeight: 38.4,\n ...options.tagStyles?.h1?.text,\n },\n block: {\n marginTop: 12,\n marginBottom: 8,\n ...options.tagStyles?.h1?.block,\n },\n },\n h2: {\n text: {\n ...baseStyle,\n fontSize: 24,\n lineHeight: 28.8,\n ...options.tagStyles?.h2?.text,\n },\n block: {\n marginTop: 10,\n marginBottom: 6,\n ...options.tagStyles?.h2?.block,\n },\n },\n h3: {\n text: {\n ...baseStyle,\n fontSize: 18.72,\n lineHeight: 22.46,\n ...options.tagStyles?.h3?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 6,\n ...options.tagStyles?.h3?.block,\n },\n },\n h4: {\n text: {\n ...baseStyle,\n fontSize: 16,\n lineHeight: 19.2,\n ...options.tagStyles?.h4?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 4,\n ...options.tagStyles?.h4?.block,\n },\n },\n h5: {\n text: {\n ...baseStyle,\n fontSize: 13.28,\n lineHeight: 15.94,\n ...options.tagStyles?.h5?.text,\n },\n block: {\n marginTop: 6,\n marginBottom: 4,\n ...options.tagStyles?.h5?.block,\n },\n },\n h6: {\n text: {\n ...baseStyle,\n fontSize: 10.72,\n lineHeight: 12.86,\n ...options.tagStyles?.h6?.text,\n },\n block: {\n marginTop: 6,\n marginBottom: 4,\n ...options.tagStyles?.h6?.block,\n },\n },\n p: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.p?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 8,\n ...options.tagStyles?.p?.block,\n },\n },\n a: {\n text: {\n ...baseStyle,\n textDecorationLine: 'underline',\n ...options.tagStyles?.a?.text,\n },\n },\n li: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.li?.text,\n },\n block: {\n paddingLeft: 0,\n ...options.tagStyles?.li?.block,\n },\n },\n pre: {\n text: {\n ...baseStyle,\n fontFamily: 'monospace',\n backgroundColor: '#bbbbbb',\n ...options.tagStyles?.pre?.text,\n },\n },\n code: {\n text: {\n ...baseStyle,\n fontFamily: 'monospace',\n backgroundColor: '#bbbbbb',\n ...options.tagStyles?.code?.text,\n },\n },\n\n // inline text styles\n b: {\n text: {\n fontWeight: 'bold',\n ...options.tagStyles?.b?.text,\n },\n },\n strong: {\n text: {\n fontWeight: 'bold',\n ...options.tagStyles?.strong?.text,\n },\n },\n i: {\n text: {\n fontStyle: 'italic',\n ...options.tagStyles?.i?.text,\n },\n },\n em: {\n text: {\n fontStyle: 'italic',\n ...options.tagStyles?.em?.text,\n },\n },\n u: {\n text: {\n textDecorationLine: 'underline',\n ...options.tagStyles?.u?.text,\n },\n },\n mark: {\n text: {\n ...baseStyle,\n backgroundColor: '#fff59d',\n ...options.tagStyles?.mark?.text,\n },\n },\n small: {\n text: {\n ...baseStyle,\n fontSize: Math.max((baseStyle.fontSize as number) - 2, 12),\n ...options.tagStyles?.small?.text,\n },\n },\n s: {\n text: {\n ...baseStyle,\n textDecorationLine: 'line-through',\n ...options.tagStyles?.s?.text,\n },\n },\n del: {\n text: {\n ...baseStyle,\n textDecorationLine: 'line-through',\n ...options.tagStyles?.del?.text,\n },\n },\n sup: {\n text: {\n ...baseStyle,\n textAlignVertical: 'top',\n fontSize: Math.max((baseStyle.fontSize as number) - 4, 10),\n ...options.tagStyles?.sup?.text,\n },\n },\n sub: {\n text: {\n ...baseStyle,\n textAlignVertical: 'bottom',\n fontSize: Math.max((baseStyle.fontSize as number) - 4, 10),\n ...options.tagStyles?.sub?.text,\n },\n },\n th: {\n text: {\n ...baseStyle,\n fontWeight: 'bold',\n padding: 8,\n borderWidth: 1,\n borderColor: 'black',\n ...options.tagStyles?.th?.text,\n },\n },\n td: {\n text: {\n ...baseStyle,\n padding: 8,\n ...options.tagStyles?.td?.text,\n },\n },\n dt: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.dt?.text,\n },\n },\n dd: {\n text: {\n ...baseStyle,\n marginLeft: 20,\n ...options.tagStyles?.dd?.text,\n },\n },\n span: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.span?.text,\n },\n },\n };\n }, [baseStyle, options.tagStyles, options.listGap]);\n\n const getStyle = useCallback(\n (\n node: AnyNode | ChildNode,\n ): {\n text: TextStyle;\n block: ViewStyle;\n } => {\n if (node.type === 'tag') {\n const classStyle = node.attribs.class\n ? options.classesStyles?.[node.attribs.class] || {}\n : {};\n return {\n text: {\n ...tagsStyles[node.tagName as HTMLTag].text,\n ...classStyle.text,\n },\n block: {\n ...(tagsStyles[node.tagName as HTMLTag].block ?? {}),\n ...classStyle.block,\n },\n };\n }\n return {\n text: {},\n block: {},\n };\n },\n [tagsStyles, options.classesStyles],\n );\n\n const renderImage = useMemo<(props: ImageProps) => ReactNode>(() => {\n if (options.renderImage) {\n return options.renderImage;\n }\n return (props: ImageProps) => <Image {...props} />;\n }, [options.renderImage]);\n\n const renderText = useMemo<(props: TextProps) => ReactNode>(() => {\n if (options.renderTextComponent) {\n return options.renderTextComponent;\n }\n return (props: TextProps) => <Text {...props} />;\n }, [options.renderTextComponent]);\n\n const providerValue = useMemo(\n () => ({\n getStyle,\n baseStyle,\n tagsStyles,\n overrideExternalLinkTintColor: options.overrideExternalLinkTintColor,\n onLinkPress: options.onLinkPress,\n markerColor: options.markerColor,\n renderImage,\n renderText,\n }),\n [\n getStyle,\n baseStyle,\n tagsStyles,\n options.overrideExternalLinkTintColor,\n options.onLinkPress,\n options.markerColor,\n renderImage,\n renderText,\n ],\n );\n\n return <HtmlContext.Provider value={providerValue}>{options.children}</HtmlContext.Provider>;\n};\n\nexport const useHtmlContext = () => {\n const context = useContext(HtmlContext);\n if (!context) {\n throw new Error('useHtml must be used within a HtmlProvider');\n }\n return context;\n};\n","import type { AnyNode } from 'domhandler';\n\n/**\n * Cleans up `<ul>` and `<ol>` nodes by removing any empty text nodes\n */\nconst cleanUlNodesUtil = (nodes: AnyNode[]): AnyNode[] => {\n return nodes.map((node) => {\n if (node.type !== 'tag') {\n return node;\n }\n if (node.name === 'ul' || node.name === 'ol') {\n if (!node.children) {\n return node;\n }\n node.children = node.children.filter((child) => {\n return child.type !== 'text' || (child.type === 'text' && child.data.trim() !== '');\n });\n }\n // Recursively process children if present\n if (node.children) {\n node.children = cleanUlNodesUtil(node.children);\n return node;\n }\n return node;\n });\n};\n\nexport class HTMLValidator {\n constructor(private nodes: AnyNode[]) {}\n\n cleanup(): AnyNode[] {\n this.nodes = cleanUlNodesUtil(this.nodes);\n return this.nodes;\n }\n}\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { Text, View } from 'react-native';\n\nimport { AlignedWidthItem } from '../context/AlignedWidthItem';\nimport { AlignedWidthProvider } from '../context/AlignedWidthProvider';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { isTextRenderer } from '../utils';\nimport { DefaultBlockRenderer } from './_DefaultBlockRenderer';\nimport { DefaultTextRenderer } from './_DefaultTextRenderer';\nimport { ATagRenderer } from './ATagRenderer';\nimport { ImgTagRenderer } from './ImgTagRenderer';\nimport { LiTagRenderer } from './LiTagRenderer';\nimport { PTagRenderer } from './PTagRenderer';\n\ninterface Props {\n node: AnyNode | ChildNode;\n}\n\nexport const NodeRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle } = useHtmlContext();\n\n if (node.type === 'tag') {\n switch (node.tagName) {\n case 'thead':\n case 'tbody':\n case 'tfoot':\n case 'blockquote':\n case 'ul':\n case 'ol':\n case 'dl':\n case 'dt':\n case 'dd':\n case 'div':\n case 'main':\n case 'section':\n case 'article':\n case 'aside':\n case 'nav':\n case 'header':\n case 'footer':\n case 'tr':\n return <DefaultBlockRenderer node={node} />;\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return (\n <DefaultBlockRenderer\n node={node}\n textProps={{\n accessible: true,\n accessibilityRole: 'header',\n }}\n />\n );\n case 'p':\n return <PTagRenderer node={node} />;\n case 'li':\n return <LiTagRenderer node={node} />;\n case 'hr':\n return <View style={[getStyle(node).block]} />;\n case 'br':\n if (isTextRenderer(node.prev)) {\n return null;\n }\n return <View style={[getStyle(node).block]} />;\n case 'table':\n return (\n <AlignedWidthProvider>\n <DefaultBlockRenderer node={node} />\n </AlignedWidthProvider>\n );\n case 'img':\n return <ImgTagRenderer node={node} />;\n // text renderers\n case 'b':\n case 'strong':\n case 'i':\n case 'em':\n case 'u':\n case 'mark':\n case 'small':\n case 's':\n case 'del':\n case 'sup':\n case 'sub':\n case 'span':\n case 'pre':\n case 'code':\n return <DefaultTextRenderer node={node} />;\n case 'a':\n return <ATagRenderer node={node} />;\n case 'th':\n case 'td': {\n const currentIndex = node.parent?.children.indexOf(node) || 0;\n return (\n <AlignedWidthItem index={currentIndex}>\n <DefaultTextRenderer node={node} />\n </AlignedWidthItem>\n );\n }\n default:\n // Ignore unsupported tags (script, style, iframe, etc.)\n return null;\n }\n }\n if (node.type === 'text') {\n const text = node.data\n // crush multiple spaces into one\n .replace(/\\s+/g, ' ')\n .replace(/&nbsp;/g, ' ');\n\n return <Text>{text}</Text>;\n }\n return null;\n};\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { type StyleProp, View, type ViewStyle } from 'react-native';\n\nimport { useAlignedWidth } from './AlignedWidthProvider';\n\ninterface Props extends PropsWithChildren {\n index: number;\n style?: StyleProp<ViewStyle>;\n}\n\n/**\n * This component is used to wrap items that need to have aligned widths.\n * It uses the AlignedWidthProvider context to measure and set the width\n * of each item based on the widest item in the same index position.\n * For example, in a table column.\n */\nexport const AlignedWidthItem: FunctionComponent<Props> = ({ children, index, style }) => {\n const { getLayoutHandlerForIndex, getWidthStyle } = useAlignedWidth();\n\n return (\n <View style={[getWidthStyle(index), style]} onLayout={getLayoutHandlerForIndex(index)}>\n {children}\n </View>\n );\n};\n","import { createContext, type ReactNode, useContext, useState } from 'react';\nimport type { LayoutChangeEvent } from 'react-native';\n\ninterface AlignedWidthContextProps {\n getLayoutHandlerForIndex: (colIdx: number) => (event: LayoutChangeEvent) => void;\n getWidthStyle: (colIdx: number) => { minWidth?: number; width?: number };\n}\n\nconst AlignedWidthContext = createContext<AlignedWidthContextProps | undefined>(undefined);\n\nexport const AlignedWidthProvider = ({ children }: { children: ReactNode }) => {\n const [colWidths, setColWidths] = useState<{ [colIdx: number]: number }>({});\n\n const getLayoutHandlerForIndex = (colIdx: number) => {\n return (event: LayoutChangeEvent) => {\n const { width } = event.nativeEvent.layout;\n setColWidths((prev) => {\n const previousWidth = prev[colIdx] || 0;\n return {\n ...prev,\n [colIdx]: Math.max(previousWidth, width),\n };\n });\n };\n };\n\n const getWidthStyle = (colIdx: number) => {\n return {\n minWidth: colWidths[colIdx] || undefined,\n width: colWidths[colIdx] || undefined,\n };\n };\n\n return (\n <AlignedWidthContext.Provider\n value={{\n getLayoutHandlerForIndex,\n getWidthStyle,\n }}\n >\n {children}\n </AlignedWidthContext.Provider>\n );\n};\n\nexport const useAlignedWidth = () => {\n const context = useContext(AlignedWidthContext);\n if (!context) {\n throw new Error('useAlignedWidth must be used within a AlignedWidthProvider');\n }\n return context;\n};\n","import { ComponentType, ReactNode } from 'react';\nimport type { ColorValue, ImageProps, TextProps, TextStyle, ViewStyle } from 'react-native';\n\nimport { OnHTMLLinkPress } from './context/HtmlProvider';\n\nexport type HTMLTag =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'p'\n | 'a'\n | 'ul'\n | 'ol'\n | 'li'\n | 'img'\n | 'table'\n | 'tr'\n | 'th'\n | 'td'\n | 'pre'\n | 'code'\n | 'blockquote'\n | 'hr'\n | 'br'\n | 'div'\n | 'b'\n | 'strong'\n | 'i'\n | 'em'\n | 'u'\n | 'mark'\n | 'small'\n | 's'\n | 'del'\n | 'sup'\n | 'sub'\n | 'span'\n | 'dt'\n | 'dd'\n | 'thead'\n | 'tbody'\n | 'tfoot'\n | 'dl'\n | 'main'\n | 'section'\n | 'article'\n | 'aside'\n | 'nav'\n | 'header'\n | 'footer';\n\nexport type RendererType = 'text' | 'block';\n\nexport const rendererTypeMap = {\n // Elements rendered with a View (block)\n thead: 'block',\n tbody: 'block',\n tfoot: 'block',\n blockquote: 'block',\n ul: 'block',\n ol: 'block',\n dl: 'block',\n li: 'block',\n div: 'block',\n hr: 'block',\n br: 'block',\n pre: 'block',\n code: 'block',\n img: 'block',\n table: 'block',\n tr: 'block',\n dt: 'block',\n dd: 'block',\n p: 'block',\n h1: 'block',\n h2: 'block',\n h3: 'block',\n h4: 'block',\n h5: 'block',\n h6: 'block',\n main: 'block',\n section: 'block',\n article: 'block',\n aside: 'block',\n nav: 'block',\n header: 'block',\n footer: 'block',\n\n // All other elements are text\n b: 'text',\n strong: 'text',\n i: 'text',\n em: 'text',\n u: 'text',\n mark: 'text',\n small: 'text',\n s: 'text',\n del: 'text',\n sup: 'text',\n sub: 'text',\n span: 'text',\n a: 'text',\n th: 'text',\n td: 'text',\n} satisfies Record<HTMLTag, RendererType>;\n\nexport type HtmlStyle = {\n text?: TextStyle;\n block?: ViewStyle;\n};\n\nexport type TagStyles = {\n [key in HTMLTag]: HtmlStyle;\n};\n\nexport interface CommonProps {\n /**\n * Render prop for all images rendered by the HTML renderer\n * (<img> tags, bullet markers, and external link icons).\n * Keeps the package free of any specific image library dependency.\n *\n * @example\n * renderImage={(props) => <Image {...props} />}\n */\n renderImage?: (props: ImageProps) => ReactNode;\n\n /**\n * Custom component to use instead of the built-in React Native `Text`.\n * Useful for applying a global font or integrating a design-system text component.\n * Must accept the same props as `Text` (i.e. `TextProps`).\n *\n * @example\n * TextComponent={MyAppText}\n */\n TextComponent?: ComponentType<TextProps & { children?: ReactNode }>;\n\n /**\n * Render prop for all text nodes rendered by the HTML renderer.\n * Receives the full `TextProps` (including `style`, `children`, accessibility props, etc.)\n * and must return a renderable node. Takes priority over `TextComponent` when both are set.\n *\n * @example\n * renderTextComponent={(props) => <MyText {...props} />}\n */\n renderTextComponent?: (props: TextProps) => ReactNode;\n\n // style props\n baseStyle?: TextStyle;\n tagStyles?: Partial<TagStyles>;\n classesStyles?: {\n [className: string]: HtmlStyle;\n };\n listGap?: number;\n\n // interaction/functional props\n onLinkPress?: (options: OnHTMLLinkPress) => void;\n markerColor?: string;\n overrideExternalLinkTintColor?: ColorValue;\n}\n","import type { AnyNode, ChildNode, Element } from 'domhandler';\n\nimport { type HTMLTag, rendererTypeMap } from './types';\n\nexport const isTextRenderer = (node: AnyNode | ChildNode | null): boolean => {\n if (!node) {\n return false;\n }\n if (node.type === 'tag') {\n return rendererTypeMap[node.tagName as HTMLTag] === 'text';\n }\n return node.type === 'text';\n};\n\n// Concatenate all text nodes from children\nexport const concatTextNodes = (children: (AnyNode | ChildNode)[]): string => {\n let result = '';\n for (const child of children) {\n if (child.type === 'text') {\n result += child.data;\n }\n // Recursively check for text nodes in element children\n if (child.type === 'tag' && Array.isArray(child.children)) {\n result += concatTextNodes(child.children);\n }\n }\n return result;\n};\n\nexport const isList = (child: ChildNode) => {\n return child.type === 'tag' && (child.tagName === 'ol' || child.tagName === 'ul');\n};\n\nexport const getTextFromNode = (node: Element): string => {\n return node.children.map((c) => (c.type === 'text' ? c.data : '')).join('');\n};\n\nexport const isExternalURL = (url?: string): boolean => {\n if (!url) {\n return false;\n }\n return url.startsWith('https://') || url.startsWith('http://');\n};\n","import type { ChildNode, Element } from 'domhandler';\nimport { Fragment, type FunctionComponent } from 'react';\nimport { type TextProps, View, type ViewProps } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { type HTMLTag, type RendererType, rendererTypeMap } from '../types';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n viewProps?: ViewProps;\n textProps?: TextProps;\n}\n\nexport const DefaultBlockRenderer: FunctionComponent<Props> = ({\n node,\n viewProps = {},\n textProps = {},\n}) => {\n const { getStyle, renderText } = useHtmlContext();\n const { style: viewStyle, ...restViewProps } = viewProps;\n const { style: textStyle, ...restTextProps } = textProps;\n\n const groupedChildren = groupByInlineBlock(node.children);\n\n return (\n <View {...restViewProps} style={[getStyle(node).block, viewStyle]}>\n {groupedChildren.map((childrenGroup, index) => {\n if (childrenGroup.type === 'text') {\n return (\n <Fragment key={`${node.type}-${index}`}>\n {renderText({\n ...restTextProps,\n style: [getStyle(node).text, textStyle],\n children: <NodesRenderer nodes={childrenGroup.nodes} />,\n })}\n </Fragment>\n );\n }\n return <NodesRenderer key={`${node.type}-${index}`} nodes={childrenGroup.nodes} />;\n })}\n </View>\n );\n};\n\nfunction groupByInlineBlock(arr: ChildNode[]): {\n type: RendererType;\n nodes: ChildNode[];\n}[] {\n const result: {\n type: RendererType;\n nodes: ChildNode[];\n }[] = [];\n let currentGroup: ChildNode[] = [];\n\n for (const item of arr) {\n const isTextNode = item.type === 'text';\n const isTextTag = item.type === 'tag' && rendererTypeMap[item.name as HTMLTag] === 'text';\n if (isTextNode || isTextTag) {\n currentGroup.push(item);\n } else {\n if (currentGroup.length) {\n result.push({\n type: 'text',\n nodes: currentGroup,\n });\n currentGroup = [];\n }\n result.push({\n type: 'block',\n nodes: [item],\n });\n }\n }\n if (currentGroup.length) {\n result.push({\n type: 'text',\n nodes: currentGroup,\n });\n }\n return result;\n}\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { type TextProps } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n textProps?: TextProps;\n}\n\nexport const DefaultTextRenderer: FunctionComponent<Props> = ({ node, textProps = {} }) => {\n const { style, ...restProps } = textProps;\n const { getStyle, renderText } = useHtmlContext();\n\n return (\n <>\n {renderText({\n ...restProps,\n style: [getStyle(node).text, style],\n children: <NodesRenderer nodes={node.children} />,\n })}\n </>\n );\n};\n","export const EXTERNAL_LINK_URI =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kJCwwjMljq2h8AAAD4SURBVEjH7dY9SgNBGMbxn7vpIngXwc5SbG39KjxCLDyCnY0nUFGIH0Uu4CU8gXZ2iYU2IsRmiiCz+u4sBpQ8sLwMDPPf53mWYVnoP2sH44bn8evmXgfQM+5n1jW20lz6LXc9DDHFByYRR2foBw4/xkM64xLbuMYy1iNvN8H7N/mPMcg4Gab1KOeoCTQK7KuTkyluZ9LJgqrCTmqcYx932E3dtNJPjnJxwWqamzjoCqpxlYlrEIw7BGqChHqtWnRygb3STqKgkwS5KS0+egWdpnlUAmkDesJhlzuqMifNDdQU3Vr6hKPql4BesIKNFqBXvC3+Bf62PgFLzkKE8ZczlwAAAABJRU5ErkJggg==';\n\nexport const UL_MARKER_URI =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAwCAYAAAAsJjtLAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAACKADAAQAAAABAAAAMAAAAAAE1YgVAAAAZklEQVQ4EWNgGAWjITC4QoDxiYRE/H9GxgkM//8LIDuNkYHhAZDfAFJw/z8DgwKyJJzNyPiBCackSBXQVCa4ahwMaigAOgSH6QwgnzD9//+/EOolVHVAjf8YGBpRBUd5oyEw8CEAAGO5FkZ9+flOAAAAAElFTkSuQmCC';\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { EXTERNAL_LINK_URI } from '../assets';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { concatTextNodes, isExternalURL } from '../utils';\n\ninterface Props {\n node: Element;\n}\n\nexport const ATagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { overrideExternalLinkTintColor, onLinkPress, getStyle, renderImage, renderText } =\n useHtmlContext();\n\n const text = concatTextNodes(node.children);\n if (!text) {\n return null;\n }\n const style = getStyle(node);\n\n const fontSize = style.text?.fontSize ?? 18;\n\n const isExternal = node.attribs.href ? isExternalURL(node.attribs.href) : false;\n\n return (\n <>\n {renderText({\n accessible: true,\n onPress: () => {\n onLinkPress?.({\n url: node.attribs.href,\n title: text,\n });\n },\n accessibilityRole: 'link',\n accessibilityHint: isExternal ? 'External link' : undefined,\n importantForAccessibility: 'yes',\n accessibilityElementsHidden: false,\n style: style.text,\n children: (\n <>\n {text}\n {isExternal\n ? renderImage({\n source: { uri: EXTERNAL_LINK_URI },\n style: {\n tintColor: overrideExternalLinkTintColor ?? style.text.color ?? 'black',\n height: fontSize,\n width: fontSize,\n paddingTop: 5,\n },\n })\n : null}\n </>\n ),\n })}\n </>\n );\n};\n","import type { Element } from 'domhandler';\nimport { type FunctionComponent, useEffect, useState } from 'react';\nimport { Image, type ImageStyle, View } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\n\ninterface Props {\n node: Element;\n}\n\nexport const ImgTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle, renderImage } = useHtmlContext();\n const [size, setSize] = useState<{\n w: number;\n h: number;\n } | null>(null);\n const [containerWidth, setContainerWidth] = useState<number>(0);\n\n const { src, alt } = node.attribs || {};\n\n useEffect(() => {\n if (!src) {\n return;\n }\n Image.getSize(\n src,\n (width, height) => {\n setSize({ w: width, h: height });\n },\n () => {\n // ignore errors — image simply won't render\n },\n );\n }, [src]);\n\n if (!size) return null;\n\n const { w, h } = size;\n\n const finalWidth = Math.min(w, containerWidth);\n const ratio = h / w;\n\n const imageStyle = {\n ...(getStyle(node).block as ImageStyle),\n width: finalWidth,\n height: finalWidth * ratio,\n };\n\n return (\n <View\n onLayout={(e) => {\n const width = e.nativeEvent.layout.width;\n setContainerWidth(width);\n }}\n style={{ width: '100%' }}\n >\n {renderImage({\n source: { uri: src },\n style: imageStyle,\n alt,\n })}\n </View>\n );\n};\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { View } from 'react-native';\n\nimport { UL_MARKER_URI } from '../assets';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { concatTextNodes, isList } from '../utils';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n}\n\nexport const LiTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle, markerColor, renderImage, renderText } = useHtmlContext();\n\n const isParentOl = node.parent?.type === 'tag' && node.parent?.tagName === 'ol';\n const parentLiTags = node.parent?.children || [];\n const currentIndex = parentLiTags.indexOf(node) + 1;\n const items = node.children;\n const style = getStyle(node);\n const { lineHeight = 20, fontSize = 16 } = style.text;\n const markerHeight = 5;\n const markerColorResult = markerColor ?? style.text.color ?? 'pink';\n const renderMarker = () => {\n if (isParentOl) {\n return renderText({ style: [style.text], children: `${currentIndex}.` });\n } else {\n return renderImage({\n source: { uri: UL_MARKER_URI },\n style: {\n width: markerHeight,\n height: lineHeight,\n tintColor: markerColorResult,\n },\n });\n }\n };\n\n // Separate nested lists and main content\n const nestedLists = items.filter((child) => isList(child));\n const mainContent = items.filter((child) => !isList(child));\n\n return (\n <View>\n <View\n style={{\n flexDirection: 'row',\n }}\n >\n <View\n style={{\n marginRight: 8,\n marginBottom: lineHeight - fontSize,\n }}\n >\n {renderMarker()}\n </View>\n {renderText({\n accessible: true,\n accessibilityLabel: `List item ${currentIndex} of ${parentLiTags.length}: ${concatTextNodes(mainContent)}`,\n style: [style.text, { flex: 1 }],\n children: <NodesRenderer nodes={mainContent} />,\n })}\n </View>\n {nestedLists.length > 0 && (\n <View style={{ width: '100%' }}>\n <NodesRenderer nodes={nestedLists} />\n </View>\n )}\n </View>\n );\n};\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { DefaultBlockRenderer } from './_DefaultBlockRenderer';\n\ninterface Props {\n node: Element;\n}\n\nexport const PTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle } = useHtmlContext();\n\n const isFirstChild = !node.previousSibling;\n const isLastChild = !node.nextSibling;\n const style = getStyle(node);\n // collapse top margin for first child and bottom margin for last child\n const marginTop = isFirstChild ? 0 : style.block.marginTop;\n const marginBottom = isLastChild ? 0 : style.block.marginBottom;\n return (\n <DefaultBlockRenderer\n node={node}\n viewProps={{\n style: {\n marginTop,\n marginBottom,\n },\n }}\n />\n );\n};\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { NodeRenderer } from './_NodeRenderer';\n\ninterface Props {\n nodes: (AnyNode | ChildNode)[];\n}\n\nexport const NodesRenderer: FunctionComponent<Props> = ({ nodes }) => {\n return nodes.map((node, index) => <NodeRenderer key={`${node.type}-${index}`} node={node} />);\n};\n"],"mappings":"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","names":["import_react","import_react_native","import_react_native","import_react_native","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react_native","import_jsx_runtime","import_react_native","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
package/dist/index.mjs CHANGED
@@ -554,7 +554,7 @@ var HTMLValidator = class {
554
554
  };
555
555
 
556
556
  // src/renderers/_NodeRenderer.tsx
557
- import { Text as Text3, View as View5 } from "react-native";
557
+ import { Text as Text2, View as View5 } from "react-native";
558
558
 
559
559
  // src/context/AlignedWidthItem.tsx
560
560
  import { View } from "react-native";
@@ -695,29 +695,25 @@ var isExternalURL = (url) => {
695
695
  };
696
696
 
697
697
  // src/renderers/_DefaultBlockRenderer.tsx
698
- import { Text as Text2, View as View2 } from "react-native";
698
+ import { Fragment } from "react";
699
+ import { View as View2 } from "react-native";
699
700
  import { jsx as jsx4 } from "react/jsx-runtime";
700
- import { createElement } from "react";
701
701
  var DefaultBlockRenderer = ({
702
702
  node,
703
703
  viewProps = {},
704
704
  textProps = {}
705
705
  }) => {
706
- const { getStyle } = useHtmlContext();
706
+ const { getStyle, renderText } = useHtmlContext();
707
707
  const { style: viewStyle, ...restViewProps } = viewProps;
708
708
  const { style: textStyle, ...restTextProps } = textProps;
709
709
  const groupedChildren = groupByInlineBlock(node.children);
710
710
  return /* @__PURE__ */ jsx4(View2, { ...restViewProps, style: [getStyle(node).block, viewStyle], children: groupedChildren.map((childrenGroup, index) => {
711
711
  if (childrenGroup.type === "text") {
712
- return /* @__PURE__ */ createElement(
713
- Text2,
714
- {
715
- ...restTextProps,
716
- key: `${node.type}-${index}`,
717
- style: [getStyle(node).text, textStyle]
718
- },
719
- /* @__PURE__ */ jsx4(NodesRenderer, { nodes: childrenGroup.nodes })
720
- );
712
+ return /* @__PURE__ */ jsx4(Fragment, { children: renderText({
713
+ ...restTextProps,
714
+ style: [getStyle(node).text, textStyle],
715
+ children: /* @__PURE__ */ jsx4(NodesRenderer, { nodes: childrenGroup.nodes })
716
+ }) }, `${node.type}-${index}`);
721
717
  }
722
718
  return /* @__PURE__ */ jsx4(NodesRenderer, { nodes: childrenGroup.nodes }, `${node.type}-${index}`);
723
719
  }) });
@@ -754,11 +750,11 @@ function groupByInlineBlock(arr) {
754
750
  }
755
751
 
756
752
  // src/renderers/_DefaultTextRenderer.tsx
757
- import { Fragment, jsx as jsx5 } from "react/jsx-runtime";
753
+ import { Fragment as Fragment2, jsx as jsx5 } from "react/jsx-runtime";
758
754
  var DefaultTextRenderer = ({ node, textProps = {} }) => {
759
755
  const { style, ...restProps } = textProps;
760
756
  const { getStyle, renderText } = useHtmlContext();
761
- return /* @__PURE__ */ jsx5(Fragment, { children: renderText({
757
+ return /* @__PURE__ */ jsx5(Fragment2, { children: renderText({
762
758
  ...restProps,
763
759
  style: [getStyle(node).text, style],
764
760
  children: /* @__PURE__ */ jsx5(NodesRenderer, { nodes: node.children })
@@ -770,7 +766,7 @@ var EXTERNAL_LINK_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaC
770
766
  var UL_MARKER_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAwCAYAAAAsJjtLAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAACKADAAQAAAABAAAAMAAAAAAE1YgVAAAAZklEQVQ4EWNgGAWjITC4QoDxiYRE/H9GxgkM//8LIDuNkYHhAZDfAFJw/z8DgwKyJJzNyPiBCackSBXQVCa4ahwMaigAOgSH6QwgnzD9//+/EOolVHVAjf8YGBpRBUd5oyEw8CEAAGO5FkZ9+flOAAAAAElFTkSuQmCC";
771
767
 
772
768
  // src/renderers/ATagRenderer.tsx
773
- import { Fragment as Fragment2, jsx as jsx6, jsxs } from "react/jsx-runtime";
769
+ import { Fragment as Fragment3, jsx as jsx6, jsxs } from "react/jsx-runtime";
774
770
  var ATagRenderer = ({ node }) => {
775
771
  const { overrideExternalLinkTintColor, onLinkPress, getStyle, renderImage, renderText } = useHtmlContext();
776
772
  const text = concatTextNodes(node.children);
@@ -780,7 +776,7 @@ var ATagRenderer = ({ node }) => {
780
776
  const style = getStyle(node);
781
777
  const fontSize = style.text?.fontSize ?? 18;
782
778
  const isExternal = node.attribs.href ? isExternalURL(node.attribs.href) : false;
783
- return /* @__PURE__ */ jsx6(Fragment2, { children: renderText({
779
+ return /* @__PURE__ */ jsx6(Fragment3, { children: renderText({
784
780
  accessible: true,
785
781
  onPress: () => {
786
782
  onLinkPress?.({
@@ -793,7 +789,7 @@ var ATagRenderer = ({ node }) => {
793
789
  importantForAccessibility: "yes",
794
790
  accessibilityElementsHidden: false,
795
791
  style: style.text,
796
- children: /* @__PURE__ */ jsxs(Fragment2, { children: [
792
+ children: /* @__PURE__ */ jsxs(Fragment3, { children: [
797
793
  text,
798
794
  isExternal ? renderImage({
799
795
  source: { uri: EXTERNAL_LINK_URI },
@@ -1024,7 +1020,7 @@ var NodeRenderer = ({ node }) => {
1024
1020
  }
1025
1021
  if (node.type === "text") {
1026
1022
  const text = node.data.replace(/\s+/g, " ").replace(/&nbsp;/g, " ");
1027
- return /* @__PURE__ */ jsx10(Text3, { children: text });
1023
+ return /* @__PURE__ */ jsx10(Text2, { children: text });
1028
1024
  }
1029
1025
  return null;
1030
1026
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/RenderHTML.tsx","../src/context/HtmlProvider.tsx","../src/HTMLValidator.ts","../src/renderers/_NodeRenderer.tsx","../src/context/AlignedWidthItem.tsx","../src/context/AlignedWidthProvider.tsx","../src/types.ts","../src/utils.ts","../src/renderers/_DefaultBlockRenderer.tsx","../src/renderers/_DefaultTextRenderer.tsx","../src/assets.ts","../src/renderers/ATagRenderer.tsx","../src/renderers/ImgTagRenderer.tsx","../src/renderers/LiTagRenderer.tsx","../src/renderers/PTagRenderer.tsx","../src/renderers/_NodesRenderer.tsx"],"sourcesContent":["import { parseDocument } from 'htmlparser2';\nimport { type ComponentType, type FunctionComponent, type ReactNode, useMemo } from 'react';\nimport {\n type ColorValue,\n type ImageProps,\n type TextProps,\n type TextStyle,\n View,\n} from 'react-native';\n\nimport { HtmlProvider, type OnHTMLLinkPress } from './context/HtmlProvider';\nimport { HTMLValidator } from './HTMLValidator';\nimport { NodesRenderer } from './renderers/_NodesRenderer';\nimport type { CommonProps, HtmlStyle, TagStyles } from './types';\n\nexport interface RenderHTMLProps extends CommonProps {\n html: string;\n}\n\nexport const RenderHTML: FunctionComponent<RenderHTMLProps> = (props) => {\n const nodes = useMemo(() => {\n if (!props.html) {\n return [];\n }\n const cleaned = props.html.replace(/\\n/g, '');\n const n = parseDocument(cleaned);\n return new HTMLValidator(n.children).cleanup();\n }, [props.html]);\n\n return (\n <View>\n <HtmlProvider\n tagStyles={props.tagStyles}\n baseStyle={props.baseStyle}\n classesStyles={props.classesStyles}\n listGap={props.listGap}\n overrideExternalLinkTintColor={props.overrideExternalLinkTintColor}\n markerColor={props.markerColor}\n onLinkPress={props.onLinkPress}\n renderImage={props.renderImage}\n renderTextComponent={props.renderTextComponent}\n >\n <NodesRenderer nodes={nodes} />\n </HtmlProvider>\n </View>\n );\n};\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { createContext, type ReactNode, useCallback, useContext, useMemo } from 'react';\nimport type { ColorValue, ImageProps, TextProps, TextStyle, ViewStyle } from 'react-native';\nimport { Image, Text } from 'react-native';\n\nimport type { CommonProps, HTMLTag, TagStyles } from '../types';\n\nexport interface OnHTMLLinkPress {\n url: string;\n title: string;\n}\n\ninterface ContextValue {\n getStyle: (node: AnyNode | ChildNode) => {\n text: TextStyle;\n block: ViewStyle;\n };\n baseStyle: TextStyle;\n tagsStyles: TagStyles;\n overrideExternalLinkTintColor?: ColorValue;\n onLinkPress?: (options: OnHTMLLinkPress) => void;\n markerColor?: string;\n renderImage: (props: ImageProps) => ReactNode;\n renderText: (props: TextProps) => ReactNode;\n}\n\nconst HtmlContext = createContext<ContextValue | null>(null);\n\ninterface ProviderProps extends CommonProps {\n children: ReactNode;\n}\n\nexport const HtmlProvider: FunctionComponent<ProviderProps> = (options) => {\n const baseStyle = useMemo<TextStyle>(() => {\n return {\n ...options.baseStyle,\n };\n }, [options.baseStyle]);\n\n const tagsStyles = useMemo<TagStyles>(() => {\n // Sorted by renderer type: block first, then text\n return {\n // BLOCK RENDERER TAGS\n thead: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.thead?.text,\n },\n block: {\n ...options.tagStyles?.thead?.block,\n },\n },\n tbody: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tbody?.text,\n },\n block: {\n ...options.tagStyles?.tbody?.block,\n },\n },\n tfoot: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tfoot?.text,\n },\n block: {\n ...options.tagStyles?.tfoot?.block,\n },\n },\n blockquote: {\n text: {\n ...baseStyle,\n fontStyle: 'italic',\n ...options.tagStyles?.blockquote?.text,\n },\n block: {\n borderLeftWidth: 4,\n borderLeftColor: 'black',\n marginLeft: 8,\n paddingLeft: 12,\n backgroundColor: '#cccccc',\n ...options.tagStyles?.blockquote?.block,\n },\n },\n ul: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.ul?.text,\n },\n block: {\n paddingLeft: 12,\n paddingVertical: 0,\n gap: options.listGap ?? 0,\n ...options.tagStyles?.ul?.block,\n },\n },\n ol: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.ol?.text,\n },\n block: {\n paddingLeft: 12,\n paddingVertical: 0,\n gap: options.listGap ?? 0,\n ...options.tagStyles?.ol?.block,\n },\n },\n dl: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.dl?.text,\n },\n block: {\n ...options.tagStyles?.dl?.block,\n },\n },\n div: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.div?.text,\n },\n block: {\n ...options.tagStyles?.div?.block,\n },\n },\n main: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.main?.text,\n },\n block: {\n ...options.tagStyles?.main?.block,\n },\n },\n section: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.section?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.section?.block,\n },\n },\n article: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.article?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.article?.block,\n },\n },\n aside: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.aside?.text,\n },\n block: {\n ...options.tagStyles?.aside?.block,\n },\n },\n nav: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.nav?.text,\n },\n block: {\n ...options.tagStyles?.nav?.block,\n },\n },\n header: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.header?.text,\n },\n block: {\n marginBottom: 8,\n ...options.tagStyles?.header?.block,\n },\n },\n footer: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.footer?.text,\n },\n block: {\n marginTop: 8,\n ...options.tagStyles?.footer?.block,\n },\n },\n hr: {\n text: {\n ...options.tagStyles?.hr?.text,\n },\n block: {\n borderBottomWidth: 1,\n borderBottomColor: 'black',\n marginVertical: 12,\n ...options.tagStyles?.hr?.block,\n },\n },\n br: {\n text: {\n ...options.tagStyles?.br?.text,\n },\n block: {\n height: 16,\n ...options.tagStyles?.br?.block,\n },\n },\n\n img: {\n text: {\n ...options.tagStyles?.img?.text,\n },\n block: {\n marginVertical: 8,\n\n flex: 1,\n width: undefined,\n height: 100,\n\n ...options.tagStyles?.img?.block,\n },\n },\n table: {\n text: {\n ...options.tagStyles?.table?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.table?.block,\n },\n },\n tr: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tr?.text,\n },\n block: {\n ...options.tagStyles?.tr?.block,\n },\n },\n\n // TEXT RENDERER TAGS\n h1: {\n text: {\n ...baseStyle,\n fontSize: 32,\n lineHeight: 38.4,\n ...options.tagStyles?.h1?.text,\n },\n block: {\n marginTop: 12,\n marginBottom: 8,\n ...options.tagStyles?.h1?.block,\n },\n },\n h2: {\n text: {\n ...baseStyle,\n fontSize: 24,\n lineHeight: 28.8,\n ...options.tagStyles?.h2?.text,\n },\n block: {\n marginTop: 10,\n marginBottom: 6,\n ...options.tagStyles?.h2?.block,\n },\n },\n h3: {\n text: {\n ...baseStyle,\n fontSize: 18.72,\n lineHeight: 22.46,\n ...options.tagStyles?.h3?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 6,\n ...options.tagStyles?.h3?.block,\n },\n },\n h4: {\n text: {\n ...baseStyle,\n fontSize: 16,\n lineHeight: 19.2,\n ...options.tagStyles?.h4?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 4,\n ...options.tagStyles?.h4?.block,\n },\n },\n h5: {\n text: {\n ...baseStyle,\n fontSize: 13.28,\n lineHeight: 15.94,\n ...options.tagStyles?.h5?.text,\n },\n block: {\n marginTop: 6,\n marginBottom: 4,\n ...options.tagStyles?.h5?.block,\n },\n },\n h6: {\n text: {\n ...baseStyle,\n fontSize: 10.72,\n lineHeight: 12.86,\n ...options.tagStyles?.h6?.text,\n },\n block: {\n marginTop: 6,\n marginBottom: 4,\n ...options.tagStyles?.h6?.block,\n },\n },\n p: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.p?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 8,\n ...options.tagStyles?.p?.block,\n },\n },\n a: {\n text: {\n ...baseStyle,\n textDecorationLine: 'underline',\n ...options.tagStyles?.a?.text,\n },\n },\n li: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.li?.text,\n },\n block: {\n paddingLeft: 0,\n ...options.tagStyles?.li?.block,\n },\n },\n pre: {\n text: {\n ...baseStyle,\n fontFamily: 'monospace',\n backgroundColor: '#bbbbbb',\n ...options.tagStyles?.pre?.text,\n },\n },\n code: {\n text: {\n ...baseStyle,\n fontFamily: 'monospace',\n backgroundColor: '#bbbbbb',\n ...options.tagStyles?.code?.text,\n },\n },\n\n // inline text styles\n b: {\n text: {\n fontWeight: 'bold',\n ...options.tagStyles?.b?.text,\n },\n },\n strong: {\n text: {\n fontWeight: 'bold',\n ...options.tagStyles?.strong?.text,\n },\n },\n i: {\n text: {\n fontStyle: 'italic',\n ...options.tagStyles?.i?.text,\n },\n },\n em: {\n text: {\n fontStyle: 'italic',\n ...options.tagStyles?.em?.text,\n },\n },\n u: {\n text: {\n textDecorationLine: 'underline',\n ...options.tagStyles?.u?.text,\n },\n },\n mark: {\n text: {\n ...baseStyle,\n backgroundColor: '#fff59d',\n ...options.tagStyles?.mark?.text,\n },\n },\n small: {\n text: {\n ...baseStyle,\n fontSize: Math.max((baseStyle.fontSize as number) - 2, 12),\n ...options.tagStyles?.small?.text,\n },\n },\n s: {\n text: {\n ...baseStyle,\n textDecorationLine: 'line-through',\n ...options.tagStyles?.s?.text,\n },\n },\n del: {\n text: {\n ...baseStyle,\n textDecorationLine: 'line-through',\n ...options.tagStyles?.del?.text,\n },\n },\n sup: {\n text: {\n ...baseStyle,\n textAlignVertical: 'top',\n fontSize: Math.max((baseStyle.fontSize as number) - 4, 10),\n ...options.tagStyles?.sup?.text,\n },\n },\n sub: {\n text: {\n ...baseStyle,\n textAlignVertical: 'bottom',\n fontSize: Math.max((baseStyle.fontSize as number) - 4, 10),\n ...options.tagStyles?.sub?.text,\n },\n },\n th: {\n text: {\n ...baseStyle,\n fontWeight: 'bold',\n padding: 8,\n borderWidth: 1,\n borderColor: 'black',\n ...options.tagStyles?.th?.text,\n },\n },\n td: {\n text: {\n ...baseStyle,\n padding: 8,\n ...options.tagStyles?.td?.text,\n },\n },\n dt: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.dt?.text,\n },\n },\n dd: {\n text: {\n ...baseStyle,\n marginLeft: 20,\n ...options.tagStyles?.dd?.text,\n },\n },\n span: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.span?.text,\n },\n },\n };\n }, [baseStyle, options.tagStyles, options.listGap]);\n\n const getStyle = useCallback(\n (\n node: AnyNode | ChildNode,\n ): {\n text: TextStyle;\n block: ViewStyle;\n } => {\n if (node.type === 'tag') {\n const classStyle = node.attribs.class\n ? options.classesStyles?.[node.attribs.class] || {}\n : {};\n return {\n text: {\n ...tagsStyles[node.tagName as HTMLTag].text,\n ...classStyle.text,\n },\n block: {\n ...(tagsStyles[node.tagName as HTMLTag].block ?? {}),\n ...classStyle.block,\n },\n };\n }\n return {\n text: {},\n block: {},\n };\n },\n [tagsStyles, options.classesStyles],\n );\n\n const renderImage = useMemo<(props: ImageProps) => ReactNode>(() => {\n if (options.renderImage) {\n return options.renderImage;\n }\n return (props: ImageProps) => <Image {...props} />;\n }, [options.renderImage]);\n\n const renderText = useMemo<(props: TextProps) => ReactNode>(() => {\n if (options.renderTextComponent) {\n return options.renderTextComponent;\n }\n return (props: TextProps) => <Text {...props} />;\n }, [options.renderTextComponent]);\n\n const providerValue = useMemo(\n () => ({\n getStyle,\n baseStyle,\n tagsStyles,\n overrideExternalLinkTintColor: options.overrideExternalLinkTintColor,\n onLinkPress: options.onLinkPress,\n markerColor: options.markerColor,\n renderImage,\n renderText,\n }),\n [\n getStyle,\n baseStyle,\n tagsStyles,\n options.overrideExternalLinkTintColor,\n options.onLinkPress,\n options.markerColor,\n renderImage,\n renderText,\n ],\n );\n\n return <HtmlContext.Provider value={providerValue}>{options.children}</HtmlContext.Provider>;\n};\n\nexport const useHtmlContext = () => {\n const context = useContext(HtmlContext);\n if (!context) {\n throw new Error('useHtml must be used within a HtmlProvider');\n }\n return context;\n};\n","import type { AnyNode } from 'domhandler';\n\n/**\n * Cleans up `<ul>` and `<ol>` nodes by removing any empty text nodes\n */\nconst cleanUlNodesUtil = (nodes: AnyNode[]): AnyNode[] => {\n return nodes.map((node) => {\n if (node.type !== 'tag') {\n return node;\n }\n if (node.name === 'ul' || node.name === 'ol') {\n if (!node.children) {\n return node;\n }\n node.children = node.children.filter((child) => {\n return child.type !== 'text' || (child.type === 'text' && child.data.trim() !== '');\n });\n }\n // Recursively process children if present\n if (node.children) {\n node.children = cleanUlNodesUtil(node.children);\n return node;\n }\n return node;\n });\n};\n\nexport class HTMLValidator {\n constructor(private nodes: AnyNode[]) {}\n\n cleanup(): AnyNode[] {\n this.nodes = cleanUlNodesUtil(this.nodes);\n return this.nodes;\n }\n}\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { Text, View } from 'react-native';\n\nimport { AlignedWidthItem } from '../context/AlignedWidthItem';\nimport { AlignedWidthProvider } from '../context/AlignedWidthProvider';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { isTextRenderer } from '../utils';\nimport { DefaultBlockRenderer } from './_DefaultBlockRenderer';\nimport { DefaultTextRenderer } from './_DefaultTextRenderer';\nimport { ATagRenderer } from './ATagRenderer';\nimport { ImgTagRenderer } from './ImgTagRenderer';\nimport { LiTagRenderer } from './LiTagRenderer';\nimport { PTagRenderer } from './PTagRenderer';\n\ninterface Props {\n node: AnyNode | ChildNode;\n}\n\nexport const NodeRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle } = useHtmlContext();\n\n if (node.type === 'tag') {\n switch (node.tagName) {\n case 'thead':\n case 'tbody':\n case 'tfoot':\n case 'blockquote':\n case 'ul':\n case 'ol':\n case 'dl':\n case 'dt':\n case 'dd':\n case 'div':\n case 'main':\n case 'section':\n case 'article':\n case 'aside':\n case 'nav':\n case 'header':\n case 'footer':\n case 'tr':\n return <DefaultBlockRenderer node={node} />;\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return (\n <DefaultBlockRenderer\n node={node}\n textProps={{\n accessible: true,\n accessibilityRole: 'header',\n }}\n />\n );\n case 'p':\n return <PTagRenderer node={node} />;\n case 'li':\n return <LiTagRenderer node={node} />;\n case 'hr':\n return <View style={[getStyle(node).block]} />;\n case 'br':\n if (isTextRenderer(node.prev)) {\n return null;\n }\n return <View style={[getStyle(node).block]} />;\n case 'table':\n return (\n <AlignedWidthProvider>\n <DefaultBlockRenderer node={node} />\n </AlignedWidthProvider>\n );\n case 'img':\n return <ImgTagRenderer node={node} />;\n // text renderers\n case 'b':\n case 'strong':\n case 'i':\n case 'em':\n case 'u':\n case 'mark':\n case 'small':\n case 's':\n case 'del':\n case 'sup':\n case 'sub':\n case 'span':\n case 'pre':\n case 'code':\n return <DefaultTextRenderer node={node} />;\n case 'a':\n return <ATagRenderer node={node} />;\n case 'th':\n case 'td': {\n const currentIndex = node.parent?.children.indexOf(node) || 0;\n return (\n <AlignedWidthItem index={currentIndex}>\n <DefaultTextRenderer node={node} />\n </AlignedWidthItem>\n );\n }\n default:\n // Ignore unsupported tags (script, style, iframe, etc.)\n return null;\n }\n }\n if (node.type === 'text') {\n const text = node.data\n // crush multiple spaces into one\n .replace(/\\s+/g, ' ')\n .replace(/&nbsp;/g, ' ');\n\n return <Text>{text}</Text>;\n }\n return null;\n};\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { type StyleProp, View, type ViewStyle } from 'react-native';\n\nimport { useAlignedWidth } from './AlignedWidthProvider';\n\ninterface Props extends PropsWithChildren {\n index: number;\n style?: StyleProp<ViewStyle>;\n}\n\n/**\n * This component is used to wrap items that need to have aligned widths.\n * It uses the AlignedWidthProvider context to measure and set the width\n * of each item based on the widest item in the same index position.\n * For example, in a table column.\n */\nexport const AlignedWidthItem: FunctionComponent<Props> = ({ children, index, style }) => {\n const { getLayoutHandlerForIndex, getWidthStyle } = useAlignedWidth();\n\n return (\n <View style={[getWidthStyle(index), style]} onLayout={getLayoutHandlerForIndex(index)}>\n {children}\n </View>\n );\n};\n","import { createContext, type ReactNode, useContext, useState } from 'react';\nimport type { LayoutChangeEvent } from 'react-native';\n\ninterface AlignedWidthContextProps {\n getLayoutHandlerForIndex: (colIdx: number) => (event: LayoutChangeEvent) => void;\n getWidthStyle: (colIdx: number) => { minWidth?: number; width?: number };\n}\n\nconst AlignedWidthContext = createContext<AlignedWidthContextProps | undefined>(undefined);\n\nexport const AlignedWidthProvider = ({ children }: { children: ReactNode }) => {\n const [colWidths, setColWidths] = useState<{ [colIdx: number]: number }>({});\n\n const getLayoutHandlerForIndex = (colIdx: number) => {\n return (event: LayoutChangeEvent) => {\n const { width } = event.nativeEvent.layout;\n setColWidths((prev) => {\n const previousWidth = prev[colIdx] || 0;\n return {\n ...prev,\n [colIdx]: Math.max(previousWidth, width),\n };\n });\n };\n };\n\n const getWidthStyle = (colIdx: number) => {\n return {\n minWidth: colWidths[colIdx] || undefined,\n width: colWidths[colIdx] || undefined,\n };\n };\n\n return (\n <AlignedWidthContext.Provider\n value={{\n getLayoutHandlerForIndex,\n getWidthStyle,\n }}\n >\n {children}\n </AlignedWidthContext.Provider>\n );\n};\n\nexport const useAlignedWidth = () => {\n const context = useContext(AlignedWidthContext);\n if (!context) {\n throw new Error('useAlignedWidth must be used within a AlignedWidthProvider');\n }\n return context;\n};\n","import { ComponentType, ReactNode } from 'react';\nimport type { ColorValue, ImageProps, TextProps, TextStyle, ViewStyle } from 'react-native';\n\nimport { OnHTMLLinkPress } from './context/HtmlProvider';\n\nexport type HTMLTag =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'p'\n | 'a'\n | 'ul'\n | 'ol'\n | 'li'\n | 'img'\n | 'table'\n | 'tr'\n | 'th'\n | 'td'\n | 'pre'\n | 'code'\n | 'blockquote'\n | 'hr'\n | 'br'\n | 'div'\n | 'b'\n | 'strong'\n | 'i'\n | 'em'\n | 'u'\n | 'mark'\n | 'small'\n | 's'\n | 'del'\n | 'sup'\n | 'sub'\n | 'span'\n | 'dt'\n | 'dd'\n | 'thead'\n | 'tbody'\n | 'tfoot'\n | 'dl'\n | 'main'\n | 'section'\n | 'article'\n | 'aside'\n | 'nav'\n | 'header'\n | 'footer';\n\nexport type RendererType = 'text' | 'block';\n\nexport const rendererTypeMap = {\n // Elements rendered with a View (block)\n thead: 'block',\n tbody: 'block',\n tfoot: 'block',\n blockquote: 'block',\n ul: 'block',\n ol: 'block',\n dl: 'block',\n li: 'block',\n div: 'block',\n hr: 'block',\n br: 'block',\n pre: 'block',\n code: 'block',\n img: 'block',\n table: 'block',\n tr: 'block',\n dt: 'block',\n dd: 'block',\n p: 'block',\n h1: 'block',\n h2: 'block',\n h3: 'block',\n h4: 'block',\n h5: 'block',\n h6: 'block',\n main: 'block',\n section: 'block',\n article: 'block',\n aside: 'block',\n nav: 'block',\n header: 'block',\n footer: 'block',\n\n // All other elements are text\n b: 'text',\n strong: 'text',\n i: 'text',\n em: 'text',\n u: 'text',\n mark: 'text',\n small: 'text',\n s: 'text',\n del: 'text',\n sup: 'text',\n sub: 'text',\n span: 'text',\n a: 'text',\n th: 'text',\n td: 'text',\n} satisfies Record<HTMLTag, RendererType>;\n\nexport type HtmlStyle = {\n text?: TextStyle;\n block?: ViewStyle;\n};\n\nexport type TagStyles = {\n [key in HTMLTag]: HtmlStyle;\n};\n\nexport interface CommonProps {\n /**\n * Render prop for all images rendered by the HTML renderer\n * (<img> tags, bullet markers, and external link icons).\n * Keeps the package free of any specific image library dependency.\n *\n * @example\n * renderImage={(props) => <Image {...props} />}\n */\n renderImage?: (props: ImageProps) => ReactNode;\n\n /**\n * Custom component to use instead of the built-in React Native `Text`.\n * Useful for applying a global font or integrating a design-system text component.\n * Must accept the same props as `Text` (i.e. `TextProps`).\n *\n * @example\n * TextComponent={MyAppText}\n */\n TextComponent?: ComponentType<TextProps & { children?: ReactNode }>;\n\n /**\n * Render prop for all text nodes rendered by the HTML renderer.\n * Receives the full `TextProps` (including `style`, `children`, accessibility props, etc.)\n * and must return a renderable node. Takes priority over `TextComponent` when both are set.\n *\n * @example\n * renderTextComponent={(props) => <MyText {...props} />}\n */\n renderTextComponent?: (props: TextProps) => ReactNode;\n\n // style props\n baseStyle?: TextStyle;\n tagStyles?: Partial<TagStyles>;\n classesStyles?: {\n [className: string]: HtmlStyle;\n };\n listGap?: number;\n\n // interaction/functional props\n onLinkPress?: (options: OnHTMLLinkPress) => void;\n markerColor?: string;\n overrideExternalLinkTintColor?: ColorValue;\n}\n","import type { AnyNode, ChildNode, Element } from 'domhandler';\n\nimport { type HTMLTag, rendererTypeMap } from './types';\n\nexport const isTextRenderer = (node: AnyNode | ChildNode | null): boolean => {\n if (!node) {\n return false;\n }\n if (node.type === 'tag') {\n return rendererTypeMap[node.tagName as HTMLTag] === 'text';\n }\n return node.type === 'text';\n};\n\n// Concatenate all text nodes from children\nexport const concatTextNodes = (children: (AnyNode | ChildNode)[]): string => {\n let result = '';\n for (const child of children) {\n if (child.type === 'text') {\n result += child.data;\n }\n // Recursively check for text nodes in element children\n if (child.type === 'tag' && Array.isArray(child.children)) {\n result += concatTextNodes(child.children);\n }\n }\n return result;\n};\n\nexport const isList = (child: ChildNode) => {\n return child.type === 'tag' && (child.tagName === 'ol' || child.tagName === 'ul');\n};\n\nexport const getTextFromNode = (node: Element): string => {\n return node.children.map((c) => (c.type === 'text' ? c.data : '')).join('');\n};\n\nexport const isExternalURL = (url?: string): boolean => {\n if (!url) {\n return false;\n }\n return url.startsWith('https://') || url.startsWith('http://');\n};\n","import type { ChildNode, Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { Text, type TextProps, View, type ViewProps } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { type HTMLTag, type RendererType, rendererTypeMap } from '../types';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n viewProps?: ViewProps;\n textProps?: TextProps;\n}\n\nexport const DefaultBlockRenderer: FunctionComponent<Props> = ({\n node,\n viewProps = {},\n textProps = {},\n}) => {\n const { getStyle } = useHtmlContext();\n const { style: viewStyle, ...restViewProps } = viewProps;\n const { style: textStyle, ...restTextProps } = textProps;\n\n const groupedChildren = groupByInlineBlock(node.children);\n\n return (\n <View {...restViewProps} style={[getStyle(node).block, viewStyle]}>\n {groupedChildren.map((childrenGroup, index) => {\n if (childrenGroup.type === 'text') {\n return (\n <Text\n {...restTextProps}\n key={`${node.type}-${index}`}\n style={[getStyle(node).text, textStyle]}\n >\n <NodesRenderer nodes={childrenGroup.nodes} />\n </Text>\n );\n }\n return <NodesRenderer key={`${node.type}-${index}`} nodes={childrenGroup.nodes} />;\n })}\n </View>\n );\n};\n\nfunction groupByInlineBlock(arr: ChildNode[]): {\n type: RendererType;\n nodes: ChildNode[];\n}[] {\n const result: {\n type: RendererType;\n nodes: ChildNode[];\n }[] = [];\n let currentGroup: ChildNode[] = [];\n\n for (const item of arr) {\n const isTextNode = item.type === 'text';\n const isTextTag = item.type === 'tag' && rendererTypeMap[item.name as HTMLTag] === 'text';\n if (isTextNode || isTextTag) {\n currentGroup.push(item);\n } else {\n if (currentGroup.length) {\n result.push({\n type: 'text',\n nodes: currentGroup,\n });\n currentGroup = [];\n }\n result.push({\n type: 'block',\n nodes: [item],\n });\n }\n }\n if (currentGroup.length) {\n result.push({\n type: 'text',\n nodes: currentGroup,\n });\n }\n return result;\n}\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { type TextProps } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n textProps?: TextProps;\n}\n\nexport const DefaultTextRenderer: FunctionComponent<Props> = ({ node, textProps = {} }) => {\n const { style, ...restProps } = textProps;\n const { getStyle, renderText } = useHtmlContext();\n\n return (\n <>\n {renderText({\n ...restProps,\n style: [getStyle(node).text, style],\n children: <NodesRenderer nodes={node.children} />,\n })}\n </>\n );\n};\n","export const EXTERNAL_LINK_URI =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kJCwwjMljq2h8AAAD4SURBVEjH7dY9SgNBGMbxn7vpIngXwc5SbG39KjxCLDyCnY0nUFGIH0Uu4CU8gXZ2iYU2IsRmiiCz+u4sBpQ8sLwMDPPf53mWYVnoP2sH44bn8evmXgfQM+5n1jW20lz6LXc9DDHFByYRR2foBw4/xkM64xLbuMYy1iNvN8H7N/mPMcg4Gab1KOeoCTQK7KuTkyluZ9LJgqrCTmqcYx932E3dtNJPjnJxwWqamzjoCqpxlYlrEIw7BGqChHqtWnRygb3STqKgkwS5KS0+egWdpnlUAmkDesJhlzuqMifNDdQU3Vr6hKPql4BesIKNFqBXvC3+Bf62PgFLzkKE8ZczlwAAAABJRU5ErkJggg==';\n\nexport const UL_MARKER_URI =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAwCAYAAAAsJjtLAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAACKADAAQAAAABAAAAMAAAAAAE1YgVAAAAZklEQVQ4EWNgGAWjITC4QoDxiYRE/H9GxgkM//8LIDuNkYHhAZDfAFJw/z8DgwKyJJzNyPiBCackSBXQVCa4ahwMaigAOgSH6QwgnzD9//+/EOolVHVAjf8YGBpRBUd5oyEw8CEAAGO5FkZ9+flOAAAAAElFTkSuQmCC';\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { EXTERNAL_LINK_URI } from '../assets';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { concatTextNodes, isExternalURL } from '../utils';\n\ninterface Props {\n node: Element;\n}\n\nexport const ATagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { overrideExternalLinkTintColor, onLinkPress, getStyle, renderImage, renderText } =\n useHtmlContext();\n\n const text = concatTextNodes(node.children);\n if (!text) {\n return null;\n }\n const style = getStyle(node);\n\n const fontSize = style.text?.fontSize ?? 18;\n\n const isExternal = node.attribs.href ? isExternalURL(node.attribs.href) : false;\n\n return (\n <>\n {renderText({\n accessible: true,\n onPress: () => {\n onLinkPress?.({\n url: node.attribs.href,\n title: text,\n });\n },\n accessibilityRole: 'link',\n accessibilityHint: isExternal ? 'External link' : undefined,\n importantForAccessibility: 'yes',\n accessibilityElementsHidden: false,\n style: style.text,\n children: (\n <>\n {text}\n {isExternal\n ? renderImage({\n source: { uri: EXTERNAL_LINK_URI },\n style: {\n tintColor: overrideExternalLinkTintColor ?? style.text.color ?? 'black',\n height: fontSize,\n width: fontSize,\n paddingTop: 5,\n },\n })\n : null}\n </>\n ),\n })}\n </>\n );\n};\n","import type { Element } from 'domhandler';\nimport { type FunctionComponent, useEffect, useState } from 'react';\nimport { Image, type ImageStyle, View } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\n\ninterface Props {\n node: Element;\n}\n\nexport const ImgTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle, renderImage } = useHtmlContext();\n const [size, setSize] = useState<{\n w: number;\n h: number;\n } | null>(null);\n const [containerWidth, setContainerWidth] = useState<number>(0);\n\n const { src, alt } = node.attribs || {};\n\n useEffect(() => {\n if (!src) {\n return;\n }\n Image.getSize(\n src,\n (width, height) => {\n setSize({ w: width, h: height });\n },\n () => {\n // ignore errors — image simply won't render\n },\n );\n }, [src]);\n\n if (!size) return null;\n\n const { w, h } = size;\n\n const finalWidth = Math.min(w, containerWidth);\n const ratio = h / w;\n\n const imageStyle = {\n ...(getStyle(node).block as ImageStyle),\n width: finalWidth,\n height: finalWidth * ratio,\n };\n\n return (\n <View\n onLayout={(e) => {\n const width = e.nativeEvent.layout.width;\n setContainerWidth(width);\n }}\n style={{ width: '100%' }}\n >\n {renderImage({\n source: { uri: src },\n style: imageStyle,\n alt,\n })}\n </View>\n );\n};\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { View } from 'react-native';\n\nimport { UL_MARKER_URI } from '../assets';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { concatTextNodes, isList } from '../utils';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n}\n\nexport const LiTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle, markerColor, renderImage, renderText } = useHtmlContext();\n\n const isParentOl = node.parent?.type === 'tag' && node.parent?.tagName === 'ol';\n const parentLiTags = node.parent?.children || [];\n const currentIndex = parentLiTags.indexOf(node) + 1;\n const items = node.children;\n const style = getStyle(node);\n const { lineHeight = 20, fontSize = 16 } = style.text;\n const markerHeight = 5;\n const markerColorResult = markerColor ?? style.text.color ?? 'pink';\n const renderMarker = () => {\n if (isParentOl) {\n return renderText({ style: [style.text], children: `${currentIndex}.` });\n } else {\n return renderImage({\n source: { uri: UL_MARKER_URI },\n style: {\n width: markerHeight,\n height: lineHeight,\n tintColor: markerColorResult,\n },\n });\n }\n };\n\n // Separate nested lists and main content\n const nestedLists = items.filter((child) => isList(child));\n const mainContent = items.filter((child) => !isList(child));\n\n return (\n <View>\n <View\n style={{\n flexDirection: 'row',\n }}\n >\n <View\n style={{\n marginRight: 8,\n marginBottom: lineHeight - fontSize,\n }}\n >\n {renderMarker()}\n </View>\n {renderText({\n accessible: true,\n accessibilityLabel: `List item ${currentIndex} of ${parentLiTags.length}: ${concatTextNodes(mainContent)}`,\n style: [style.text, { flex: 1 }],\n children: <NodesRenderer nodes={mainContent} />,\n })}\n </View>\n {nestedLists.length > 0 && (\n <View style={{ width: '100%' }}>\n <NodesRenderer nodes={nestedLists} />\n </View>\n )}\n </View>\n );\n};\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { DefaultBlockRenderer } from './_DefaultBlockRenderer';\n\ninterface Props {\n node: Element;\n}\n\nexport const PTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle } = useHtmlContext();\n\n const isFirstChild = !node.previousSibling;\n const isLastChild = !node.nextSibling;\n const style = getStyle(node);\n // collapse top margin for first child and bottom margin for last child\n const marginTop = isFirstChild ? 0 : style.block.marginTop;\n const marginBottom = isLastChild ? 0 : style.block.marginBottom;\n return (\n <DefaultBlockRenderer\n node={node}\n viewProps={{\n style: {\n marginTop,\n marginBottom,\n },\n }}\n />\n );\n};\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { NodeRenderer } from './_NodeRenderer';\n\ninterface Props {\n nodes: (AnyNode | ChildNode)[];\n}\n\nexport const NodesRenderer: FunctionComponent<Props> = ({ nodes }) => {\n return nodes.map((node, index) => <NodeRenderer key={`${node.type}-${index}`} node={node} />);\n};\n"],"mappings":"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","names":["useMemo","View","Text","View","createContext","useContext","jsx","jsx","Text","View","jsx","View","Text","jsx","Fragment","jsx","useState","Image","View","jsx","useState","Image","View","View","jsx","jsxs","View","jsx","jsx","View","Text","jsx","jsx","useMemo","View"]}
1
+ {"version":3,"sources":["../src/RenderHTML.tsx","../src/context/HtmlProvider.tsx","../src/HTMLValidator.ts","../src/renderers/_NodeRenderer.tsx","../src/context/AlignedWidthItem.tsx","../src/context/AlignedWidthProvider.tsx","../src/types.ts","../src/utils.ts","../src/renderers/_DefaultBlockRenderer.tsx","../src/renderers/_DefaultTextRenderer.tsx","../src/assets.ts","../src/renderers/ATagRenderer.tsx","../src/renderers/ImgTagRenderer.tsx","../src/renderers/LiTagRenderer.tsx","../src/renderers/PTagRenderer.tsx","../src/renderers/_NodesRenderer.tsx"],"sourcesContent":["import { parseDocument } from 'htmlparser2';\nimport { type ComponentType, type FunctionComponent, type ReactNode, useMemo } from 'react';\nimport {\n type ColorValue,\n type ImageProps,\n type TextProps,\n type TextStyle,\n View,\n} from 'react-native';\n\nimport { HtmlProvider, type OnHTMLLinkPress } from './context/HtmlProvider';\nimport { HTMLValidator } from './HTMLValidator';\nimport { NodesRenderer } from './renderers/_NodesRenderer';\nimport type { CommonProps, HtmlStyle, TagStyles } from './types';\n\nexport interface RenderHTMLProps extends CommonProps {\n html: string;\n}\n\nexport const RenderHTML: FunctionComponent<RenderHTMLProps> = (props) => {\n const nodes = useMemo(() => {\n if (!props.html) {\n return [];\n }\n const cleaned = props.html.replace(/\\n/g, '');\n const n = parseDocument(cleaned);\n return new HTMLValidator(n.children).cleanup();\n }, [props.html]);\n\n return (\n <View>\n <HtmlProvider\n tagStyles={props.tagStyles}\n baseStyle={props.baseStyle}\n classesStyles={props.classesStyles}\n listGap={props.listGap}\n overrideExternalLinkTintColor={props.overrideExternalLinkTintColor}\n markerColor={props.markerColor}\n onLinkPress={props.onLinkPress}\n renderImage={props.renderImage}\n renderTextComponent={props.renderTextComponent}\n >\n <NodesRenderer nodes={nodes} />\n </HtmlProvider>\n </View>\n );\n};\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { createContext, type ReactNode, useCallback, useContext, useMemo } from 'react';\nimport type { ColorValue, ImageProps, TextProps, TextStyle, ViewStyle } from 'react-native';\nimport { Image, Text } from 'react-native';\n\nimport type { CommonProps, HTMLTag, TagStyles } from '../types';\n\nexport interface OnHTMLLinkPress {\n url: string;\n title: string;\n}\n\ninterface ContextValue {\n getStyle: (node: AnyNode | ChildNode) => {\n text: TextStyle;\n block: ViewStyle;\n };\n baseStyle: TextStyle;\n tagsStyles: TagStyles;\n overrideExternalLinkTintColor?: ColorValue;\n onLinkPress?: (options: OnHTMLLinkPress) => void;\n markerColor?: string;\n renderImage: (props: ImageProps) => ReactNode;\n renderText: (props: TextProps) => ReactNode;\n}\n\nconst HtmlContext = createContext<ContextValue | null>(null);\n\ninterface ProviderProps extends CommonProps {\n children: ReactNode;\n}\n\nexport const HtmlProvider: FunctionComponent<ProviderProps> = (options) => {\n const baseStyle = useMemo<TextStyle>(() => {\n return {\n ...options.baseStyle,\n };\n }, [options.baseStyle]);\n\n const tagsStyles = useMemo<TagStyles>(() => {\n // Sorted by renderer type: block first, then text\n return {\n // BLOCK RENDERER TAGS\n thead: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.thead?.text,\n },\n block: {\n ...options.tagStyles?.thead?.block,\n },\n },\n tbody: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tbody?.text,\n },\n block: {\n ...options.tagStyles?.tbody?.block,\n },\n },\n tfoot: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tfoot?.text,\n },\n block: {\n ...options.tagStyles?.tfoot?.block,\n },\n },\n blockquote: {\n text: {\n ...baseStyle,\n fontStyle: 'italic',\n ...options.tagStyles?.blockquote?.text,\n },\n block: {\n borderLeftWidth: 4,\n borderLeftColor: 'black',\n marginLeft: 8,\n paddingLeft: 12,\n backgroundColor: '#cccccc',\n ...options.tagStyles?.blockquote?.block,\n },\n },\n ul: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.ul?.text,\n },\n block: {\n paddingLeft: 12,\n paddingVertical: 0,\n gap: options.listGap ?? 0,\n ...options.tagStyles?.ul?.block,\n },\n },\n ol: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.ol?.text,\n },\n block: {\n paddingLeft: 12,\n paddingVertical: 0,\n gap: options.listGap ?? 0,\n ...options.tagStyles?.ol?.block,\n },\n },\n dl: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.dl?.text,\n },\n block: {\n ...options.tagStyles?.dl?.block,\n },\n },\n div: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.div?.text,\n },\n block: {\n ...options.tagStyles?.div?.block,\n },\n },\n main: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.main?.text,\n },\n block: {\n ...options.tagStyles?.main?.block,\n },\n },\n section: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.section?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.section?.block,\n },\n },\n article: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.article?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.article?.block,\n },\n },\n aside: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.aside?.text,\n },\n block: {\n ...options.tagStyles?.aside?.block,\n },\n },\n nav: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.nav?.text,\n },\n block: {\n ...options.tagStyles?.nav?.block,\n },\n },\n header: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.header?.text,\n },\n block: {\n marginBottom: 8,\n ...options.tagStyles?.header?.block,\n },\n },\n footer: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.footer?.text,\n },\n block: {\n marginTop: 8,\n ...options.tagStyles?.footer?.block,\n },\n },\n hr: {\n text: {\n ...options.tagStyles?.hr?.text,\n },\n block: {\n borderBottomWidth: 1,\n borderBottomColor: 'black',\n marginVertical: 12,\n ...options.tagStyles?.hr?.block,\n },\n },\n br: {\n text: {\n ...options.tagStyles?.br?.text,\n },\n block: {\n height: 16,\n ...options.tagStyles?.br?.block,\n },\n },\n\n img: {\n text: {\n ...options.tagStyles?.img?.text,\n },\n block: {\n marginVertical: 8,\n\n flex: 1,\n width: undefined,\n height: 100,\n\n ...options.tagStyles?.img?.block,\n },\n },\n table: {\n text: {\n ...options.tagStyles?.table?.text,\n },\n block: {\n marginVertical: 8,\n ...options.tagStyles?.table?.block,\n },\n },\n tr: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.tr?.text,\n },\n block: {\n ...options.tagStyles?.tr?.block,\n },\n },\n\n // TEXT RENDERER TAGS\n h1: {\n text: {\n ...baseStyle,\n fontSize: 32,\n lineHeight: 38.4,\n ...options.tagStyles?.h1?.text,\n },\n block: {\n marginTop: 12,\n marginBottom: 8,\n ...options.tagStyles?.h1?.block,\n },\n },\n h2: {\n text: {\n ...baseStyle,\n fontSize: 24,\n lineHeight: 28.8,\n ...options.tagStyles?.h2?.text,\n },\n block: {\n marginTop: 10,\n marginBottom: 6,\n ...options.tagStyles?.h2?.block,\n },\n },\n h3: {\n text: {\n ...baseStyle,\n fontSize: 18.72,\n lineHeight: 22.46,\n ...options.tagStyles?.h3?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 6,\n ...options.tagStyles?.h3?.block,\n },\n },\n h4: {\n text: {\n ...baseStyle,\n fontSize: 16,\n lineHeight: 19.2,\n ...options.tagStyles?.h4?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 4,\n ...options.tagStyles?.h4?.block,\n },\n },\n h5: {\n text: {\n ...baseStyle,\n fontSize: 13.28,\n lineHeight: 15.94,\n ...options.tagStyles?.h5?.text,\n },\n block: {\n marginTop: 6,\n marginBottom: 4,\n ...options.tagStyles?.h5?.block,\n },\n },\n h6: {\n text: {\n ...baseStyle,\n fontSize: 10.72,\n lineHeight: 12.86,\n ...options.tagStyles?.h6?.text,\n },\n block: {\n marginTop: 6,\n marginBottom: 4,\n ...options.tagStyles?.h6?.block,\n },\n },\n p: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.p?.text,\n },\n block: {\n marginTop: 8,\n marginBottom: 8,\n ...options.tagStyles?.p?.block,\n },\n },\n a: {\n text: {\n ...baseStyle,\n textDecorationLine: 'underline',\n ...options.tagStyles?.a?.text,\n },\n },\n li: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.li?.text,\n },\n block: {\n paddingLeft: 0,\n ...options.tagStyles?.li?.block,\n },\n },\n pre: {\n text: {\n ...baseStyle,\n fontFamily: 'monospace',\n backgroundColor: '#bbbbbb',\n ...options.tagStyles?.pre?.text,\n },\n },\n code: {\n text: {\n ...baseStyle,\n fontFamily: 'monospace',\n backgroundColor: '#bbbbbb',\n ...options.tagStyles?.code?.text,\n },\n },\n\n // inline text styles\n b: {\n text: {\n fontWeight: 'bold',\n ...options.tagStyles?.b?.text,\n },\n },\n strong: {\n text: {\n fontWeight: 'bold',\n ...options.tagStyles?.strong?.text,\n },\n },\n i: {\n text: {\n fontStyle: 'italic',\n ...options.tagStyles?.i?.text,\n },\n },\n em: {\n text: {\n fontStyle: 'italic',\n ...options.tagStyles?.em?.text,\n },\n },\n u: {\n text: {\n textDecorationLine: 'underline',\n ...options.tagStyles?.u?.text,\n },\n },\n mark: {\n text: {\n ...baseStyle,\n backgroundColor: '#fff59d',\n ...options.tagStyles?.mark?.text,\n },\n },\n small: {\n text: {\n ...baseStyle,\n fontSize: Math.max((baseStyle.fontSize as number) - 2, 12),\n ...options.tagStyles?.small?.text,\n },\n },\n s: {\n text: {\n ...baseStyle,\n textDecorationLine: 'line-through',\n ...options.tagStyles?.s?.text,\n },\n },\n del: {\n text: {\n ...baseStyle,\n textDecorationLine: 'line-through',\n ...options.tagStyles?.del?.text,\n },\n },\n sup: {\n text: {\n ...baseStyle,\n textAlignVertical: 'top',\n fontSize: Math.max((baseStyle.fontSize as number) - 4, 10),\n ...options.tagStyles?.sup?.text,\n },\n },\n sub: {\n text: {\n ...baseStyle,\n textAlignVertical: 'bottom',\n fontSize: Math.max((baseStyle.fontSize as number) - 4, 10),\n ...options.tagStyles?.sub?.text,\n },\n },\n th: {\n text: {\n ...baseStyle,\n fontWeight: 'bold',\n padding: 8,\n borderWidth: 1,\n borderColor: 'black',\n ...options.tagStyles?.th?.text,\n },\n },\n td: {\n text: {\n ...baseStyle,\n padding: 8,\n ...options.tagStyles?.td?.text,\n },\n },\n dt: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.dt?.text,\n },\n },\n dd: {\n text: {\n ...baseStyle,\n marginLeft: 20,\n ...options.tagStyles?.dd?.text,\n },\n },\n span: {\n text: {\n ...baseStyle,\n ...options.tagStyles?.span?.text,\n },\n },\n };\n }, [baseStyle, options.tagStyles, options.listGap]);\n\n const getStyle = useCallback(\n (\n node: AnyNode | ChildNode,\n ): {\n text: TextStyle;\n block: ViewStyle;\n } => {\n if (node.type === 'tag') {\n const classStyle = node.attribs.class\n ? options.classesStyles?.[node.attribs.class] || {}\n : {};\n return {\n text: {\n ...tagsStyles[node.tagName as HTMLTag].text,\n ...classStyle.text,\n },\n block: {\n ...(tagsStyles[node.tagName as HTMLTag].block ?? {}),\n ...classStyle.block,\n },\n };\n }\n return {\n text: {},\n block: {},\n };\n },\n [tagsStyles, options.classesStyles],\n );\n\n const renderImage = useMemo<(props: ImageProps) => ReactNode>(() => {\n if (options.renderImage) {\n return options.renderImage;\n }\n return (props: ImageProps) => <Image {...props} />;\n }, [options.renderImage]);\n\n const renderText = useMemo<(props: TextProps) => ReactNode>(() => {\n if (options.renderTextComponent) {\n return options.renderTextComponent;\n }\n return (props: TextProps) => <Text {...props} />;\n }, [options.renderTextComponent]);\n\n const providerValue = useMemo(\n () => ({\n getStyle,\n baseStyle,\n tagsStyles,\n overrideExternalLinkTintColor: options.overrideExternalLinkTintColor,\n onLinkPress: options.onLinkPress,\n markerColor: options.markerColor,\n renderImage,\n renderText,\n }),\n [\n getStyle,\n baseStyle,\n tagsStyles,\n options.overrideExternalLinkTintColor,\n options.onLinkPress,\n options.markerColor,\n renderImage,\n renderText,\n ],\n );\n\n return <HtmlContext.Provider value={providerValue}>{options.children}</HtmlContext.Provider>;\n};\n\nexport const useHtmlContext = () => {\n const context = useContext(HtmlContext);\n if (!context) {\n throw new Error('useHtml must be used within a HtmlProvider');\n }\n return context;\n};\n","import type { AnyNode } from 'domhandler';\n\n/**\n * Cleans up `<ul>` and `<ol>` nodes by removing any empty text nodes\n */\nconst cleanUlNodesUtil = (nodes: AnyNode[]): AnyNode[] => {\n return nodes.map((node) => {\n if (node.type !== 'tag') {\n return node;\n }\n if (node.name === 'ul' || node.name === 'ol') {\n if (!node.children) {\n return node;\n }\n node.children = node.children.filter((child) => {\n return child.type !== 'text' || (child.type === 'text' && child.data.trim() !== '');\n });\n }\n // Recursively process children if present\n if (node.children) {\n node.children = cleanUlNodesUtil(node.children);\n return node;\n }\n return node;\n });\n};\n\nexport class HTMLValidator {\n constructor(private nodes: AnyNode[]) {}\n\n cleanup(): AnyNode[] {\n this.nodes = cleanUlNodesUtil(this.nodes);\n return this.nodes;\n }\n}\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { Text, View } from 'react-native';\n\nimport { AlignedWidthItem } from '../context/AlignedWidthItem';\nimport { AlignedWidthProvider } from '../context/AlignedWidthProvider';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { isTextRenderer } from '../utils';\nimport { DefaultBlockRenderer } from './_DefaultBlockRenderer';\nimport { DefaultTextRenderer } from './_DefaultTextRenderer';\nimport { ATagRenderer } from './ATagRenderer';\nimport { ImgTagRenderer } from './ImgTagRenderer';\nimport { LiTagRenderer } from './LiTagRenderer';\nimport { PTagRenderer } from './PTagRenderer';\n\ninterface Props {\n node: AnyNode | ChildNode;\n}\n\nexport const NodeRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle } = useHtmlContext();\n\n if (node.type === 'tag') {\n switch (node.tagName) {\n case 'thead':\n case 'tbody':\n case 'tfoot':\n case 'blockquote':\n case 'ul':\n case 'ol':\n case 'dl':\n case 'dt':\n case 'dd':\n case 'div':\n case 'main':\n case 'section':\n case 'article':\n case 'aside':\n case 'nav':\n case 'header':\n case 'footer':\n case 'tr':\n return <DefaultBlockRenderer node={node} />;\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return (\n <DefaultBlockRenderer\n node={node}\n textProps={{\n accessible: true,\n accessibilityRole: 'header',\n }}\n />\n );\n case 'p':\n return <PTagRenderer node={node} />;\n case 'li':\n return <LiTagRenderer node={node} />;\n case 'hr':\n return <View style={[getStyle(node).block]} />;\n case 'br':\n if (isTextRenderer(node.prev)) {\n return null;\n }\n return <View style={[getStyle(node).block]} />;\n case 'table':\n return (\n <AlignedWidthProvider>\n <DefaultBlockRenderer node={node} />\n </AlignedWidthProvider>\n );\n case 'img':\n return <ImgTagRenderer node={node} />;\n // text renderers\n case 'b':\n case 'strong':\n case 'i':\n case 'em':\n case 'u':\n case 'mark':\n case 'small':\n case 's':\n case 'del':\n case 'sup':\n case 'sub':\n case 'span':\n case 'pre':\n case 'code':\n return <DefaultTextRenderer node={node} />;\n case 'a':\n return <ATagRenderer node={node} />;\n case 'th':\n case 'td': {\n const currentIndex = node.parent?.children.indexOf(node) || 0;\n return (\n <AlignedWidthItem index={currentIndex}>\n <DefaultTextRenderer node={node} />\n </AlignedWidthItem>\n );\n }\n default:\n // Ignore unsupported tags (script, style, iframe, etc.)\n return null;\n }\n }\n if (node.type === 'text') {\n const text = node.data\n // crush multiple spaces into one\n .replace(/\\s+/g, ' ')\n .replace(/&nbsp;/g, ' ');\n\n return <Text>{text}</Text>;\n }\n return null;\n};\n","import type { FunctionComponent, PropsWithChildren } from 'react';\nimport { type StyleProp, View, type ViewStyle } from 'react-native';\n\nimport { useAlignedWidth } from './AlignedWidthProvider';\n\ninterface Props extends PropsWithChildren {\n index: number;\n style?: StyleProp<ViewStyle>;\n}\n\n/**\n * This component is used to wrap items that need to have aligned widths.\n * It uses the AlignedWidthProvider context to measure and set the width\n * of each item based on the widest item in the same index position.\n * For example, in a table column.\n */\nexport const AlignedWidthItem: FunctionComponent<Props> = ({ children, index, style }) => {\n const { getLayoutHandlerForIndex, getWidthStyle } = useAlignedWidth();\n\n return (\n <View style={[getWidthStyle(index), style]} onLayout={getLayoutHandlerForIndex(index)}>\n {children}\n </View>\n );\n};\n","import { createContext, type ReactNode, useContext, useState } from 'react';\nimport type { LayoutChangeEvent } from 'react-native';\n\ninterface AlignedWidthContextProps {\n getLayoutHandlerForIndex: (colIdx: number) => (event: LayoutChangeEvent) => void;\n getWidthStyle: (colIdx: number) => { minWidth?: number; width?: number };\n}\n\nconst AlignedWidthContext = createContext<AlignedWidthContextProps | undefined>(undefined);\n\nexport const AlignedWidthProvider = ({ children }: { children: ReactNode }) => {\n const [colWidths, setColWidths] = useState<{ [colIdx: number]: number }>({});\n\n const getLayoutHandlerForIndex = (colIdx: number) => {\n return (event: LayoutChangeEvent) => {\n const { width } = event.nativeEvent.layout;\n setColWidths((prev) => {\n const previousWidth = prev[colIdx] || 0;\n return {\n ...prev,\n [colIdx]: Math.max(previousWidth, width),\n };\n });\n };\n };\n\n const getWidthStyle = (colIdx: number) => {\n return {\n minWidth: colWidths[colIdx] || undefined,\n width: colWidths[colIdx] || undefined,\n };\n };\n\n return (\n <AlignedWidthContext.Provider\n value={{\n getLayoutHandlerForIndex,\n getWidthStyle,\n }}\n >\n {children}\n </AlignedWidthContext.Provider>\n );\n};\n\nexport const useAlignedWidth = () => {\n const context = useContext(AlignedWidthContext);\n if (!context) {\n throw new Error('useAlignedWidth must be used within a AlignedWidthProvider');\n }\n return context;\n};\n","import { ComponentType, ReactNode } from 'react';\nimport type { ColorValue, ImageProps, TextProps, TextStyle, ViewStyle } from 'react-native';\n\nimport { OnHTMLLinkPress } from './context/HtmlProvider';\n\nexport type HTMLTag =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'h5'\n | 'h6'\n | 'p'\n | 'a'\n | 'ul'\n | 'ol'\n | 'li'\n | 'img'\n | 'table'\n | 'tr'\n | 'th'\n | 'td'\n | 'pre'\n | 'code'\n | 'blockquote'\n | 'hr'\n | 'br'\n | 'div'\n | 'b'\n | 'strong'\n | 'i'\n | 'em'\n | 'u'\n | 'mark'\n | 'small'\n | 's'\n | 'del'\n | 'sup'\n | 'sub'\n | 'span'\n | 'dt'\n | 'dd'\n | 'thead'\n | 'tbody'\n | 'tfoot'\n | 'dl'\n | 'main'\n | 'section'\n | 'article'\n | 'aside'\n | 'nav'\n | 'header'\n | 'footer';\n\nexport type RendererType = 'text' | 'block';\n\nexport const rendererTypeMap = {\n // Elements rendered with a View (block)\n thead: 'block',\n tbody: 'block',\n tfoot: 'block',\n blockquote: 'block',\n ul: 'block',\n ol: 'block',\n dl: 'block',\n li: 'block',\n div: 'block',\n hr: 'block',\n br: 'block',\n pre: 'block',\n code: 'block',\n img: 'block',\n table: 'block',\n tr: 'block',\n dt: 'block',\n dd: 'block',\n p: 'block',\n h1: 'block',\n h2: 'block',\n h3: 'block',\n h4: 'block',\n h5: 'block',\n h6: 'block',\n main: 'block',\n section: 'block',\n article: 'block',\n aside: 'block',\n nav: 'block',\n header: 'block',\n footer: 'block',\n\n // All other elements are text\n b: 'text',\n strong: 'text',\n i: 'text',\n em: 'text',\n u: 'text',\n mark: 'text',\n small: 'text',\n s: 'text',\n del: 'text',\n sup: 'text',\n sub: 'text',\n span: 'text',\n a: 'text',\n th: 'text',\n td: 'text',\n} satisfies Record<HTMLTag, RendererType>;\n\nexport type HtmlStyle = {\n text?: TextStyle;\n block?: ViewStyle;\n};\n\nexport type TagStyles = {\n [key in HTMLTag]: HtmlStyle;\n};\n\nexport interface CommonProps {\n /**\n * Render prop for all images rendered by the HTML renderer\n * (<img> tags, bullet markers, and external link icons).\n * Keeps the package free of any specific image library dependency.\n *\n * @example\n * renderImage={(props) => <Image {...props} />}\n */\n renderImage?: (props: ImageProps) => ReactNode;\n\n /**\n * Custom component to use instead of the built-in React Native `Text`.\n * Useful for applying a global font or integrating a design-system text component.\n * Must accept the same props as `Text` (i.e. `TextProps`).\n *\n * @example\n * TextComponent={MyAppText}\n */\n TextComponent?: ComponentType<TextProps & { children?: ReactNode }>;\n\n /**\n * Render prop for all text nodes rendered by the HTML renderer.\n * Receives the full `TextProps` (including `style`, `children`, accessibility props, etc.)\n * and must return a renderable node. Takes priority over `TextComponent` when both are set.\n *\n * @example\n * renderTextComponent={(props) => <MyText {...props} />}\n */\n renderTextComponent?: (props: TextProps) => ReactNode;\n\n // style props\n baseStyle?: TextStyle;\n tagStyles?: Partial<TagStyles>;\n classesStyles?: {\n [className: string]: HtmlStyle;\n };\n listGap?: number;\n\n // interaction/functional props\n onLinkPress?: (options: OnHTMLLinkPress) => void;\n markerColor?: string;\n overrideExternalLinkTintColor?: ColorValue;\n}\n","import type { AnyNode, ChildNode, Element } from 'domhandler';\n\nimport { type HTMLTag, rendererTypeMap } from './types';\n\nexport const isTextRenderer = (node: AnyNode | ChildNode | null): boolean => {\n if (!node) {\n return false;\n }\n if (node.type === 'tag') {\n return rendererTypeMap[node.tagName as HTMLTag] === 'text';\n }\n return node.type === 'text';\n};\n\n// Concatenate all text nodes from children\nexport const concatTextNodes = (children: (AnyNode | ChildNode)[]): string => {\n let result = '';\n for (const child of children) {\n if (child.type === 'text') {\n result += child.data;\n }\n // Recursively check for text nodes in element children\n if (child.type === 'tag' && Array.isArray(child.children)) {\n result += concatTextNodes(child.children);\n }\n }\n return result;\n};\n\nexport const isList = (child: ChildNode) => {\n return child.type === 'tag' && (child.tagName === 'ol' || child.tagName === 'ul');\n};\n\nexport const getTextFromNode = (node: Element): string => {\n return node.children.map((c) => (c.type === 'text' ? c.data : '')).join('');\n};\n\nexport const isExternalURL = (url?: string): boolean => {\n if (!url) {\n return false;\n }\n return url.startsWith('https://') || url.startsWith('http://');\n};\n","import type { ChildNode, Element } from 'domhandler';\nimport { Fragment, type FunctionComponent } from 'react';\nimport { type TextProps, View, type ViewProps } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { type HTMLTag, type RendererType, rendererTypeMap } from '../types';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n viewProps?: ViewProps;\n textProps?: TextProps;\n}\n\nexport const DefaultBlockRenderer: FunctionComponent<Props> = ({\n node,\n viewProps = {},\n textProps = {},\n}) => {\n const { getStyle, renderText } = useHtmlContext();\n const { style: viewStyle, ...restViewProps } = viewProps;\n const { style: textStyle, ...restTextProps } = textProps;\n\n const groupedChildren = groupByInlineBlock(node.children);\n\n return (\n <View {...restViewProps} style={[getStyle(node).block, viewStyle]}>\n {groupedChildren.map((childrenGroup, index) => {\n if (childrenGroup.type === 'text') {\n return (\n <Fragment key={`${node.type}-${index}`}>\n {renderText({\n ...restTextProps,\n style: [getStyle(node).text, textStyle],\n children: <NodesRenderer nodes={childrenGroup.nodes} />,\n })}\n </Fragment>\n );\n }\n return <NodesRenderer key={`${node.type}-${index}`} nodes={childrenGroup.nodes} />;\n })}\n </View>\n );\n};\n\nfunction groupByInlineBlock(arr: ChildNode[]): {\n type: RendererType;\n nodes: ChildNode[];\n}[] {\n const result: {\n type: RendererType;\n nodes: ChildNode[];\n }[] = [];\n let currentGroup: ChildNode[] = [];\n\n for (const item of arr) {\n const isTextNode = item.type === 'text';\n const isTextTag = item.type === 'tag' && rendererTypeMap[item.name as HTMLTag] === 'text';\n if (isTextNode || isTextTag) {\n currentGroup.push(item);\n } else {\n if (currentGroup.length) {\n result.push({\n type: 'text',\n nodes: currentGroup,\n });\n currentGroup = [];\n }\n result.push({\n type: 'block',\n nodes: [item],\n });\n }\n }\n if (currentGroup.length) {\n result.push({\n type: 'text',\n nodes: currentGroup,\n });\n }\n return result;\n}\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { type TextProps } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n textProps?: TextProps;\n}\n\nexport const DefaultTextRenderer: FunctionComponent<Props> = ({ node, textProps = {} }) => {\n const { style, ...restProps } = textProps;\n const { getStyle, renderText } = useHtmlContext();\n\n return (\n <>\n {renderText({\n ...restProps,\n style: [getStyle(node).text, style],\n children: <NodesRenderer nodes={node.children} />,\n })}\n </>\n );\n};\n","export const EXTERNAL_LINK_URI =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+kJCwwjMljq2h8AAAD4SURBVEjH7dY9SgNBGMbxn7vpIngXwc5SbG39KjxCLDyCnY0nUFGIH0Uu4CU8gXZ2iYU2IsRmiiCz+u4sBpQ8sLwMDPPf53mWYVnoP2sH44bn8evmXgfQM+5n1jW20lz6LXc9DDHFByYRR2foBw4/xkM64xLbuMYy1iNvN8H7N/mPMcg4Gab1KOeoCTQK7KuTkyluZ9LJgqrCTmqcYx932E3dtNJPjnJxwWqamzjoCqpxlYlrEIw7BGqChHqtWnRygb3STqKgkwS5KS0+egWdpnlUAmkDesJhlzuqMifNDdQU3Vr6hKPql4BesIKNFqBXvC3+Bf62PgFLzkKE8ZczlwAAAABJRU5ErkJggg==';\n\nexport const UL_MARKER_URI =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAwCAYAAAAsJjtLAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAACKADAAQAAAABAAAAMAAAAAAE1YgVAAAAZklEQVQ4EWNgGAWjITC4QoDxiYRE/H9GxgkM//8LIDuNkYHhAZDfAFJw/z8DgwKyJJzNyPiBCackSBXQVCa4ahwMaigAOgSH6QwgnzD9//+/EOolVHVAjf8YGBpRBUd5oyEw8CEAAGO5FkZ9+flOAAAAAElFTkSuQmCC';\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { EXTERNAL_LINK_URI } from '../assets';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { concatTextNodes, isExternalURL } from '../utils';\n\ninterface Props {\n node: Element;\n}\n\nexport const ATagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { overrideExternalLinkTintColor, onLinkPress, getStyle, renderImage, renderText } =\n useHtmlContext();\n\n const text = concatTextNodes(node.children);\n if (!text) {\n return null;\n }\n const style = getStyle(node);\n\n const fontSize = style.text?.fontSize ?? 18;\n\n const isExternal = node.attribs.href ? isExternalURL(node.attribs.href) : false;\n\n return (\n <>\n {renderText({\n accessible: true,\n onPress: () => {\n onLinkPress?.({\n url: node.attribs.href,\n title: text,\n });\n },\n accessibilityRole: 'link',\n accessibilityHint: isExternal ? 'External link' : undefined,\n importantForAccessibility: 'yes',\n accessibilityElementsHidden: false,\n style: style.text,\n children: (\n <>\n {text}\n {isExternal\n ? renderImage({\n source: { uri: EXTERNAL_LINK_URI },\n style: {\n tintColor: overrideExternalLinkTintColor ?? style.text.color ?? 'black',\n height: fontSize,\n width: fontSize,\n paddingTop: 5,\n },\n })\n : null}\n </>\n ),\n })}\n </>\n );\n};\n","import type { Element } from 'domhandler';\nimport { type FunctionComponent, useEffect, useState } from 'react';\nimport { Image, type ImageStyle, View } from 'react-native';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\n\ninterface Props {\n node: Element;\n}\n\nexport const ImgTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle, renderImage } = useHtmlContext();\n const [size, setSize] = useState<{\n w: number;\n h: number;\n } | null>(null);\n const [containerWidth, setContainerWidth] = useState<number>(0);\n\n const { src, alt } = node.attribs || {};\n\n useEffect(() => {\n if (!src) {\n return;\n }\n Image.getSize(\n src,\n (width, height) => {\n setSize({ w: width, h: height });\n },\n () => {\n // ignore errors — image simply won't render\n },\n );\n }, [src]);\n\n if (!size) return null;\n\n const { w, h } = size;\n\n const finalWidth = Math.min(w, containerWidth);\n const ratio = h / w;\n\n const imageStyle = {\n ...(getStyle(node).block as ImageStyle),\n width: finalWidth,\n height: finalWidth * ratio,\n };\n\n return (\n <View\n onLayout={(e) => {\n const width = e.nativeEvent.layout.width;\n setContainerWidth(width);\n }}\n style={{ width: '100%' }}\n >\n {renderImage({\n source: { uri: src },\n style: imageStyle,\n alt,\n })}\n </View>\n );\n};\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\nimport { View } from 'react-native';\n\nimport { UL_MARKER_URI } from '../assets';\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { concatTextNodes, isList } from '../utils';\nimport { NodesRenderer } from './_NodesRenderer';\n\ninterface Props {\n node: Element;\n}\n\nexport const LiTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle, markerColor, renderImage, renderText } = useHtmlContext();\n\n const isParentOl = node.parent?.type === 'tag' && node.parent?.tagName === 'ol';\n const parentLiTags = node.parent?.children || [];\n const currentIndex = parentLiTags.indexOf(node) + 1;\n const items = node.children;\n const style = getStyle(node);\n const { lineHeight = 20, fontSize = 16 } = style.text;\n const markerHeight = 5;\n const markerColorResult = markerColor ?? style.text.color ?? 'pink';\n const renderMarker = () => {\n if (isParentOl) {\n return renderText({ style: [style.text], children: `${currentIndex}.` });\n } else {\n return renderImage({\n source: { uri: UL_MARKER_URI },\n style: {\n width: markerHeight,\n height: lineHeight,\n tintColor: markerColorResult,\n },\n });\n }\n };\n\n // Separate nested lists and main content\n const nestedLists = items.filter((child) => isList(child));\n const mainContent = items.filter((child) => !isList(child));\n\n return (\n <View>\n <View\n style={{\n flexDirection: 'row',\n }}\n >\n <View\n style={{\n marginRight: 8,\n marginBottom: lineHeight - fontSize,\n }}\n >\n {renderMarker()}\n </View>\n {renderText({\n accessible: true,\n accessibilityLabel: `List item ${currentIndex} of ${parentLiTags.length}: ${concatTextNodes(mainContent)}`,\n style: [style.text, { flex: 1 }],\n children: <NodesRenderer nodes={mainContent} />,\n })}\n </View>\n {nestedLists.length > 0 && (\n <View style={{ width: '100%' }}>\n <NodesRenderer nodes={nestedLists} />\n </View>\n )}\n </View>\n );\n};\n","import type { Element } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { useHtmlContext } from '../context/HtmlProvider';\nimport { DefaultBlockRenderer } from './_DefaultBlockRenderer';\n\ninterface Props {\n node: Element;\n}\n\nexport const PTagRenderer: FunctionComponent<Props> = ({ node }) => {\n const { getStyle } = useHtmlContext();\n\n const isFirstChild = !node.previousSibling;\n const isLastChild = !node.nextSibling;\n const style = getStyle(node);\n // collapse top margin for first child and bottom margin for last child\n const marginTop = isFirstChild ? 0 : style.block.marginTop;\n const marginBottom = isLastChild ? 0 : style.block.marginBottom;\n return (\n <DefaultBlockRenderer\n node={node}\n viewProps={{\n style: {\n marginTop,\n marginBottom,\n },\n }}\n />\n );\n};\n","import type { AnyNode, ChildNode } from 'domhandler';\nimport type { FunctionComponent } from 'react';\n\nimport { NodeRenderer } from './_NodeRenderer';\n\ninterface Props {\n nodes: (AnyNode | ChildNode)[];\n}\n\nexport const NodesRenderer: FunctionComponent<Props> = ({ nodes }) => {\n return nodes.map((node, index) => <NodeRenderer key={`${node.type}-${index}`} node={node} />);\n};\n"],"mappings":"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","names":["useMemo","View","Text","View","createContext","useContext","jsx","jsx","View","jsx","View","Fragment","jsx","Fragment","jsx","useState","Image","View","jsx","useState","Image","View","View","jsx","jsxs","View","jsx","jsx","View","Text","jsx","jsx","useMemo","View"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nanogiants/react-native-render-html",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "A lightweight, customisable HTML renderer for React Native",
5
5
  "keywords": [
6
6
  "react-native",
@@ -1,6 +1,6 @@
1
1
  import type { ChildNode, Element } from 'domhandler';
2
- import type { FunctionComponent } from 'react';
3
- import { Text, type TextProps, View, type ViewProps } from 'react-native';
2
+ import { Fragment, type FunctionComponent } from 'react';
3
+ import { type TextProps, View, type ViewProps } from 'react-native';
4
4
 
5
5
  import { useHtmlContext } from '../context/HtmlProvider';
6
6
  import { type HTMLTag, type RendererType, rendererTypeMap } from '../types';
@@ -17,7 +17,7 @@ export const DefaultBlockRenderer: FunctionComponent<Props> = ({
17
17
  viewProps = {},
18
18
  textProps = {},
19
19
  }) => {
20
- const { getStyle } = useHtmlContext();
20
+ const { getStyle, renderText } = useHtmlContext();
21
21
  const { style: viewStyle, ...restViewProps } = viewProps;
22
22
  const { style: textStyle, ...restTextProps } = textProps;
23
23
 
@@ -28,13 +28,13 @@ export const DefaultBlockRenderer: FunctionComponent<Props> = ({
28
28
  {groupedChildren.map((childrenGroup, index) => {
29
29
  if (childrenGroup.type === 'text') {
30
30
  return (
31
- <Text
32
- {...restTextProps}
33
- key={`${node.type}-${index}`}
34
- style={[getStyle(node).text, textStyle]}
35
- >
36
- <NodesRenderer nodes={childrenGroup.nodes} />
37
- </Text>
31
+ <Fragment key={`${node.type}-${index}`}>
32
+ {renderText({
33
+ ...restTextProps,
34
+ style: [getStyle(node).text, textStyle],
35
+ children: <NodesRenderer nodes={childrenGroup.nodes} />,
36
+ })}
37
+ </Fragment>
38
38
  );
39
39
  }
40
40
  return <NodesRenderer key={`${node.type}-${index}`} nodes={childrenGroup.nodes} />;