Skip to content
Snippets Groups Projects

Add the right side of 'code flow' that including code viewer

Merged Chen Charnolevsky requested to merge 469653-vulnerability-code-flow-P5 into master
All threads resolved!
2 files
+ 129
0
Compare changes
  • Side-by-side
  • Inline
Files
2
import hljsCore from 'highlight.js/lib/core';
import languageLoader from '~/content_editor/services/highlight_js_language_loader';
import { ROUGE_TO_HLJS_LANGUAGE_MAP } from '~/vue_shared/components/source_viewer/constants';
const HLJS_ON_AFTER_HIGHLIGHT = 'after:highlight';
const loadLanguage = async (language, hljs) => {
const languageDefinition = await languageLoader[language]();
hljs.registerLanguage(language, languageDefinition.default);
};
const loadSubLanguages = async (languageDefinition, hljs) => {
// Some files can contain sub-languages (i.e., Svelte); this ensures that sub-languages are also loaded
if (!languageDefinition?.contains) return;
// generate list of languages to load
const languages = new Set(
languageDefinition.contains
.filter((component) => Boolean(component.subLanguage))
.map((component) => component.subLanguage),
);
if (languageDefinition.subLanguage) {
languages.add(languageDefinition.subLanguage);
}
await Promise.all([...languages].map((language) => loadLanguage(language, hljs)));
};
// Registers our plugins for Highlight.js
// Plugin API: https://github.com/highlightjs/highlight.js/blob/main/docs/plugin-api.rst
const registerPlugins = (hljs, plugins) => {
if (!plugins) {
return;
}
for (const plugin of plugins) {
hljs.addPlugin({ [HLJS_ON_AFTER_HIGHLIGHT]: plugin });
}
};
const registerLanguage = async (hljs, language) => {
await loadLanguage(language, hljs);
await loadSubLanguages(hljs.getLanguage(language), hljs);
};
const initHighlightJs = async (language, plugins) => {
const hljs = hljsCore.newInstance();
registerPlugins(hljs, plugins);
await registerLanguage(hljs, language);
return hljs;
};
const highlightContent = async (lang, rawContent, plugins) => {
const language = ROUGE_TO_HLJS_LANGUAGE_MAP[lang.toLowerCase()];
let highlightedContent;
if (language) {
const hljs = await initHighlightJs(language, plugins);
highlightedContent = hljs.highlight(rawContent, { language }).value;
}
return highlightedContent;
};
export { highlightContent };
Loading