@pega/cosmos-react-rte 8.20.0 → 8.21.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.
@@ -1 +1 @@
1
- {"version":3,"file":"Editor.styles.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.styles.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,wBAAwB,oOAYpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,mEAIhC,CAAC;AAEF,eAAO,MAAM,qBAAqB,yGAgBhC,CAAC;AAIH,eAAO,MAAM,gBAAgB;2BAS43E,CAAC;uDATv2E,CAAC;AAEpD,eAAO,MAAM,iBAAiB,mSAE7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,iRAE5B,CAAC"}
1
+ {"version":3,"file":"Editor.styles.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.styles.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,wBAAwB,oOAYpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,mEAIhC,CAAC;AAEF,eAAO,MAAM,qBAAqB,yGAgBhC,CAAC;AAIH,eAAO,MAAM,gBAAgB;2BASy3E,CAAC;uDATp2E,CAAC;AAEpD,eAAO,MAAM,iBAAiB,mSAE7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,iRAE5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextViewer.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAQlE,eAAO,MAAM,SAAS,QACoK,CAAC;;;;AA4F3L,wBAAqE"}
1
+ {"version":3,"file":"RichTextViewer.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAQlE,eAAO,MAAM,SAAS,QACoK,CAAC;;;;AAqG3L,wBAAqE"}
@@ -32,14 +32,14 @@ const findFirstHref = (nodes) => {
32
32
  }
33
33
  }
34
34
  };
35
- const RichTextViewer = forwardRef(function RichTextViewer({ testId, content, type, interactionRenderers, markdownMap, onRetry, onMarkdownLinkRender, ...restProps }, ref) {
35
+ const RichTextViewer = forwardRef(function RichTextViewer({ testId, content, type, interactionRenderers, markdownMap, escapeHtmlInMarkdownText, onRetry, onMarkdownLinkRender, ...restProps }, ref) {
36
36
  const testIds = useTestIds(testId, getRichTextViewerTestIds);
37
37
  const t = useI18n();
38
38
  const [nodes, setNodes] = useState([]);
39
39
  const [error, setError] = useState(false);
40
40
  useEffect(() => {
41
41
  if (type === 'markdown') {
42
- const newNodes = convertMarkdown(content, [...(interactionRenderers ?? []), { regexPattern: URL_REGEX, type: 'builtin-url' }], markdownMap);
42
+ const newNodes = convertMarkdown(content, [...(interactionRenderers ?? []), { regexPattern: URL_REGEX, type: 'builtin-url' }], markdownMap, { escapeHtmlInTextTokens: !!escapeHtmlInMarkdownText });
43
43
  if (onMarkdownLinkRender) {
44
44
  const href = findFirstHref(newNodes);
45
45
  if (href) {
@@ -61,7 +61,14 @@ const RichTextViewer = forwardRef(function RichTextViewer({ testId, content, typ
61
61
  setError(true);
62
62
  }
63
63
  }
64
- }, [content, type, interactionRenderers]);
64
+ }, [
65
+ content,
66
+ type,
67
+ interactionRenderers,
68
+ markdownMap,
69
+ onMarkdownLinkRender,
70
+ escapeHtmlInMarkdownText
71
+ ]);
65
72
  if (type === 'html' && (!interactionRenderers || interactionRenderers.length === 0)) {
66
73
  return _jsx(HTML, { ref: ref, content: content });
67
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextViewer.js","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useState, useEffect } from 'react';\nimport type { PropsWithoutRef } from 'react';\nimport type { PegaCustom } from 'slate';\n\nimport {\n HTML,\n ErrorState,\n useI18n,\n useTestIds,\n withTestIds,\n hasProp\n} from '@pega/cosmos-react-core';\nimport type { ForwardRefForwardPropsComponent } from '@pega/cosmos-react-core';\n\nimport convertMarkdown from './utils/markdownConverter';\nimport type { RichTextViewerProps } from './RichTextViewer.types';\nimport { StyledEditorContainer, StyledRichTextViewer } from './RichTextEditor.styles';\nimport { convertHtml } from './utils/htmlConverter';\nimport { RichTextTreeRenderer } from './RichTextTreeRenderer';\nimport type { RichTextTreeRendererProps } from './RichTextTreeRenderer';\nimport { getRichTextViewerTestIds } from './RichTextViewer.test-ids';\n\n// Regex to match valid URLs\nexport const URL_REGEX =\n /(?<leadingChar>^|\\s)(?<url>(?<protocol>https?:\\/\\/)?(?<host>[a-z0-9]+(?:[-.][a-z0-9]+)*\\.(?<tld>[a-z]{2,5})(?<port>:[0-9]{1,5})?)(?<pathQueryHash>[/a-zA-Z0-9?=&+%@.|#_~:[\\]'()-]*)?)/g;\n\nconst isValidHTTPURL = (href?: string): boolean => {\n if (!href) return false;\n\n try {\n const url = new URL(href, window.location.href);\n return url.protocol.startsWith('http');\n } catch {\n return false;\n }\n};\n\nconst findFirstHref = (nodes: (PegaCustom.Element | PegaCustom.Text)[]): string | undefined => {\n for (const node of nodes) {\n if (hasProp(node, 'children')) {\n const href = findFirstHref(node.children);\n if (isValidHTTPURL(href)) {\n return href;\n }\n } else if (isValidHTTPURL(node.href)) {\n return node.href;\n }\n }\n};\n\nconst RichTextViewer: ForwardRefForwardPropsComponent<RichTextViewerProps> = forwardRef(\n function RichTextViewer(\n {\n testId,\n content,\n type,\n interactionRenderers,\n markdownMap,\n onRetry,\n onMarkdownLinkRender,\n ...restProps\n }: PropsWithoutRef<RichTextViewerProps>,\n ref: RichTextViewerProps['ref']\n ) {\n const testIds = useTestIds(testId, getRichTextViewerTestIds);\n const t = useI18n();\n const [nodes, setNodes] = useState<RichTextTreeRendererProps['nodes']>([]);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n if (type === 'markdown') {\n const newNodes = convertMarkdown(\n content,\n [...(interactionRenderers ?? []), { regexPattern: URL_REGEX, type: 'builtin-url' }],\n markdownMap\n );\n\n if (onMarkdownLinkRender) {\n const href = findFirstHref(newNodes);\n if (href) {\n onMarkdownLinkRender(href);\n }\n }\n\n setNodes(newNodes);\n }\n if (type === 'richtext') {\n setNodes(JSON.parse(content));\n }\n if (type === 'html' && interactionRenderers && interactionRenderers.length > 0) {\n try {\n setNodes(convertHtml(content, interactionRenderers));\n setError(false);\n } catch {\n setNodes([]);\n setError(true);\n }\n }\n }, [content, type, interactionRenderers]);\n\n if (type === 'html' && (!interactionRenderers || interactionRenderers.length === 0)) {\n return <HTML ref={ref} content={content} />;\n }\n\n return error ? (\n <ErrorState message={t('rte_invalid_html')} onRetry={onRetry} />\n ) : (\n <StyledRichTextViewer data-testid={testIds.root} ref={ref} {...restProps}>\n <StyledEditorContainer>\n <RichTextTreeRenderer nodes={nodes} />\n </StyledEditorContainer>\n </StyledRichTextViewer>\n );\n }\n);\n\nexport default withTestIds(RichTextViewer, getRichTextViewerTestIds);\n"]}
1
+ {"version":3,"file":"RichTextViewer.js","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, useState, useEffect } from 'react';\nimport type { PropsWithoutRef } from 'react';\nimport type { PegaCustom } from 'slate';\n\nimport {\n HTML,\n ErrorState,\n useI18n,\n useTestIds,\n withTestIds,\n hasProp\n} from '@pega/cosmos-react-core';\nimport type { ForwardRefForwardPropsComponent } from '@pega/cosmos-react-core';\n\nimport convertMarkdown from './utils/markdownConverter';\nimport type { RichTextViewerProps } from './RichTextViewer.types';\nimport { StyledEditorContainer, StyledRichTextViewer } from './RichTextEditor.styles';\nimport { convertHtml } from './utils/htmlConverter';\nimport { RichTextTreeRenderer } from './RichTextTreeRenderer';\nimport type { RichTextTreeRendererProps } from './RichTextTreeRenderer';\nimport { getRichTextViewerTestIds } from './RichTextViewer.test-ids';\n\n// Regex to match valid URLs\nexport const URL_REGEX =\n /(?<leadingChar>^|\\s)(?<url>(?<protocol>https?:\\/\\/)?(?<host>[a-z0-9]+(?:[-.][a-z0-9]+)*\\.(?<tld>[a-z]{2,5})(?<port>:[0-9]{1,5})?)(?<pathQueryHash>[/a-zA-Z0-9?=&+%@.|#_~:[\\]'()-]*)?)/g;\n\nconst isValidHTTPURL = (href?: string): boolean => {\n if (!href) return false;\n\n try {\n const url = new URL(href, window.location.href);\n return url.protocol.startsWith('http');\n } catch {\n return false;\n }\n};\n\nconst findFirstHref = (nodes: (PegaCustom.Element | PegaCustom.Text)[]): string | undefined => {\n for (const node of nodes) {\n if (hasProp(node, 'children')) {\n const href = findFirstHref(node.children);\n if (isValidHTTPURL(href)) {\n return href;\n }\n } else if (isValidHTTPURL(node.href)) {\n return node.href;\n }\n }\n};\n\nconst RichTextViewer: ForwardRefForwardPropsComponent<RichTextViewerProps> = forwardRef(\n function RichTextViewer(\n {\n testId,\n content,\n type,\n interactionRenderers,\n markdownMap,\n escapeHtmlInMarkdownText,\n onRetry,\n onMarkdownLinkRender,\n ...restProps\n }: PropsWithoutRef<RichTextViewerProps>,\n ref: RichTextViewerProps['ref']\n ) {\n const testIds = useTestIds(testId, getRichTextViewerTestIds);\n const t = useI18n();\n const [nodes, setNodes] = useState<RichTextTreeRendererProps['nodes']>([]);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n if (type === 'markdown') {\n const newNodes = convertMarkdown(\n content,\n [...(interactionRenderers ?? []), { regexPattern: URL_REGEX, type: 'builtin-url' }],\n markdownMap,\n { escapeHtmlInTextTokens: !!escapeHtmlInMarkdownText }\n );\n\n if (onMarkdownLinkRender) {\n const href = findFirstHref(newNodes);\n if (href) {\n onMarkdownLinkRender(href);\n }\n }\n\n setNodes(newNodes);\n }\n if (type === 'richtext') {\n setNodes(JSON.parse(content));\n }\n if (type === 'html' && interactionRenderers && interactionRenderers.length > 0) {\n try {\n setNodes(convertHtml(content, interactionRenderers));\n setError(false);\n } catch {\n setNodes([]);\n setError(true);\n }\n }\n }, [\n content,\n type,\n interactionRenderers,\n markdownMap,\n onMarkdownLinkRender,\n escapeHtmlInMarkdownText\n ]);\n\n if (type === 'html' && (!interactionRenderers || interactionRenderers.length === 0)) {\n return <HTML ref={ref} content={content} />;\n }\n\n return error ? (\n <ErrorState message={t('rte_invalid_html')} onRetry={onRetry} />\n ) : (\n <StyledRichTextViewer data-testid={testIds.root} ref={ref} {...restProps}>\n <StyledEditorContainer>\n <RichTextTreeRenderer nodes={nodes} />\n </StyledEditorContainer>\n </StyledRichTextViewer>\n );\n }\n);\n\nexport default withTestIds(RichTextViewer, getRichTextViewerTestIds);\n"]}
@@ -27,6 +27,7 @@ export type RichTextViewerProps = TestIdProp & {
27
27
  content: string;
28
28
  interactionRenderers?: InteractionRenderers[];
29
29
  markdownMap?: MDMap;
30
+ escapeHtmlInMarkdownText?: boolean;
30
31
  onRetry?: ErrorStateProps['onRetry'];
31
32
  ref?: Ref<HTMLDivElement>;
32
33
  } & ({
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextViewer.types.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1F,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,mBAAmB,CAAC,EAAE,CACpB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,KAElB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7F,SAAS,CAAC;CACf;AAED,MAAM,MAAM,QAAQ,GAAG;KACpB,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;CACzF,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;KACjB,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACtD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KACf,aAAa,CAAC;QAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,GAAG,SAAS;CACvD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC9C,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACrC,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CAC3B,GAAG,CACE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAAC,oBAAoB,CAAC,EAAE,KAAK,CAAA;CAAE,CAC9D,CAAC"}
1
+ {"version":3,"file":"RichTextViewer.types.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1F,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAC/B,mBAAmB,CAAC,EAAE,CACpB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,KAElB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC7F,SAAS,CAAC;CACf;AAED,MAAM,MAAM,QAAQ,GAAG;KACpB,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;CACzF,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;KACjB,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACtD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KACf,aAAa,CAAC;QAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,GAAG,SAAS;CACvD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC9C,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACrC,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;CAC3B,GAAG,CACE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAAC,oBAAoB,CAAC,EAAE,KAAK,CAAA;CAAE,CAC9D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextViewer.types.js","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { MarkedToken, Tokens } from 'marked';\nimport type { ComponentType, Ref } from 'react';\n\nimport type { ErrorStateProps, ExcludeStrict, TestIdProp } from '@pega/cosmos-react-core';\n\nexport interface InteractionRenderers {\n type: string;\n regexPattern: RegExp;\n xmlElement?: string;\n component?: ComponentType<any>;\n getSearchAttributes?: (\n xmlElement: string,\n searchResult: string\n ) =>\n | { markdown: string; component: ComponentType<any>; props: Record<string, any>; text: string }\n | undefined;\n}\n\nexport type TokenMap = {\n [K in ExcludeStrict<MarkedToken, Tokens.Def>['type']]: Extract<MarkedToken, { type: K }>;\n};\n\nexport type MDMap = {\n [K in ExcludeStrict<MarkedToken, Tokens.Def>['type']]?: (\n token: TokenMap[K]\n ) => ComponentType<{ token: TokenMap[K] }> | undefined;\n};\n\nexport type RichTextViewerProps = TestIdProp & {\n content: string;\n interactionRenderers?: InteractionRenderers[];\n markdownMap?: MDMap;\n onRetry?: ErrorStateProps['onRetry'];\n ref?: Ref<HTMLDivElement>;\n} & (\n | { type: 'markdown'; onMarkdownLinkRender?: (href: string) => void }\n | { type: 'html' | 'richtext'; onMarkdownLinkRender?: never }\n );\n"]}
1
+ {"version":3,"file":"RichTextViewer.types.js","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { MarkedToken, Tokens } from 'marked';\nimport type { ComponentType, Ref } from 'react';\n\nimport type { ErrorStateProps, ExcludeStrict, TestIdProp } from '@pega/cosmos-react-core';\n\nexport interface InteractionRenderers {\n type: string;\n regexPattern: RegExp;\n xmlElement?: string;\n component?: ComponentType<any>;\n getSearchAttributes?: (\n xmlElement: string,\n searchResult: string\n ) =>\n | { markdown: string; component: ComponentType<any>; props: Record<string, any>; text: string }\n | undefined;\n}\n\nexport type TokenMap = {\n [K in ExcludeStrict<MarkedToken, Tokens.Def>['type']]: Extract<MarkedToken, { type: K }>;\n};\n\nexport type MDMap = {\n [K in ExcludeStrict<MarkedToken, Tokens.Def>['type']]?: (\n token: TokenMap[K]\n ) => ComponentType<{ token: TokenMap[K] }> | undefined;\n};\n\nexport type RichTextViewerProps = TestIdProp & {\n content: string;\n interactionRenderers?: InteractionRenderers[];\n markdownMap?: MDMap;\n escapeHtmlInMarkdownText?: boolean;\n onRetry?: ErrorStateProps['onRetry'];\n ref?: Ref<HTMLDivElement>;\n} & (\n | { type: 'markdown'; onMarkdownLinkRender?: (href: string) => void }\n | { type: 'html' | 'richtext'; onMarkdownLinkRender?: never }\n );\n"]}
@@ -1,8 +1,11 @@
1
1
  import type { Element, Text } from 'slate';
2
2
  import type { MarkedToken } from 'marked';
3
3
  import type { InteractionRenderers, RichTextViewerProps } from '../RichTextViewer.types';
4
- export declare const getNode: (token: MarkedToken, interactionRenderers?: InteractionRenderers[], markdownMap?: RichTextViewerProps["markdownMap"]) => Element | Text;
4
+ type ConvertMarkdownOptions = {
5
+ escapeHtmlInTextTokens?: boolean;
6
+ };
7
+ export declare const getNode: (token: MarkedToken, interactionRenderers?: InteractionRenderers[], markdownMap?: RichTextViewerProps["markdownMap"], options?: ConvertMarkdownOptions) => Element | Text;
5
8
  export declare const convertMarkdownForEditor: (md?: string, searchRenderers?: InteractionRenderers[]) => (Element | Text)[];
6
- declare const convertMarkdown: (md: string, interactionRenderers?: InteractionRenderers[], markdownMap?: RichTextViewerProps["markdownMap"]) => (Element | Text)[];
9
+ declare const convertMarkdown: (md: string, interactionRenderers?: InteractionRenderers[], markdownMap?: RichTextViewerProps["markdownMap"], options?: ConvertMarkdownOptions) => (Element | Text)[];
7
10
  export default convertMarkdown;
8
11
  //# sourceMappingURL=markdownConverter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdownConverter.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/markdownConverter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAK1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAIzF,eAAO,MAAM,OAAO,GAClB,OAAO,WAAW,EAClB,uBAAuB,oBAAoB,EAAE,EAC7C,cAAc,mBAAmB,CAAC,aAAa,CAAC,KAC/C,OAAO,GAAG,IAiJZ,CAAC;AAYF,eAAO,MAAM,wBAAwB,GACnC,WAAO,EACP,kBAAkB,oBAAoB,EAAE,KACvC,CAAC,OAAO,GAAG,IAAI,CAAC,EAOlB,CAAC;AAIF,QAAA,MAAM,eAAe,GACnB,IAAI,MAAM,EACV,uBAAuB,oBAAoB,EAAE,EAC7C,cAAc,mBAAmB,CAAC,aAAa,CAAC,KAC/C,CAAC,OAAO,GAAG,IAAI,CAAC,EAIlB,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"markdownConverter.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/markdownConverter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAK1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AASzF,KAAK,sBAAsB,GAAG;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,OAAO,GAClB,OAAO,WAAW,EAClB,uBAAuB,oBAAoB,EAAE,EAC7C,cAAc,mBAAmB,CAAC,aAAa,CAAC,EAChD,UAAU,sBAAsB,KAC/B,OAAO,GAAG,IAqJZ,CAAC;AAaF,eAAO,MAAM,wBAAwB,GACnC,WAAO,EACP,kBAAkB,oBAAoB,EAAE,KACvC,CAAC,OAAO,GAAG,IAAI,CAAC,EAOlB,CAAC;AAIF,QAAA,MAAM,eAAe,GACnB,IAAI,MAAM,EACV,uBAAuB,oBAAoB,EAAE,EAC7C,cAAc,mBAAmB,CAAC,aAAa,CAAC,EAChD,UAAU,sBAAsB,KAC/B,CAAC,OAAO,GAAG,IAAI,CAAC,EAIlB,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -2,22 +2,30 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { marked } from 'marked';
3
3
  import { hasProp } from '@pega/cosmos-react-core';
4
4
  import parseTextToCustomSlateNodes from './interactionRenderer';
5
- export const getNode = (token, interactionRenderers, markdownMap) => {
5
+ // Inserts a zero-width space after '<' to break HTML tag parsing without affecting the rendered text.
6
+ const escapeHtmlInText = (text) => {
7
+ return text.replace(/<(\/?[a-zA-Z])/g, '<\u200B$1');
8
+ };
9
+ export const getNode = (token, interactionRenderers, markdownMap, options) => {
6
10
  if (!hasProp(token, 'type') || token.type === 'def')
7
11
  return { type: 'paragraph', children: [{ text: '' }] };
8
12
  let children;
9
13
  if (hasProp(token, 'tokens')) {
10
14
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
11
- children = markDownToSlate(token.tokens || [], interactionRenderers, markdownMap);
15
+ children = markDownToSlate(token.tokens || [], interactionRenderers, markdownMap, options);
12
16
  }
13
17
  else if (hasProp(token, 'items')) {
14
18
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
15
- children = markDownToSlate(token.items, interactionRenderers, markdownMap);
19
+ children = markDownToSlate(token.items, interactionRenderers, markdownMap, options);
16
20
  }
17
21
  else {
18
22
  let mdText = '';
19
- if (token.type === 'text')
20
- mdText = token.raw;
23
+ if (token.type === 'text') {
24
+ mdText = options?.escapeHtmlInTextTokens ? escapeHtmlInText(token.text) : token.raw;
25
+ }
26
+ else if (token.type === 'html') {
27
+ mdText = options?.escapeHtmlInTextTokens ? escapeHtmlInText(token.text) : token.text;
28
+ }
21
29
  else if (hasProp(token, 'text'))
22
30
  mdText = token.text;
23
31
  children = parseTextToCustomSlateNodes(mdText, interactionRenderers);
@@ -137,9 +145,9 @@ export const getNode = (token, interactionRenderers, markdownMap) => {
137
145
  }
138
146
  }
139
147
  };
140
- const markDownToSlate = (tokens, interactionRenderers, markdownMap) => {
148
+ const markDownToSlate = (tokens, interactionRenderers, markdownMap, options) => {
141
149
  return tokens.map(token => {
142
- return getNode(token, interactionRenderers, markdownMap);
150
+ return getNode(token, interactionRenderers, markdownMap, options);
143
151
  });
144
152
  };
145
153
  export const convertMarkdownForEditor = (md = '', searchRenderers) => {
@@ -152,10 +160,10 @@ export const convertMarkdownForEditor = (md = '', searchRenderers) => {
152
160
  };
153
161
  // Converts markdown into Slate compatible nodes, also takes regex used
154
162
  // in Feed Component to pass them down to custom elements
155
- const convertMarkdown = (md, interactionRenderers, markdownMap) => {
163
+ const convertMarkdown = (md, interactionRenderers, markdownMap, options) => {
156
164
  const lexer = new marked.Lexer({ gfm: false });
157
165
  const output = lexer.lex(md);
158
- return markDownToSlate(output, interactionRenderers, markdownMap);
166
+ return markDownToSlate(output, interactionRenderers, markdownMap, options);
159
167
  };
160
168
  export default convertMarkdown;
161
169
  //# sourceMappingURL=markdownConverter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdownConverter.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/markdownConverter.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { PegaCustom, Element, Text } from 'slate';\nimport { marked } from 'marked';\nimport type { MarkedToken } from 'marked';\nimport type { FC } from 'react';\n\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport type { InteractionRenderers, RichTextViewerProps } from '../RichTextViewer.types';\n\nimport parseTextToCustomSlateNodes from './interactionRenderer';\n\nexport const getNode = (\n token: MarkedToken,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap']\n): Element | Text => {\n if (!hasProp(token, 'type') || token.type === 'def')\n return { type: 'paragraph', children: [{ text: '' }] };\n\n let children;\n\n if (hasProp(token, 'tokens')) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n children = markDownToSlate(\n (token.tokens as MarkedToken[]) || [],\n interactionRenderers,\n markdownMap\n );\n } else if (hasProp(token, 'items')) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n children = markDownToSlate(token.items, interactionRenderers, markdownMap);\n } else {\n let mdText = '';\n\n if (token.type === 'text') mdText = token.raw;\n else if (hasProp(token, 'text')) mdText = token.text;\n\n children = parseTextToCustomSlateNodes(mdText, interactionRenderers);\n }\n\n if (markdownMap?.[token.type]) {\n const CustomComponent = (\n markdownMap[token.type] as (token: MarkedToken) => FC<{ token: MarkedToken }> | undefined\n )(token);\n if (CustomComponent)\n return {\n type: 'override',\n component: <CustomComponent token={token} />,\n children: [{ text: '' }]\n };\n }\n\n if (!children.length) {\n return {\n type: 'paragraph',\n children: [{ text: token.raw }]\n };\n }\n\n switch (token.type) {\n case 'paragraph': {\n return {\n type: token.type,\n children\n };\n }\n case 'heading': {\n return {\n type:\n token.depth && token.depth <= 4\n ? (`heading-${token.depth}` as `heading-${1 | 2 | 3 | 4}`)\n : 'heading-4',\n children\n };\n }\n case 'link': {\n return {\n href: token.href,\n text: token.text || ''\n };\n }\n case 'em': {\n return {\n italic: true,\n text: token.text || ''\n };\n }\n case 'strong': {\n return {\n bold: true,\n text: token.text || ''\n };\n }\n case 'del': {\n return {\n 'line-through': true,\n text: token.text || ''\n };\n }\n case 'codespan': {\n return {\n code: true,\n text: token.text || ''\n };\n }\n case 'list': {\n if (token.ordered) {\n return {\n type: 'ordered-list',\n start: typeof token.start === 'number' ? token.start : 1,\n children: children as PegaCustom.ListItemElement[]\n };\n }\n\n return {\n type: 'unordered-list',\n children: children as PegaCustom.ListItemElement[]\n };\n }\n case 'list_item': {\n return {\n type: 'list-item',\n children: children as Element[]\n };\n }\n case 'blockquote': {\n return {\n type: 'block-quote',\n children\n };\n }\n case 'code': {\n const [, language] = /^```([^\\n]+)/.exec(token.raw) ?? [];\n return {\n type: 'code-block',\n language,\n children: [{ text: token.text }]\n };\n }\n case 'hr': {\n return {\n type: 'horizontal-rule',\n children: [{ text: '' }]\n };\n }\n case 'image': {\n return {\n type: 'image',\n alt: token.text,\n src: token.href,\n children: [{ text: '' }]\n };\n }\n default: {\n return {\n type: token.type,\n children\n } as Element;\n }\n }\n};\n\nconst markDownToSlate = (\n tokens: MarkedToken[],\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap']\n): (Element | Text)[] => {\n return tokens.map(token => {\n return getNode(token, interactionRenderers, markdownMap);\n });\n};\n\nexport const convertMarkdownForEditor = (\n md = '',\n searchRenderers?: InteractionRenderers[]\n): (Element | Text)[] => {\n return [\n {\n type: 'paragraph',\n children: parseTextToCustomSlateNodes(md, searchRenderers)\n }\n ];\n};\n\n// Converts markdown into Slate compatible nodes, also takes regex used\n// in Feed Component to pass them down to custom elements\nconst convertMarkdown = (\n md: string,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap']\n): (Element | Text)[] => {\n const lexer = new marked.Lexer({ gfm: false });\n const output = lexer.lex(md) as MarkedToken[];\n return markDownToSlate(output, interactionRenderers, markdownMap);\n};\n\nexport default convertMarkdown;\n"]}
1
+ {"version":3,"file":"markdownConverter.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/markdownConverter.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { PegaCustom, Element, Text } from 'slate';\nimport { marked } from 'marked';\nimport type { MarkedToken } from 'marked';\nimport type { FC } from 'react';\n\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport type { InteractionRenderers, RichTextViewerProps } from '../RichTextViewer.types';\n\nimport parseTextToCustomSlateNodes from './interactionRenderer';\n\n// Inserts a zero-width space after '<' to break HTML tag parsing without affecting the rendered text.\nconst escapeHtmlInText = (text: string): string => {\n return text.replace(/<(\\/?[a-zA-Z])/g, '<\\u200B$1');\n};\n\ntype ConvertMarkdownOptions = {\n escapeHtmlInTextTokens?: boolean;\n};\n\nexport const getNode = (\n token: MarkedToken,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap'],\n options?: ConvertMarkdownOptions\n): Element | Text => {\n if (!hasProp(token, 'type') || token.type === 'def')\n return { type: 'paragraph', children: [{ text: '' }] };\n\n let children;\n\n if (hasProp(token, 'tokens')) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n children = markDownToSlate(\n (token.tokens as MarkedToken[]) || [],\n interactionRenderers,\n markdownMap,\n options\n );\n } else if (hasProp(token, 'items')) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n children = markDownToSlate(token.items, interactionRenderers, markdownMap, options);\n } else {\n let mdText = '';\n\n if (token.type === 'text') {\n mdText = options?.escapeHtmlInTextTokens ? escapeHtmlInText(token.text) : token.raw;\n } else if (token.type === 'html') {\n mdText = options?.escapeHtmlInTextTokens ? escapeHtmlInText(token.text) : token.text;\n } else if (hasProp(token, 'text')) mdText = token.text;\n\n children = parseTextToCustomSlateNodes(mdText, interactionRenderers);\n }\n\n if (markdownMap?.[token.type]) {\n const CustomComponent = (\n markdownMap[token.type] as (token: MarkedToken) => FC<{ token: MarkedToken }> | undefined\n )(token);\n if (CustomComponent)\n return {\n type: 'override',\n component: <CustomComponent token={token} />,\n children: [{ text: '' }]\n };\n }\n\n if (!children.length) {\n return {\n type: 'paragraph',\n children: [{ text: token.raw }]\n };\n }\n\n switch (token.type) {\n case 'paragraph': {\n return {\n type: token.type,\n children\n };\n }\n case 'heading': {\n return {\n type:\n token.depth && token.depth <= 4\n ? (`heading-${token.depth}` as `heading-${1 | 2 | 3 | 4}`)\n : 'heading-4',\n children\n };\n }\n case 'link': {\n return {\n href: token.href,\n text: token.text || ''\n };\n }\n case 'em': {\n return {\n italic: true,\n text: token.text || ''\n };\n }\n case 'strong': {\n return {\n bold: true,\n text: token.text || ''\n };\n }\n case 'del': {\n return {\n 'line-through': true,\n text: token.text || ''\n };\n }\n case 'codespan': {\n return {\n code: true,\n text: token.text || ''\n };\n }\n case 'list': {\n if (token.ordered) {\n return {\n type: 'ordered-list',\n start: typeof token.start === 'number' ? token.start : 1,\n children: children as PegaCustom.ListItemElement[]\n };\n }\n\n return {\n type: 'unordered-list',\n children: children as PegaCustom.ListItemElement[]\n };\n }\n case 'list_item': {\n return {\n type: 'list-item',\n children: children as Element[]\n };\n }\n case 'blockquote': {\n return {\n type: 'block-quote',\n children\n };\n }\n case 'code': {\n const [, language] = /^```([^\\n]+)/.exec(token.raw) ?? [];\n return {\n type: 'code-block',\n language,\n children: [{ text: token.text }]\n };\n }\n case 'hr': {\n return {\n type: 'horizontal-rule',\n children: [{ text: '' }]\n };\n }\n case 'image': {\n return {\n type: 'image',\n alt: token.text,\n src: token.href,\n children: [{ text: '' }]\n };\n }\n default: {\n return {\n type: token.type,\n children\n } as Element;\n }\n }\n};\n\nconst markDownToSlate = (\n tokens: MarkedToken[],\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap'],\n options?: ConvertMarkdownOptions\n): (Element | Text)[] => {\n return tokens.map(token => {\n return getNode(token, interactionRenderers, markdownMap, options);\n });\n};\n\nexport const convertMarkdownForEditor = (\n md = '',\n searchRenderers?: InteractionRenderers[]\n): (Element | Text)[] => {\n return [\n {\n type: 'paragraph',\n children: parseTextToCustomSlateNodes(md, searchRenderers)\n }\n ];\n};\n\n// Converts markdown into Slate compatible nodes, also takes regex used\n// in Feed Component to pass them down to custom elements\nconst convertMarkdown = (\n md: string,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap'],\n options?: ConvertMarkdownOptions\n): (Element | Text)[] => {\n const lexer = new marked.Lexer({ gfm: false });\n const output = lexer.lex(md) as MarkedToken[];\n return markDownToSlate(output, interactionRenderers, markdownMap, options);\n};\n\nexport default convertMarkdown;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pega/cosmos-react-rte",
3
- "version": "8.20.0",
3
+ "version": "8.21.1",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "author": "Pegasystems",
6
6
  "sideEffects": false,
@@ -14,7 +14,7 @@
14
14
  "build": "tsc -b tsconfig.build.json"
15
15
  },
16
16
  "dependencies": {
17
- "@pega/cosmos-react-core": "8.20.0",
17
+ "@pega/cosmos-react-core": "8.21.1",
18
18
  "@popperjs/core": "^2.11.6",
19
19
  "@types/parse5": "^6.0.0",
20
20
  "@types/react": "^17.0.62 || ^18.3.3",