2022-04-19 21:09:48 +00:00
|
|
|
import { lowlight } from 'lowlight/lib/core';
|
|
|
|
import { __, sprintf } from '~/locale';
|
2022-04-20 21:08:12 +00:00
|
|
|
import CODE_BLOCK_LANGUAGES from '../constants/code_block_languages';
|
2022-04-29 12:10:13 +00:00
|
|
|
import languageLoader from './highlight_js_language_loader';
|
2022-04-19 21:09:48 +00:00
|
|
|
|
|
|
|
const codeBlockLanguageLoader = {
|
|
|
|
lowlight,
|
|
|
|
|
|
|
|
allLanguages: CODE_BLOCK_LANGUAGES,
|
|
|
|
|
2022-05-30 18:08:57 +00:00
|
|
|
findOrCreateLanguageBySyntax(value) {
|
2022-04-19 21:09:48 +00:00
|
|
|
const lowercaseValue = value?.toLowerCase() || 'plaintext';
|
|
|
|
return (
|
|
|
|
this.allLanguages.find(
|
|
|
|
({ syntax, variants }) =>
|
|
|
|
syntax === lowercaseValue || variants?.toLowerCase().split(', ').includes(lowercaseValue),
|
|
|
|
) || {
|
|
|
|
syntax: lowercaseValue,
|
|
|
|
label: sprintf(__(`Custom (%{language})`), { language: lowercaseValue }),
|
|
|
|
}
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
|
|
|
filterLanguages(value) {
|
|
|
|
if (!value) return this.allLanguages;
|
|
|
|
|
|
|
|
const lowercaseValue = value?.toLowerCase() || '';
|
|
|
|
return this.allLanguages.filter(
|
|
|
|
({ syntax, label, variants }) =>
|
|
|
|
syntax.toLowerCase().includes(lowercaseValue) ||
|
|
|
|
label.toLowerCase().includes(lowercaseValue) ||
|
|
|
|
variants?.toLowerCase().includes(lowercaseValue),
|
|
|
|
);
|
|
|
|
},
|
2022-03-23 12:07:27 +00:00
|
|
|
|
|
|
|
isLanguageLoaded(language) {
|
|
|
|
return this.lowlight.registered(language);
|
2022-04-19 21:09:48 +00:00
|
|
|
},
|
2022-03-23 12:07:27 +00:00
|
|
|
|
2022-04-19 21:09:48 +00:00
|
|
|
loadLanguageFromInputRule(match) {
|
2022-05-30 18:08:57 +00:00
|
|
|
const { syntax } = this.findOrCreateLanguageBySyntax(match[1]);
|
2022-04-19 21:09:48 +00:00
|
|
|
|
2022-05-05 18:08:40 +00:00
|
|
|
this.loadLanguage(syntax);
|
2022-04-19 21:09:48 +00:00
|
|
|
|
|
|
|
return { language: syntax };
|
|
|
|
},
|
2022-03-23 12:07:27 +00:00
|
|
|
|
2022-05-05 18:08:40 +00:00
|
|
|
async loadLanguage(languageName) {
|
|
|
|
if (this.isLanguageLoaded(languageName)) return false;
|
2022-03-23 12:07:27 +00:00
|
|
|
|
2022-05-05 18:08:40 +00:00
|
|
|
try {
|
|
|
|
const { default: language } = await languageLoader[languageName]();
|
|
|
|
this.lowlight.registerLanguage(languageName, language);
|
|
|
|
return true;
|
|
|
|
} catch {
|
|
|
|
return false;
|
|
|
|
}
|
2022-04-19 21:09:48 +00:00
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
export default codeBlockLanguageLoader;
|