let modelist = ace.require("ace/ext/modelist"); let codeEditor = null; // ACE - Mode Loader let modelistLoaded = []; let loadAceMode = (m) => { return $.ajax({ url: '/js/ace/mode-' + m + '.js', dataType: "script", cache: true, beforeSend: () => { if(_.includes(modelistLoaded, m)) { return false; } }, success: () => { modelistLoaded.push(m); } }); }; // Vue Code Block instance let vueCodeBlock = new Vue({ el: '#modal-editor-codeblock', data: { modes: modelist.modesByName, modeSelected: 'text', initContent: '' }, watch: { modeSelected: (val, oldVal) => { loadAceMode(val).done(() => { ace.require("ace/mode/" + val); codeEditor.getSession().setMode("ace/mode/" + val); }); } }, methods: { open: (ev) => { $('#modal-editor-codeblock').addClass('is-active'); _.delay(() => { codeEditor = ace.edit("codeblock-editor"); codeEditor.setTheme("ace/theme/tomorrow_night"); codeEditor.getSession().setMode("ace/mode/" + vueCodeBlock.modeSelected); codeEditor.setOption('fontSize', '14px'); codeEditor.setOption('hScrollBarAlwaysVisible', false); codeEditor.setOption('wrap', true); codeEditor.setValue(vueCodeBlock.initContent); codeEditor.focus(); codeEditor.renderer.updateFull(); }, 300); }, cancel: (ev) => { mdeModalOpenState = false; $('#modal-editor-codeblock').removeClass('is-active'); vueCodeBlock.initContent = ''; }, insertCode: (ev) => { if(mde.codemirror.doc.somethingSelected()) { mde.codemirror.execCommand('singleSelection'); } let codeBlockText = '\n```' + vueCodeBlock.modeSelected + '\n' + codeEditor.getValue() + '\n```\n'; mde.codemirror.doc.replaceSelection(codeBlockText); vueCodeBlock.cancel(); } } });