editor-codeblock.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. let codeEditor = ace.edit("codeblock-editor");
  2. codeEditor.setTheme("ace/theme/tomorrow_night");
  3. codeEditor.getSession().setMode("ace/mode/markdown");
  4. codeEditor.setOption('fontSize', '14px');
  5. codeEditor.setOption('hScrollBarAlwaysVisible', false);
  6. codeEditor.setOption('wrap', true);
  7. let modelist = ace.require("ace/ext/modelist");
  8. // ACE - Mode Loader
  9. let modelistLoaded = [];
  10. let loadAceMode = (m) => {
  11. return $.ajax({
  12. url: '/js/ace/mode-' + m + '.js',
  13. dataType: "script",
  14. cache: true,
  15. beforeSend: () => {
  16. if(_.includes(modelistLoaded, m)) {
  17. return false;
  18. }
  19. },
  20. success: () => {
  21. modelistLoaded.push(m);
  22. }
  23. });
  24. };
  25. // Vue Code Block instance
  26. let vueCodeBlock = new Vue({
  27. el: '#modal-editor-codeblock',
  28. data: {
  29. modes: modelist.modesByName,
  30. modeSelected: 'text'
  31. },
  32. watch: {
  33. modeSelected: (val, oldVal) => {
  34. loadAceMode(val).done(() => {
  35. ace.require("ace/mode/" + val);
  36. codeEditor.getSession().setMode("ace/mode/" + val);
  37. });
  38. }
  39. },
  40. methods: {
  41. open: (ev) => {
  42. $('#modal-editor-codeblock').addClass('is-active');
  43. _.delay(() => {
  44. codeEditor.resize();
  45. codeEditor.focus();
  46. codeEditor.setAutoScrollEditorIntoView(true);
  47. codeEditor.renderer.updateFull();
  48. }, 1000);
  49. },
  50. cancel: (ev) => {
  51. mdeModalOpenState = false;
  52. $('#modal-editor-codeblock').removeClass('is-active');
  53. },
  54. insertCode: (ev) => {
  55. if(mde.codemirror.doc.somethingSelected()) {
  56. mde.codemirror.execCommand('singleSelection');
  57. }
  58. let codeBlockText = '\n```' + vueCodeBlock.modeSelected + '\n' + codeEditor.getValue() + '\n```\n';
  59. mde.codemirror.doc.replaceSelection(codeBlockText);
  60. vueCodeBlock.cancel();
  61. }
  62. }
  63. });