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-19 21:09:48 +00:00
|
|
|
|
|
|
|
const codeBlockLanguageLoader = {
|
|
|
|
lowlight,
|
|
|
|
|
|
|
|
allLanguages: CODE_BLOCK_LANGUAGES,
|
|
|
|
|
|
|
|
findLanguageBySyntax(value) {
|
|
|
|
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) {
|
|
|
|
const { syntax } = this.findLanguageBySyntax(match[1]);
|
|
|
|
|
|
|
|
this.loadLanguages([syntax]);
|
|
|
|
|
|
|
|
return { language: syntax };
|
|
|
|
},
|
2022-03-23 12:07:27 +00:00
|
|
|
|
|
|
|
loadLanguages(languageList = []) {
|
|
|
|
const loaders = languageList
|
|
|
|
.filter((languageName) => !this.isLanguageLoaded(languageName))
|
|
|
|
.map((languageName) => {
|
|
|
|
return import(
|
|
|
|
/* webpackChunkName: 'highlight.language.js' */ `highlight.js/lib/languages/${languageName}`
|
|
|
|
)
|
|
|
|
.then(({ default: language }) => {
|
|
|
|
this.lowlight.registerLanguage(languageName, language);
|
|
|
|
})
|
|
|
|
.catch(() => false);
|
|
|
|
});
|
|
|
|
|
|
|
|
return Promise.all(loaders);
|
2022-04-19 21:09:48 +00:00
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
export default codeBlockLanguageLoader;
|