feat: add C, C++, and Java syntax highlighting support

Add c, cpp, and java to the highlight.js language bundle for code block
rendering. These are among the most commonly used languages in AI coding
conversations and were previously unsupported, falling back to plain text.

Also adds aliases: h (C headers), cc/cxx/c++/hpp/hxx (C++ variants).
This commit is contained in:
Nicolas Varrot
2026-02-13 11:30:18 +00:00
parent 6fb2f83716
commit f8324b760c
2 changed files with 14 additions and 4 deletions

View File

@@ -3,8 +3,8 @@ import hljs, { rehypeHighlightLanguages, rehypeHighlightOptions } from '../highl
describe('highlight', () => { describe('highlight', () => {
const expectedLanguages = [ const expectedLanguages = [
'bash', 'css', 'diff', 'dockerfile', 'go', 'ini', 'bash', 'c', 'cpp', 'css', 'diff', 'dockerfile', 'go', 'ini',
'javascript', 'json', 'markdown', 'python', 'rust', 'java', 'javascript', 'json', 'markdown', 'python', 'rust',
'shell', 'sql', 'typescript', 'xml', 'yaml', 'shell', 'sql', 'typescript', 'xml', 'yaml',
]; ];
@@ -17,7 +17,7 @@ describe('highlight', () => {
}); });
it('resolves common aliases', () => { it('resolves common aliases', () => {
const aliases = ['sh', 'zsh', 'js', 'jsx', 'ts', 'tsx', 'py', 'html', 'yml', 'rs']; const aliases = ['sh', 'zsh', 'h', 'cc', 'cxx', 'js', 'jsx', 'ts', 'tsx', 'py', 'html', 'yml', 'rs'];
for (const alias of aliases) { for (const alias of aliases) {
const lang = hljs.getLanguage(alias); const lang = hljs.getLanguage(alias);
expect(lang, `alias "${alias}" should resolve`).toBeDefined(); expect(lang, `alias "${alias}" should resolve`).toBeDefined();

View File

@@ -8,11 +8,14 @@ import type { LanguageFn } from 'highlight.js';
// Languages commonly seen in AI assistant conversations // Languages commonly seen in AI assistant conversations
import bash from 'highlight.js/lib/languages/bash'; import bash from 'highlight.js/lib/languages/bash';
import c from 'highlight.js/lib/languages/c';
import cpp from 'highlight.js/lib/languages/cpp';
import css from 'highlight.js/lib/languages/css'; import css from 'highlight.js/lib/languages/css';
import diff from 'highlight.js/lib/languages/diff'; import diff from 'highlight.js/lib/languages/diff';
import dockerfile from 'highlight.js/lib/languages/dockerfile'; import dockerfile from 'highlight.js/lib/languages/dockerfile';
import go from 'highlight.js/lib/languages/go'; import go from 'highlight.js/lib/languages/go';
import ini from 'highlight.js/lib/languages/ini'; import ini from 'highlight.js/lib/languages/ini';
import java from 'highlight.js/lib/languages/java';
import javascript from 'highlight.js/lib/languages/javascript'; import javascript from 'highlight.js/lib/languages/javascript';
import json from 'highlight.js/lib/languages/json'; import json from 'highlight.js/lib/languages/json';
import markdown from 'highlight.js/lib/languages/markdown'; import markdown from 'highlight.js/lib/languages/markdown';
@@ -25,11 +28,14 @@ import xml from 'highlight.js/lib/languages/xml';
import yaml from 'highlight.js/lib/languages/yaml'; import yaml from 'highlight.js/lib/languages/yaml';
hljs.registerLanguage('bash', bash); hljs.registerLanguage('bash', bash);
hljs.registerLanguage('c', c);
hljs.registerLanguage('cpp', cpp);
hljs.registerLanguage('css', css); hljs.registerLanguage('css', css);
hljs.registerLanguage('diff', diff); hljs.registerLanguage('diff', diff);
hljs.registerLanguage('dockerfile', dockerfile); hljs.registerLanguage('dockerfile', dockerfile);
hljs.registerLanguage('go', go); hljs.registerLanguage('go', go);
hljs.registerLanguage('ini', ini); hljs.registerLanguage('ini', ini);
hljs.registerLanguage('java', java);
hljs.registerLanguage('javascript', javascript); hljs.registerLanguage('javascript', javascript);
hljs.registerLanguage('json', json); hljs.registerLanguage('json', json);
hljs.registerLanguage('markdown', markdown); hljs.registerLanguage('markdown', markdown);
@@ -43,6 +49,8 @@ hljs.registerLanguage('yaml', yaml);
// Aliases for hljs direct usage (ToolCall.tsx) // Aliases for hljs direct usage (ToolCall.tsx)
hljs.registerAliases(['sh', 'zsh'], { languageName: 'bash' }); hljs.registerAliases(['sh', 'zsh'], { languageName: 'bash' });
hljs.registerAliases(['h'], { languageName: 'c' });
hljs.registerAliases(['cc', 'cxx', 'c++', 'hpp', 'hxx'], { languageName: 'cpp' });
hljs.registerAliases(['js', 'jsx'], { languageName: 'javascript' }); hljs.registerAliases(['js', 'jsx'], { languageName: 'javascript' });
hljs.registerAliases(['ts', 'tsx'], { languageName: 'typescript' }); hljs.registerAliases(['ts', 'tsx'], { languageName: 'typescript' });
hljs.registerAliases(['py'], { languageName: 'python' }); hljs.registerAliases(['py'], { languageName: 'python' });
@@ -56,7 +64,7 @@ hljs.registerAliases(['rs'], { languageName: 'rust' });
* rehype-highlight uses lowlight internally and accepts a `languages` record. * rehype-highlight uses lowlight internally and accepts a `languages` record.
*/ */
export const rehypeHighlightLanguages: Record<string, LanguageFn> = { export const rehypeHighlightLanguages: Record<string, LanguageFn> = {
bash, css, diff, dockerfile, go, ini, javascript, json, bash, c, cpp, css, diff, dockerfile, go, ini, java, javascript, json,
markdown, python, rust, shell, sql, typescript, xml, yaml, markdown, python, rust, shell, sql, typescript, xml, yaml,
}; };
@@ -67,6 +75,8 @@ export const rehypeHighlightOptions = {
languages: rehypeHighlightLanguages, languages: rehypeHighlightLanguages,
aliases: { aliases: {
bash: ['sh', 'zsh'], bash: ['sh', 'zsh'],
c: ['h'],
cpp: ['cc', 'cxx', 'c++', 'hpp', 'hxx'],
javascript: ['js', 'jsx'], javascript: ['js', 'jsx'],
typescript: ['ts', 'tsx'], typescript: ['ts', 'tsx'],
python: ['py'], python: ['py'],