redoc/src/utils/highlight.ts
2025-02-07 19:08:10 +07:00

83 lines
2.3 KiB
TypeScript

import * as Prism from 'prismjs';
import 'prismjs/components/prism-bash.js';
import 'prismjs/components/prism-c.js';
import 'prismjs/components/prism-clike.js';
import 'prismjs/components/prism-coffeescript.js';
import 'prismjs/components/prism-cpp.js';
import 'prismjs/components/prism-csharp.js';
import 'prismjs/components/prism-csv.js';
import 'prismjs/components/prism-go.js';
import 'prismjs/components/prism-http.js';
import 'prismjs/components/prism-java.js';
import 'prismjs/components/prism-lua.js';
import 'prismjs/components/prism-markup-templating.js'; // dep of php
import 'prismjs/components/prism-markup.js'; // xml
import 'prismjs/components/prism-objectivec.js';
import 'prismjs/components/prism-perl.js';
import 'prismjs/components/prism-php.js';
import 'prismjs/components/prism-powershell.js';
import 'prismjs/components/prism-python.js';
import 'prismjs/components/prism-q.js';
import 'prismjs/components/prism-ruby.js';
import 'prismjs/components/prism-scala.js';
import 'prismjs/components/prism-sql.js';
import 'prismjs/components/prism-swift.js';
import 'prismjs/components/prism-yaml.js';
const DEFAULT_LANG = 'clike';
Prism.languages.insertBefore(
'javascript',
'string',
{
'property string': {
pattern: /([{,]\s*)"(?:\\.|[^\\"\r\n])*"(?=\s*:)/i,
lookbehind: true,
},
} as any,
undefined as any,
);
Prism.languages.insertBefore(
'javascript',
'punctuation',
{
property: {
pattern: /([{,]\s*)[a-z]\w*(?=\s*:)/i,
lookbehind: true,
},
},
undefined as any,
);
/**
* map language names to Prism.js names
*/
export function mapLang(lang: string): string {
return (
{
json: 'js',
'c++': 'cpp',
'c#': 'csharp',
'objective-c': 'objectivec',
shell: 'bash',
viml: 'vim',
}[lang] || DEFAULT_LANG
);
}
/**
* Highlight source code string using Prism.js
* @param source source code to highlight
* @param lang highlight language
* @return highlighted source code as **html string**
*/
export function highlight(source: string | number | boolean, lang: string = DEFAULT_LANG): string {
lang = lang.toLowerCase();
let grammar = Prism.languages[lang];
if (!grammar) {
grammar = Prism.languages[mapLang(lang)];
}
return Prism.highlight(source.toString(), grammar, lang);
}