From 8e1661af78a4e62b83c94122a51ad46050493715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kent=20Mossb=C3=A4ck?= Date: Mon, 20 Apr 2026 10:44:18 +0200 Subject: [PATCH 1/8] feat: replace UnwantedMdRender with ParagraphRender for

elements in MarkdownRenderer --- .../lib/components/MarkdownRenderer/MarkdownRenderer.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx index bec1278ef..88d2c6f9e 100644 --- a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx +++ b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx @@ -31,13 +31,17 @@ const UnwantedMdRender = ({ children }: UnwantedMdRenderProps) => ( <>{children} ); +const ParagraphRender = ({ children }: UnwantedMdRenderProps) => ( +

{children}

+); + export const MarkdownRenderer: React.FC = ({ mdText }) => { const mdTextEscaped = escapeDecimalLikeLabels(mdText); return ( Date: Mon, 4 May 2026 15:30:33 +0200 Subject: [PATCH 2/8] feat: implement new line normalization and replace ParagraphRender with UnwantedMdRender in MarkdownRenderer Co-authored-by: Copilot --- .../MarkdownRenderer/MarkdownRenderer.tsx | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx index 88d2c6f9e..a98d41157 100644 --- a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx +++ b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx @@ -15,6 +15,30 @@ function escapeDecimalLikeLabels(markdown: string): string { return markdown.replace(/^(\d+)\.(?=\s)/gm, '$1\\.'); } +function normalizeNewLines(markdown: string): string { + return markdown + .replace(/\\r\\n/g, '\n') + .replace(/\\n/g, '\n') + .replace(/\\r/g, '\n') + .replace(/\r\n|\r/g, '\n'); +} + +function newLineToBreak(markdown: string): string { + const emptyRowToken = '__PXWEB_EMPTY_ROW__'; + const blankLineGroupRegex = /\n[ \t]*\n+/g; + + // Mark blank-line groups first, then convert all remaining newlines to hard breaks. + const withMarkedEmptyRows = markdown.replace( + blankLineGroupRegex, + `\n${emptyRowToken}\n`, + ); + + return withMarkedEmptyRows + .split('\n') + .map((line) => (line === emptyRowToken ? ' ' : line)) + .join(' \n'); +} + const LinkRenderer = ({ href = '', children }: LinkProps) => ( {children} @@ -31,23 +55,22 @@ const UnwantedMdRender = ({ children }: UnwantedMdRenderProps) => ( <>{children} ); -const ParagraphRender = ({ children }: UnwantedMdRenderProps) => ( -

{children}

-); - export const MarkdownRenderer: React.FC = ({ mdText }) => { - const mdTextEscaped = escapeDecimalLikeLabels(mdText); + const mdTextNormalized = normalizeNewLines(mdText); + const mdTextEscaped = escapeDecimalLikeLabels(mdTextNormalized); + const mdTextWithBreaks = newLineToBreak(mdTextEscaped); + return ( - {mdTextEscaped} + {mdTextWithBreaks} ); }; From e018d2e2a1a4e3a9226f1ed159bc0f7ea6001665 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kent=20Mossb=C3=A4ck?= Date: Mon, 4 May 2026 16:39:11 +0200 Subject: [PATCH 3/8] refactor: simplify new line handling and improve Markdown rendering logic Co-authored-by: Copilot --- .../MarkdownRenderer/MarkdownRenderer.tsx | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx index a98d41157..134fa28ad 100644 --- a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx +++ b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx @@ -24,19 +24,11 @@ function normalizeNewLines(markdown: string): string { } function newLineToBreak(markdown: string): string { - const emptyRowToken = '__PXWEB_EMPTY_ROW__'; - const blankLineGroupRegex = /\n[ \t]*\n+/g; - - // Mark blank-line groups first, then convert all remaining newlines to hard breaks. - const withMarkedEmptyRows = markdown.replace( - blankLineGroupRegex, - `\n${emptyRowToken}\n`, - ); + return markdown.replace(/\n/g, ' \n'); +} - return withMarkedEmptyRows - .split('\n') - .map((line) => (line === emptyRowToken ? ' ' : line)) - .join(' \n'); +function splitIntoBlocks(markdown: string): string[] { + return markdown.split(/\n[ \t]*\n+/); } const LinkRenderer = ({ href = '', children }: LinkProps) => ( @@ -58,20 +50,27 @@ const UnwantedMdRender = ({ children }: UnwantedMdRenderProps) => ( export const MarkdownRenderer: React.FC = ({ mdText }) => { const mdTextNormalized = normalizeNewLines(mdText); const mdTextEscaped = escapeDecimalLikeLabels(mdTextNormalized); - const mdTextWithBreaks = newLineToBreak(mdTextEscaped); + const markdownBlocks = splitIntoBlocks(mdTextEscaped); return ( - - {mdTextWithBreaks} - + <> + {markdownBlocks.map((block, index) => ( + + + {newLineToBreak(block)} + + {index < markdownBlocks.length - 1 &&

} +
+ ))} + ); }; From 061758fd8cc6a7751d6d3d58ffe4a9eda78b7d53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kent=20Mossb=C3=A4ck?= Date: Tue, 5 May 2026 08:27:30 +0200 Subject: [PATCH 4/8] fix: update new line handling and improve block key generation in MarkdownRenderer Co-authored-by: Copilot --- .../MarkdownRenderer/MarkdownRenderer.tsx | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx index 134fa28ad..a7acf3add 100644 --- a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx +++ b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx @@ -17,14 +17,14 @@ function escapeDecimalLikeLabels(markdown: string): string { function normalizeNewLines(markdown: string): string { return markdown - .replace(/\\r\\n/g, '\n') - .replace(/\\n/g, '\n') - .replace(/\\r/g, '\n') - .replace(/\r\n|\r/g, '\n'); + .replaceAll(/\r\n/g, '\n') + .replaceAll(/\n/g, '\n') + .replaceAll(/\r/g, '\n') + .replaceAll(/\r\n|\r/g, '\n'); } function newLineToBreak(markdown: string): string { - return markdown.replace(/\n/g, ' \n'); + return markdown.replaceAll(/\n/g, ' \n'); } function splitIntoBlocks(markdown: string): string[] { @@ -51,11 +51,17 @@ export const MarkdownRenderer: React.FC = ({ mdText }) => { const mdTextNormalized = normalizeNewLines(mdText); const mdTextEscaped = escapeDecimalLikeLabels(mdTextNormalized); const markdownBlocks = splitIntoBlocks(mdTextEscaped); + const blockOccurrences = new Map(); return ( <> - {markdownBlocks.map((block, index) => ( - + {markdownBlocks.map((block, index) => { + const occurrence = blockOccurrences.get(block) ?? 0; + blockOccurrences.set(block, occurrence + 1); + const blockKey = `${block}-${occurrence}`; + + return ( + = ({ mdText }) => { {newLineToBreak(block)} {index < markdownBlocks.length - 1 &&

} -
- ))} +
+ ); + })} ); }; From 1fdf28551263a186cd29a61323340314f73bf924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kent=20Mossb=C3=A4ck?= Date: Tue, 5 May 2026 08:30:46 +0200 Subject: [PATCH 5/8] fix: ensure consistent rendering of Markdown blocks in MarkdownRenderer --- .../MarkdownRenderer/MarkdownRenderer.tsx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx index a7acf3add..2a1262deb 100644 --- a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx +++ b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx @@ -62,18 +62,18 @@ export const MarkdownRenderer: React.FC = ({ mdText }) => { return ( - - {newLineToBreak(block)} - - {index < markdownBlocks.length - 1 &&

} + + {newLineToBreak(block)} + + {index < markdownBlocks.length - 1 &&

}
); })} From 4bae6cc7589964fccca9dbc848f82581dc9695f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kent=20Mossb=C3=A4ck?= Date: Tue, 5 May 2026 08:43:55 +0200 Subject: [PATCH 6/8] fix: streamline new line normalization in MarkdownRenderer Co-authored-by: Copilot --- .../lib/components/MarkdownRenderer/MarkdownRenderer.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx index 2a1262deb..b5ede5c27 100644 --- a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx +++ b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx @@ -17,10 +17,8 @@ function escapeDecimalLikeLabels(markdown: string): string { function normalizeNewLines(markdown: string): string { return markdown - .replaceAll(/\r\n/g, '\n') - .replaceAll(/\n/g, '\n') - .replaceAll(/\r/g, '\n') - .replaceAll(/\r\n|\r/g, '\n'); + .replaceAll('\r\n', '\n') + .replaceAll('\r', '\n'); } function newLineToBreak(markdown: string): string { From f0374f34085de6a66b576b8d9cfcdcae7b017743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kent=20Mossb=C3=A4ck?= Date: Tue, 5 May 2026 08:45:47 +0200 Subject: [PATCH 7/8] fix: simplify new line normalization in MarkdownRenderer --- .../src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx index b5ede5c27..99ea32e26 100644 --- a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx +++ b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx @@ -16,9 +16,7 @@ function escapeDecimalLikeLabels(markdown: string): string { } function normalizeNewLines(markdown: string): string { - return markdown - .replaceAll('\r\n', '\n') - .replaceAll('\r', '\n'); + return markdown.replaceAll('\r\n', '\n').replaceAll('\r', '\n'); } function newLineToBreak(markdown: string): string { From 19acda35a65af780a9723f98cc864d1b697083e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kent=20Mossb=C3=A4ck?= Date: Tue, 5 May 2026 08:53:25 +0200 Subject: [PATCH 8/8] fix: correct regex usage in newLineToBreak function for consistent new line handling Co-authored-by: Copilot --- .../src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx index 99ea32e26..11576805e 100644 --- a/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx +++ b/packages/pxweb2-ui/src/lib/components/MarkdownRenderer/MarkdownRenderer.tsx @@ -20,7 +20,7 @@ function normalizeNewLines(markdown: string): string { } function newLineToBreak(markdown: string): string { - return markdown.replaceAll(/\n/g, ' \n'); + return markdown.replaceAll('\n', ' \n'); } function splitIntoBlocks(markdown: string): string[] {