@pega/cosmos-react-rte 10.0.0-build.4.8 → 10.0.0-build.4.9
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/lib/components/RichTextEditor/RichTextViewer.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextViewer.js +3 -3
- package/lib/components/RichTextEditor/RichTextViewer.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextViewer.types.d.ts +2 -0
- package/lib/components/RichTextEditor/RichTextViewer.types.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextViewer.types.js.map +1 -1
- package/lib/components/RichTextEditor/utils/markdownConverter.d.ts +2 -2
- package/lib/components/RichTextEditor/utils/markdownConverter.d.ts.map +1 -1
- package/lib/components/RichTextEditor/utils/markdownConverter.js +299 -16
- package/lib/components/RichTextEditor/utils/markdownConverter.js.map +1 -1
- package/lib/components/RichTextEditor/utils/renderers.d.ts +3 -0
- package/lib/components/RichTextEditor/utils/renderers.d.ts.map +1 -1
- package/lib/components/RichTextEditor/utils/renderers.js +42 -0
- package/lib/components/RichTextEditor/utils/renderers.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextViewer.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAoBlE,eAAO,MAAM,SAAS,QACoK,CAAC;;;;
|
|
1
|
+
{"version":3,"file":"RichTextViewer.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAoBlE,eAAO,MAAM,SAAS,QACoK,CAAC;;;;AA8F3L,wBAAqE"}
|
|
@@ -39,14 +39,14 @@ const findFirstHref = (nodes) => {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
|
-
const RichTextViewer = forwardRef(function RichTextViewer({ testId, content, type, interactionRenderers, markdownMap, onRetry, onMarkdownLinkRender, ...restProps }, ref) {
|
|
42
|
+
const RichTextViewer = forwardRef(function RichTextViewer({ testId, content, type, interactionRenderers, markdownMap, onRetry, onMarkdownLinkRender, renderHTML = false, ...restProps }, ref) {
|
|
43
43
|
const testIds = useTestIds(testId, getRichTextViewerTestIds);
|
|
44
44
|
const t = useI18n();
|
|
45
45
|
const [nodes, setNodes] = useState([]);
|
|
46
46
|
const [error, setError] = useState(false);
|
|
47
47
|
useEffect(() => {
|
|
48
48
|
if (type === 'markdown') {
|
|
49
|
-
const newNodes = convertMarkdown(content, [...(interactionRenderers ?? []), { regexPattern: URL_REGEX, type: 'builtin-url' }], markdownMap);
|
|
49
|
+
const newNodes = convertMarkdown(content, [...(interactionRenderers ?? []), { regexPattern: URL_REGEX, type: 'builtin-url' }], markdownMap, renderHTML);
|
|
50
50
|
if (onMarkdownLinkRender) {
|
|
51
51
|
const href = findFirstHref(newNodes);
|
|
52
52
|
if (href) {
|
|
@@ -68,7 +68,7 @@ const RichTextViewer = forwardRef(function RichTextViewer({ testId, content, typ
|
|
|
68
68
|
setError(true);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
}, [content, type, interactionRenderers]);
|
|
71
|
+
}, [content, type, interactionRenderers, renderHTML]);
|
|
72
72
|
if (type === 'html' && (!interactionRenderers || interactionRenderers.length === 0)) {
|
|
73
73
|
return _jsx(StyledHTMLViewer, { ref: ref, content: content });
|
|
74
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextViewer.js","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":"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
|
|
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';\nimport styled, { css } from 'styled-components';\n\nimport {\n HTML,\n ErrorState,\n useI18n,\n useTestIds,\n withTestIds,\n hasProp,\n defaultThemeProp\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\nconst StyledHTMLViewer = styled(HTML)(({\n theme: {\n base: { spacing }\n }\n}) => {\n return css`\n padding: calc(0.125 * ${spacing});\n `;\n});\n\nStyledHTMLViewer.defaultProps = defaultThemeProp;\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 renderHTML = false,\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 renderHTML\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, renderHTML]);\n\n if (type === 'html' && (!interactionRenderers || interactionRenderers.length === 0)) {\n return <StyledHTMLViewer 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"]}
|
|
@@ -32,8 +32,10 @@ export type RichTextViewerProps = TestIdProp & {
|
|
|
32
32
|
} & ({
|
|
33
33
|
type: 'markdown';
|
|
34
34
|
onMarkdownLinkRender?: (href: string) => void;
|
|
35
|
+
renderHTML?: boolean;
|
|
35
36
|
} | {
|
|
36
37
|
type: 'html' | 'richtext';
|
|
37
38
|
onMarkdownLinkRender?: never;
|
|
39
|
+
renderHTML?: never;
|
|
38
40
|
});
|
|
39
41
|
//# sourceMappingURL=RichTextViewer.types.d.ts.map
|
|
@@ -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,
|
|
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,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACzF;IAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAAC,oBAAoB,CAAC,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,CAClF,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 onRetry?: ErrorStateProps['onRetry'];\n ref?: Ref<HTMLDivElement>;\n} & (\n | { type: 'markdown'; onMarkdownLinkRender?: (href: string) => void; renderHTML?: boolean }\n | { type: 'html' | 'richtext'; onMarkdownLinkRender?: never; renderHTML?: never }\n );\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
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
|
+
export declare const getNode: (token: MarkedToken, interactionRenderers?: InteractionRenderers[], markdownMap?: RichTextViewerProps["markdownMap"], htmlEnabled?: boolean) => Element | Text;
|
|
5
5
|
export declare const convertMarkdownForEditor: (md?: string, searchRenderers?: InteractionRenderers[]) => (Element | Text)[];
|
|
6
|
-
declare const convertMarkdown: (md: string, interactionRenderers?: InteractionRenderers[], markdownMap?: RichTextViewerProps["markdownMap"]) => (Element | Text)[];
|
|
6
|
+
declare const convertMarkdown: (md: string, interactionRenderers?: InteractionRenderers[], markdownMap?: RichTextViewerProps["markdownMap"], htmlEnabled?: boolean) => (Element | Text)[];
|
|
7
7
|
export default convertMarkdown;
|
|
8
8
|
//# 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,EAAU,MAAM,QAAQ,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,EAAU,MAAM,QAAQ,CAAC;AAOlD,OAAO,KAAK,EAAY,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAwhBnG,eAAO,MAAM,OAAO,GAClB,OAAO,WAAW,EAClB,uBAAuB,oBAAoB,EAAE,EAC7C,cAAc,mBAAmB,CAAC,aAAa,CAAC,EAChD,qBAAmB,KAClB,OAAO,GAAG,IAmMZ,CAAC;AAEF,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,qBAAmB,KAClB,CAAC,OAAO,GAAG,IAAI,CAAC,EAKlB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { marked } from 'marked';
|
|
3
|
+
import { parseFragment, serialize } from 'parse5';
|
|
3
4
|
import { hasProp } from '@pega/cosmos-react-core';
|
|
4
5
|
import parseTextToCustomSlateNodes from './interactionRenderer';
|
|
5
6
|
const getTableColumnAlignment = (alignment) => {
|
|
@@ -36,6 +37,112 @@ const applyFormatting = (children, token, formatKey) => {
|
|
|
36
37
|
[formatKey]: true
|
|
37
38
|
};
|
|
38
39
|
};
|
|
40
|
+
// Limited set of inline HTML tags supported within markdown content.
|
|
41
|
+
const INLINE_HTML_TAG_FORMATS = {
|
|
42
|
+
em: 'italic',
|
|
43
|
+
i: 'italic',
|
|
44
|
+
strong: 'bold',
|
|
45
|
+
b: 'bold',
|
|
46
|
+
del: 'line-through',
|
|
47
|
+
u: 'underline',
|
|
48
|
+
sup: 'superscript',
|
|
49
|
+
sub: 'subscript'
|
|
50
|
+
};
|
|
51
|
+
const isParse5Element = (node) => !!node && node.nodeName !== '#text' && node.nodeName !== '#comment';
|
|
52
|
+
const isParse5Text = (node) => node.nodeName === '#text';
|
|
53
|
+
const getParse5Attribute = (element, name) => element.attrs.find(attr => attr.name === name)?.value;
|
|
54
|
+
// Concatenates the text of a parse5 node and all of its descendants.
|
|
55
|
+
const getParse5TextContent = (node) => {
|
|
56
|
+
if (isParse5Text(node))
|
|
57
|
+
return node.value;
|
|
58
|
+
if (isParse5Element(node))
|
|
59
|
+
return node.childNodes.map(getParse5TextContent).join('');
|
|
60
|
+
return '';
|
|
61
|
+
};
|
|
62
|
+
// Wraps text in a fenced markdown code block, using a fence long enough to not collide with any
|
|
63
|
+
// backtick run inside the content.
|
|
64
|
+
const toFencedCodeBlock = (code) => {
|
|
65
|
+
const longestBacktickRun = Math.max(0, ...(code.match(/`+/g) ?? []).map(run => run.length));
|
|
66
|
+
const fence = '`'.repeat(Math.max(3, longestBacktickRun + 1));
|
|
67
|
+
return `${fence}\n${code}\n${fence}`;
|
|
68
|
+
};
|
|
69
|
+
// Block-level HTML tags that are unwrapped and treated like markdown paragraphs.
|
|
70
|
+
const PARAGRAPH_LIKE_TAGS = new Set(['div', 'p']);
|
|
71
|
+
// Heading HTML tags mapped to the markdown heading prefix they are treated as.
|
|
72
|
+
const HEADING_TAG_PREFIXES = {
|
|
73
|
+
h1: '#',
|
|
74
|
+
h2: '##',
|
|
75
|
+
h3: '###',
|
|
76
|
+
h4: '####',
|
|
77
|
+
h5: '#####',
|
|
78
|
+
h6: '######'
|
|
79
|
+
};
|
|
80
|
+
// List container HTML tags.
|
|
81
|
+
const LIST_TAGS = new Set(['ul', 'ol']);
|
|
82
|
+
const isListElement = (node) => isParse5Element(node) && LIST_TAGS.has(node.nodeName);
|
|
83
|
+
// Converts an HTML list (<ul>/<ol>) to the equivalent markdown list, recursing into nested lists
|
|
84
|
+
// with increased indentation so the structure matches a hand-written markdown list.
|
|
85
|
+
const convertListToMarkdown = (list, indent = '') => {
|
|
86
|
+
const ordered = list.nodeName === 'ol';
|
|
87
|
+
const start = ordered ? Number.parseInt(getParse5Attribute(list, 'start') ?? '', 10) : Number.NaN;
|
|
88
|
+
let index = Number.isNaN(start) ? 1 : start;
|
|
89
|
+
const lines = [];
|
|
90
|
+
list.childNodes
|
|
91
|
+
.filter((node) => isParse5Element(node) && node.nodeName === 'li')
|
|
92
|
+
.forEach(item => {
|
|
93
|
+
const marker = ordered ? `${index}.` : '-';
|
|
94
|
+
const inlineChildren = item.childNodes.filter(child => !isListElement(child));
|
|
95
|
+
const inline = serialize({ ...item, childNodes: inlineChildren }).trim();
|
|
96
|
+
lines.push(`${indent}${marker} ${inline}`);
|
|
97
|
+
item.childNodes.filter(isListElement).forEach(nested => {
|
|
98
|
+
lines.push(convertListToMarkdown(nested, `${indent}${' '.repeat(marker.length + 1)}`));
|
|
99
|
+
});
|
|
100
|
+
index += 1;
|
|
101
|
+
});
|
|
102
|
+
return lines.join('\n');
|
|
103
|
+
};
|
|
104
|
+
// A <pre> is only treated as a code block when its single element child is a <code>.
|
|
105
|
+
const isPreCodeBlock = (el) => {
|
|
106
|
+
if (el.nodeName !== 'pre')
|
|
107
|
+
return false;
|
|
108
|
+
const elementChildren = el.childNodes.filter(isParse5Element);
|
|
109
|
+
return elementChildren.length === 1 && elementChildren[0].nodeName === 'code';
|
|
110
|
+
};
|
|
111
|
+
const isSupportedBlockElement = (el) => PARAGRAPH_LIKE_TAGS.has(el.nodeName) ||
|
|
112
|
+
el.nodeName in HEADING_TAG_PREFIXES ||
|
|
113
|
+
el.nodeName === 'a' ||
|
|
114
|
+
el.nodeName === 'img' ||
|
|
115
|
+
LIST_TAGS.has(el.nodeName) ||
|
|
116
|
+
isPreCodeBlock(el);
|
|
117
|
+
// Returns the markdown representation of each top-level block (<div>/<p> as paragraphs, <h1>-<h6>
|
|
118
|
+
// as `#`-prefixed headings, <a>/<img> as links/images, <ul>/<ol> as lists, <pre> as a code block)
|
|
119
|
+
// when the block consists solely of supported blocks (ignoring whitespace), or undefined otherwise.
|
|
120
|
+
// Used to treat those blocks like their markdown equivalents.
|
|
121
|
+
const getTopLevelBlockMarkdown = (raw) => {
|
|
122
|
+
const { childNodes } = parseFragment(raw.trim());
|
|
123
|
+
const elements = childNodes.filter(isParse5Element);
|
|
124
|
+
const hasStrayText = childNodes.some(node => isParse5Text(node) && node.value.trim() !== '');
|
|
125
|
+
if (hasStrayText || elements.length === 0 || elements.some(el => !isSupportedBlockElement(el))) {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
return elements.map(el => {
|
|
129
|
+
if (LIST_TAGS.has(el.nodeName)) {
|
|
130
|
+
return convertListToMarkdown(el);
|
|
131
|
+
}
|
|
132
|
+
if (el.nodeName === 'pre') {
|
|
133
|
+
return toFencedCodeBlock(getParse5TextContent(el));
|
|
134
|
+
}
|
|
135
|
+
const inner = serialize(el);
|
|
136
|
+
if (el.nodeName === 'a') {
|
|
137
|
+
return `[${inner}](${getParse5Attribute(el, 'href') ?? ''})`;
|
|
138
|
+
}
|
|
139
|
+
if (el.nodeName === 'img') {
|
|
140
|
+
return ` ?? ''})`;
|
|
141
|
+
}
|
|
142
|
+
const headingPrefix = HEADING_TAG_PREFIXES[el.nodeName];
|
|
143
|
+
return headingPrefix ? `${headingPrefix} ${inner}` : inner;
|
|
144
|
+
});
|
|
145
|
+
};
|
|
39
146
|
const MARKED_TOKEN_TYPES = [
|
|
40
147
|
'blockquote',
|
|
41
148
|
'br',
|
|
@@ -60,17 +167,192 @@ const MARKED_TOKEN_TYPES = [
|
|
|
60
167
|
];
|
|
61
168
|
const MARKED_TOKEN_TYPE_SET = new Set(MARKED_TOKEN_TYPES);
|
|
62
169
|
const isMarkedToken = (token) => MARKED_TOKEN_TYPE_SET.has(token.type);
|
|
170
|
+
// Expands top-level blocks (<div>/<p> and <h1> - <h6>) into the token stream they represent as
|
|
171
|
+
// markdown, so a series of them behaves exactly like the equivalent blank-line-separated markdown
|
|
172
|
+
// paragraphs and headings.
|
|
173
|
+
const expandTopLevelBlockTokens = (tokens) => tokens.flatMap(token => {
|
|
174
|
+
if (token.type === 'html' && token.block) {
|
|
175
|
+
const blockMarkdown = getTopLevelBlockMarkdown(token.raw);
|
|
176
|
+
if (blockMarkdown) {
|
|
177
|
+
return expandTopLevelBlockTokens(marked.lexer(blockMarkdown.join('\n\n'), { gfm: true }).filter(isMarkedToken));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return [token];
|
|
181
|
+
});
|
|
182
|
+
// Classifies a single HTML tag token, returning its lowercased tag name and whether it is a
|
|
183
|
+
// closing tag. Opening tags are parsed with a real HTML parser; closing tags carry no attributes,
|
|
184
|
+
// so their name is read directly and anything other than a bare `</name>` is rejected.
|
|
185
|
+
const parseHtmlTagToken = (raw) => {
|
|
186
|
+
const trimmed = raw.trim();
|
|
187
|
+
if (trimmed.startsWith('</')) {
|
|
188
|
+
if (!trimmed.endsWith('>'))
|
|
189
|
+
return undefined;
|
|
190
|
+
const name = trimmed.slice(2, -1).trim().toLowerCase();
|
|
191
|
+
return name && !/[\s>/]/.test(name) ? { name, isClosing: true, attributes: {} } : undefined;
|
|
192
|
+
}
|
|
193
|
+
const [element] = parseFragment(trimmed).childNodes;
|
|
194
|
+
if (!isParse5Element(element))
|
|
195
|
+
return undefined;
|
|
196
|
+
const attributes = Object.fromEntries(element.attrs.map(attr => [attr.name, attr.value]));
|
|
197
|
+
return { name: element.nodeName, isClosing: false, attributes };
|
|
198
|
+
};
|
|
199
|
+
// Inline HTML tags handled beyond text formatting: <span> unwraps to text, <a> becomes a link,
|
|
200
|
+
// <img> becomes an image, and <code> becomes an inline code span.
|
|
201
|
+
const INLINE_HTML_STRUCTURAL_TAGS = new Set(['span', 'a', 'img', 'code']);
|
|
202
|
+
const getSupportedInlineHtmlTag = (raw) => {
|
|
203
|
+
const tag = parseHtmlTagToken(raw);
|
|
204
|
+
if (!tag)
|
|
205
|
+
return undefined;
|
|
206
|
+
return tag.name in INLINE_HTML_TAG_FORMATS || INLINE_HTML_STRUCTURAL_TAGS.has(tag.name)
|
|
207
|
+
? tag
|
|
208
|
+
: undefined;
|
|
209
|
+
};
|
|
210
|
+
const getInlineHtmlFormat = (tagName) => tagName in INLINE_HTML_TAG_FORMATS ? INLINE_HTML_TAG_FORMATS[tagName] : undefined;
|
|
211
|
+
// Finds the index of the matching closing tag, accounting for nested tags of the same name.
|
|
212
|
+
const findInlineHtmlCloseIndex = (tokens, openIndex, tagName) => {
|
|
213
|
+
let depth = 1;
|
|
214
|
+
for (let i = openIndex + 1; i < tokens.length; i += 1) {
|
|
215
|
+
const token = tokens[i];
|
|
216
|
+
if (token.type === 'html') {
|
|
217
|
+
const tag = getSupportedInlineHtmlTag(token.raw);
|
|
218
|
+
if (tag?.name === tagName) {
|
|
219
|
+
depth += tag.isClosing ? -1 : 1;
|
|
220
|
+
if (depth === 0) {
|
|
221
|
+
return i;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return -1;
|
|
227
|
+
};
|
|
228
|
+
// Applies an inline HTML formatting mark to a node and all of its descendant text nodes, matching
|
|
229
|
+
// the leaf-level representation that regular markdown emphasis produces.
|
|
230
|
+
const applyInlineHtmlFormat = (node, formatKey) => {
|
|
231
|
+
if ('type' in node) {
|
|
232
|
+
if (node.type === 'custom') {
|
|
233
|
+
return { ...node, [formatKey]: true };
|
|
234
|
+
}
|
|
235
|
+
if (node.type === 'text') {
|
|
236
|
+
return {
|
|
237
|
+
...node,
|
|
238
|
+
children: node.children.map(child => applyInlineHtmlFormat(child, formatKey))
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
return node;
|
|
242
|
+
}
|
|
243
|
+
return { ...node, [formatKey]: true };
|
|
244
|
+
};
|
|
245
|
+
// Concatenates the text of a node and all of its descendants.
|
|
246
|
+
const getNodeText = (node) => 'children' in node ? node.children.map(getNodeText).join('') : node.text;
|
|
247
|
+
// Builds a link leaf from an <a> tag's attributes and its inner nodes, matching the representation
|
|
248
|
+
// of a markdown link (href plus plain text).
|
|
249
|
+
const createLinkNode = (attributes, innerNodes) => ({
|
|
250
|
+
href: attributes.href ?? '',
|
|
251
|
+
text: innerNodes.map(getNodeText).join('')
|
|
252
|
+
});
|
|
253
|
+
// Builds an image element from an <img> tag's attributes, matching the representation of a markdown
|
|
254
|
+
// image.
|
|
255
|
+
const createImageNode = (attributes) => ({
|
|
256
|
+
type: 'image',
|
|
257
|
+
alt: attributes.alt ?? '',
|
|
258
|
+
src: attributes.src ?? '',
|
|
259
|
+
children: [{ text: '' }]
|
|
260
|
+
});
|
|
261
|
+
const TEXT_MARK_KEYS = [
|
|
262
|
+
'bold',
|
|
263
|
+
'italic',
|
|
264
|
+
'line-through',
|
|
265
|
+
'code',
|
|
266
|
+
'underline',
|
|
267
|
+
'superscript',
|
|
268
|
+
'subscript'
|
|
269
|
+
];
|
|
270
|
+
const isPlainLeaf = (node) => !node.href && !node.searchResult;
|
|
271
|
+
// Returns the single plain text leaf a node represents (either a bare leaf or a `text` element
|
|
272
|
+
// wrapping exactly one plain leaf), or undefined when the node cannot be merged with a neighbor.
|
|
273
|
+
const asSingleLeaf = (node) => {
|
|
274
|
+
if (!('type' in node)) {
|
|
275
|
+
return isPlainLeaf(node) ? node : undefined;
|
|
276
|
+
}
|
|
277
|
+
if (node.type === 'text' && node.children.length === 1) {
|
|
278
|
+
const [child] = node.children;
|
|
279
|
+
if (!('type' in child) && isPlainLeaf(child)) {
|
|
280
|
+
return child;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
return undefined;
|
|
284
|
+
};
|
|
285
|
+
const haveSameMarks = (a, b) => TEXT_MARK_KEYS.every(key => !!a[key] === !!b[key]);
|
|
286
|
+
// Merges adjacent plain text runs that share the same marks so that, for example, nested same-tag
|
|
287
|
+
// emphasis collapses into a single formatted run (e.g. <strong><strong>foo</strong> bar</strong>
|
|
288
|
+
// renders identically to **foo bar**).
|
|
289
|
+
const mergeAdjacentTextNodes = (nodes) => {
|
|
290
|
+
const merged = [];
|
|
291
|
+
nodes.forEach(node => {
|
|
292
|
+
const leaf = asSingleLeaf(node);
|
|
293
|
+
const prev = merged[merged.length - 1];
|
|
294
|
+
const prevLeaf = prev ? asSingleLeaf(prev) : undefined;
|
|
295
|
+
if (leaf && prevLeaf && haveSameMarks(prevLeaf, leaf)) {
|
|
296
|
+
merged[merged.length - 1] = { ...prevLeaf, text: prevLeaf.text + leaf.text };
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
merged.push(node);
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
return merged;
|
|
303
|
+
};
|
|
63
304
|
const getCustomComponentFromMarkdownMap = (token, markdownMap) => {
|
|
64
305
|
return markdownMap?.[token.type]?.(token);
|
|
65
306
|
};
|
|
66
|
-
const markDownToSlate = (tokens, interactionRenderers, markdownMap, convertTokenToSlateNode) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
307
|
+
const markDownToSlate = (tokens, interactionRenderers, markdownMap, convertTokenToSlateNode, htmlEnabled) => {
|
|
308
|
+
const nodes = [];
|
|
309
|
+
for (let i = 0; i < tokens.length; i += 1) {
|
|
310
|
+
const token = tokens[i];
|
|
311
|
+
const openTag = htmlEnabled && token.type === 'html' ? getSupportedInlineHtmlTag(token.raw) : undefined;
|
|
312
|
+
if (openTag && openTag.name === 'img' && !openTag.isClosing) {
|
|
313
|
+
nodes.push(createImageNode(openTag.attributes));
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
const closeIndex = openTag && !openTag.isClosing ? findInlineHtmlCloseIndex(tokens, i, openTag.name) : -1;
|
|
317
|
+
if (openTag && closeIndex !== -1) {
|
|
318
|
+
if (openTag.name === 'code') {
|
|
319
|
+
// <code> is treated like a markdown codespan: its raw content becomes a code-marked leaf.
|
|
320
|
+
const innerRaw = tokens
|
|
321
|
+
.slice(i + 1, closeIndex)
|
|
322
|
+
.map(inner => inner.raw)
|
|
323
|
+
.join('');
|
|
324
|
+
nodes.push({ text: innerRaw, code: true });
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
const innerNodes = markDownToSlate(tokens.slice(i + 1, closeIndex), interactionRenderers, markdownMap, convertTokenToSlateNode, htmlEnabled);
|
|
328
|
+
if (openTag.name === 'a') {
|
|
329
|
+
nodes.push(createLinkNode(openTag.attributes, innerNodes));
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
const formatKey = getInlineHtmlFormat(openTag.name);
|
|
333
|
+
if (formatKey) {
|
|
334
|
+
innerNodes.forEach(innerNode => {
|
|
335
|
+
nodes.push(applyInlineHtmlFormat(innerNode, formatKey));
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
// Unwrapped tags (e.g. <span>) contribute their content as plain inline nodes.
|
|
340
|
+
nodes.push(...innerNodes);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
i = closeIndex;
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
nodes.push(convertTokenToSlateNode(token, interactionRenderers, markdownMap, htmlEnabled));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return htmlEnabled ? mergeAdjacentTextNodes(nodes) : nodes;
|
|
70
352
|
};
|
|
71
|
-
const convertTableCellToSlateNode = (cell, convertTokenToSlateNode, interactionRenderers, markdownMap, align, isHeaderCell) => {
|
|
353
|
+
const convertTableCellToSlateNode = (cell, convertTokenToSlateNode, interactionRenderers, markdownMap, align, isHeaderCell, htmlEnabled = false) => {
|
|
72
354
|
const children = cell.tokens?.length
|
|
73
|
-
? flattenInlineNodes(markDownToSlate(cell.tokens.filter(isMarkedToken), interactionRenderers, markdownMap, convertTokenToSlateNode))
|
|
355
|
+
? flattenInlineNodes(markDownToSlate(cell.tokens.filter(isMarkedToken), interactionRenderers, markdownMap, convertTokenToSlateNode, htmlEnabled))
|
|
74
356
|
: parseTextToCustomSlateNodes(cell.text || '', interactionRenderers);
|
|
75
357
|
const tableCell = {
|
|
76
358
|
type: 'table-cell',
|
|
@@ -80,21 +362,21 @@ const convertTableCellToSlateNode = (cell, convertTokenToSlateNode, interactionR
|
|
|
80
362
|
};
|
|
81
363
|
return tableCell;
|
|
82
364
|
};
|
|
83
|
-
const convertTableRowsToSlateNodes = (rows, convertTokenToSlateNode, interactionRenderers, markdownMap, alignments, isHeaderCell) => {
|
|
365
|
+
const convertTableRowsToSlateNodes = (rows, convertTokenToSlateNode, interactionRenderers, markdownMap, alignments, isHeaderCell, htmlEnabled = false) => {
|
|
84
366
|
return rows.map(row => {
|
|
85
367
|
return {
|
|
86
368
|
type: 'table-row',
|
|
87
369
|
children: row.map((cell, columnIndex) => {
|
|
88
|
-
return convertTableCellToSlateNode(cell, convertTokenToSlateNode, interactionRenderers, markdownMap, getTableColumnAlignment(alignments?.[columnIndex]), isHeaderCell);
|
|
370
|
+
return convertTableCellToSlateNode(cell, convertTokenToSlateNode, interactionRenderers, markdownMap, getTableColumnAlignment(alignments?.[columnIndex]), isHeaderCell, htmlEnabled);
|
|
89
371
|
})
|
|
90
372
|
};
|
|
91
373
|
});
|
|
92
374
|
};
|
|
93
|
-
export const getNode = (token, interactionRenderers, markdownMap) => {
|
|
375
|
+
export const getNode = (token, interactionRenderers, markdownMap, htmlEnabled = false) => {
|
|
94
376
|
if (!hasProp(token, 'type') || token.type === 'def')
|
|
95
377
|
return { type: 'paragraph', children: [{ text: '' }] };
|
|
96
378
|
if (token.type === 'html') {
|
|
97
|
-
if (
|
|
379
|
+
if (parseHtmlTagToken(token.raw)?.name === 'br') {
|
|
98
380
|
return { text: '\n' };
|
|
99
381
|
}
|
|
100
382
|
const parsed = parseTextToCustomSlateNodes(token.raw, interactionRenderers);
|
|
@@ -108,10 +390,10 @@ export const getNode = (token, interactionRenderers, markdownMap) => {
|
|
|
108
390
|
}
|
|
109
391
|
let children;
|
|
110
392
|
if (hasProp(token, 'tokens')) {
|
|
111
|
-
children = markDownToSlate(token.tokens || [], interactionRenderers, markdownMap, getNode);
|
|
393
|
+
children = markDownToSlate(token.tokens || [], interactionRenderers, markdownMap, getNode, htmlEnabled);
|
|
112
394
|
}
|
|
113
395
|
else if (hasProp(token, 'items')) {
|
|
114
|
-
children = markDownToSlate(token.items, interactionRenderers, markdownMap, getNode);
|
|
396
|
+
children = markDownToSlate(token.items, interactionRenderers, markdownMap, getNode, htmlEnabled);
|
|
115
397
|
}
|
|
116
398
|
else {
|
|
117
399
|
let mdText = '';
|
|
@@ -204,8 +486,8 @@ export const getNode = (token, interactionRenderers, markdownMap) => {
|
|
|
204
486
|
case 'table': {
|
|
205
487
|
const headerRows = token.header?.length ? [token.header] : [];
|
|
206
488
|
const bodyRows = token.rows || [];
|
|
207
|
-
const headerSlateRows = convertTableRowsToSlateNodes(headerRows, getNode, interactionRenderers, markdownMap, token.align, true);
|
|
208
|
-
const bodySlateRows = convertTableRowsToSlateNodes(bodyRows, getNode, interactionRenderers, markdownMap, token.align);
|
|
489
|
+
const headerSlateRows = convertTableRowsToSlateNodes(headerRows, getNode, interactionRenderers, markdownMap, token.align, true, htmlEnabled);
|
|
490
|
+
const bodySlateRows = convertTableRowsToSlateNodes(bodyRows, getNode, interactionRenderers, markdownMap, token.align, false, htmlEnabled);
|
|
209
491
|
const tableBody = {
|
|
210
492
|
type: 'table-body',
|
|
211
493
|
children: bodySlateRows
|
|
@@ -253,10 +535,11 @@ export const convertMarkdownForEditor = (md = '', searchRenderers) => {
|
|
|
253
535
|
};
|
|
254
536
|
// Converts markdown into Slate compatible nodes, also takes regex used
|
|
255
537
|
// in Feed Component to pass them down to custom elements
|
|
256
|
-
const convertMarkdown = (md, interactionRenderers, markdownMap) => {
|
|
538
|
+
const convertMarkdown = (md, interactionRenderers, markdownMap, htmlEnabled = false) => {
|
|
257
539
|
const lexer = new marked.Lexer({ gfm: true });
|
|
258
540
|
const output = lexer.lex(md);
|
|
259
|
-
|
|
541
|
+
const tokens = htmlEnabled ? expandTopLevelBlockTokens(output) : output;
|
|
542
|
+
return markDownToSlate(tokens, interactionRenderers, markdownMap, getNode, htmlEnabled);
|
|
260
543
|
};
|
|
261
544
|
export default convertMarkdown;
|
|
262
545
|
//# sourceMappingURL=markdownConverter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdownConverter.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/markdownConverter.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAIlD,OAAO,2BAA2B,MAAM,uBAAuB,CAAC;AAUhE,MAAM,uBAAuB,GAAG,CAC9B,SAAoD,EAClB,EAAE;IACpC,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAyB,EAAsB,EAAE,CAC3E,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CACnB,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,UAAU,IAAI,IAAI;IAC1D,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;IACnC,CAAC,CAAC,CAAC,IAAI,CAAC,CACX,CAAC;AAEJ,MAAM,eAAe,GAAG,CACtB,QAA4B,EAC5B,KAAkB,EAClB,SAAsD,EACtC,EAAE;IAClB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpF,OAAO;YACL,GAAG,QAAQ,CAAC,CAAC,CAAC;YACd,CAAC,SAAS,CAAC,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnE,GAAG,KAAK;YACR,CAAC,SAAS,CAAC,EAAE,IAAI;SAClB,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,iBAAiB;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GACZ,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACb,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAExD,OAAO;QACL,GAAG,QAAQ;QACX,CAAC,SAAS,CAAC,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG;IACzB,YAAY;IACZ,IAAI;IACJ,MAAM;IACN,UAAU;IACV,KAAK;IACL,KAAK;IACL,IAAI;IACJ,QAAQ;IACR,SAAS;IACT,IAAI;IACJ,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;IACX,OAAO;IACP,QAAQ;IACR,OAAO;IACP,MAAM;CAC2C,CAAC;AACpD,MAAM,qBAAqB,GAAwB,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAE/E,MAAM,aAAa,GAAG,CAAC,KAAmC,EAAwB,EAAE,CAClF,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAExC,MAAM,iCAAiC,GAAG,CACxC,KAAkB,EAClB,WAAgD,EACG,EAAE;IACrD,OAAO,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CACtB,MAAqB,EACrB,oBAAwD,EACxD,WAA2D,EAC3D,uBAA+C,EAC3B,EAAE;IACtB,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACxB,OAAO,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,EAAE,WAAW,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CAClC,IAAsB,EACtB,uBAA+C,EAC/C,oBAA6C,EAC7C,WAAgD,EAChD,KAA4B,EAC5B,YAAsB,EACO,EAAE;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM;QAClC,CAAC,CAAC,kBAAkB,CAChB,eAAe,CACb,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EACjC,oBAAoB,EACpB,WAAW,EACX,uBAAuB,CACxB,CACF;QACH,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAEvE,MAAM,SAAS,GAAgC;QAC7C,IAAI,EAAE,YAAY;QAClB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;KAC1D,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,CACnC,IAA0B,EAC1B,uBAA+C,EAC/C,oBAA6C,EAC7C,WAAgD,EAChD,UAAkC,EAClC,YAAsB,EACQ,EAAE;IAChC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACpB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;gBACtC,OAAO,2BAA2B,CAChC,IAAI,EACJ,uBAAuB,EACvB,oBAAoB,EACpB,WAAW,EACX,uBAAuB,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,EAClD,YAAY,CACb,CAAC;YACJ,CAAC,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,KAAkB,EAClB,oBAA6C,EAC7C,WAAgD,EAChC,EAAE;IAClB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;QACjD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IAEzD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,2BAA2B,CAAC,KAAK,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAC5E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QACD,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,MAAM;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,QAA4B,CAAC;IAEjC,IAAI,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC7B,QAAQ,GAAG,eAAe,CACvB,KAAK,CAAC,MAAwB,IAAI,EAAE,EACrC,oBAAoB,EACpB,WAAW,EACX,OAAO,CACR,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC;QACnC,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC;aACzC,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;YAAE,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;QAErD,QAAQ,GAAG,2BAA2B,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,WAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,eAAe,GAAG,iCAAiC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC9E,IAAI,eAAe;YACjB,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,KAAC,eAAe,IAAC,KAAK,EAAE,KAAK,GAAI;gBAC5C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;aACzB,CAAC;IACN,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;SAChC,CAAC;IACJ,CAAC;IAED,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ;aACT,CAAC;QACJ,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,OAAO;gBACL,IAAI,EACF,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC;oBAC7B,CAAC,CAAE,WAAW,KAAK,CAAC,KAAK,EAAiC;oBAC1D,CAAC,CAAC,WAAW;gBACjB,QAAQ;aACT,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;aACvB,CAAC;QACJ,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,OAAO,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO;oBACL,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACxD,QAAQ,EAAE,QAAwC;iBACnD,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,QAAwC;aACnD,CAAC;QACJ,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,QAAqB;aAChC,CAAC;QACJ,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,QAAQ;aACT,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,OAAO;gBACL,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,KAAK,CAAC,IAAI;gBACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;aACjC,CAAC;QACJ,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAElC,MAAM,eAAe,GAAG,4BAA4B,CAClD,UAAU,EACV,OAAO,EACP,oBAAoB,EACpB,WAAW,EACX,KAAK,CAAC,KAAK,EACX,IAAI,CACL,CAAC;YAEF,MAAM,aAAa,GAAG,4BAA4B,CAChD,QAAQ,EACR,OAAO,EACP,oBAAoB,EACpB,WAAW,EACX,KAAK,CAAC,KAAK,CACZ,CAAC;YAEF,MAAM,SAAS,GAAgC;gBAC7C,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,aAAa;aACxB,CAAC;YAEF,MAAM,aAAa,GAGjB,eAAe,CAAC,MAAM,GAAG,CAAC;gBACxB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,SAAS,CAAC;gBAChE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAElB,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,aAAa;aACxB,CAAC;QACJ,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,OAAO;gBACL,IAAI,EAAE,iBAAiB;gBACvB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;aACzB,CAAC;QACJ,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,GAAG,EAAE,KAAK,CAAC,IAAI;gBACf,GAAG,EAAE,KAAK,CAAC,IAAI;gBACf,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;aACzB,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ;aACE,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,EAAE,GAAG,EAAE,EACP,eAAwC,EACpB,EAAE;IACtB,OAAO;QACL;YACE,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,2BAA2B,CAAC,EAAE,EAAE,eAAe,CAAC;SAC3D;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,uEAAuE;AACvE,yDAAyD;AACzD,MAAM,eAAe,GAAG,CACtB,EAAU,EACV,oBAA6C,EAC7C,WAAgD,EAC5B,EAAE;IACtB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAkB,CAAC;IAC9C,OAAO,eAAe,CAAC,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,eAAe,eAAe,CAAC","sourcesContent":["import type { PegaCustom, Element, Text } from 'slate';\nimport { marked } from 'marked';\nimport type { MarkedToken, Tokens } from 'marked';\nimport type { ComponentType } from 'react';\n\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport type { TokenMap, InteractionRenderers, RichTextViewerProps } from '../RichTextViewer.types';\n\nimport parseTextToCustomSlateNodes from './interactionRenderer';\n\ntype TableColumnAlignment = 'left' | 'center' | 'right';\n\ntype MarkedTokenToSlateNode = (\n token: MarkedToken,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap']\n) => Element | Text;\n\nconst getTableColumnAlignment = (\n alignment: Tokens.Table['align'][number] | undefined\n): TableColumnAlignment | undefined => {\n if (alignment === 'left' || alignment === 'center' || alignment === 'right') {\n return alignment;\n }\n\n return undefined;\n};\n\nconst flattenInlineNodes = (nodes: (Element | Text)[]): (Element | Text)[] =>\n nodes.flatMap(node =>\n 'type' in node && node.type === 'text' && 'children' in node\n ? flattenInlineNodes(node.children)\n : [node]\n );\n\nconst applyFormatting = (\n children: (Element | Text)[],\n token: MarkedToken,\n formatKey: 'italic' | 'bold' | 'code' | 'line-through'\n): Element | Text => {\n if (children.length === 1 && 'type' in children[0] && children[0].type === 'custom') {\n return {\n ...children[0],\n [formatKey]: true\n };\n }\n\n if (children.length > 1) {\n const formattedChildren = flattenInlineNodes(children).map(child => ({\n ...child,\n [formatKey]: true\n }));\n\n return {\n type: 'text',\n children: formattedChildren\n };\n }\n\n const baseNode =\n children.length > 0 && !('type' in children[0])\n ? children[0]\n : { text: 'text' in token ? token.text || '' : '' };\n\n return {\n ...baseNode,\n [formatKey]: true\n };\n};\n\nconst MARKED_TOKEN_TYPES = [\n 'blockquote',\n 'br',\n 'code',\n 'codespan',\n 'def',\n 'del',\n 'em',\n 'escape',\n 'heading',\n 'hr',\n 'html',\n 'image',\n 'link',\n 'list',\n 'list_item',\n 'paragraph',\n 'space',\n 'strong',\n 'table',\n 'text'\n] as const satisfies readonly MarkedToken['type'][];\nconst MARKED_TOKEN_TYPE_SET: ReadonlySet<string> = new Set(MARKED_TOKEN_TYPES);\n\nconst isMarkedToken = (token: MarkedToken | Tokens.Generic): token is MarkedToken =>\n MARKED_TOKEN_TYPE_SET.has(token.type);\n\nconst getCustomComponentFromMarkdownMap = <K extends keyof TokenMap>(\n token: TokenMap[K],\n markdownMap?: RichTextViewerProps['markdownMap']\n): ComponentType<{ token: TokenMap[K] }> | undefined => {\n return markdownMap?.[token.type]?.(token);\n};\n\nconst markDownToSlate = (\n tokens: MarkedToken[],\n interactionRenderers: InteractionRenderers[] | undefined,\n markdownMap: RichTextViewerProps['markdownMap'] | undefined,\n convertTokenToSlateNode: MarkedTokenToSlateNode\n): (Element | Text)[] => {\n return tokens.map(token => {\n return convertTokenToSlateNode(token, interactionRenderers, markdownMap);\n });\n};\n\nconst convertTableCellToSlateNode = (\n cell: Tokens.TableCell,\n convertTokenToSlateNode: MarkedTokenToSlateNode,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap'],\n align?: TableColumnAlignment,\n isHeaderCell?: boolean\n): PegaCustom.TableCellElement => {\n const children = cell.tokens?.length\n ? flattenInlineNodes(\n markDownToSlate(\n cell.tokens.filter(isMarkedToken),\n interactionRenderers,\n markdownMap,\n convertTokenToSlateNode\n )\n )\n : parseTextToCustomSlateNodes(cell.text || '', interactionRenderers);\n\n const tableCell: PegaCustom.TableCellElement = {\n type: 'table-cell',\n ...(align ? { align } : {}),\n ...(isHeaderCell ? { isHeaderCell: true } : {}),\n children: children.length > 0 ? children : [{ text: '' }]\n };\n\n return tableCell;\n};\n\nconst convertTableRowsToSlateNodes = (\n rows: Tokens.TableCell[][],\n convertTokenToSlateNode: MarkedTokenToSlateNode,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap'],\n alignments?: Tokens.Table['align'],\n isHeaderCell?: boolean\n): PegaCustom.TableRowElement[] => {\n return rows.map(row => {\n return {\n type: 'table-row',\n children: row.map((cell, columnIndex) => {\n return convertTableCellToSlateNode(\n cell,\n convertTokenToSlateNode,\n interactionRenderers,\n markdownMap,\n getTableColumnAlignment(alignments?.[columnIndex]),\n isHeaderCell\n );\n })\n };\n });\n};\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 if (token.type === 'html') {\n if (/^<br\\s*\\/?>$/i.test(token.raw.trim())) {\n return { text: '\\n' };\n }\n\n const parsed = parseTextToCustomSlateNodes(token.raw, interactionRenderers);\n if (parsed.length === 1) {\n return parsed[0];\n }\n return {\n type: 'paragraph',\n children: parsed\n };\n }\n\n let children: (Element | Text)[];\n\n if (hasProp(token, 'tokens')) {\n children = markDownToSlate(\n (token.tokens as MarkedToken[]) || [],\n interactionRenderers,\n markdownMap,\n getNode\n );\n } else if (hasProp(token, 'items')) {\n children = markDownToSlate(token.items, interactionRenderers, markdownMap, getNode);\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 = getCustomComponentFromMarkdownMap(token, markdownMap);\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 applyFormatting(children, token, 'italic');\n }\n case 'strong': {\n return applyFormatting(children, token, 'bold');\n }\n case 'del': {\n return applyFormatting(children, token, 'line-through');\n }\n case 'codespan': {\n return applyFormatting(children, token, 'code');\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 return {\n type: 'code-block',\n language: token.lang,\n children: [{ text: token.text }]\n };\n }\n case 'table': {\n const headerRows = token.header?.length ? [token.header] : [];\n const bodyRows = token.rows || [];\n\n const headerSlateRows = convertTableRowsToSlateNodes(\n headerRows,\n getNode,\n interactionRenderers,\n markdownMap,\n token.align,\n true\n );\n\n const bodySlateRows = convertTableRowsToSlateNodes(\n bodyRows,\n getNode,\n interactionRenderers,\n markdownMap,\n token.align\n );\n\n const tableBody: PegaCustom.TableBodyElement = {\n type: 'table-body',\n children: bodySlateRows\n };\n\n const tableChildren:\n | [PegaCustom.TableHeadElement, PegaCustom.TableBodyElement]\n | [PegaCustom.TableBodyElement] =\n headerSlateRows.length > 0\n ? [{ type: 'table-head', children: headerSlateRows }, tableBody]\n : [tableBody];\n\n return {\n type: 'table',\n children: tableChildren\n };\n }\n case 'br': {\n return { 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\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: true });\n const output = lexer.lex(md) as MarkedToken[];\n return markDownToSlate(output, interactionRenderers, markdownMap, getNode);\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, Tokens } from 'marked';\nimport { parseFragment, serialize } from 'parse5';\nimport type * as parse5 from 'parse5';\nimport type { ComponentType } from 'react';\n\nimport { hasProp } from '@pega/cosmos-react-core';\n\nimport type { TokenMap, InteractionRenderers, RichTextViewerProps } from '../RichTextViewer.types';\n\nimport parseTextToCustomSlateNodes from './interactionRenderer';\n\ntype TableColumnAlignment = 'left' | 'center' | 'right';\n\ntype MarkedTokenToSlateNode = (\n token: MarkedToken,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap'],\n htmlEnabled?: boolean\n) => Element | Text;\n\nconst getTableColumnAlignment = (\n alignment: Tokens.Table['align'][number] | undefined\n): TableColumnAlignment | undefined => {\n if (alignment === 'left' || alignment === 'center' || alignment === 'right') {\n return alignment;\n }\n\n return undefined;\n};\n\nconst flattenInlineNodes = (nodes: (Element | Text)[]): (Element | Text)[] =>\n nodes.flatMap(node =>\n 'type' in node && node.type === 'text' && 'children' in node\n ? flattenInlineNodes(node.children)\n : [node]\n );\n\nconst applyFormatting = (\n children: (Element | Text)[],\n token: MarkedToken,\n formatKey: 'italic' | 'bold' | 'code' | 'line-through'\n): Element | Text => {\n if (children.length === 1 && 'type' in children[0] && children[0].type === 'custom') {\n return {\n ...children[0],\n [formatKey]: true\n };\n }\n\n if (children.length > 1) {\n const formattedChildren = flattenInlineNodes(children).map(child => ({\n ...child,\n [formatKey]: true\n }));\n\n return {\n type: 'text',\n children: formattedChildren\n };\n }\n\n const baseNode =\n children.length > 0 && !('type' in children[0])\n ? children[0]\n : { text: 'text' in token ? token.text || '' : '' };\n\n return {\n ...baseNode,\n [formatKey]: true\n };\n};\n\ntype InlineHtmlFormatKey =\n | 'italic'\n | 'bold'\n | 'underline'\n | 'line-through'\n | 'superscript'\n | 'subscript';\n\n// Limited set of inline HTML tags supported within markdown content.\nconst INLINE_HTML_TAG_FORMATS: Record<string, InlineHtmlFormatKey> = {\n em: 'italic',\n i: 'italic',\n strong: 'bold',\n b: 'bold',\n del: 'line-through',\n u: 'underline',\n sup: 'superscript',\n sub: 'subscript'\n};\n\ninterface HtmlTagToken {\n name: string;\n isClosing: boolean;\n attributes: Record<string, string>;\n}\n\nconst isParse5Element = (node: parse5.ChildNode | undefined): node is parse5.Element =>\n !!node && node.nodeName !== '#text' && node.nodeName !== '#comment';\n\nconst isParse5Text = (node: parse5.ChildNode): node is parse5.TextNode => node.nodeName === '#text';\n\nconst getParse5Attribute = (element: parse5.Element, name: string): string | undefined =>\n element.attrs.find(attr => attr.name === name)?.value;\n\n// Concatenates the text of a parse5 node and all of its descendants.\nconst getParse5TextContent = (node: parse5.ChildNode): string => {\n if (isParse5Text(node)) return node.value;\n if (isParse5Element(node)) return node.childNodes.map(getParse5TextContent).join('');\n return '';\n};\n\n// Wraps text in a fenced markdown code block, using a fence long enough to not collide with any\n// backtick run inside the content.\nconst toFencedCodeBlock = (code: string): string => {\n const longestBacktickRun = Math.max(0, ...(code.match(/`+/g) ?? []).map(run => run.length));\n const fence = '`'.repeat(Math.max(3, longestBacktickRun + 1));\n return `${fence}\\n${code}\\n${fence}`;\n};\n\n// Block-level HTML tags that are unwrapped and treated like markdown paragraphs.\nconst PARAGRAPH_LIKE_TAGS: ReadonlySet<string> = new Set(['div', 'p']);\n\n// Heading HTML tags mapped to the markdown heading prefix they are treated as.\nconst HEADING_TAG_PREFIXES: Record<string, string> = {\n h1: '#',\n h2: '##',\n h3: '###',\n h4: '####',\n h5: '#####',\n h6: '######'\n};\n\n// List container HTML tags.\nconst LIST_TAGS: ReadonlySet<string> = new Set(['ul', 'ol']);\n\nconst isListElement = (node: parse5.ChildNode): node is parse5.Element =>\n isParse5Element(node) && LIST_TAGS.has(node.nodeName);\n\n// Converts an HTML list (<ul>/<ol>) to the equivalent markdown list, recursing into nested lists\n// with increased indentation so the structure matches a hand-written markdown list.\nconst convertListToMarkdown = (list: parse5.Element, indent = ''): string => {\n const ordered = list.nodeName === 'ol';\n const start = ordered ? Number.parseInt(getParse5Attribute(list, 'start') ?? '', 10) : Number.NaN;\n let index = Number.isNaN(start) ? 1 : start;\n\n const lines: string[] = [];\n\n list.childNodes\n .filter((node): node is parse5.Element => isParse5Element(node) && node.nodeName === 'li')\n .forEach(item => {\n const marker = ordered ? `${index}.` : '-';\n const inlineChildren = item.childNodes.filter(child => !isListElement(child));\n const inline = serialize({ ...item, childNodes: inlineChildren }).trim();\n\n lines.push(`${indent}${marker} ${inline}`);\n\n item.childNodes.filter(isListElement).forEach(nested => {\n lines.push(convertListToMarkdown(nested, `${indent}${' '.repeat(marker.length + 1)}`));\n });\n\n index += 1;\n });\n\n return lines.join('\\n');\n};\n\n// A <pre> is only treated as a code block when its single element child is a <code>.\nconst isPreCodeBlock = (el: parse5.Element): boolean => {\n if (el.nodeName !== 'pre') return false;\n const elementChildren = el.childNodes.filter(isParse5Element);\n return elementChildren.length === 1 && elementChildren[0].nodeName === 'code';\n};\n\nconst isSupportedBlockElement = (el: parse5.Element): boolean =>\n PARAGRAPH_LIKE_TAGS.has(el.nodeName) ||\n el.nodeName in HEADING_TAG_PREFIXES ||\n el.nodeName === 'a' ||\n el.nodeName === 'img' ||\n LIST_TAGS.has(el.nodeName) ||\n isPreCodeBlock(el);\n\n// Returns the markdown representation of each top-level block (<div>/<p> as paragraphs, <h1>-<h6>\n// as `#`-prefixed headings, <a>/<img> as links/images, <ul>/<ol> as lists, <pre> as a code block)\n// when the block consists solely of supported blocks (ignoring whitespace), or undefined otherwise.\n// Used to treat those blocks like their markdown equivalents.\nconst getTopLevelBlockMarkdown = (raw: string): string[] | undefined => {\n const { childNodes } = parseFragment(raw.trim());\n const elements = childNodes.filter(isParse5Element);\n const hasStrayText = childNodes.some(node => isParse5Text(node) && node.value.trim() !== '');\n\n if (hasStrayText || elements.length === 0 || elements.some(el => !isSupportedBlockElement(el))) {\n return undefined;\n }\n\n return elements.map(el => {\n if (LIST_TAGS.has(el.nodeName)) {\n return convertListToMarkdown(el);\n }\n if (el.nodeName === 'pre') {\n return toFencedCodeBlock(getParse5TextContent(el));\n }\n const inner = serialize(el);\n if (el.nodeName === 'a') {\n return `[${inner}](${getParse5Attribute(el, 'href') ?? ''})`;\n }\n if (el.nodeName === 'img') {\n return ` ?? ''})`;\n }\n const headingPrefix = HEADING_TAG_PREFIXES[el.nodeName];\n return headingPrefix ? `${headingPrefix} ${inner}` : inner;\n });\n};\n\nconst MARKED_TOKEN_TYPES = [\n 'blockquote',\n 'br',\n 'code',\n 'codespan',\n 'def',\n 'del',\n 'em',\n 'escape',\n 'heading',\n 'hr',\n 'html',\n 'image',\n 'link',\n 'list',\n 'list_item',\n 'paragraph',\n 'space',\n 'strong',\n 'table',\n 'text'\n] as const satisfies readonly MarkedToken['type'][];\nconst MARKED_TOKEN_TYPE_SET: ReadonlySet<string> = new Set(MARKED_TOKEN_TYPES);\n\nconst isMarkedToken = (token: MarkedToken | Tokens.Generic): token is MarkedToken =>\n MARKED_TOKEN_TYPE_SET.has(token.type);\n\n// Expands top-level blocks (<div>/<p> and <h1> - <h6>) into the token stream they represent as\n// markdown, so a series of them behaves exactly like the equivalent blank-line-separated markdown\n// paragraphs and headings.\nconst expandTopLevelBlockTokens = (tokens: MarkedToken[]): MarkedToken[] =>\n tokens.flatMap(token => {\n if (token.type === 'html' && token.block) {\n const blockMarkdown = getTopLevelBlockMarkdown(token.raw);\n if (blockMarkdown) {\n return expandTopLevelBlockTokens(\n marked.lexer(blockMarkdown.join('\\n\\n'), { gfm: true }).filter(isMarkedToken)\n );\n }\n }\n return [token];\n });\n\n// Classifies a single HTML tag token, returning its lowercased tag name and whether it is a\n// closing tag. Opening tags are parsed with a real HTML parser; closing tags carry no attributes,\n// so their name is read directly and anything other than a bare `</name>` is rejected.\nconst parseHtmlTagToken = (raw: string): HtmlTagToken | undefined => {\n const trimmed = raw.trim();\n\n if (trimmed.startsWith('</')) {\n if (!trimmed.endsWith('>')) return undefined;\n const name = trimmed.slice(2, -1).trim().toLowerCase();\n return name && !/[\\s>/]/.test(name) ? { name, isClosing: true, attributes: {} } : undefined;\n }\n\n const [element] = parseFragment(trimmed).childNodes;\n if (!isParse5Element(element)) return undefined;\n const attributes = Object.fromEntries(element.attrs.map(attr => [attr.name, attr.value]));\n return { name: element.nodeName, isClosing: false, attributes };\n};\n\n// Inline HTML tags handled beyond text formatting: <span> unwraps to text, <a> becomes a link,\n// <img> becomes an image, and <code> becomes an inline code span.\nconst INLINE_HTML_STRUCTURAL_TAGS: ReadonlySet<string> = new Set(['span', 'a', 'img', 'code']);\n\nconst getSupportedInlineHtmlTag = (raw: string): HtmlTagToken | undefined => {\n const tag = parseHtmlTagToken(raw);\n if (!tag) return undefined;\n return tag.name in INLINE_HTML_TAG_FORMATS || INLINE_HTML_STRUCTURAL_TAGS.has(tag.name)\n ? tag\n : undefined;\n};\n\nconst getInlineHtmlFormat = (tagName: string): InlineHtmlFormatKey | undefined =>\n tagName in INLINE_HTML_TAG_FORMATS ? INLINE_HTML_TAG_FORMATS[tagName] : undefined;\n\n// Finds the index of the matching closing tag, accounting for nested tags of the same name.\nconst findInlineHtmlCloseIndex = (\n tokens: MarkedToken[],\n openIndex: number,\n tagName: string\n): number => {\n let depth = 1;\n\n for (let i = openIndex + 1; i < tokens.length; i += 1) {\n const token = tokens[i];\n if (token.type === 'html') {\n const tag = getSupportedInlineHtmlTag(token.raw);\n\n if (tag?.name === tagName) {\n depth += tag.isClosing ? -1 : 1;\n if (depth === 0) {\n return i;\n }\n }\n }\n }\n\n return -1;\n};\n\n// Applies an inline HTML formatting mark to a node and all of its descendant text nodes, matching\n// the leaf-level representation that regular markdown emphasis produces.\nconst applyInlineHtmlFormat = (\n node: Element | Text,\n formatKey: InlineHtmlFormatKey\n): Element | Text => {\n if ('type' in node) {\n if (node.type === 'custom') {\n return { ...node, [formatKey]: true };\n }\n\n if (node.type === 'text') {\n return {\n ...node,\n children: node.children.map(child => applyInlineHtmlFormat(child, formatKey))\n };\n }\n\n return node;\n }\n\n return { ...node, [formatKey]: true };\n};\n\n// Concatenates the text of a node and all of its descendants.\nconst getNodeText = (node: Element | Text): string =>\n 'children' in node ? node.children.map(getNodeText).join('') : node.text;\n\n// Builds a link leaf from an <a> tag's attributes and its inner nodes, matching the representation\n// of a markdown link (href plus plain text).\nconst createLinkNode = (\n attributes: Record<string, string>,\n innerNodes: (Element | Text)[]\n): Text => ({\n href: attributes.href ?? '',\n text: innerNodes.map(getNodeText).join('')\n});\n\n// Builds an image element from an <img> tag's attributes, matching the representation of a markdown\n// image.\nconst createImageNode = (attributes: Record<string, string>): PegaCustom.ImageElement => ({\n type: 'image',\n alt: attributes.alt ?? '',\n src: attributes.src ?? '',\n children: [{ text: '' }]\n});\n\nconst TEXT_MARK_KEYS = [\n 'bold',\n 'italic',\n 'line-through',\n 'code',\n 'underline',\n 'superscript',\n 'subscript'\n] as const;\n\nconst isPlainLeaf = (node: Text): boolean => !node.href && !node.searchResult;\n\n// Returns the single plain text leaf a node represents (either a bare leaf or a `text` element\n// wrapping exactly one plain leaf), or undefined when the node cannot be merged with a neighbor.\nconst asSingleLeaf = (node: Element | Text): Text | undefined => {\n if (!('type' in node)) {\n return isPlainLeaf(node) ? node : undefined;\n }\n\n if (node.type === 'text' && node.children.length === 1) {\n const [child] = node.children;\n if (!('type' in child) && isPlainLeaf(child)) {\n return child;\n }\n }\n\n return undefined;\n};\n\nconst haveSameMarks = (a: Text, b: Text): boolean =>\n TEXT_MARK_KEYS.every(key => !!a[key] === !!b[key]);\n\n// Merges adjacent plain text runs that share the same marks so that, for example, nested same-tag\n// emphasis collapses into a single formatted run (e.g. <strong><strong>foo</strong> bar</strong>\n// renders identically to **foo bar**).\nconst mergeAdjacentTextNodes = (nodes: (Element | Text)[]): (Element | Text)[] => {\n const merged: (Element | Text)[] = [];\n\n nodes.forEach(node => {\n const leaf = asSingleLeaf(node);\n const prev = merged[merged.length - 1];\n const prevLeaf = prev ? asSingleLeaf(prev) : undefined;\n\n if (leaf && prevLeaf && haveSameMarks(prevLeaf, leaf)) {\n merged[merged.length - 1] = { ...prevLeaf, text: prevLeaf.text + leaf.text };\n } else {\n merged.push(node);\n }\n });\n\n return merged;\n};\n\nconst getCustomComponentFromMarkdownMap = <K extends keyof TokenMap>(\n token: TokenMap[K],\n markdownMap?: RichTextViewerProps['markdownMap']\n): ComponentType<{ token: TokenMap[K] }> | undefined => {\n return markdownMap?.[token.type]?.(token);\n};\n\nconst markDownToSlate = (\n tokens: MarkedToken[],\n interactionRenderers: InteractionRenderers[] | undefined,\n markdownMap: RichTextViewerProps['markdownMap'] | undefined,\n convertTokenToSlateNode: MarkedTokenToSlateNode,\n htmlEnabled: boolean\n): (Element | Text)[] => {\n const nodes: (Element | Text)[] = [];\n\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n const openTag =\n htmlEnabled && token.type === 'html' ? getSupportedInlineHtmlTag(token.raw) : undefined;\n\n if (openTag && openTag.name === 'img' && !openTag.isClosing) {\n nodes.push(createImageNode(openTag.attributes));\n } else {\n const closeIndex =\n openTag && !openTag.isClosing ? findInlineHtmlCloseIndex(tokens, i, openTag.name) : -1;\n\n if (openTag && closeIndex !== -1) {\n if (openTag.name === 'code') {\n // <code> is treated like a markdown codespan: its raw content becomes a code-marked leaf.\n const innerRaw = tokens\n .slice(i + 1, closeIndex)\n .map(inner => inner.raw)\n .join('');\n nodes.push({ text: innerRaw, code: true });\n } else {\n const innerNodes = markDownToSlate(\n tokens.slice(i + 1, closeIndex),\n interactionRenderers,\n markdownMap,\n convertTokenToSlateNode,\n htmlEnabled\n );\n\n if (openTag.name === 'a') {\n nodes.push(createLinkNode(openTag.attributes, innerNodes));\n } else {\n const formatKey = getInlineHtmlFormat(openTag.name);\n if (formatKey) {\n innerNodes.forEach(innerNode => {\n nodes.push(applyInlineHtmlFormat(innerNode, formatKey));\n });\n } else {\n // Unwrapped tags (e.g. <span>) contribute their content as plain inline nodes.\n nodes.push(...innerNodes);\n }\n }\n }\n\n i = closeIndex;\n } else {\n nodes.push(convertTokenToSlateNode(token, interactionRenderers, markdownMap, htmlEnabled));\n }\n }\n }\n\n return htmlEnabled ? mergeAdjacentTextNodes(nodes) : nodes;\n};\n\nconst convertTableCellToSlateNode = (\n cell: Tokens.TableCell,\n convertTokenToSlateNode: MarkedTokenToSlateNode,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap'],\n align?: TableColumnAlignment,\n isHeaderCell?: boolean,\n htmlEnabled = false\n): PegaCustom.TableCellElement => {\n const children = cell.tokens?.length\n ? flattenInlineNodes(\n markDownToSlate(\n cell.tokens.filter(isMarkedToken),\n interactionRenderers,\n markdownMap,\n convertTokenToSlateNode,\n htmlEnabled\n )\n )\n : parseTextToCustomSlateNodes(cell.text || '', interactionRenderers);\n\n const tableCell: PegaCustom.TableCellElement = {\n type: 'table-cell',\n ...(align ? { align } : {}),\n ...(isHeaderCell ? { isHeaderCell: true } : {}),\n children: children.length > 0 ? children : [{ text: '' }]\n };\n\n return tableCell;\n};\n\nconst convertTableRowsToSlateNodes = (\n rows: Tokens.TableCell[][],\n convertTokenToSlateNode: MarkedTokenToSlateNode,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap'],\n alignments?: Tokens.Table['align'],\n isHeaderCell?: boolean,\n htmlEnabled = false\n): PegaCustom.TableRowElement[] => {\n return rows.map(row => {\n return {\n type: 'table-row',\n children: row.map((cell, columnIndex) => {\n return convertTableCellToSlateNode(\n cell,\n convertTokenToSlateNode,\n interactionRenderers,\n markdownMap,\n getTableColumnAlignment(alignments?.[columnIndex]),\n isHeaderCell,\n htmlEnabled\n );\n })\n };\n });\n};\n\nexport const getNode = (\n token: MarkedToken,\n interactionRenderers?: InteractionRenderers[],\n markdownMap?: RichTextViewerProps['markdownMap'],\n htmlEnabled = false\n): Element | Text => {\n if (!hasProp(token, 'type') || token.type === 'def')\n return { type: 'paragraph', children: [{ text: '' }] };\n\n if (token.type === 'html') {\n if (parseHtmlTagToken(token.raw)?.name === 'br') {\n return { text: '\\n' };\n }\n\n const parsed = parseTextToCustomSlateNodes(token.raw, interactionRenderers);\n if (parsed.length === 1) {\n return parsed[0];\n }\n return {\n type: 'paragraph',\n children: parsed\n };\n }\n\n let children: (Element | Text)[];\n\n if (hasProp(token, 'tokens')) {\n children = markDownToSlate(\n (token.tokens as MarkedToken[]) || [],\n interactionRenderers,\n markdownMap,\n getNode,\n htmlEnabled\n );\n } else if (hasProp(token, 'items')) {\n children = markDownToSlate(\n token.items,\n interactionRenderers,\n markdownMap,\n getNode,\n htmlEnabled\n );\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 = getCustomComponentFromMarkdownMap(token, markdownMap);\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 applyFormatting(children, token, 'italic');\n }\n case 'strong': {\n return applyFormatting(children, token, 'bold');\n }\n case 'del': {\n return applyFormatting(children, token, 'line-through');\n }\n case 'codespan': {\n return applyFormatting(children, token, 'code');\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 return {\n type: 'code-block',\n language: token.lang,\n children: [{ text: token.text }]\n };\n }\n case 'table': {\n const headerRows = token.header?.length ? [token.header] : [];\n const bodyRows = token.rows || [];\n\n const headerSlateRows = convertTableRowsToSlateNodes(\n headerRows,\n getNode,\n interactionRenderers,\n markdownMap,\n token.align,\n true,\n htmlEnabled\n );\n\n const bodySlateRows = convertTableRowsToSlateNodes(\n bodyRows,\n getNode,\n interactionRenderers,\n markdownMap,\n token.align,\n false,\n htmlEnabled\n );\n\n const tableBody: PegaCustom.TableBodyElement = {\n type: 'table-body',\n children: bodySlateRows\n };\n\n const tableChildren:\n | [PegaCustom.TableHeadElement, PegaCustom.TableBodyElement]\n | [PegaCustom.TableBodyElement] =\n headerSlateRows.length > 0\n ? [{ type: 'table-head', children: headerSlateRows }, tableBody]\n : [tableBody];\n\n return {\n type: 'table',\n children: tableChildren\n };\n }\n case 'br': {\n return { 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\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 htmlEnabled = false\n): (Element | Text)[] => {\n const lexer = new marked.Lexer({ gfm: true });\n const output = lexer.lex(md) as MarkedToken[];\n const tokens = htmlEnabled ? expandTopLevelBlockTokens(output) : output;\n return markDownToSlate(tokens, interactionRenderers, markdownMap, getNode, htmlEnabled);\n};\n\nexport default convertMarkdown;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderers.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/renderers.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAa,YAAY,EAAE,MAAM,OAAO,CAAC;AAmBpE,eAAO,MAAM,iBAAiB,GAAI,mCAAmC,kBAAkB,
|
|
1
|
+
{"version":3,"file":"renderers.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/renderers.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAa,YAAY,EAAE,MAAM,OAAO,CAAC;AAmBpE,eAAO,MAAM,iBAAiB,GAAI,mCAAmC,kBAAkB,gBAgItF,CAAC;AAEF,KAAK,IAAI,GAAG;IACV,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EACN,GAAG,CAAC,OAAO,GACX,aAAa,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,YAAY,CAAA;KAAE,CAAC,CAAC;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAGF,eAAO,MAAM,YAAY,GAAI,MAAM,IAAI,gBAsGtC,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,OAAO,eAAe,4CA6CvD,CAAC;AAEF,eAAO,MAAM,UAAU,+NAEtB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,MAAM,UAAU,CAAC,IAAI,4CA4CjD,CAAC"}
|
|
@@ -35,6 +35,9 @@ export const slateNodeRenderer = ({ children, element, attributes }) => {
|
|
|
35
35
|
...element.content,
|
|
36
36
|
...(element.bold && { bold: true }),
|
|
37
37
|
...(element.italic && { italic: true }),
|
|
38
|
+
...(element.underline && { underline: true }),
|
|
39
|
+
...(element.superscript && { superscript: true }),
|
|
40
|
+
...(element.subscript && { subscript: true }),
|
|
38
41
|
...(element['line-through'] && { 'line-through': true }),
|
|
39
42
|
...(element.code && { code: true })
|
|
40
43
|
};
|
|
@@ -45,6 +48,15 @@ export const slateNodeRenderer = ({ children, element, attributes }) => {
|
|
|
45
48
|
if (element.italic) {
|
|
46
49
|
child = _jsx("em", { children: child });
|
|
47
50
|
}
|
|
51
|
+
if (element.underline) {
|
|
52
|
+
child = _jsx("u", { children: child });
|
|
53
|
+
}
|
|
54
|
+
if (element.superscript) {
|
|
55
|
+
child = _jsx("sup", { children: child });
|
|
56
|
+
}
|
|
57
|
+
if (element.subscript) {
|
|
58
|
+
child = _jsx("sub", { children: child });
|
|
59
|
+
}
|
|
48
60
|
if (element.bold) {
|
|
49
61
|
child = _jsx("strong", { children: child });
|
|
50
62
|
}
|
|
@@ -114,6 +126,9 @@ export const nodeRenderer = (node) => {
|
|
|
114
126
|
...node.content,
|
|
115
127
|
...(node.bold && { bold: true }),
|
|
116
128
|
...(node.italic && { italic: true }),
|
|
129
|
+
...(node.underline && { underline: true }),
|
|
130
|
+
...(node.superscript && { superscript: true }),
|
|
131
|
+
...(node.subscript && { subscript: true }),
|
|
117
132
|
...(node['line-through'] && { 'line-through': true }),
|
|
118
133
|
...(node.code && { code: true })
|
|
119
134
|
};
|
|
@@ -124,6 +139,15 @@ export const nodeRenderer = (node) => {
|
|
|
124
139
|
if (node.italic) {
|
|
125
140
|
child = _jsx("em", { children: child });
|
|
126
141
|
}
|
|
142
|
+
if (node.underline) {
|
|
143
|
+
child = _jsx("u", { children: child });
|
|
144
|
+
}
|
|
145
|
+
if (node.superscript) {
|
|
146
|
+
child = _jsx("sup", { children: child });
|
|
147
|
+
}
|
|
148
|
+
if (node.subscript) {
|
|
149
|
+
child = _jsx("sub", { children: child });
|
|
150
|
+
}
|
|
127
151
|
if (node.bold) {
|
|
128
152
|
child = _jsx("strong", { children: child });
|
|
129
153
|
}
|
|
@@ -182,6 +206,15 @@ export const slateLeafRenderer = (props) => {
|
|
|
182
206
|
if (props.leaf.italic) {
|
|
183
207
|
child = _jsx("em", { children: child });
|
|
184
208
|
}
|
|
209
|
+
if (props.leaf.underline) {
|
|
210
|
+
child = _jsx("u", { children: child });
|
|
211
|
+
}
|
|
212
|
+
if (props.leaf.superscript) {
|
|
213
|
+
child = _jsx("sup", { children: child });
|
|
214
|
+
}
|
|
215
|
+
if (props.leaf.subscript) {
|
|
216
|
+
child = _jsx("sub", { children: child });
|
|
217
|
+
}
|
|
185
218
|
if (props.leaf.bold) {
|
|
186
219
|
child = _jsx("strong", { children: child });
|
|
187
220
|
}
|
|
@@ -208,6 +241,15 @@ export const leafRenderer = (leaf) => {
|
|
|
208
241
|
if (leaf.italic) {
|
|
209
242
|
child = _jsx("em", { children: child });
|
|
210
243
|
}
|
|
244
|
+
if (leaf.underline) {
|
|
245
|
+
child = _jsx("u", { children: child });
|
|
246
|
+
}
|
|
247
|
+
if (leaf.superscript) {
|
|
248
|
+
child = _jsx("sup", { children: child });
|
|
249
|
+
}
|
|
250
|
+
if (leaf.subscript) {
|
|
251
|
+
child = _jsx("sub", { children: child });
|
|
252
|
+
}
|
|
211
253
|
if (leaf.bold) {
|
|
212
254
|
child = _jsx("strong", { children: child });
|
|
213
255
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/renderers.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { RenderElementProps, RenderLeafProps } from 'slate-react';\nimport type { PegaCustom } from 'slate';\nimport type { ComponentType, ReactNode, ReactElement } from 'react';\nimport styled from 'styled-components';\n\nimport { Text, Link, Image } from '@pega/cosmos-react-core';\n\nimport BlockQuote from '../DecoratorComponents/BlockQuote';\nimport CodeBlock from '../DecoratorComponents/CodeBlock';\nimport Code from '../DecoratorComponents/Code';\nimport HorizontalRule from '../DecoratorComponents/HorizontalRule';\nimport {\n Table,\n TableHead,\n TableRow,\n TableCell,\n TableHeaderCell,\n TableBody\n} from '../DecoratorComponents/Table';\n\n// Renderer for block level elements\nexport const slateNodeRenderer = ({ children, element, attributes }: RenderElementProps) => {\n switch (element.type) {\n case 'heading-1':\n return (\n <Text variant='h1' {...attributes}>\n {children}\n </Text>\n );\n case 'heading-2':\n return (\n <Text variant='h2' {...attributes}>\n {children}\n </Text>\n );\n case 'heading-3':\n return (\n <Text variant='h3' {...attributes}>\n {children}\n </Text>\n );\n case 'heading-4':\n return (\n <Text variant='h4' {...attributes}>\n {children}\n </Text>\n );\n case 'ordered-list':\n return <ol {...attributes}>{children}</ol>;\n case 'unordered-list':\n return <ul {...attributes}>{children}</ul>;\n case 'list-item':\n return (\n <li\n {...attributes}\n data-order={element.order}\n data-level={element.level}\n data-id={element.id}\n data-parent-id={element.parentId}\n >\n {children}\n </li>\n );\n case 'block-quote':\n return <BlockQuote {...attributes}>{children}</BlockQuote>;\n case 'code-block':\n return (\n <CodeBlock {...attributes} language={element.language}>\n {children}\n </CodeBlock>\n );\n case 'horizontal-rule':\n return <HorizontalRule />;\n case 'custom': {\n const CustomComponent = element.component;\n const contentWithFormatting = {\n ...element.content,\n ...(element.bold && { bold: true }),\n ...(element.italic && { italic: true }),\n ...(element['line-through'] && { 'line-through': true }),\n ...(element.code && { code: true })\n };\n let child = <CustomComponent {...attributes}>{contentWithFormatting}</CustomComponent>;\n if (element.href) {\n child = <Link href={element.href}>{child}</Link>;\n }\n if (element.italic) {\n child = <em>{child}</em>;\n }\n if (element.bold) {\n child = <strong>{child}</strong>;\n }\n if (element['line-through']) {\n child = <del>{child}</del>;\n }\n if (element.code) {\n child = <Code>{child}</Code>;\n }\n return child;\n }\n case 'override': {\n return element.component;\n }\n case 'table':\n return <Table {...attributes}>{children}</Table>;\n case 'table-head':\n return <TableHead {...attributes}>{children}</TableHead>;\n case 'table-body':\n return <TableBody {...attributes}>{children}</TableBody>;\n case 'table-row':\n return <TableRow {...attributes}>{children}</TableRow>;\n case 'table-cell': {\n const cellProps = element.align ? { ...attributes, align: element.align } : attributes;\n if (element.isHeaderCell) {\n return <TableHeaderCell {...cellProps}>{children}</TableHeaderCell>;\n }\n return <TableCell {...cellProps}>{children}</TableCell>;\n }\n case 'paragraph':\n return (\n <div>\n <Text {...attributes}>{children}</Text>\n </div>\n );\n case 'image':\n return (\n <div {...attributes}>\n <Image src={element.src} alt={element.alt ?? ''} />\n {children}\n </div>\n );\n case 'image-placeholder':\n return <div {...attributes}>{children}</div>;\n default: {\n return <span {...attributes}>{children}</span>;\n }\n }\n};\n\ntype Node = {\n children: JSX.Element[];\n type: string;\n align?: 'left' | 'center' | 'right';\n href?: string;\n italic?: boolean;\n start?: number;\n bold?: boolean;\n 'line-through'?: boolean;\n code?: boolean;\n isHeaderCell?: boolean;\n component?:\n | JSX.Element\n | ComponentType<{ children: Record<string, string | boolean> | ReactElement }>;\n src?: string;\n alt?: string;\n content?: Record<string, string>;\n};\n\n// Renderer for block level elements\nexport const nodeRenderer = (node: Node) => {\n switch (node.type) {\n case 'heading-1':\n return <Text variant='h1'>{node.children}</Text>;\n case 'heading-2':\n return <Text variant='h2'>{node.children}</Text>;\n case 'heading-3':\n return <Text variant='h3'>{node.children}</Text>;\n case 'heading-4':\n return <Text variant='h4'>{node.children}</Text>;\n case 'ordered-list':\n return <ol start={node.start}>{node.children}</ol>;\n case 'unordered-list':\n return <ul>{node.children}</ul>;\n case 'list-item':\n return <li>{node.children}</li>;\n case 'block-quote':\n return <BlockQuote>{node.children}</BlockQuote>;\n case 'code-block':\n return <CodeBlock>{node.children}</CodeBlock>;\n case 'horizontal-rule':\n return <HorizontalRule />;\n case 'custom': {\n const CustomComponent = node.component as ComponentType<{\n children?: Record<string, string | boolean> | ReactElement;\n }>;\n const contentWithFormatting = {\n ...node.content,\n ...(node.bold && { bold: true }),\n ...(node.italic && { italic: true }),\n ...(node['line-through'] && { 'line-through': true }),\n ...(node.code && { code: true })\n };\n let child = <CustomComponent>{contentWithFormatting}</CustomComponent>;\n if (node.href) {\n child = <Link href={node.href}>{child}</Link>;\n }\n if (node.italic) {\n child = <em>{child}</em>;\n }\n if (node.bold) {\n child = <strong>{child}</strong>;\n }\n if (node['line-through']) {\n child = <del>{child}</del>;\n }\n if (node.code) {\n child = <Code>{child}</Code>;\n }\n return child;\n }\n case 'override': {\n return node.component as JSX.Element;\n }\n case 'table':\n return <Table>{node.children}</Table>;\n case 'table-head':\n return <TableHead>{node.children}</TableHead>;\n case 'table-body':\n return <TableBody>{node.children}</TableBody>;\n case 'table-row':\n return <TableRow>{node.children}</TableRow>;\n case 'table-cell': {\n const cellProps = node.align ? { align: node.align } : undefined;\n if (node.isHeaderCell) {\n return <TableHeaderCell {...cellProps}>{node.children}</TableHeaderCell>;\n }\n return <TableCell {...cellProps}>{node.children}</TableCell>;\n }\n case 'paragraph':\n return (\n <div>\n <Text>{node.children}</Text>\n </div>\n );\n case 'image':\n return (\n <div>\n <Image src={node.src} alt={node.alt ?? ''} />\n {node.children}\n </div>\n );\n case 'image-placeholder':\n return <div>{node.children}</div>;\n case 'space':\n return <br />;\n default: {\n return <>{node.children}</>;\n }\n }\n};\n\n// Renderer for inline elements\nexport const slateLeafRenderer = (props: RenderLeafProps) => {\n let child = props.children;\n\n if (props.leaf.searchResult) {\n const CustomComponent = props.leaf.searchResult.component;\n return (\n <span {...props.attributes}>\n <CustomComponent {...props.leaf.searchResult.props}>{child}</CustomComponent>\n </span>\n );\n }\n\n if (props.leaf.code) {\n child = <Code>{child}</Code>;\n }\n\n if (props.leaf['line-through']) {\n child = <del>{child}</del>;\n }\n\n if (props.leaf.italic) {\n child = <em>{child}</em>;\n }\n\n if (props.leaf.bold) {\n child = <strong>{child}</strong>;\n }\n\n if (props.leaf.href) {\n child = <Link href={props.leaf.href}>{child}</Link>;\n }\n\n return <span {...props.attributes}>{child}</span>;\n};\n\nexport const StyledSpan = styled.span`\n white-space: pre-line;\n`;\n\nexport const leafRenderer = (leaf: PegaCustom.Text) => {\n let child: string | ReactNode = leaf.text;\n if (leaf.searchResult) {\n const CustomComponent = leaf.searchResult.component;\n return (\n <span>\n <CustomComponent {...leaf.searchResult.props}>{child}</CustomComponent>\n </span>\n );\n }\n\n if (leaf.code) {\n child = <Code>{child}</Code>;\n }\n\n if (leaf['line-through']) {\n child = <del>{child}</del>;\n }\n\n if (leaf.italic) {\n child = <em>{child}</em>;\n }\n\n if (leaf.bold) {\n child = <strong>{child}</strong>;\n }\n\n if (leaf.href) {\n child = <Link href={leaf.href}>{child}</Link>;\n }\n\n return <StyledSpan>{child}</StyledSpan>;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/renderers.tsx"],"names":[],"mappings":";AAGA,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,UAAU,MAAM,mCAAmC,CAAC;AAC3D,OAAO,SAAS,MAAM,kCAAkC,CAAC;AACzD,OAAO,IAAI,MAAM,6BAA6B,CAAC;AAC/C,OAAO,cAAc,MAAM,uCAAuC,CAAC;AACnE,OAAO,EACL,KAAK,EACL,SAAS,EACT,QAAQ,EACR,SAAS,EACT,eAAe,EACf,SAAS,EACV,MAAM,8BAA8B,CAAC;AAEtC,oCAAoC;AACpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAsB,EAAE,EAAE;IACzF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,CACL,KAAC,IAAI,IAAC,OAAO,EAAC,IAAI,KAAK,UAAU,YAC9B,QAAQ,GACJ,CACR,CAAC;QACJ,KAAK,WAAW;YACd,OAAO,CACL,KAAC,IAAI,IAAC,OAAO,EAAC,IAAI,KAAK,UAAU,YAC9B,QAAQ,GACJ,CACR,CAAC;QACJ,KAAK,WAAW;YACd,OAAO,CACL,KAAC,IAAI,IAAC,OAAO,EAAC,IAAI,KAAK,UAAU,YAC9B,QAAQ,GACJ,CACR,CAAC;QACJ,KAAK,WAAW;YACd,OAAO,CACL,KAAC,IAAI,IAAC,OAAO,EAAC,IAAI,KAAK,UAAU,YAC9B,QAAQ,GACJ,CACR,CAAC;QACJ,KAAK,cAAc;YACjB,OAAO,gBAAQ,UAAU,YAAG,QAAQ,GAAM,CAAC;QAC7C,KAAK,gBAAgB;YACnB,OAAO,gBAAQ,UAAU,YAAG,QAAQ,GAAM,CAAC;QAC7C,KAAK,WAAW;YACd,OAAO,CACL,gBACM,UAAU,gBACF,OAAO,CAAC,KAAK,gBACb,OAAO,CAAC,KAAK,aAChB,OAAO,CAAC,EAAE,oBACH,OAAO,CAAC,QAAQ,YAE/B,QAAQ,GACN,CACN,CAAC;QACJ,KAAK,aAAa;YAChB,OAAO,KAAC,UAAU,OAAK,UAAU,YAAG,QAAQ,GAAc,CAAC;QAC7D,KAAK,YAAY;YACf,OAAO,CACL,KAAC,SAAS,OAAK,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,YAClD,QAAQ,GACC,CACb,CAAC;QACJ,KAAK,iBAAiB;YACpB,OAAO,KAAC,cAAc,KAAG,CAAC;QAC5B,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;YAC1C,MAAM,qBAAqB,GAAG;gBAC5B,GAAG,OAAO,CAAC,OAAO;gBAClB,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACnC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACvC,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC7C,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBACjD,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC7C,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;gBACxD,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aACpC,CAAC;YACF,IAAI,KAAK,GAAG,KAAC,eAAe,OAAK,UAAU,YAAG,qBAAqB,GAAmB,CAAC;YACvF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,GAAG,KAAC,IAAI,IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,YAAG,KAAK,GAAQ,CAAC;YACnD,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,KAAK,GAAG,uBAAK,KAAK,GAAM,CAAC;YAC3B,CAAC;YACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,KAAK,GAAG,sBAAI,KAAK,GAAK,CAAC;YACzB,CAAC;YACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;YAC7B,CAAC;YACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;YAC7B,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,GAAG,2BAAS,KAAK,GAAU,CAAC;YACnC,CAAC;YACD,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC5B,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;YAC7B,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,GAAG,KAAC,IAAI,cAAE,KAAK,GAAQ,CAAC;YAC/B,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,OAAO,OAAO,CAAC,SAAS,CAAC;QAC3B,CAAC;QACD,KAAK,OAAO;YACV,OAAO,KAAC,KAAK,OAAK,UAAU,YAAG,QAAQ,GAAS,CAAC;QACnD,KAAK,YAAY;YACf,OAAO,KAAC,SAAS,OAAK,UAAU,YAAG,QAAQ,GAAa,CAAC;QAC3D,KAAK,YAAY;YACf,OAAO,KAAC,SAAS,OAAK,UAAU,YAAG,QAAQ,GAAa,CAAC;QAC3D,KAAK,WAAW;YACd,OAAO,KAAC,QAAQ,OAAK,UAAU,YAAG,QAAQ,GAAY,CAAC;QACzD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;YACvF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,OAAO,KAAC,eAAe,OAAK,SAAS,YAAG,QAAQ,GAAmB,CAAC;YACtE,CAAC;YACD,OAAO,KAAC,SAAS,OAAK,SAAS,YAAG,QAAQ,GAAa,CAAC;QAC1D,CAAC;QACD,KAAK,WAAW;YACd,OAAO,CACL,wBACE,KAAC,IAAI,OAAK,UAAU,YAAG,QAAQ,GAAQ,GACnC,CACP,CAAC;QACJ,KAAK,OAAO;YACV,OAAO,CACL,kBAAS,UAAU,aACjB,KAAC,KAAK,IAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,GAAI,EAClD,QAAQ,IACL,CACP,CAAC;QACJ,KAAK,mBAAmB;YACtB,OAAO,iBAAS,UAAU,YAAG,QAAQ,GAAO,CAAC;QAC/C,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,kBAAU,UAAU,YAAG,QAAQ,GAAQ,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAwBF,oCAAoC;AACpC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAU,EAAE,EAAE;IACzC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,WAAW;YACd,OAAO,KAAC,IAAI,IAAC,OAAO,EAAC,IAAI,YAAE,IAAI,CAAC,QAAQ,GAAQ,CAAC;QACnD,KAAK,WAAW;YACd,OAAO,KAAC,IAAI,IAAC,OAAO,EAAC,IAAI,YAAE,IAAI,CAAC,QAAQ,GAAQ,CAAC;QACnD,KAAK,WAAW;YACd,OAAO,KAAC,IAAI,IAAC,OAAO,EAAC,IAAI,YAAE,IAAI,CAAC,QAAQ,GAAQ,CAAC;QACnD,KAAK,WAAW;YACd,OAAO,KAAC,IAAI,IAAC,OAAO,EAAC,IAAI,YAAE,IAAI,CAAC,QAAQ,GAAQ,CAAC;QACnD,KAAK,cAAc;YACjB,OAAO,aAAI,KAAK,EAAE,IAAI,CAAC,KAAK,YAAG,IAAI,CAAC,QAAQ,GAAM,CAAC;QACrD,KAAK,gBAAgB;YACnB,OAAO,uBAAK,IAAI,CAAC,QAAQ,GAAM,CAAC;QAClC,KAAK,WAAW;YACd,OAAO,uBAAK,IAAI,CAAC,QAAQ,GAAM,CAAC;QAClC,KAAK,aAAa;YAChB,OAAO,KAAC,UAAU,cAAE,IAAI,CAAC,QAAQ,GAAc,CAAC;QAClD,KAAK,YAAY;YACf,OAAO,KAAC,SAAS,cAAE,IAAI,CAAC,QAAQ,GAAa,CAAC;QAChD,KAAK,iBAAiB;YACpB,OAAO,KAAC,cAAc,KAAG,CAAC;QAC5B,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,eAAe,GAAG,IAAI,CAAC,SAE3B,CAAC;YACH,MAAM,qBAAqB,GAAG;gBAC5B,GAAG,IAAI,CAAC,OAAO;gBACf,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAChC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACpC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC1C,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBAC9C,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;gBAC1C,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;gBACrD,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aACjC,CAAC;YACF,IAAI,KAAK,GAAG,KAAC,eAAe,cAAE,qBAAqB,GAAmB,CAAC;YACvE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,KAAK,GAAG,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,YAAG,KAAK,GAAQ,CAAC;YAChD,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,KAAK,GAAG,uBAAK,KAAK,GAAM,CAAC;YAC3B,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,KAAK,GAAG,sBAAI,KAAK,GAAK,CAAC;YACzB,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;YAC7B,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;YAC7B,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,KAAK,GAAG,2BAAS,KAAK,GAAU,CAAC;YACnC,CAAC;YACD,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBACzB,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;YAC7B,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,KAAK,GAAG,KAAC,IAAI,cAAE,KAAK,GAAQ,CAAC;YAC/B,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,OAAO,IAAI,CAAC,SAAwB,CAAC;QACvC,CAAC;QACD,KAAK,OAAO;YACV,OAAO,KAAC,KAAK,cAAE,IAAI,CAAC,QAAQ,GAAS,CAAC;QACxC,KAAK,YAAY;YACf,OAAO,KAAC,SAAS,cAAE,IAAI,CAAC,QAAQ,GAAa,CAAC;QAChD,KAAK,YAAY;YACf,OAAO,KAAC,SAAS,cAAE,IAAI,CAAC,QAAQ,GAAa,CAAC;QAChD,KAAK,WAAW;YACd,OAAO,KAAC,QAAQ,cAAE,IAAI,CAAC,QAAQ,GAAY,CAAC;QAC9C,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACjE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,OAAO,KAAC,eAAe,OAAK,SAAS,YAAG,IAAI,CAAC,QAAQ,GAAmB,CAAC;YAC3E,CAAC;YACD,OAAO,KAAC,SAAS,OAAK,SAAS,YAAG,IAAI,CAAC,QAAQ,GAAa,CAAC;QAC/D,CAAC;QACD,KAAK,WAAW;YACd,OAAO,CACL,wBACE,KAAC,IAAI,cAAE,IAAI,CAAC,QAAQ,GAAQ,GACxB,CACP,CAAC;QACJ,KAAK,OAAO;YACV,OAAO,CACL,0BACE,KAAC,KAAK,IAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,GAAI,EAC5C,IAAI,CAAC,QAAQ,IACV,CACP,CAAC;QACJ,KAAK,mBAAmB;YACtB,OAAO,wBAAM,IAAI,CAAC,QAAQ,GAAO,CAAC;QACpC,KAAK,OAAO;YACV,OAAO,cAAM,CAAC;QAChB,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,4BAAG,IAAI,CAAC,QAAQ,GAAI,CAAC;QAC9B,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,+BAA+B;AAC/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAsB,EAAE,EAAE;IAC1D,IAAI,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;IAE3B,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QAC1D,OAAO,CACL,kBAAU,KAAK,CAAC,UAAU,YACxB,KAAC,eAAe,OAAK,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,YAAG,KAAK,GAAmB,GACxE,CACR,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,GAAG,KAAC,IAAI,cAAE,KAAK,GAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,GAAG,uBAAK,KAAK,GAAM,CAAC;IAC3B,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,KAAK,GAAG,sBAAI,KAAK,GAAK,CAAC;IACzB,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3B,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,GAAG,2BAAS,KAAK,GAAU,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,GAAG,KAAC,IAAI,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,YAAG,KAAK,GAAQ,CAAC;IACtD,CAAC;IAED,OAAO,kBAAU,KAAK,CAAC,UAAU,YAAG,KAAK,GAAQ,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAA;;CAEpC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAqB,EAAE,EAAE;IACpD,IAAI,KAAK,GAAuB,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;QACpD,OAAO,CACL,yBACE,KAAC,eAAe,OAAK,IAAI,CAAC,YAAY,CAAC,KAAK,YAAG,KAAK,GAAmB,GAClE,CACR,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,GAAG,KAAC,IAAI,cAAE,KAAK,GAAQ,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACzB,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,GAAG,uBAAK,KAAK,GAAM,CAAC;IAC3B,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,GAAG,sBAAI,KAAK,GAAK,CAAC;IACzB,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,GAAG,wBAAM,KAAK,GAAO,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,GAAG,2BAAS,KAAK,GAAU,CAAC;IACnC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,GAAG,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,YAAG,KAAK,GAAQ,CAAC;IAChD,CAAC;IAED,OAAO,KAAC,UAAU,cAAE,KAAK,GAAc,CAAC;AAC1C,CAAC,CAAC","sourcesContent":["import type { RenderElementProps, RenderLeafProps } from 'slate-react';\nimport type { PegaCustom } from 'slate';\nimport type { ComponentType, ReactNode, ReactElement } from 'react';\nimport styled from 'styled-components';\n\nimport { Text, Link, Image } from '@pega/cosmos-react-core';\n\nimport BlockQuote from '../DecoratorComponents/BlockQuote';\nimport CodeBlock from '../DecoratorComponents/CodeBlock';\nimport Code from '../DecoratorComponents/Code';\nimport HorizontalRule from '../DecoratorComponents/HorizontalRule';\nimport {\n Table,\n TableHead,\n TableRow,\n TableCell,\n TableHeaderCell,\n TableBody\n} from '../DecoratorComponents/Table';\n\n// Renderer for block level elements\nexport const slateNodeRenderer = ({ children, element, attributes }: RenderElementProps) => {\n switch (element.type) {\n case 'heading-1':\n return (\n <Text variant='h1' {...attributes}>\n {children}\n </Text>\n );\n case 'heading-2':\n return (\n <Text variant='h2' {...attributes}>\n {children}\n </Text>\n );\n case 'heading-3':\n return (\n <Text variant='h3' {...attributes}>\n {children}\n </Text>\n );\n case 'heading-4':\n return (\n <Text variant='h4' {...attributes}>\n {children}\n </Text>\n );\n case 'ordered-list':\n return <ol {...attributes}>{children}</ol>;\n case 'unordered-list':\n return <ul {...attributes}>{children}</ul>;\n case 'list-item':\n return (\n <li\n {...attributes}\n data-order={element.order}\n data-level={element.level}\n data-id={element.id}\n data-parent-id={element.parentId}\n >\n {children}\n </li>\n );\n case 'block-quote':\n return <BlockQuote {...attributes}>{children}</BlockQuote>;\n case 'code-block':\n return (\n <CodeBlock {...attributes} language={element.language}>\n {children}\n </CodeBlock>\n );\n case 'horizontal-rule':\n return <HorizontalRule />;\n case 'custom': {\n const CustomComponent = element.component;\n const contentWithFormatting = {\n ...element.content,\n ...(element.bold && { bold: true }),\n ...(element.italic && { italic: true }),\n ...(element.underline && { underline: true }),\n ...(element.superscript && { superscript: true }),\n ...(element.subscript && { subscript: true }),\n ...(element['line-through'] && { 'line-through': true }),\n ...(element.code && { code: true })\n };\n let child = <CustomComponent {...attributes}>{contentWithFormatting}</CustomComponent>;\n if (element.href) {\n child = <Link href={element.href}>{child}</Link>;\n }\n if (element.italic) {\n child = <em>{child}</em>;\n }\n if (element.underline) {\n child = <u>{child}</u>;\n }\n if (element.superscript) {\n child = <sup>{child}</sup>;\n }\n if (element.subscript) {\n child = <sub>{child}</sub>;\n }\n if (element.bold) {\n child = <strong>{child}</strong>;\n }\n if (element['line-through']) {\n child = <del>{child}</del>;\n }\n if (element.code) {\n child = <Code>{child}</Code>;\n }\n return child;\n }\n case 'override': {\n return element.component;\n }\n case 'table':\n return <Table {...attributes}>{children}</Table>;\n case 'table-head':\n return <TableHead {...attributes}>{children}</TableHead>;\n case 'table-body':\n return <TableBody {...attributes}>{children}</TableBody>;\n case 'table-row':\n return <TableRow {...attributes}>{children}</TableRow>;\n case 'table-cell': {\n const cellProps = element.align ? { ...attributes, align: element.align } : attributes;\n if (element.isHeaderCell) {\n return <TableHeaderCell {...cellProps}>{children}</TableHeaderCell>;\n }\n return <TableCell {...cellProps}>{children}</TableCell>;\n }\n case 'paragraph':\n return (\n <div>\n <Text {...attributes}>{children}</Text>\n </div>\n );\n case 'image':\n return (\n <div {...attributes}>\n <Image src={element.src} alt={element.alt ?? ''} />\n {children}\n </div>\n );\n case 'image-placeholder':\n return <div {...attributes}>{children}</div>;\n default: {\n return <span {...attributes}>{children}</span>;\n }\n }\n};\n\ntype Node = {\n children: JSX.Element[];\n type: string;\n align?: 'left' | 'center' | 'right';\n href?: string;\n italic?: boolean;\n start?: number;\n bold?: boolean;\n underline?: boolean;\n superscript?: boolean;\n subscript?: boolean;\n 'line-through'?: boolean;\n code?: boolean;\n isHeaderCell?: boolean;\n component?:\n | JSX.Element\n | ComponentType<{ children: Record<string, string | boolean> | ReactElement }>;\n src?: string;\n alt?: string;\n content?: Record<string, string>;\n};\n\n// Renderer for block level elements\nexport const nodeRenderer = (node: Node) => {\n switch (node.type) {\n case 'heading-1':\n return <Text variant='h1'>{node.children}</Text>;\n case 'heading-2':\n return <Text variant='h2'>{node.children}</Text>;\n case 'heading-3':\n return <Text variant='h3'>{node.children}</Text>;\n case 'heading-4':\n return <Text variant='h4'>{node.children}</Text>;\n case 'ordered-list':\n return <ol start={node.start}>{node.children}</ol>;\n case 'unordered-list':\n return <ul>{node.children}</ul>;\n case 'list-item':\n return <li>{node.children}</li>;\n case 'block-quote':\n return <BlockQuote>{node.children}</BlockQuote>;\n case 'code-block':\n return <CodeBlock>{node.children}</CodeBlock>;\n case 'horizontal-rule':\n return <HorizontalRule />;\n case 'custom': {\n const CustomComponent = node.component as ComponentType<{\n children?: Record<string, string | boolean> | ReactElement;\n }>;\n const contentWithFormatting = {\n ...node.content,\n ...(node.bold && { bold: true }),\n ...(node.italic && { italic: true }),\n ...(node.underline && { underline: true }),\n ...(node.superscript && { superscript: true }),\n ...(node.subscript && { subscript: true }),\n ...(node['line-through'] && { 'line-through': true }),\n ...(node.code && { code: true })\n };\n let child = <CustomComponent>{contentWithFormatting}</CustomComponent>;\n if (node.href) {\n child = <Link href={node.href}>{child}</Link>;\n }\n if (node.italic) {\n child = <em>{child}</em>;\n }\n if (node.underline) {\n child = <u>{child}</u>;\n }\n if (node.superscript) {\n child = <sup>{child}</sup>;\n }\n if (node.subscript) {\n child = <sub>{child}</sub>;\n }\n if (node.bold) {\n child = <strong>{child}</strong>;\n }\n if (node['line-through']) {\n child = <del>{child}</del>;\n }\n if (node.code) {\n child = <Code>{child}</Code>;\n }\n return child;\n }\n case 'override': {\n return node.component as JSX.Element;\n }\n case 'table':\n return <Table>{node.children}</Table>;\n case 'table-head':\n return <TableHead>{node.children}</TableHead>;\n case 'table-body':\n return <TableBody>{node.children}</TableBody>;\n case 'table-row':\n return <TableRow>{node.children}</TableRow>;\n case 'table-cell': {\n const cellProps = node.align ? { align: node.align } : undefined;\n if (node.isHeaderCell) {\n return <TableHeaderCell {...cellProps}>{node.children}</TableHeaderCell>;\n }\n return <TableCell {...cellProps}>{node.children}</TableCell>;\n }\n case 'paragraph':\n return (\n <div>\n <Text>{node.children}</Text>\n </div>\n );\n case 'image':\n return (\n <div>\n <Image src={node.src} alt={node.alt ?? ''} />\n {node.children}\n </div>\n );\n case 'image-placeholder':\n return <div>{node.children}</div>;\n case 'space':\n return <br />;\n default: {\n return <>{node.children}</>;\n }\n }\n};\n\n// Renderer for inline elements\nexport const slateLeafRenderer = (props: RenderLeafProps) => {\n let child = props.children;\n\n if (props.leaf.searchResult) {\n const CustomComponent = props.leaf.searchResult.component;\n return (\n <span {...props.attributes}>\n <CustomComponent {...props.leaf.searchResult.props}>{child}</CustomComponent>\n </span>\n );\n }\n\n if (props.leaf.code) {\n child = <Code>{child}</Code>;\n }\n\n if (props.leaf['line-through']) {\n child = <del>{child}</del>;\n }\n\n if (props.leaf.italic) {\n child = <em>{child}</em>;\n }\n\n if (props.leaf.underline) {\n child = <u>{child}</u>;\n }\n\n if (props.leaf.superscript) {\n child = <sup>{child}</sup>;\n }\n\n if (props.leaf.subscript) {\n child = <sub>{child}</sub>;\n }\n\n if (props.leaf.bold) {\n child = <strong>{child}</strong>;\n }\n\n if (props.leaf.href) {\n child = <Link href={props.leaf.href}>{child}</Link>;\n }\n\n return <span {...props.attributes}>{child}</span>;\n};\n\nexport const StyledSpan = styled.span`\n white-space: pre-line;\n`;\n\nexport const leafRenderer = (leaf: PegaCustom.Text) => {\n let child: string | ReactNode = leaf.text;\n if (leaf.searchResult) {\n const CustomComponent = leaf.searchResult.component;\n return (\n <span>\n <CustomComponent {...leaf.searchResult.props}>{child}</CustomComponent>\n </span>\n );\n }\n\n if (leaf.code) {\n child = <Code>{child}</Code>;\n }\n\n if (leaf['line-through']) {\n child = <del>{child}</del>;\n }\n\n if (leaf.italic) {\n child = <em>{child}</em>;\n }\n\n if (leaf.underline) {\n child = <u>{child}</u>;\n }\n\n if (leaf.superscript) {\n child = <sup>{child}</sup>;\n }\n\n if (leaf.subscript) {\n child = <sub>{child}</sub>;\n }\n\n if (leaf.bold) {\n child = <strong>{child}</strong>;\n }\n\n if (leaf.href) {\n child = <Link href={leaf.href}>{child}</Link>;\n }\n\n return <StyledSpan>{child}</StyledSpan>;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pega/cosmos-react-rte",
|
|
3
|
-
"version": "10.0.0-build.4.
|
|
3
|
+
"version": "10.0.0-build.4.9",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"author": "Pegasystems",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@intevation/tiptap-extension-office-paste": "^0.1.2",
|
|
18
|
-
"@pega/cosmos-react-core": "10.0.0-build.4.
|
|
18
|
+
"@pega/cosmos-react-core": "10.0.0-build.4.9",
|
|
19
19
|
"@popperjs/core": "^2.11.6",
|
|
20
20
|
"@tiptap/core": "^3.12.1",
|
|
21
21
|
"@tiptap/extension-blockquote": "^3.12.1",
|