114 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| window.common = (function(global) {
 | |
|   const {
 | |
|     Rx: { Subject, Observable },
 | |
|     CodeMirror,
 | |
|     emmetCodeMirror,
 | |
|     common = { init: [] }
 | |
|   } = global;
 | |
| 
 | |
|   const { challengeType = '0', challengeTypes } = common;
 | |
| 
 | |
|   if (
 | |
|     !CodeMirror ||
 | |
|     challengeType === challengeTypes.BASEJUMP ||
 | |
|     challengeType === challengeTypes.ZIPLINE ||
 | |
|     challengeType === challengeTypes.VIDEO ||
 | |
|     challengeType === challengeTypes.STEP ||
 | |
|     challengeType === challengeTypes.HIKES
 | |
|   ) {
 | |
|     common.editor = {};
 | |
|     return common;
 | |
|   }
 | |
| 
 | |
|   var editor = CodeMirror.fromTextArea(
 | |
|     document.getElementById('codeEditor'),
 | |
|     {
 | |
|       lint: true,
 | |
|       lineNumbers: true,
 | |
|       mode: 'javascript',
 | |
|       theme: 'monokai',
 | |
|       runnable: true,
 | |
|       matchBrackets: true,
 | |
|       autoCloseBrackets: true,
 | |
|       scrollbarStyle: 'null',
 | |
|       lineWrapping: true,
 | |
|       gutters: ['CodeMirror-lint-markers']
 | |
|     }
 | |
|   );
 | |
| 
 | |
|   editor.setSize('100%', 'auto');
 | |
| 
 | |
|   common.editorExecute$ = new Subject();
 | |
|   common.editorKeyUp$ = Observable.fromEventPattern(
 | |
|     (handler) => editor.on('keyup', handler),
 | |
|     (handler) => editor.off('keyup', handler)
 | |
|   );
 | |
| 
 | |
|   editor.setOption('extraKeys', {
 | |
|     Tab: function(cm) {
 | |
|       if (cm.somethingSelected()) {
 | |
|         cm.indentSelection('add');
 | |
|       } else {
 | |
|         var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');
 | |
|         cm.replaceSelection(spaces);
 | |
|       }
 | |
|     },
 | |
|     'Shift-Tab': function(cm) {
 | |
|       if (cm.somethingSelected()) {
 | |
|         cm.indentSelection('subtract');
 | |
|       } else {
 | |
|         var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');
 | |
|         cm.replaceSelection(spaces);
 | |
|       }
 | |
|     },
 | |
|     'Ctrl-Enter': function() {
 | |
|       common.editorExecute$.onNext();
 | |
|       return false;
 | |
|     },
 | |
|     'Cmd-Enter': function() {
 | |
|       common.editorExecute$.onNext();
 | |
|       return false;
 | |
|     }
 | |
|   });
 | |
| 
 | |
| 
 | |
|   var info = editor.getScrollInfo();
 | |
| 
 | |
|   var after = editor.charCoords({
 | |
|     line: editor.getCursor().line + 1,
 | |
|     ch: 0
 | |
|   }, 'local').top;
 | |
| 
 | |
|   if (info.top + info.clientHeight < after) {
 | |
|     editor.scrollTo(null, after - info.clientHeight + 3);
 | |
|   }
 | |
| 
 | |
|   if (emmetCodeMirror) {
 | |
|     emmetCodeMirror(
 | |
|       editor,
 | |
|       {
 | |
|         'Cmd-E': 'emmet.expand_abbreviation',
 | |
|         Tab: 'emmet.expand_abbreviation_with_tab',
 | |
|         Enter: 'emmet.insert_formatted_line_break_only'
 | |
|       }
 | |
|     );
 | |
|   }
 | |
|   common.init.push(function() {
 | |
|     let editorValue;
 | |
|     if (common.codeUri.isAlive()) {
 | |
|       editorValue = common.codeUri.parse();
 | |
|     } else {
 | |
|       editorValue = common.codeStorage.isAlive(common.challengeName) ?
 | |
|         common.codeStorage.getStoredValue(common.challengeName) :
 | |
|         common.seed;
 | |
|     }
 | |
| 
 | |
|     editor.setValue(common.replaceSafeTags(editorValue));
 | |
|     editor.refresh();
 | |
|   });
 | |
| 
 | |
|   common.editor = editor;
 | |
| 
 | |
|   return common;
 | |
| }(window));
 |