mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-09 22:49:57 +09:00
96 lines
3.2 KiB
JavaScript
96 lines
3.2 KiB
JavaScript
import CodeMirror from 'codemirror';
|
|
|
|
CodeMirror.defineMode('notebook', function (config, _parserConfig) {
|
|
const nullMode = CodeMirror.getMode(config, 'text/plain');
|
|
const python = CodeMirror.getMode(config, 'python');
|
|
const markdown = CodeMirror.getMode(config, 'markdown');
|
|
const latex = CodeMirror.getMode(config, 'text/x-latex');
|
|
const javascript = CodeMirror.getMode(config, 'javascript');
|
|
const modeMap = {
|
|
py: python,
|
|
md: markdown,
|
|
math: latex,
|
|
js: javascript,
|
|
};
|
|
return {
|
|
startState() {
|
|
return {
|
|
mode: python,
|
|
modeState: python.startState(),
|
|
chunkStart: false,
|
|
};
|
|
},
|
|
token(stream, state) {
|
|
if (stream.sol() && stream.match('%%')) {
|
|
stream.eatSpace();
|
|
state.chunkStart = true;
|
|
return 'keyword';
|
|
}
|
|
if (state.chunkStart) {
|
|
const m = stream.match(/[\w\-]+/);
|
|
const name = m && m[0];
|
|
const mode = (state.mode = modeMap[name] || nullMode);
|
|
state.modeState = mode.startState ? mode.startState() : null;
|
|
state.chunkStart = false;
|
|
return 'keyword';
|
|
}
|
|
const { mode, modeState } = state;
|
|
return mode.token(stream, modeState);
|
|
},
|
|
indent(state, textAfter, line) {
|
|
const { mode, modeState } = state;
|
|
if (mode.indent) return mode.indent(modeState, textAfter, line);
|
|
},
|
|
innerMode(state) {
|
|
const { mode, modeState } = state;
|
|
return { mode, state: modeState };
|
|
},
|
|
};
|
|
});
|
|
|
|
CodeMirror.defineMIME('text/x-notebook', 'notebook');
|
|
|
|
function selectBuffer(editor, buffers, name) {
|
|
var buf = buffers[name];
|
|
if (buf.getEditor()) buf = buf.linkedDoc({ sharedHist: true });
|
|
var old = editor.swapDoc(buf);
|
|
var linked = old.iterLinkedDocs(function (doc) {
|
|
linked = doc;
|
|
});
|
|
if (linked) {
|
|
// Make sure the document in buffers is the one the other view is looking at
|
|
for (var name in buffers)
|
|
if (buffers[name] == old) buffers[name] = linked;
|
|
old.unlinkDoc(linked);
|
|
}
|
|
editor.focus();
|
|
// console.log(editor.getValue());
|
|
}
|
|
|
|
function openBuffer(buffers, name, text, mode, buffersDropDown, buffersList) {
|
|
buffers[name] = CodeMirror.Doc(text, mode);
|
|
let opt = document.createElement('option');
|
|
opt.appendChild(document.createTextNode(name));
|
|
buffersDropDown.appendChild(opt);
|
|
|
|
let li = document.createElement('li');
|
|
li.appendChild(document.createTextNode(name));
|
|
li.dataset.language = name;
|
|
buffersList.appendChild(li);
|
|
}
|
|
|
|
function newBuf(buffers, buffersDropDown, buffersList, primaryEditor) {
|
|
let name = prompt('Name your tab', '*scratch*');
|
|
if (name == null) return;
|
|
if (buffers.hasOwnProperty(name)) {
|
|
alert("There's already a buffer by that name.");
|
|
return;
|
|
}
|
|
openBuffer(buffers, name, '', 'python', buffersDropDown, buffersList);
|
|
selectBuffer(primaryEditor, buffers, name);
|
|
let sel = buffersDropDown;
|
|
sel.value = name;
|
|
}
|
|
|
|
export { selectBuffer, openBuffer, newBuf };
|