diff --git a/src/app/plugins/markdown/block/rules.ts b/src/app/plugins/markdown/block/rules.ts index f598ee63..e0a727ee 100644 --- a/src/app/plugins/markdown/block/rules.ts +++ b/src/app/plugins/markdown/block/rules.ts @@ -16,8 +16,12 @@ export const CodeBlockRule: BlockMDRule = { match: (text) => text.match(CODEBLOCK_REG_1), html: (match) => { const [, g1, g2] = match; - const classNameAtt = g1 ? ` class="language-${g1}"` : ''; - return `
${g2}`;
+ // use last identifier after dot, e.g. for "example.json" gets us "json" as language code.
+ const langCode = g1 ? g1.substring(g1.lastIndexOf('.') + 1) : null;
+ const filename = g1 != langCode ? g1 : null;
+ const classNameAtt = langCode ? ` class="language-${langCode}"` : '';
+ const filenameAtt = filename ? ` data-label="${filename}"` : '';
+ return `${g2}`;
},
};
diff --git a/src/app/plugins/react-custom-html-parser.tsx b/src/app/plugins/react-custom-html-parser.tsx
index ba40c978..961131d9 100644
--- a/src/app/plugins/react-custom-html-parser.tsx
+++ b/src/app/plugins/react-custom-html-parser.tsx
@@ -232,8 +232,9 @@ export function CodeBlock({
opts: HTMLReactParserOptions;
}) {
const code = children[0];
- const languageClass =
- code instanceof Element && code.name === 'code' ? code.attribs.class : undefined;
+ const attribs = code instanceof Element && code.name === 'code' ? code.attribs : undefined;
+ const languageClass = attribs?.class;
+ const customLabel = attribs?.['data-label'];
const language =
languageClass && languageClass.startsWith('language-')
? languageClass.replace('language-', '')
@@ -262,7 +263,7 @@ export function CodeBlock({