From 3b0687e5571c2091ce582200d2fd7e15222d3efc Mon Sep 17 00:00:00 2001 From: NicolasNewman Date: Mon, 22 Apr 2024 17:12:12 -0500 Subject: [PATCH 1/5] feat(mathml): added additional config option for forcing legacy rendering --- packages/mermaid/src/config.type.ts | 7 +++++++ packages/mermaid/src/diagrams/common/common.ts | 5 +++-- packages/mermaid/src/schemas/config.schema.yaml | 7 +++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/config.type.ts b/packages/mermaid/src/config.type.ts index 79f424315..775d49fb5 100644 --- a/packages/mermaid/src/config.type.ts +++ b/packages/mermaid/src/config.type.ts @@ -120,6 +120,13 @@ export interface MermaidConfig { * */ legacyMathML?: boolean; + /** + * This option forces Mermaid to rely on KaTeX's own stylesheet for rendering MathML. Due to differences between OS + * fonts and browser's MathML implementation, this option is recommended if consistent rendering is important. + * If set to true, ignores legacyMathML. + * + */ + forceLegacyMathML?: boolean; /** * This option controls if the generated ids of nodes in the SVG are * generated randomly or based on a seed. diff --git a/packages/mermaid/src/diagrams/common/common.ts b/packages/mermaid/src/diagrams/common/common.ts index 017b2b091..364dc25ea 100644 --- a/packages/mermaid/src/diagrams/common/common.ts +++ b/packages/mermaid/src/diagrams/common/common.ts @@ -337,11 +337,12 @@ export const renderKatex = async (text: string, config: MermaidConfig): Promise< return text; } - if (!isMathMLSupported() && !config.legacyMathML) { + if (!(isMathMLSupported() || config.legacyMathML || config.forceLegacyMathML)) { return text.replace(katexRegex, 'MathML is unsupported in this environment.'); } const { default: katex } = await import('katex'); + const outputMode = (config.forceLegacyMathML) || (!isMathMLSupported() && config.legacyMathML) ? 'htmlAndMathml' : 'mathml'; return text .split(lineBreakRegex) .map((line) => @@ -357,7 +358,7 @@ export const renderKatex = async (text: string, config: MermaidConfig): Promise< .renderToString(c, { throwOnError: true, displayMode: true, - output: isMathMLSupported() ? 'mathml' : 'htmlAndMathml', + output: outputMode }) .replace(/\n/g, ' ') .replace(//g, '') diff --git a/packages/mermaid/src/schemas/config.schema.yaml b/packages/mermaid/src/schemas/config.schema.yaml index d1bb8ad1b..68da484e0 100644 --- a/packages/mermaid/src/schemas/config.schema.yaml +++ b/packages/mermaid/src/schemas/config.schema.yaml @@ -180,6 +180,13 @@ properties: fall back to legacy rendering for KaTeX. type: boolean default: false + forceLegacyMathML: + description: | + This option forces Mermaid to rely on KaTeX's own stylesheet for rendering MathML. Due to differences between OS + fonts and browser's MathML implementation, this option is recommended if consistent rendering is important. + If set to true, ignores legacyMathML. + type: boolean + default: false deterministicIds: description: | This option controls if the generated ids of nodes in the SVG are From 13aa3265e3cd7fefe20eac18dcc26563f55d796a Mon Sep 17 00:00:00 2001 From: NicolasNewman Date: Mon, 22 Apr 2024 17:14:36 -0500 Subject: [PATCH 2/5] docs(mathml): updated docs to include forceLegacyMathML --- .../src/docs/config/img/mathMLDifferences.png | Bin 0 -> 15108 bytes packages/mermaid/src/docs/config/math.md | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 packages/mermaid/src/docs/config/img/mathMLDifferences.png diff --git a/packages/mermaid/src/docs/config/img/mathMLDifferences.png b/packages/mermaid/src/docs/config/img/mathMLDifferences.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7a86400f44b00fd16acad5e3a66a1a9ff26d52 GIT binary patch literal 15108 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 XLkqWVSLh6AYX!+jD2P{y8U_6qGL%eZ literal 0 HcmV?d00001 diff --git a/packages/mermaid/src/docs/config/math.md b/packages/mermaid/src/docs/config/math.md index 22b398e08..6b203c52d 100644 --- a/packages/mermaid/src/docs/config/math.md +++ b/packages/mermaid/src/docs/config/math.md @@ -60,3 +60,13 @@ Example with legacy mode enabled (the latest version of KaTeX's stylesheet can b ``` + +## Handling Rendering Differences + +Due to differences between default fonts across operating systems and browser's MathML implementations, inconsistent results can be seen across platforms. If having consistent results are important, or the most optimal rendered results are desired, `forceLegacyMathML` can be enabled in the config. + +This option will always use KaTeX's stylesheet instead of only when MathML is not supported (as with `legacyMathML`). Note that only `forceLegacyMathML` needs to be set. + +If including KaTeX's stylesheet is not a concern, enabling this option is recommended to avoid scenarios where no MathML implementation within a browser provides the desired output (as seen below). + +![Image showing differences between Browsers](img/mathMLDifferences.png) From 7f33ae0f40700654216a787771b95a454978a1bb Mon Sep 17 00:00:00 2001 From: NicolasNewman Date: Mon, 22 Apr 2024 17:15:10 -0500 Subject: [PATCH 3/5] fix(mathml): fixed flowchart equations being cut off --- packages/mermaid/src/diagrams/common/common.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/mermaid/src/diagrams/common/common.ts b/packages/mermaid/src/diagrams/common/common.ts index 364dc25ea..c6537e390 100644 --- a/packages/mermaid/src/diagrams/common/common.ts +++ b/packages/mermaid/src/diagrams/common/common.ts @@ -347,9 +347,7 @@ export const renderKatex = async (text: string, config: MermaidConfig): Promise< .split(lineBreakRegex) .map((line) => hasKatex(line) - ? `
- ${line} -
` + ? `
${line}
` : `
${line}
` ) .join('') From 1ac9244e68973b39f269a4c7b237b33c49395992 Mon Sep 17 00:00:00 2001 From: NicolasNewman Date: Mon, 29 Apr 2024 09:46:50 -0500 Subject: [PATCH 4/5] style(mathml): linting --- packages/mermaid/src/diagrams/common/common.ts | 7 +++++-- packages/mermaid/src/docs/config/math.md | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/mermaid/src/diagrams/common/common.ts b/packages/mermaid/src/diagrams/common/common.ts index c6537e390..66cc5ff6f 100644 --- a/packages/mermaid/src/diagrams/common/common.ts +++ b/packages/mermaid/src/diagrams/common/common.ts @@ -342,7 +342,10 @@ export const renderKatex = async (text: string, config: MermaidConfig): Promise< } const { default: katex } = await import('katex'); - const outputMode = (config.forceLegacyMathML) || (!isMathMLSupported() && config.legacyMathML) ? 'htmlAndMathml' : 'mathml'; + const outputMode = + config.forceLegacyMathML || (!isMathMLSupported() && config.legacyMathML) + ? 'htmlAndMathml' + : 'mathml'; return text .split(lineBreakRegex) .map((line) => @@ -356,7 +359,7 @@ export const renderKatex = async (text: string, config: MermaidConfig): Promise< .renderToString(c, { throwOnError: true, displayMode: true, - output: outputMode + output: outputMode, }) .replace(/\n/g, ' ') .replace(//g, '') diff --git a/packages/mermaid/src/docs/config/math.md b/packages/mermaid/src/docs/config/math.md index 6b203c52d..a53dceaf2 100644 --- a/packages/mermaid/src/docs/config/math.md +++ b/packages/mermaid/src/docs/config/math.md @@ -63,7 +63,7 @@ Example with legacy mode enabled (the latest version of KaTeX's stylesheet can b ## Handling Rendering Differences -Due to differences between default fonts across operating systems and browser's MathML implementations, inconsistent results can be seen across platforms. If having consistent results are important, or the most optimal rendered results are desired, `forceLegacyMathML` can be enabled in the config. +Due to differences between default fonts across operating systems and browser's MathML implementations, inconsistent results can be seen across platforms. If having consistent results are important, or the most optimal rendered results are desired, `forceLegacyMathML` can be enabled in the config. This option will always use KaTeX's stylesheet instead of only when MathML is not supported (as with `legacyMathML`). Note that only `forceLegacyMathML` needs to be set. From c4ccfec3166be0cd6fba1ddd09beee818aa2356a Mon Sep 17 00:00:00 2001 From: NicolasNewman Date: Mon, 29 Apr 2024 14:49:56 +0000 Subject: [PATCH 5/5] Update docs --- docs/config/img/mathMLDifferences.png | Bin 0 -> 15108 bytes docs/config/math.md | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 docs/config/img/mathMLDifferences.png diff --git a/docs/config/img/mathMLDifferences.png b/docs/config/img/mathMLDifferences.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7a86400f44b00fd16acad5e3a66a1a9ff26d52 GIT binary patch literal 15108 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 XLkqWVSLh6AYX!+jD2P{y8U_6qGL%eZ literal 0 HcmV?d00001 diff --git a/docs/config/math.md b/docs/config/math.md index 154158508..b2063e3af 100644 --- a/docs/config/math.md +++ b/docs/config/math.md @@ -84,3 +84,13 @@ Example with legacy mode enabled (the latest version of KaTeX's stylesheet can b ``` + +## Handling Rendering Differences + +Due to differences between default fonts across operating systems and browser's MathML implementations, inconsistent results can be seen across platforms. If having consistent results are important, or the most optimal rendered results are desired, `forceLegacyMathML` can be enabled in the config. + +This option will always use KaTeX's stylesheet instead of only when MathML is not supported (as with `legacyMathML`). Note that only `forceLegacyMathML` needs to be set. + +If including KaTeX's stylesheet is not a concern, enabling this option is recommended to avoid scenarios where no MathML implementation within a browser provides the desired output (as seen below). + +![Image showing differences between Browsers](img/mathMLDifferences.png)