2018-03-28 10:42:46 +08:00
|
|
|
import libraryLoader from "./library_loader.js";
|
2018-03-27 12:22:02 +08:00
|
|
|
import bundleService from "./bundle.js";
|
|
|
|
import infoService from "./info.js";
|
|
|
|
import server from "./server.js";
|
|
|
|
import noteDetailService from "./note_detail.js";
|
|
|
|
|
|
|
|
let codeEditor = null;
|
|
|
|
|
|
|
|
const $noteDetailCode = $('#note-detail-code');
|
|
|
|
const $executeScriptButton = $("#execute-script-button");
|
|
|
|
|
2018-03-28 09:46:38 +08:00
|
|
|
async function show() {
|
2018-04-08 03:56:46 +08:00
|
|
|
await libraryLoader.requireLibrary(libraryLoader.CODE_MIRROR);
|
2018-03-27 12:22:02 +08:00
|
|
|
|
2018-04-08 03:56:46 +08:00
|
|
|
if (!codeEditor) {
|
2018-03-27 12:22:02 +08:00
|
|
|
CodeMirror.keyMap.default["Shift-Tab"] = "indentLess";
|
|
|
|
CodeMirror.keyMap.default["Tab"] = "indentMore";
|
|
|
|
|
2018-04-09 00:17:42 +08:00
|
|
|
// these conflict with backward/forward navigation shortcuts
|
|
|
|
delete CodeMirror.keyMap.default["Alt-Left"];
|
|
|
|
delete CodeMirror.keyMap.default["Alt-Right"];
|
|
|
|
|
2018-03-27 12:22:02 +08:00
|
|
|
CodeMirror.modeURL = 'libraries/codemirror/mode/%N/%N.js';
|
|
|
|
|
2018-04-08 03:56:46 +08:00
|
|
|
codeEditor = CodeMirror($noteDetailCode[0], {
|
2018-03-27 12:22:02 +08:00
|
|
|
value: "",
|
|
|
|
viewportMargin: Infinity,
|
|
|
|
indentUnit: 4,
|
|
|
|
matchBrackets: true,
|
|
|
|
matchTags: {bothTags: true},
|
|
|
|
highlightSelectionMatches: {showToken: /\w/, annotateScrollbar: false},
|
|
|
|
lint: true,
|
|
|
|
gutters: ["CodeMirror-lint-markers"],
|
2018-04-12 10:44:33 +08:00
|
|
|
lineNumbers: true,
|
2018-08-13 15:07:21 +08:00
|
|
|
tabindex: 100
|
2018-03-27 12:22:02 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
codeEditor.on('change', noteDetailService.noteChanged);
|
|
|
|
}
|
|
|
|
|
|
|
|
$noteDetailCode.show();
|
|
|
|
|
|
|
|
const currentNote = noteDetailService.getCurrentNote();
|
|
|
|
|
2018-04-08 03:56:46 +08:00
|
|
|
// this needs to happen after the element is shown, otherwise the editor won't be refreshed
|
2018-03-27 12:22:02 +08:00
|
|
|
codeEditor.setValue(currentNote.content);
|
|
|
|
|
|
|
|
const info = CodeMirror.findModeByMIME(currentNote.mime);
|
|
|
|
|
|
|
|
if (info) {
|
|
|
|
codeEditor.setOption("mode", info.mime);
|
|
|
|
CodeMirror.autoLoadMode(codeEditor, info.mode);
|
|
|
|
}
|
|
|
|
|
|
|
|
codeEditor.refresh();
|
|
|
|
}
|
|
|
|
|
|
|
|
function getContent() {
|
|
|
|
return codeEditor.getValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
function focus() {
|
|
|
|
codeEditor.focus();
|
|
|
|
}
|
|
|
|
|
|
|
|
async function executeCurrentNote() {
|
2018-05-27 07:27:47 +08:00
|
|
|
// ctrl+enter is also used elsewhere so make sure we're running only when appropriate
|
|
|
|
if (noteDetailService.getCurrentNoteType() !== 'code') {
|
|
|
|
return;
|
|
|
|
}
|
2018-03-27 12:22:02 +08:00
|
|
|
|
2018-05-27 07:27:47 +08:00
|
|
|
// make sure note is saved so we load latest changes
|
|
|
|
await noteDetailService.saveNoteIfChanged();
|
2018-03-27 12:22:02 +08:00
|
|
|
|
2018-05-27 07:27:47 +08:00
|
|
|
const currentNote = noteDetailService.getCurrentNote();
|
2018-03-27 12:22:02 +08:00
|
|
|
|
2018-05-27 07:27:47 +08:00
|
|
|
if (currentNote.mime.endsWith("env=frontend")) {
|
2018-07-30 00:39:10 +08:00
|
|
|
await bundleService.getAndExecuteBundle(noteDetailService.getCurrentNoteId());
|
2018-05-27 07:27:47 +08:00
|
|
|
}
|
2018-03-27 12:22:02 +08:00
|
|
|
|
2018-05-27 07:27:47 +08:00
|
|
|
if (currentNote.mime.endsWith("env=backend")) {
|
|
|
|
await server.post('script/run/' + noteDetailService.getCurrentNoteId());
|
2018-03-27 12:22:02 +08:00
|
|
|
}
|
2018-05-27 07:27:47 +08:00
|
|
|
|
|
|
|
infoService.showMessage("Note executed");
|
2018-03-27 12:22:02 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
$(document).bind('keydown', "ctrl+return", executeCurrentNote);
|
|
|
|
|
|
|
|
$executeScriptButton.click(executeCurrentNote);
|
|
|
|
|
|
|
|
export default {
|
2018-03-28 09:46:38 +08:00
|
|
|
show,
|
2018-03-27 12:22:02 +08:00
|
|
|
getContent,
|
|
|
|
focus
|
|
|
|
}
|