editor-codeblock.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. })