You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.3 KiB

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