diff options
Diffstat (limited to 'app/assets/javascripts/content_editor/services/code_block_language_loader.js')
-rw-r--r-- | app/assets/javascripts/content_editor/services/code_block_language_loader.js | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/app/assets/javascripts/content_editor/services/code_block_language_loader.js b/app/assets/javascripts/content_editor/services/code_block_language_loader.js new file mode 100644 index 00000000000..3c12cf614a5 --- /dev/null +++ b/app/assets/javascripts/content_editor/services/code_block_language_loader.js @@ -0,0 +1,35 @@ +export default class CodeBlockLanguageLoader { + constructor(lowlight) { + this.lowlight = lowlight; + } + + isLanguageLoaded(language) { + return this.lowlight.registered(language); + } + + loadLanguagesFromDOM(domTree) { + const languages = []; + + domTree.querySelectorAll('pre').forEach((preElement) => { + languages.push(preElement.getAttribute('lang')); + }); + + return this.loadLanguages(languages); + } + + 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); + } +} |