editor-codeblock.js 1.7 KB

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