2015-11-13 19:10:23 +00:00
|
|
|
window.common = (function(global) {
|
|
|
|
const {
|
2015-11-20 01:27:05 +00:00
|
|
|
Rx: { Subject, Observable },
|
2015-11-13 19:10:23 +00:00
|
|
|
CodeMirror,
|
|
|
|
emmetCodeMirror,
|
|
|
|
common = { init: [] }
|
|
|
|
} = global;
|
|
|
|
|
2015-11-20 01:27:05 +00:00
|
|
|
const { challengeType = '0', challengeTypes } = common;
|
2015-11-18 05:25:16 +00:00
|
|
|
|
|
|
|
if (
|
|
|
|
!CodeMirror ||
|
2015-11-20 05:51:38 +00:00
|
|
|
challengeType === challengeTypes.BASEJUMP ||
|
2015-11-20 01:27:05 +00:00
|
|
|
challengeType === challengeTypes.ZIPLINE ||
|
|
|
|
challengeType === challengeTypes.VIDEO ||
|
|
|
|
challengeType === challengeTypes.STEP ||
|
|
|
|
challengeType === challengeTypes.HIKES
|
2015-11-18 05:25:16 +00:00
|
|
|
) {
|
|
|
|
common.editor = {};
|
|
|
|
return common;
|
2015-11-13 19:10:23 +00:00
|
|
|
}
|
|
|
|
|
2015-11-18 05:25:16 +00:00
|
|
|
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']
|
|
|
|
}
|
|
|
|
);
|
2015-11-13 19:10:23 +00:00
|
|
|
|
|
|
|
editor.setSize('100%', 'auto');
|
|
|
|
|
2015-11-22 04:30:30 +00:00
|
|
|
common.editorExecute$ = new Subject();
|
2015-11-20 01:27:05 +00:00
|
|
|
common.editorKeyUp$ = Observable.fromEventPattern(
|
2015-11-22 04:30:30 +00:00
|
|
|
(handler) => editor.on('keyup', handler),
|
|
|
|
(handler) => editor.off('keyup', handler)
|
2015-11-20 01:27:05 +00:00
|
|
|
);
|
2015-11-13 19:10:23 +00:00
|
|
|
|
|
|
|
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() {
|
2015-11-20 01:27:05 +00:00
|
|
|
common.editorExecute$.onNext();
|
2015-11-13 19:10:23 +00:00
|
|
|
return false;
|
|
|
|
},
|
|
|
|
'Cmd-Enter': function() {
|
2015-11-20 01:27:05 +00:00
|
|
|
common.editorExecute$.onNext();
|
2015-11-13 19:10:23 +00:00
|
|
|
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() {
|
2015-11-20 01:27:05 +00:00
|
|
|
let editorValue;
|
2015-11-13 19:10:23 +00:00
|
|
|
if (common.codeUri.isAlive()) {
|
|
|
|
editorValue = common.codeUri.parse();
|
|
|
|
} else {
|
2015-11-22 04:30:30 +00:00
|
|
|
editorValue = common.codeStorage.isAlive(common.challengeName) ?
|
|
|
|
common.codeStorage.getStoredValue(common.challengeName) :
|
2015-11-13 19:10:23 +00:00
|
|
|
common.seed;
|
|
|
|
}
|
|
|
|
|
|
|
|
editor.setValue(common.replaceSafeTags(editorValue));
|
|
|
|
editor.refresh();
|
|
|
|
});
|
|
|
|
|
|
|
|
common.editor = editor;
|
|
|
|
|
|
|
|
return common;
|
|
|
|
}(window));
|