diff --git a/changelog_unreleased/markdown/16348.md b/changelog_unreleased/markdown/16348.md new file mode 100644 index 000000000..b116b885f --- /dev/null +++ b/changelog_unreleased/markdown/16348.md @@ -0,0 +1,22 @@ +#### Preserve explicit language in front matter (#16348 by @fisker) + + +```markdown + +---yaml +title: Hello +slug: home +--- + + +--- +title: Hello +slug: home +--- + + +---yaml +title: Hello +slug: home +--- +``` diff --git a/src/language-css/clean.js b/src/language-css/clean.js index d54d32358..1ac78bd2c 100644 --- a/src/language-css/clean.js +++ b/src/language-css/clean.js @@ -12,7 +12,7 @@ const ignoredProperties = new Set([ ]); function clean(original, cloned, parent) { - if (isFrontMatter(original) && original.lang === "yaml") { + if (isFrontMatter(original) && original.language === "yaml") { delete cloned.value; } diff --git a/src/utils/front-matter/parse.js b/src/utils/front-matter/parse.js index 7bfdc0ca5..ca8a7fadf 100644 --- a/src/utils/front-matter/parse.js +++ b/src/utils/front-matter/parse.js @@ -1,7 +1,7 @@ const frontMatterRegex = new RegExp( String.raw`^(?-{3}|\+{3})` + // trailing spaces after delimiters are allowed - String.raw`(?[^\n]*)` + + String.raw`(?[^\n]*)` + String.raw`\n(?:|(?.*?)\n)` + // In some markdown processors such as pandoc, // "..." can be used as the end delimiter for YAML front-matter. @@ -17,22 +17,30 @@ function parse(text) { return { content: text }; } - const { startDelimiter, language, value = "", endDelimiter } = match.groups; + let { + startDelimiter, + explicitLanguage, + value = "", + endDelimiter, + } = match.groups; - let lang = language.trim() || "yaml"; + explicitLanguage = explicitLanguage.trim(); + + let language = explicitLanguage || "yaml"; if (startDelimiter === "+++") { - lang = "toml"; + language = "toml"; } // Only allow yaml to parse with a different end delimiter - if (lang !== "yaml" && startDelimiter !== endDelimiter) { + if (language !== "yaml" && startDelimiter !== endDelimiter) { return { content: text }; } const [raw] = match; const frontMatter = { type: "front-matter", - lang, + language, + explicitLanguage: explicitLanguage || undefined, value, startDelimiter, endDelimiter, diff --git a/src/utils/front-matter/print.js b/src/utils/front-matter/print.js index 22b5517bc..218eb51f8 100644 --- a/src/utils/front-matter/print.js +++ b/src/utils/front-matter/print.js @@ -1,11 +1,12 @@ import { hardline, markAsRoot } from "../../document/builders.js"; async function print(node, textToDoc) { - if (node.lang === "yaml") { + if (node.language === "yaml") { const value = node.value.trim(); const doc = value ? await textToDoc(value, { parser: "yaml" }) : ""; return markAsRoot([ node.startDelimiter, + node.explicitLanguage ?? "", hardline, doc, doc ? hardline : "", diff --git a/tests/format/misc/embedded_language_formatting/in-html/__snapshots__/format.test.js.snap b/tests/format/misc/embedded_language_formatting/in-html/__snapshots__/format.test.js.snap index a2607763a..e70cf5844 100644 --- a/tests/format/misc/embedded_language_formatting/in-html/__snapshots__/format.test.js.snap +++ b/tests/format/misc/embedded_language_formatting/in-html/__snapshots__/format.test.js.snap @@ -106,7 +106,7 @@ slug: home Hello world! =====================================output===================================== ---- +---yaml title: Hello slug: home --- diff --git a/tests/format/misc/embedded_language_formatting/in-markdown/__snapshots__/format.test.js.snap b/tests/format/misc/embedded_language_formatting/in-markdown/__snapshots__/format.test.js.snap index 7809e8056..332455dcb 100644 --- a/tests/format/misc/embedded_language_formatting/in-markdown/__snapshots__/format.test.js.snap +++ b/tests/format/misc/embedded_language_formatting/in-markdown/__snapshots__/format.test.js.snap @@ -96,7 +96,7 @@ Hello world! =====================================output===================================== ---- +---yaml title: Hello slug: home ...