Skip to content

Commit 8511ce3

Browse files
chore(deps): Replace showdown dependency with marked (#366)
1 parent 7bd0eec commit 8511ce3

File tree

4 files changed

+42
-33
lines changed

4 files changed

+42
-33
lines changed

packages/dev/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"react-dom": "^18.2.0",
2121
"react-i18next": "^11.7.3",
2222
"react-router-dom": "^6.11.2",
23-
"showdown": "2.1.0",
23+
"marked": "^15.0.6",
2424
"lodash-es": "^4.17.21"
2525
},
2626
"devDependencies": {

packages/module/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"@patternfly/react-core": "^6.0.0",
4949
"react": ">=18.0.0",
5050
"react-dom": ">=18.0.0",
51-
"showdown": ">=2.1.0"
51+
"marked": "^15.0.6"
5252
},
5353
"dependencies": {
5454
"dompurify": "^3.1.3",

packages/module/src/ConsoleInternal/components/markdown-view.tsx

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as React from 'react';
22
import { css } from '@patternfly/react-styles';
3-
import { Converter } from 'showdown';
3+
import { marked } from 'marked';
44
import { useForceRender } from '@console/shared';
55
import { QuickStartContext, QuickStartContextValues } from '../../utils/quick-start-context';
66

@@ -15,18 +15,7 @@ interface ShowdownExtension {
1515
replace?: (...args: any[]) => string;
1616
}
1717

18-
export const markdownConvert = (markdown, extensions?: ShowdownExtension[]) => {
19-
const converter = new Converter({
20-
tables: true,
21-
openLinksInNewWindow: true,
22-
strikethrough: true,
23-
emoji: false,
24-
});
25-
26-
if (extensions) {
27-
converter.addExtension(extensions);
28-
}
29-
18+
export const markdownConvert = async (markdown: string, extensions?: ShowdownExtension[]) => {
3019
DOMPurify.addHook('beforeSanitizeElements', function (node) {
3120
// nodeType 1 = element type
3221

@@ -82,12 +71,26 @@ export const markdownConvert = (markdown, extensions?: ShowdownExtension[]) => {
8271
}
8372
});
8473

85-
return DOMPurify.sanitize(converter.makeHtml(markdown), {
86-
USE_PROFILES: {
87-
html: true,
88-
svg: true,
89-
},
90-
});
74+
// Replace code fences with non markdown formatting relates tokens so that marked doesn't try to parse them as code spans
75+
const markdownWithSubstitutedCodeFences = markdown.replace(/```/g, '@@@');
76+
const parsedMarkdown = await marked.parse(markdownWithSubstitutedCodeFences);
77+
// Swap the temporary tokens back to code fences before we run the extensions
78+
let md = parsedMarkdown.replace(/@@@/g, '```');
79+
80+
if (extensions) {
81+
// Convert code spans back to md format before we run the custom extension regexes
82+
md = md.replace(/<code>(.*)<\/code>/g, '`$1`');
83+
84+
extensions.forEach(({ regex, replace }) => {
85+
if (regex) {
86+
md = md.replace(regex, replace);
87+
}
88+
});
89+
90+
// Convert any remaining backticks back into code spans
91+
md = md.replace(/`(.*)`/g, '<code>$1</code>');
92+
}
93+
return DOMPurify.sanitize(md);
9194
};
9295

9396
interface SyncMarkdownProps {
@@ -116,10 +119,18 @@ export const SyncMarkdownView: React.FC<SyncMarkdownProps> = ({
116119
className,
117120
}) => {
118121
const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
119-
const markup = React.useMemo(
120-
() => markdownConvert(content || emptyMsg || getResource('Not available'), extensions),
121-
[content, emptyMsg, extensions, getResource],
122-
);
122+
const [markup, setMarkup] = React.useState<string>('');
123+
124+
React.useEffect(() => {
125+
async function getMd() {
126+
const md = await markdownConvert(
127+
content || emptyMsg || getResource('Not available'),
128+
extensions,
129+
);
130+
setMarkup(md);
131+
}
132+
getMd();
133+
}, [content, emptyMsg, getResource, extensions]);
123134
const innerProps: InnerSyncMarkdownProps = {
124135
renderExtension: extensions?.length > 0 ? renderExtension : undefined,
125136
exactHeight,

yarn.lock

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4494,7 +4494,7 @@ commander@^8.3.0:
44944494
resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
44954495
integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
44964496

4497-
commander@^9.0.0, commander@^9.4.1:
4497+
commander@^9.4.1:
44984498
version "9.5.0"
44994499
resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30"
45004500
integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
@@ -10360,6 +10360,11 @@ markdown-table@^2.0.0:
1036010360
dependencies:
1036110361
repeat-string "^1.0.0"
1036210362

10363+
marked@^15.0.6:
10364+
version "15.0.6"
10365+
resolved "https://registry.yarnpkg.com/marked/-/marked-15.0.6.tgz#8165f16afb6f4b30a35bdcee657c3b8415820a8f"
10366+
integrity sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==
10367+
1036310368
marked@^4.0.16:
1036410369
version "4.3.0"
1036510370
resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
@@ -13581,13 +13586,6 @@ shortid@^2.2.8:
1358113586
dependencies:
1358213587
nanoid "^2.1.0"
1358313588

13584-
13585-
version "2.1.0"
13586-
resolved "https://registry.yarnpkg.com/showdown/-/showdown-2.1.0.tgz#1251f5ed8f773f0c0c7bfc8e6fd23581f9e545c5"
13587-
integrity sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==
13588-
dependencies:
13589-
commander "^9.0.0"
13590-
1359113589
side-channel@^1.0.4:
1359213590
version "1.0.4"
1359313591
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"

0 commit comments

Comments
 (0)