editor-codeblock.js 2.2 KB

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