diff --git a/GUI/src/components/Markdowify/index.tsx b/GUI/src/components/Markdowify/index.tsx index c26d69bcb..578c94b68 100644 --- a/GUI/src/components/Markdowify/index.tsx +++ b/GUI/src/components/Markdowify/index.tsx @@ -42,6 +42,30 @@ const LinkPreview: React.FC<{ const hasSpecialFormat = (m: string) => m.includes('\n\n') && m.indexOf('.') > 0 && m.indexOf(':') > m.indexOf('.'); +function formatMessage(message?: string): string { + if (!message) return ''; + + const filteredMessage = message + .replaceAll(/\\?\$b\w*/g, '') + .replaceAll(/\\?\$v\w*/g, '') + .replaceAll(/\\?\$g\w*/g, ''); + + return filteredMessage + .replaceAll(/&#x([0-9A-Fa-f]+);/g, (_, hex: string) => String.fromCharCode(parseInt(hex, 16))) + .replaceAll(/(^|\n)(\d{4})\.\s/g, (match, prefix, year) => { + const remainingText = filteredMessage.substring(filteredMessage.indexOf(match) + match.length); + const sentenceEnd = remainingText.indexOf('\n\n'); + if (sentenceEnd !== -1) { + const currentSentence = remainingText.substring(0, sentenceEnd); + if (currentSentence.trim().endsWith(':')) { + return `${prefix}${year}. `; + } + } + return `${prefix}${year}\\. `; + }) + .replace(/(?<=\n)\d+\.\s/g, hasSpecialFormat(filteredMessage) ? '\n\n$&' : '$&'); +} + const Markdownify: React.FC = ({ message, sanitizeLinks = false }) => (
= ({ message, sanitizeLinks = fals disableParsingRawHTML: true, }} > - {message - ?.replaceAll(/&#x([0-9A-Fa-f]+);/g, (_, hex: string) => String.fromCodePoint(Number.parseInt(hex, 16))) - ?.replaceAll(/(?<=\n)\d+\.\s/g, hasSpecialFormat(message) ? '\n\n$&' : '$&') ?? ''} + {formatMessage(message)}
); diff --git a/GUI/src/services/service-builder.ts b/GUI/src/services/service-builder.ts index 38ce27863..355c5b54b 100644 --- a/GUI/src/services/service-builder.ts +++ b/GUI/src/services/service-builder.ts @@ -426,7 +426,7 @@ export function getYamlContent( } if (parentNode.data.stepType === StepType.MultiChoiceQuestion) { - return handleMultiChoiceQuestion(finishedFlow, parentStepName, parentNode, childNode); + return handleMultiChoiceQuestion(finishedFlow, parentStepName, parentNode, childNode, name); } if (parentNode.data.stepType === StepType.DynamicChoices) { @@ -711,7 +711,12 @@ function handleMultiChoiceQuestion( parentStepName: string, parentNode: Node, childNode: Node | undefined, + serviceName: string, ) { + parentNode.data.multiChoiceQuestion?.buttons.forEach( + (b) => (b.payload = b.payload.replaceAll('/_mcq_', `/${serviceName}_mcq_`)), + ); + return finishedFlow.set(parentStepName, { assign: { buttons: parentNode?.data?.multiChoiceQuestion?.buttons ?? [],