editor.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. 'use strict';
  2. function addScript(data, callback) {
  3. function add(data) {
  4. var s = document.createElement('script');
  5. s.async = false;
  6. if(data.innerHTML) s.innerHTML = data.innerHTML;
  7. else if(data.src) s.src = data.src;
  8. s.onload = finish;
  9. document.body.appendChild(s);
  10. }
  11. function finish() {
  12. if(! -- count) callback();
  13. }
  14. if(!data.forEach) data = [data];
  15. var count = data.length;
  16. data.forEach(add);
  17. }
  18. function addCSS(data){
  19. function add(data){
  20. var s;
  21. if(data.html) {
  22. s = document.createElement('style');
  23. s.innerHTML = data.html;
  24. } else if(data.href) {
  25. s = document.createElement('link');
  26. s.rel = 'stylesheet';
  27. s.type = 'text/css';
  28. s.href = data.href;
  29. }
  30. if(s) document.head.appendChild(s);
  31. }
  32. if(!data.forEach) data = [data];
  33. data.forEach(add);
  34. }
  35. function initEditor(options){
  36. options = options || {};
  37. addCSS([
  38. {href: 'lib/CodeMirror/lib/codemirror.css'},
  39. {href: 'mylib/CodeMirror/fold.css'},
  40. {href: 'mylib/CodeMirror/search.css'},
  41. ]);
  42. addScript([
  43. {src: 'lib/CodeMirror/lib/codemirror.js'},
  44. {src: 'lib/CodeMirror/mode/javascript/javascript.js'},
  45. {src: 'lib/CodeMirror/addon/comment/continuecomment.js'},
  46. {src: 'lib/CodeMirror/addon/edit/matchbrackets.js'},
  47. {src: 'lib/CodeMirror/addon/edit/closebrackets.js'},
  48. {src: 'lib/CodeMirror/addon/fold/foldcode.js'},
  49. {src: 'lib/CodeMirror/addon/fold/foldgutter.js'},
  50. {src: 'lib/CodeMirror/addon/fold/brace-fold.js'},
  51. {src: 'lib/CodeMirror/addon/fold/comment-fold.js'},
  52. {src: 'lib/CodeMirror/addon/search/match-highlighter.js'},
  53. {src: 'lib/CodeMirror/addon/search/searchcursor.js'},
  54. {src: 'lib/CodeMirror/addon/selection/active-line.js'},
  55. {src: 'mylib/CodeMirror/search.js'},
  56. ], function(){
  57. CodeMirror.keyMap.vm = {'fallthrough': 'default'};
  58. if(options.onsave) {
  59. CodeMirror.keyMap.vm['Ctrl-S'] = 'save';
  60. CodeMirror.commands.save = options.onsave;
  61. }
  62. if(options.onexit) {
  63. CodeMirror.keyMap.vm['Esc'] = 'exit';
  64. CodeMirror.commands.exit = options.onexit;
  65. }
  66. var editor = CodeMirror(options.container, {
  67. continueComments: true,
  68. matchBrackets: true,
  69. autoCloseBrackets: true,
  70. highlightSelectionMatches: true,
  71. lineNumbers: true,
  72. mode: 'javascript',
  73. lineWrapping: true,
  74. indentUnit: 4,
  75. indentWithTabs: true,
  76. keyMap: 'vm',
  77. styleActiveLine: true,
  78. foldGutter: true,
  79. gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
  80. });
  81. editor.clearHistory = function() {
  82. this.getDoc().clearHistory();
  83. };
  84. editor.setValueAndFocus = function(value) {
  85. this.setValue(value);
  86. this.focus();
  87. };
  88. if(options.onchange) editor.on('change', options.onchange);
  89. if(options.readonly) editor.setOption('readOnly', options.readonly);
  90. if(options.callback) options.callback(editor);
  91. });
  92. }