]>
Commit | Line | Data |
---|---|---|
1 | (function() { | |
2 | if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js"; | |
3 | ||
4 | var loading = {}; | |
5 | function splitCallback(cont, n) { | |
6 | var countDown = n; | |
7 | return function() { if (--countDown == 0) cont(); }; | |
8 | } | |
9 | function ensureDeps(mode, cont) { | |
10 | var deps = CodeMirror.modes[mode].dependencies; | |
11 | if (!deps) return cont(); | |
12 | var missing = []; | |
13 | for (var i = 0; i < deps.length; ++i) { | |
14 | if (!CodeMirror.modes.hasOwnProperty(deps[i])) | |
15 | missing.push(deps[i]); | |
16 | } | |
17 | if (!missing.length) return cont(); | |
18 | var split = splitCallback(cont, missing.length); | |
19 | for (var i = 0; i < missing.length; ++i) | |
20 | CodeMirror.requireMode(missing[i], split); | |
21 | } | |
22 | ||
23 | CodeMirror.requireMode = function(mode, cont) { | |
24 | if (typeof mode != "string") mode = mode.name; | |
25 | if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); | |
26 | if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); | |
27 | ||
28 | var script = document.createElement("script"); | |
29 | script.src = CodeMirror.modeURL.replace(/%N/g, mode); | |
30 | var others = document.getElementsByTagName("script")[0]; | |
31 | others.parentNode.insertBefore(script, others); | |
32 | var list = loading[mode] = [cont]; | |
33 | var count = 0, poll = setInterval(function() { | |
34 | if (++count > 100) return clearInterval(poll); | |
35 | if (CodeMirror.modes.hasOwnProperty(mode)) { | |
36 | clearInterval(poll); | |
37 | loading[mode] = null; | |
38 | ensureDeps(mode, function() { | |
39 | for (var i = 0; i < list.length; ++i) list[i](); | |
40 | }); | |
41 | } | |
42 | }, 200); | |
43 | }; | |
44 | ||
45 | CodeMirror.autoLoadMode = function(instance, mode) { | |
46 | if (!CodeMirror.modes.hasOwnProperty(mode)) | |
47 | CodeMirror.requireMode(mode, function() { | |
48 | instance.setOption("mode", instance.getOption("mode")); | |
49 | }); | |
50 | }; | |
51 | }()); |