loadmode.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // CodeMirror, copyright (c) by Marijn Haverbeke and others
  2. // Distributed under an MIT license: https://codemirror.net/LICENSE
  3. ;(function (mod) {
  4. if (typeof exports == 'object' && typeof module == 'object')
  5. // CommonJS
  6. mod(require('../../lib/codemirror'), 'cjs')
  7. else if (typeof define == 'function' && define.amd)
  8. // AMD
  9. define(['../../lib/codemirror'], function (CM) {
  10. mod(CM, 'amd')
  11. })
  12. // Plain browser env
  13. else mod(CodeMirror, 'plain')
  14. })(function (CodeMirror, env) {
  15. if (!CodeMirror.modeURL) CodeMirror.modeURL = '../mode/%N/%N.js'
  16. var loading = {}
  17. function splitCallback(cont, n) {
  18. var countDown = n
  19. return function () {
  20. if (--countDown == 0) cont()
  21. }
  22. }
  23. function ensureDeps(mode, cont, options) {
  24. var modeObj = CodeMirror.modes[mode],
  25. deps = modeObj && modeObj.dependencies
  26. if (!deps) return cont()
  27. var missing = []
  28. for (var i = 0; i < deps.length; ++i) {
  29. if (!CodeMirror.modes.hasOwnProperty(deps[i])) missing.push(deps[i])
  30. }
  31. if (!missing.length) return cont()
  32. var split = splitCallback(cont, missing.length)
  33. for (var i = 0; i < missing.length; ++i) CodeMirror.requireMode(missing[i], split, options)
  34. }
  35. CodeMirror.requireMode = function (mode, cont, options) {
  36. if (typeof mode != 'string') mode = mode.name
  37. if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont, options)
  38. if (loading.hasOwnProperty(mode)) return loading[mode].push(cont)
  39. var file = options && options.path ? options.path(mode) : CodeMirror.modeURL.replace(/%N/g, mode)
  40. if (options && options.loadMode) {
  41. options.loadMode(file, function () {
  42. ensureDeps(mode, cont, options)
  43. })
  44. } else if (env == 'plain') {
  45. var script = document.createElement('script')
  46. script.src = file
  47. var others = document.getElementsByTagName('script')[0]
  48. var list = (loading[mode] = [cont])
  49. CodeMirror.on(script, 'load', function () {
  50. ensureDeps(
  51. mode,
  52. function () {
  53. for (var i = 0; i < list.length; ++i) list[i]()
  54. },
  55. options
  56. )
  57. })
  58. others.parentNode.insertBefore(script, others)
  59. } else if (env == 'cjs') {
  60. require(file)
  61. cont()
  62. } else if (env == 'amd') {
  63. requirejs([file], cont)
  64. }
  65. }
  66. CodeMirror.autoLoadMode = function (instance, mode, options) {
  67. if (!CodeMirror.modes.hasOwnProperty(mode))
  68. CodeMirror.requireMode(
  69. mode,
  70. function () {
  71. instance.setOption('mode', instance.getOption('mode'))
  72. },
  73. options
  74. )
  75. }
  76. })