CodeMirror 6.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4767 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
parent
24e418344e
commit
f72e8cbd91
@ -1,5 +1,6 @@
|
|||||||
import {LitElement, html, css, svg} from '/static/lit/lit-all.min.js';
|
import {LitElement, html, css, svg} from '/static/lit/lit-all.min.js';
|
||||||
|
|
||||||
|
let cm6;
|
||||||
let gSocket;
|
let gSocket;
|
||||||
|
|
||||||
let gCurrentFile;
|
let gCurrentFile;
|
||||||
@ -201,7 +202,7 @@ class TfFilesElement extends LitElement {
|
|||||||
let buffer = await file.arrayBuffer();
|
let buffer = await file.arrayBuffer();
|
||||||
let text = new TextDecoder('latin1').decode(buffer);
|
let text = new TextDecoder('latin1').decode(buffer);
|
||||||
gFiles[file.name] = {
|
gFiles[file.name] = {
|
||||||
doc: new CodeMirror.Doc(text, guessMode(file.name)),
|
doc: new cm6.EditorState.create({doc: text, extensions: cm6.extensions}),
|
||||||
buffer: buffer,
|
buffer: buffer,
|
||||||
generation: -1,
|
generation: -1,
|
||||||
isNew: true,
|
isNew: true,
|
||||||
@ -435,7 +436,7 @@ function is_edit_only() {
|
|||||||
return window.location.search == '?editonly=1' || window.innerWidth < 1024;
|
return window.location.search == '?editonly=1' || window.innerWidth < 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
function edit() {
|
async function edit() {
|
||||||
if (editing()) {
|
if (editing()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -444,33 +445,15 @@ function edit() {
|
|||||||
document.getElementById("editPane").style.display = 'flex';
|
document.getElementById("editPane").style.display = 'flex';
|
||||||
document.getElementById('viewPane').style.display = is_edit_only() ? 'none' : 'flex';
|
document.getElementById('viewPane').style.display = is_edit_only() ? 'none' : 'flex';
|
||||||
|
|
||||||
ensureLoaded([
|
try {
|
||||||
{tagName: "script", attributes: {src: "/codemirror/codemirror.min.js"}},
|
cm6 = await import('/codemirror/cm6.js');
|
||||||
{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/base16-dark.min.css"}},
|
gEditor = cm6.TildeFriendsEditorView(document.getElementById("editor"));
|
||||||
{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/matchesonscrollbar.min.css"}},
|
gEditor.onDocChange = updateFiles;
|
||||||
{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/dialog.min.css"}},
|
await load();
|
||||||
{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/codemirror.min.css"}},
|
} catch (error) {
|
||||||
{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/lint.css"}},
|
alert(`${error.message}\n\n${error.stack}`);
|
||||||
{tagName: "script", attributes: {src: "/codemirror/trailingspace.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/dialog.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/search.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/searchcursor.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/jump-to-line.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/matchesonscrollbar.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/annotatescrollbar.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/javascript.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/css.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/xml.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/htmlmixed.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/lint.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/jshint.min.js"}},
|
|
||||||
{tagName: "script", attributes: {src: "/codemirror/javascript-lint.min.js"}},
|
|
||||||
], function() {
|
|
||||||
load().catch(function(error) {
|
|
||||||
alert(error);
|
|
||||||
closeEditor();
|
closeEditor();
|
||||||
});
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function trace() {
|
function trace() {
|
||||||
@ -491,15 +474,16 @@ function loadFile(name, id) {
|
|||||||
}
|
}
|
||||||
return response.text();
|
return response.text();
|
||||||
}).then(function(text) {
|
}).then(function(text) {
|
||||||
gFiles[name].doc = new CodeMirror.Doc(text, guessMode(name));
|
gFiles[name].doc = cm6.EditorState.create({doc: text, extensions: cm6.extensions});
|
||||||
|
gFiles[name].original = gFiles[name].doc.doc.toString();
|
||||||
if (!Object.values(gFiles).some(x => !x.doc)) {
|
if (!Object.values(gFiles).some(x => !x.doc)) {
|
||||||
openFile(Object.keys(gFiles).sort()[0]);
|
openFile(Object.keys(gFiles).sort()[0]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function load(path) {
|
async function load(path) {
|
||||||
return fetch((path || url()) + 'view').then(function(response) {
|
let response = await fetch((path || url()) + 'view');
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
if (response.status == 404) {
|
if (response.status == 404) {
|
||||||
return null;
|
return null;
|
||||||
@ -507,29 +491,7 @@ function load(path) {
|
|||||||
throw new Error(response.status + ' ' + response.statusText);
|
throw new Error(response.status + ' ' + response.statusText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return response.json();
|
let json = await response.json();
|
||||||
}).then(function(json) {
|
|
||||||
if (!gEditor) {
|
|
||||||
gEditor = CodeMirror.fromTextArea(document.getElementById("editor"), {
|
|
||||||
'theme': 'base16-dark',
|
|
||||||
'lineNumbers': true,
|
|
||||||
'tabSize': 4,
|
|
||||||
'indentUnit': 4,
|
|
||||||
'indentWithTabs': true,
|
|
||||||
'showTrailingSpace': true,
|
|
||||||
'gutters': ['CodeMirror-lint-markers'],
|
|
||||||
'mode': {'js': 'javascript'}[(path || url()).split('.').pop()],
|
|
||||||
'lint': {
|
|
||||||
'options': {
|
|
||||||
esversion: 2021,
|
|
||||||
varstmt: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
gEditor.on('changes', function() {
|
|
||||||
updateFiles();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
gFiles = {};
|
gFiles = {};
|
||||||
let isApp = false;
|
let isApp = false;
|
||||||
let promises = [];
|
let promises = [];
|
||||||
@ -552,12 +514,11 @@ function load(path) {
|
|||||||
let text = '// New script.\n';
|
let text = '// New script.\n';
|
||||||
gCurrentFile = 'app.js';
|
gCurrentFile = 'app.js';
|
||||||
gFiles[gCurrentFile] = {
|
gFiles[gCurrentFile] = {
|
||||||
doc: new CodeMirror.Doc(text, guessMode(gCurrentFile)),
|
doc: cm6.EditorState.create({doc: text, extensions: cm6.extensions}),
|
||||||
};
|
};
|
||||||
openFile(gCurrentFile);
|
openFile(gCurrentFile);
|
||||||
}
|
}
|
||||||
return Promise.all(promises);
|
return Promise.all(promises);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeEditor() {
|
function closeEditor() {
|
||||||
@ -573,8 +534,8 @@ function explodePath() {
|
|||||||
function save(save_to) {
|
function save(save_to) {
|
||||||
document.getElementById("save").disabled = true;
|
document.getElementById("save").disabled = true;
|
||||||
if (gCurrentFile) {
|
if (gCurrentFile) {
|
||||||
gFiles[gCurrentFile].doc = gEditor.getDoc();
|
gFiles[gCurrentFile].doc = gEditor.state;
|
||||||
if (!gFiles[gCurrentFile].isNew && !gFiles[gCurrentFile].doc.isClean(gFiles[gCurrentFile].doc.changeGeneration())) {
|
if (!gFiles[gCurrentFile].isNew && !gFiles[gCurrentFile].doc.doc.toString() == gFiles[gCurrentFile].original) {
|
||||||
delete gFiles[gCurrentFile].buffer;
|
delete gFiles[gCurrentFile].buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -592,7 +553,7 @@ function save(save_to) {
|
|||||||
let promises = [];
|
let promises = [];
|
||||||
for (let name of Object.keys(gFiles)) {
|
for (let name of Object.keys(gFiles)) {
|
||||||
let file = gFiles[name];
|
let file = gFiles[name];
|
||||||
if (!file.isNew && file.doc.isClean(file.generation)) {
|
if (!file.isNew && file.doc.doc.toString() == file.original) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -603,7 +564,7 @@ function save(save_to) {
|
|||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/binary',
|
'Content-Type': 'application/binary',
|
||||||
},
|
},
|
||||||
body: file.buffer ?? file.doc.getValue(),
|
body: file.buffer ?? file.doc.doc.toString(),
|
||||||
}).then(function(response) {
|
}).then(function(response) {
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error('Saving "' + name + '": ' + response.status + ' ' + response.statusText);
|
throw new Error('Saving "' + name + '": ' + response.status + ' ' + response.statusText);
|
||||||
@ -648,7 +609,7 @@ function save(save_to) {
|
|||||||
}).finally(function() {
|
}).finally(function() {
|
||||||
document.getElementById("save").disabled = false;
|
document.getElementById("save").disabled = false;
|
||||||
Object.values(gFiles).forEach(function(file) {
|
Object.values(gFiles).forEach(function(file) {
|
||||||
file.generation = file.doc.changeGeneration();
|
file.original = file.doc.doc.toString();
|
||||||
});
|
});
|
||||||
updateFiles();
|
updateFiles();
|
||||||
});
|
});
|
||||||
@ -1029,11 +990,13 @@ function connectSocket(path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function openFile(name) {
|
function openFile(name) {
|
||||||
let newDoc = (name && gFiles[name]) ? gFiles[name].doc : new CodeMirror.Doc("", guessMode(name));
|
let newDoc = (name && gFiles[name]) ? gFiles[name].doc : cm6.EditorState.create({doc: "", extensions: cm6.extensions});
|
||||||
let oldDoc = gEditor.swapDoc(newDoc);
|
let oldDoc = gEditor.state;
|
||||||
|
gEditor.setState(newDoc);
|
||||||
|
|
||||||
if (gFiles[gCurrentFile]) {
|
if (gFiles[gCurrentFile]) {
|
||||||
gFiles[gCurrentFile].doc = oldDoc;
|
gFiles[gCurrentFile].doc = oldDoc;
|
||||||
if (!gFiles[gCurrentFile].isNew && gFiles[gCurrentFile].doc.isClean(oldDoc.generation)) {
|
if (!gFiles[gCurrentFile].isNew && gFiles[gCurrentFile].doc.doc.toString() == oldDoc.doc.toString()) {
|
||||||
delete gFiles[gCurrentFile].buffer;
|
delete gFiles[gCurrentFile].buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1046,7 +1009,7 @@ function updateFiles() {
|
|||||||
let files = document.getElementsByTagName("tf-files-pane")[0];
|
let files = document.getElementsByTagName("tf-files-pane")[0];
|
||||||
if (files) {
|
if (files) {
|
||||||
files.files = Object.fromEntries(Object.keys(gFiles).map(file => [file, {
|
files.files = Object.fromEntries(Object.keys(gFiles).map(file => [file, {
|
||||||
clean: gFiles[file].doc.isClean(gFiles[file].generation),
|
clean: (file == gCurrentFile ? gEditor.state.doc.toString() : gFiles[file].doc.doc.toString()) == gFiles[file].original,
|
||||||
}]));
|
}]));
|
||||||
files.current = gCurrentFile;
|
files.current = gCurrentFile;
|
||||||
}
|
}
|
||||||
@ -1055,7 +1018,7 @@ function updateFiles() {
|
|||||||
|
|
||||||
function makeNewFile(name) {
|
function makeNewFile(name) {
|
||||||
gFiles[name] = {
|
gFiles[name] = {
|
||||||
doc: new CodeMirror.Doc("", guessMode(name)),
|
doc: cm6.EditorState.create({extensions: cm6.extensions}),
|
||||||
generation: -1,
|
generation: -1,
|
||||||
};
|
};
|
||||||
openFile(name);
|
openFile(name);
|
||||||
|
@ -27,11 +27,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="hbox" style="height: 100%">
|
<div class="hbox" style="height: 100%">
|
||||||
<tf-files-pane></tf-files-pane>
|
<tf-files-pane></tf-files-pane>
|
||||||
<div id="docPane" style="display: flex; flex: 1 1 50%; flex-flow: column">
|
<div style="display: flex; flex: 1 1 50%; flex-flow: column" id="editor"></div>
|
||||||
<div style="flex: 1 1 50%; position: relative">
|
|
||||||
<textarea id="editor" class="main"></textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="viewPane" class="vbox" style="flex: 1 1; overflow: auto">
|
<div id="viewPane" class="vbox" style="flex: 1 1; overflow: auto">
|
||||||
|
@ -64,14 +64,8 @@ a:active {
|
|||||||
color: #eee8d5;
|
color: #eee8d5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.CodeMirror {
|
.cm-editor {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
padding: 0;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
position: absolute;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.cm-tab {
|
.cm-tab {
|
||||||
|
1
deps/codemirror/annotatescrollbar.min.js
vendored
1
deps/codemirror/annotatescrollbar.min.js
vendored
@ -1 +0,0 @@
|
|||||||
!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(t){"use strict";function e(t,e){function i(t){clearTimeout(n.doRedraw),n.doRedraw=setTimeout(function(){n.redraw()},t)}this.cm=t,this.options=e,this.buttonHeight=e.scrollButtonHeight||t.getOption("scrollButtonHeight"),this.annotations=[],this.doRedraw=this.doUpdate=null,this.div=t.getWrapperElement().appendChild(document.createElement("div")),this.div.style.cssText="position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none",this.computeScale();var n=this;t.on("refresh",this.resizeHandler=function(){clearTimeout(n.doUpdate),n.doUpdate=setTimeout(function(){n.computeScale()&&i(20)},100)}),t.on("markerAdded",this.resizeHandler),t.on("markerCleared",this.resizeHandler),!1!==e.listenForChanges&&t.on("changes",this.changeHandler=function(){i(250)})}t.defineExtension("annotateScrollbar",function(t){return new e(this,t="string"==typeof t?{className:t}:t)}),t.defineOption("scrollButtonHeight",0),e.prototype.computeScale=function(){var t=this.cm,t=(t.getWrapperElement().clientHeight-t.display.barHeight-2*this.buttonHeight)/t.getScrollerElement().scrollHeight;if(t!=this.hScale)return this.hScale=t,!0},e.prototype.update=function(t){this.annotations=t,this.redraw()},e.prototype.redraw=function(t){!1!==t&&this.computeScale();var n=this.cm,e=this.hScale,i=document.createDocumentFragment(),o=this.annotations,r=n.getOption("lineWrapping"),a=r&&1.5*n.defaultTextHeight(),s=null,h=null;function l(t,e){var i;return s!=t.line&&(s=t.line,h=n.getLineHandle(t.line),(i=n.getLineHandleVisualStart(h))!=h&&(s=n.getLineNumber(i),h=i)),h.widgets&&h.widgets.length||r&&h.height>a?n.charCoords(t,"local")[e?"top":"bottom"]:n.heightAtLine(h,"local")+(e?0:h.height)}var d=n.lastLine();if(n.display.barWidth)for(var c,p=0;p<o.length;p++){var u=o[p];if(!(u.to.line>d)){for(var m,f,g=c||l(u.from,!0)*e,H=l(u.to,!1)*e;p<o.length-1&&!(o[p+1].to.line>d)&&!(H+.9<(c=l(o[p+1].from,!0)*e));)H=l((u=o[++p]).to,!1)*e;H!=g&&(m=Math.max(H-g,3),(f=i.appendChild(document.createElement("div"))).style.cssText="position: absolute; right: 0px; width: "+Math.max(n.display.barWidth-1,2)+"px; top: "+(g+this.buttonHeight)+"px; height: "+m+"px",f.className=this.options.className,u.id&&f.setAttribute("annotation-id",u.id))}}this.div.textContent="",this.div.appendChild(i)},e.prototype.clear=function(){this.cm.off("refresh",this.resizeHandler),this.cm.off("markerAdded",this.resizeHandler),this.cm.off("markerCleared",this.resizeHandler),this.changeHandler&&this.cm.off("changes",this.changeHandler),this.div.parentNode.removeChild(this.div)}});
|
|
1
deps/codemirror/base16-dark.min.css
vendored
1
deps/codemirror/base16-dark.min.css
vendored
@ -1 +0,0 @@
|
|||||||
.cm-s-base16-dark.CodeMirror{background:#151515;color:#e0e0e0}.cm-s-base16-dark div.CodeMirror-selected{background:#303030}.cm-s-base16-dark .CodeMirror-line::selection,.cm-s-base16-dark .CodeMirror-line>span::selection,.cm-s-base16-dark .CodeMirror-line>span>span::selection{background:rgba(48,48,48,.99)}.cm-s-base16-dark .CodeMirror-line::-moz-selection,.cm-s-base16-dark .CodeMirror-line>span::-moz-selection,.cm-s-base16-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(48,48,48,.99)}.cm-s-base16-dark .CodeMirror-gutters{background:#151515;border-right:0}.cm-s-base16-dark .CodeMirror-guttermarker{color:#ac4142}.cm-s-base16-dark .CodeMirror-guttermarker-subtle{color:#505050}.cm-s-base16-dark .CodeMirror-linenumber{color:#505050}.cm-s-base16-dark .CodeMirror-cursor{border-left:1px solid #b0b0b0}.cm-s-base16-dark.cm-fat-cursor .CodeMirror-cursor{background-color:#8e8d8875!important}.cm-s-base16-dark .cm-animate-fat-cursor{background-color:#8e8d8875!important}.cm-s-base16-dark span.cm-comment{color:#8f5536}.cm-s-base16-dark span.cm-atom{color:#aa759f}.cm-s-base16-dark span.cm-number{color:#aa759f}.cm-s-base16-dark span.cm-attribute,.cm-s-base16-dark span.cm-property{color:#90a959}.cm-s-base16-dark span.cm-keyword{color:#ac4142}.cm-s-base16-dark span.cm-string{color:#f4bf75}.cm-s-base16-dark span.cm-variable{color:#90a959}.cm-s-base16-dark span.cm-variable-2{color:#6a9fb5}.cm-s-base16-dark span.cm-def{color:#d28445}.cm-s-base16-dark span.cm-bracket{color:#e0e0e0}.cm-s-base16-dark span.cm-tag{color:#ac4142}.cm-s-base16-dark span.cm-link{color:#aa759f}.cm-s-base16-dark span.cm-error{background:#ac4142;color:#b0b0b0}.cm-s-base16-dark .CodeMirror-activeline-background{background:#202020}.cm-s-base16-dark .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}
|
|
1
deps/codemirror/cm6.js
vendored
Normal file
1
deps/codemirror/cm6.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
deps/codemirror/codemirror.min.css
vendored
1
deps/codemirror/codemirror.min.css
vendored
File diff suppressed because one or more lines are too long
1
deps/codemirror/codemirror.min.js
vendored
1
deps/codemirror/codemirror.min.js
vendored
File diff suppressed because one or more lines are too long
1
deps/codemirror/css.min.js
vendored
1
deps/codemirror/css.min.js
vendored
File diff suppressed because one or more lines are too long
1
deps/codemirror/dialog.min.css
vendored
1
deps/codemirror/dialog.min.css
vendored
@ -1 +0,0 @@
|
|||||||
.CodeMirror-dialog{position:absolute;left:0;right:0;background:inherit;z-index:15;padding:.1em .8em;overflow:hidden;color:inherit}.CodeMirror-dialog-top{border-bottom:1px solid #eee;top:0}.CodeMirror-dialog-bottom{border-top:1px solid #eee;bottom:0}.CodeMirror-dialog input{border:none;outline:0;background:0 0;width:20em;color:inherit;font-family:monospace}.CodeMirror-dialog button{font-size:70%}
|
|
1
deps/codemirror/dialog.min.js
vendored
1
deps/codemirror/dialog.min.js
vendored
@ -1 +0,0 @@
|
|||||||
!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(s){function f(e,o,n){var e=e.getWrapperElement(),t=e.appendChild(document.createElement("div"));return t.className=n?"CodeMirror-dialog CodeMirror-dialog-bottom":"CodeMirror-dialog CodeMirror-dialog-top","string"==typeof o?t.innerHTML=o:t.appendChild(o),s.addClass(e,"dialog-opened"),t}function p(e,o){e.state.currentNotificationClose&&e.state.currentNotificationClose(),e.state.currentNotificationClose=o}s.defineExtension("openDialog",function(e,o,n){n=n||{},p(this,null);var t=f(this,e,n.bottom),i=!1,r=this;function u(e){"string"==typeof e?l.value=e:i||(i=!0,s.rmClass(t.parentNode,"dialog-opened"),t.parentNode.removeChild(t),r.focus(),n.onClose&&n.onClose(t))}var l=t.getElementsByTagName("input")[0];return l?(l.focus(),n.value&&(l.value=n.value,!1!==n.selectValueOnOpen&&l.select()),n.onInput&&s.on(l,"input",function(e){n.onInput(e,l.value,u)}),n.onKeyUp&&s.on(l,"keyup",function(e){n.onKeyUp(e,l.value,u)}),s.on(l,"keydown",function(e){n&&n.onKeyDown&&n.onKeyDown(e,l.value,u)||((27==e.keyCode||!1!==n.closeOnEnter&&13==e.keyCode)&&(l.blur(),s.e_stop(e),u()),13==e.keyCode&&o(l.value,e))}),!1!==n.closeOnBlur&&s.on(t,"focusout",function(e){null!==e.relatedTarget&&u()})):(e=t.getElementsByTagName("button")[0])&&(s.on(e,"click",function(){u(),r.focus()}),!1!==n.closeOnBlur&&s.on(e,"blur",u),e.focus()),u}),s.defineExtension("openConfirm",function(e,o,n){p(this,null);var t=f(this,e,n&&n.bottom),i=t.getElementsByTagName("button"),r=!1,u=this,l=1;function a(){r||(r=!0,s.rmClass(t.parentNode,"dialog-opened"),t.parentNode.removeChild(t),u.focus())}i[0].focus();for(var c=0;c<i.length;++c){var d=i[c];!function(o){s.on(d,"click",function(e){s.e_preventDefault(e),a(),o&&o(u)})}(o[c]),s.on(d,"blur",function(){--l,setTimeout(function(){l<=0&&a()},200)}),s.on(d,"focus",function(){++l})}}),s.defineExtension("openNotification",function(e,o){p(this,r);var n,t=f(this,e,o&&o.bottom),i=!1,e=o&&void 0!==o.duration?o.duration:5e3;function r(){i||(i=!0,clearTimeout(n),s.rmClass(t.parentNode,"dialog-opened"),t.parentNode.removeChild(t))}return s.on(t,"click",function(e){s.e_preventDefault(e),r()}),e&&(n=setTimeout(r,e)),r})});
|
|
1
deps/codemirror/htmlmixed.min.js
vendored
1
deps/codemirror/htmlmixed.min.js
vendored
@ -1 +0,0 @@
|
|||||||
!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("../xml/xml"),require("../javascript/javascript"),require("../css/css")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../xml/xml","../javascript/javascript","../css/css"],t):t(CodeMirror)}(function(m){"use strict";var l={script:[["lang",/(javascript|babel)/i,"javascript"],["type",/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i,"javascript"],["type",/./,"text/plain"],[null,null,"javascript"]],style:[["lang",/^css$/i,"css"],["type",/^(text\/)?(x-)?(stylesheet|css)$/i,"css"],["type",/./,"text/plain"],[null,null,"css"]]};var a={};function d(t,e){e=t.match(a[t=e]||(a[t]=new RegExp("\\s+"+t+"\\s*=\\s*('|\")?([^'\"]+)('|\")?\\s*")));return e?/^\s*(.*?)\s*$/.exec(e[2])[1]:""}function g(t,e){return new RegExp((e?"^":"")+"</\\s*"+t+"\\s*>","i")}function o(t,e){for(var a in t)for(var n=e[a]||(e[a]=[]),l=t[a],o=l.length-1;0<=o;o--)n.unshift(l[o])}m.defineMode("htmlmixed",function(i,t){var c=m.getMode(i,{name:"xml",htmlMode:!0,multilineTagIndentFactor:t.multilineTagIndentFactor,multilineTagIndentPastTag:t.multilineTagIndentPastTag,allowMissingTagName:t.allowMissingTagName}),s={},e=t&&t.tags,a=t&&t.scriptTypes;if(o(l,s),e&&o(e,s),a)for(var n=a.length-1;0<=n;n--)s.script.unshift(["type",a[n].matches,a[n].mode]);function u(t,e){var a,o,r,n=c.token(t,e.htmlState),l=/\btag\b/.test(n);return l&&!/[<>\s\/]/.test(t.current())&&(a=e.htmlState.tagName&&e.htmlState.tagName.toLowerCase())&&s.hasOwnProperty(a)?e.inTag=a+" ":e.inTag&&l&&/>$/.test(t.current())?(a=/^([\S]+) (.*)/.exec(e.inTag),e.inTag=null,l=">"==t.current()&&function(t,e){for(var a=0;a<t.length;a++){var n=t[a];if(!n[0]||n[1].test(d(e,n[0])))return n[2]}}(s[a[1]],a[2]),l=m.getMode(i,l),o=g(a[1],!0),r=g(a[1],!1),e.token=function(t,e){return t.match(o,!1)?(e.token=u,e.localState=e.localMode=null):(a=t,n=r,t=e.localMode.token(t,e.localState),e=a.current(),-1<(l=e.search(n))?a.backUp(e.length-l):e.match(/<\/?$/)&&(a.backUp(e.length),a.match(n,!1)||a.match(e)),t);var a,n,l},e.localMode=l,e.localState=m.startState(l,c.indent(e.htmlState,"",""))):e.inTag&&(e.inTag+=t.current(),t.eol()&&(e.inTag+=" ")),n}return{startState:function(){return{token:u,inTag:null,localMode:null,localState:null,htmlState:m.startState(c)}},copyState:function(t){var e;return t.localState&&(e=m.copyState(t.localMode,t.localState)),{token:t.token,inTag:t.inTag,localMode:t.localMode,localState:e,htmlState:m.copyState(c,t.htmlState)}},token:function(t,e){return e.token(t,e)},indent:function(t,e,a){return!t.localMode||/^\s*<\//.test(e)?c.indent(t.htmlState,e,a):t.localMode.indent?t.localMode.indent(t.localState,e,a):m.Pass},innerMode:function(t){return{state:t.localState||t.htmlState,mode:t.localMode||c}}}},"xml","javascript","css"),m.defineMIME("text/html","htmlmixed")});
|
|
1
deps/codemirror/javascript-lint.min.js
vendored
1
deps/codemirror/javascript-lint.min.js
vendored
@ -1 +0,0 @@
|
|||||||
!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(a){"use strict";a.registerHelper("lint","javascript",function(e,r){if(!window.JSHINT)return window.console&&window.console.error("Error: window.JSHINT not defined, CodeMirror JavaScript linting cannot run."),[];if(r.indent||(r.indent=1),JSHINT(e,r,r.globals),e=JSHINT.data().errors,r=[],e)for(var n=e,o=r,i=0;i<n.length;i++){var t,d,s,c=n[i];c&&(c.line<=0?window.console&&window.console.warn("Cannot display JSHint error (invalid line "+c.line+")",c):(t=c.character-1,d=1+t,c.evidence&&-1<(s=c.evidence.substring(t).search(/.\b/))&&(d+=s),s={message:c.reason,severity:c.code&&c.code.startsWith("W")?"warning":"error",from:a.Pos(c.line-1,t),to:a.Pos(c.line-1,d)},o.push(s)))}return r})});
|
|
1
deps/codemirror/javascript.min.js
vendored
1
deps/codemirror/javascript.min.js
vendored
File diff suppressed because one or more lines are too long
1
deps/codemirror/jshint.min.js
vendored
1
deps/codemirror/jshint.min.js
vendored
File diff suppressed because one or more lines are too long
1
deps/codemirror/jump-to-line.min.js
vendored
1
deps/codemirror/jump-to-line.min.js
vendored
@ -1 +0,0 @@
|
|||||||
!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror"),require("../dialog/dialog")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../dialog/dialog"],e):e(CodeMirror)}(function(e){"use strict";function l(e,o){var r=Number(o);return/^[-+]/.test(o)?e.getCursor().line+r:r-1}e.defineOption("search",{bottom:!1}),e.commands.jumpToLine=function(t){var e,o,r,s,i,n=t.getCursor();i=(i=e=t).phrase("Jump to line:")+' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">'+i.phrase("(Use line:column or scroll% syntax)")+"</span>",o=t.phrase("Jump to line:"),r=n.line+1+":"+n.ch,s=function(e){var o,r;e&&((o=/^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(e))?t.setCursor(l(t,o[1]),Number(o[2])):(o=/^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(e))?(r=Math.round(t.lineCount()*Number(o[1])/100),/^[-+]/.test(o[1])&&(r=n.line+r+1),t.setCursor(r-1,n.ch)):(o=/^\s*\:?\s*([\+\-]?\d+)\s*/.exec(e))&&t.setCursor(l(t,o[1]),n.ch))},e.openDialog?e.openDialog(i,s,{value:r,selectValueOnOpen:!0,bottom:e.options.search.bottom}):s(prompt(o,r))},e.keyMap.default["Alt-G"]="jumpToLine"});
|
|
80
deps/codemirror/lint.css
vendored
80
deps/codemirror/lint.css
vendored
@ -1,80 +0,0 @@
|
|||||||
/* The lint marker gutter */
|
|
||||||
.CodeMirror-lint-markers {
|
|
||||||
width: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-tooltip {
|
|
||||||
background-color: #ffd;
|
|
||||||
border: 1px solid black;
|
|
||||||
border-radius: 4px 4px 4px 4px;
|
|
||||||
color: black;
|
|
||||||
font-family: monospace;
|
|
||||||
font-size: 10pt;
|
|
||||||
overflow: hidden;
|
|
||||||
padding: 2px 5px;
|
|
||||||
position: fixed;
|
|
||||||
white-space: pre;
|
|
||||||
white-space: pre-wrap;
|
|
||||||
z-index: 100;
|
|
||||||
max-width: 600px;
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity .4s;
|
|
||||||
-moz-transition: opacity .4s;
|
|
||||||
-webkit-transition: opacity .4s;
|
|
||||||
-o-transition: opacity .4s;
|
|
||||||
-ms-transition: opacity .4s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-mark {
|
|
||||||
background-position: left bottom;
|
|
||||||
background-repeat: repeat-x;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-mark-warning {
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=");
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-mark-error {
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==");
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-marker {
|
|
||||||
background-position: center center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
cursor: pointer;
|
|
||||||
display: inline-block;
|
|
||||||
height: 16px;
|
|
||||||
width: 16px;
|
|
||||||
vertical-align: middle;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-message {
|
|
||||||
padding-left: 18px;
|
|
||||||
background-position: top left;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-marker-warning, .CodeMirror-lint-message-warning {
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=");
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-marker-error, .CodeMirror-lint-message-error {
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=");
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-marker-multiple {
|
|
||||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: right bottom;
|
|
||||||
width: 100%; height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-line-error {
|
|
||||||
background-color: rgba(183, 76, 81, 0.08);
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror-lint-line-warning {
|
|
||||||
background-color: rgba(255, 211, 0, 0.1);
|
|
||||||
}
|
|
||||||
|
|
292
deps/codemirror/lint.js
vendored
292
deps/codemirror/lint.js
vendored
@ -1,292 +0,0 @@
|
|||||||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
||||||
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
|
|
||||||
|
|
||||||
(function(mod) {
|
|
||||||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
||||||
mod(require("../../lib/codemirror"));
|
|
||||||
else if (typeof define == "function" && define.amd) // AMD
|
|
||||||
define(["../../lib/codemirror"], mod);
|
|
||||||
else // Plain browser env
|
|
||||||
mod(CodeMirror);
|
|
||||||
})(function(CodeMirror) {
|
|
||||||
"use strict";
|
|
||||||
var GUTTER_ID = "CodeMirror-lint-markers";
|
|
||||||
var LINT_LINE_ID = "CodeMirror-lint-line-";
|
|
||||||
|
|
||||||
function showTooltip(cm, e, content) {
|
|
||||||
var tt = document.createElement("div");
|
|
||||||
tt.className = "CodeMirror-lint-tooltip cm-s-" + cm.options.theme;
|
|
||||||
tt.appendChild(content.cloneNode(true));
|
|
||||||
if (cm.state.lint.options.selfContain)
|
|
||||||
cm.getWrapperElement().appendChild(tt);
|
|
||||||
else
|
|
||||||
document.body.appendChild(tt);
|
|
||||||
|
|
||||||
function position(e) {
|
|
||||||
if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position);
|
|
||||||
tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px";
|
|
||||||
tt.style.left = (e.clientX + 5) + "px";
|
|
||||||
}
|
|
||||||
CodeMirror.on(document, "mousemove", position);
|
|
||||||
position(e);
|
|
||||||
if (tt.style.opacity != null) tt.style.opacity = 1;
|
|
||||||
return tt;
|
|
||||||
}
|
|
||||||
function rm(elt) {
|
|
||||||
if (elt.parentNode) elt.parentNode.removeChild(elt);
|
|
||||||
}
|
|
||||||
function hideTooltip(tt) {
|
|
||||||
if (!tt.parentNode) return;
|
|
||||||
if (tt.style.opacity == null) rm(tt);
|
|
||||||
tt.style.opacity = 0;
|
|
||||||
setTimeout(function() { rm(tt); }, 600);
|
|
||||||
}
|
|
||||||
|
|
||||||
function showTooltipFor(cm, e, content, node) {
|
|
||||||
var tooltip = showTooltip(cm, e, content);
|
|
||||||
function hide() {
|
|
||||||
CodeMirror.off(node, "mouseout", hide);
|
|
||||||
if (tooltip) { hideTooltip(tooltip); tooltip = null; }
|
|
||||||
}
|
|
||||||
var poll = setInterval(function() {
|
|
||||||
if (tooltip) for (var n = node;; n = n.parentNode) {
|
|
||||||
if (n && n.nodeType == 11) n = n.host;
|
|
||||||
if (n == document.body) return;
|
|
||||||
if (!n) { hide(); break; }
|
|
||||||
}
|
|
||||||
if (!tooltip) return clearInterval(poll);
|
|
||||||
}, 400);
|
|
||||||
CodeMirror.on(node, "mouseout", hide);
|
|
||||||
}
|
|
||||||
|
|
||||||
function LintState(cm, conf, hasGutter) {
|
|
||||||
this.marked = [];
|
|
||||||
if (conf instanceof Function) conf = {getAnnotations: conf};
|
|
||||||
if (!conf || conf === true) conf = {};
|
|
||||||
this.options = {};
|
|
||||||
this.linterOptions = conf.options || {};
|
|
||||||
for (var prop in defaults) this.options[prop] = defaults[prop];
|
|
||||||
for (var prop in conf) {
|
|
||||||
if (defaults.hasOwnProperty(prop)) {
|
|
||||||
if (conf[prop] != null) this.options[prop] = conf[prop];
|
|
||||||
} else if (!conf.options) {
|
|
||||||
this.linterOptions[prop] = conf[prop];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.timeout = null;
|
|
||||||
this.hasGutter = hasGutter;
|
|
||||||
this.onMouseOver = function(e) { onMouseOver(cm, e); };
|
|
||||||
this.waitingFor = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaults = {
|
|
||||||
highlightLines: false,
|
|
||||||
tooltips: true,
|
|
||||||
delay: 500,
|
|
||||||
lintOnChange: true,
|
|
||||||
getAnnotations: null,
|
|
||||||
async: false,
|
|
||||||
selfContain: null,
|
|
||||||
formatAnnotation: null,
|
|
||||||
onUpdateLinting: null
|
|
||||||
}
|
|
||||||
|
|
||||||
function clearMarks(cm) {
|
|
||||||
var state = cm.state.lint;
|
|
||||||
if (state.hasGutter) cm.clearGutter(GUTTER_ID);
|
|
||||||
if (state.options.highlightLines) clearErrorLines(cm);
|
|
||||||
for (var i = 0; i < state.marked.length; ++i)
|
|
||||||
state.marked[i].clear();
|
|
||||||
state.marked.length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function clearErrorLines(cm) {
|
|
||||||
cm.eachLine(function(line) {
|
|
||||||
var has = line.wrapClass && /\bCodeMirror-lint-line-\w+\b/.exec(line.wrapClass);
|
|
||||||
if (has) cm.removeLineClass(line, "wrap", has[0]);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeMarker(cm, labels, severity, multiple, tooltips) {
|
|
||||||
var marker = document.createElement("div"), inner = marker;
|
|
||||||
marker.className = "CodeMirror-lint-marker CodeMirror-lint-marker-" + severity;
|
|
||||||
if (multiple) {
|
|
||||||
inner = marker.appendChild(document.createElement("div"));
|
|
||||||
inner.className = "CodeMirror-lint-marker CodeMirror-lint-marker-multiple";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) {
|
|
||||||
showTooltipFor(cm, e, labels, inner);
|
|
||||||
});
|
|
||||||
|
|
||||||
return marker;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getMaxSeverity(a, b) {
|
|
||||||
if (a == "error") return a;
|
|
||||||
else return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
function groupByLine(annotations) {
|
|
||||||
var lines = [];
|
|
||||||
for (var i = 0; i < annotations.length; ++i) {
|
|
||||||
var ann = annotations[i], line = ann.from.line;
|
|
||||||
(lines[line] || (lines[line] = [])).push(ann);
|
|
||||||
}
|
|
||||||
return lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
function annotationTooltip(ann) {
|
|
||||||
var severity = ann.severity;
|
|
||||||
if (!severity) severity = "error";
|
|
||||||
var tip = document.createElement("div");
|
|
||||||
tip.className = "CodeMirror-lint-message CodeMirror-lint-message-" + severity;
|
|
||||||
if (typeof ann.messageHTML != 'undefined') {
|
|
||||||
tip.innerHTML = ann.messageHTML;
|
|
||||||
} else {
|
|
||||||
tip.appendChild(document.createTextNode(ann.message));
|
|
||||||
}
|
|
||||||
return tip;
|
|
||||||
}
|
|
||||||
|
|
||||||
function lintAsync(cm, getAnnotations) {
|
|
||||||
var state = cm.state.lint
|
|
||||||
var id = ++state.waitingFor
|
|
||||||
function abort() {
|
|
||||||
id = -1
|
|
||||||
cm.off("change", abort)
|
|
||||||
}
|
|
||||||
cm.on("change", abort)
|
|
||||||
getAnnotations(cm.getValue(), function(annotations, arg2) {
|
|
||||||
cm.off("change", abort)
|
|
||||||
if (state.waitingFor != id) return
|
|
||||||
if (arg2 && annotations instanceof CodeMirror) annotations = arg2
|
|
||||||
cm.operation(function() {updateLinting(cm, annotations)})
|
|
||||||
}, state.linterOptions, cm);
|
|
||||||
}
|
|
||||||
|
|
||||||
function startLinting(cm) {
|
|
||||||
var state = cm.state.lint;
|
|
||||||
if (!state) return;
|
|
||||||
var options = state.options;
|
|
||||||
/*
|
|
||||||
* Passing rules in `options` property prevents JSHint (and other linters) from complaining
|
|
||||||
* about unrecognized rules like `onUpdateLinting`, `delay`, `lintOnChange`, etc.
|
|
||||||
*/
|
|
||||||
var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint");
|
|
||||||
if (!getAnnotations) return;
|
|
||||||
if (options.async || getAnnotations.async) {
|
|
||||||
lintAsync(cm, getAnnotations)
|
|
||||||
} else {
|
|
||||||
var annotations = getAnnotations(cm.getValue(), state.linterOptions, cm);
|
|
||||||
if (!annotations) return;
|
|
||||||
if (annotations.then) annotations.then(function(issues) {
|
|
||||||
cm.operation(function() {updateLinting(cm, issues)})
|
|
||||||
});
|
|
||||||
else cm.operation(function() {updateLinting(cm, annotations)})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateLinting(cm, annotationsNotSorted) {
|
|
||||||
var state = cm.state.lint;
|
|
||||||
if (!state) return;
|
|
||||||
var options = state.options;
|
|
||||||
clearMarks(cm);
|
|
||||||
|
|
||||||
var annotations = groupByLine(annotationsNotSorted);
|
|
||||||
|
|
||||||
for (var line = 0; line < annotations.length; ++line) {
|
|
||||||
var anns = annotations[line];
|
|
||||||
if (!anns) continue;
|
|
||||||
|
|
||||||
// filter out duplicate messages
|
|
||||||
var message = [];
|
|
||||||
anns = anns.filter(function(item) { return message.indexOf(item.message) > -1 ? false : message.push(item.message) });
|
|
||||||
|
|
||||||
var maxSeverity = null;
|
|
||||||
var tipLabel = state.hasGutter && document.createDocumentFragment();
|
|
||||||
|
|
||||||
for (var i = 0; i < anns.length; ++i) {
|
|
||||||
var ann = anns[i];
|
|
||||||
var severity = ann.severity;
|
|
||||||
if (!severity) severity = "error";
|
|
||||||
maxSeverity = getMaxSeverity(maxSeverity, severity);
|
|
||||||
|
|
||||||
if (options.formatAnnotation) ann = options.formatAnnotation(ann);
|
|
||||||
if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann));
|
|
||||||
|
|
||||||
if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, {
|
|
||||||
className: "CodeMirror-lint-mark CodeMirror-lint-mark-" + severity,
|
|
||||||
__annotation: ann
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
// use original annotations[line] to show multiple messages
|
|
||||||
if (state.hasGutter)
|
|
||||||
cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, annotations[line].length > 1,
|
|
||||||
options.tooltips));
|
|
||||||
|
|
||||||
if (options.highlightLines)
|
|
||||||
cm.addLineClass(line, "wrap", LINT_LINE_ID + maxSeverity);
|
|
||||||
}
|
|
||||||
if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);
|
|
||||||
}
|
|
||||||
|
|
||||||
function onChange(cm) {
|
|
||||||
var state = cm.state.lint;
|
|
||||||
if (!state) return;
|
|
||||||
clearTimeout(state.timeout);
|
|
||||||
state.timeout = setTimeout(function(){startLinting(cm);}, state.options.delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
function popupTooltips(cm, annotations, e) {
|
|
||||||
var target = e.target || e.srcElement;
|
|
||||||
var tooltip = document.createDocumentFragment();
|
|
||||||
for (var i = 0; i < annotations.length; i++) {
|
|
||||||
var ann = annotations[i];
|
|
||||||
tooltip.appendChild(annotationTooltip(ann));
|
|
||||||
}
|
|
||||||
showTooltipFor(cm, e, tooltip, target);
|
|
||||||
}
|
|
||||||
|
|
||||||
function onMouseOver(cm, e) {
|
|
||||||
var target = e.target || e.srcElement;
|
|
||||||
if (!/\bCodeMirror-lint-mark-/.test(target.className)) return;
|
|
||||||
var box = target.getBoundingClientRect(), x = (box.left + box.right) / 2, y = (box.top + box.bottom) / 2;
|
|
||||||
var spans = cm.findMarksAt(cm.coordsChar({left: x, top: y}, "client"));
|
|
||||||
|
|
||||||
var annotations = [];
|
|
||||||
for (var i = 0; i < spans.length; ++i) {
|
|
||||||
var ann = spans[i].__annotation;
|
|
||||||
if (ann) annotations.push(ann);
|
|
||||||
}
|
|
||||||
if (annotations.length) popupTooltips(cm, annotations, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
CodeMirror.defineOption("lint", false, function(cm, val, old) {
|
|
||||||
if (old && old != CodeMirror.Init) {
|
|
||||||
clearMarks(cm);
|
|
||||||
if (cm.state.lint.options.lintOnChange !== false)
|
|
||||||
cm.off("change", onChange);
|
|
||||||
CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver);
|
|
||||||
clearTimeout(cm.state.lint.timeout);
|
|
||||||
delete cm.state.lint;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (val) {
|
|
||||||
var gutters = cm.getOption("gutters"), hasLintGutter = false;
|
|
||||||
for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true;
|
|
||||||
var state = cm.state.lint = new LintState(cm, val, hasLintGutter);
|
|
||||||
if (state.options.lintOnChange)
|
|
||||||
cm.on("change", onChange);
|
|
||||||
if (state.options.tooltips != false && state.options.tooltips != "gutter")
|
|
||||||
CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver);
|
|
||||||
|
|
||||||
startLinting(cm);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
CodeMirror.defineExtension("performLint", function() {
|
|
||||||
startLinting(this);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
1
deps/codemirror/matchesonscrollbar.min.css
vendored
1
deps/codemirror/matchesonscrollbar.min.css
vendored
@ -1 +0,0 @@
|
|||||||
.CodeMirror-search-match{background:gold;border-top:1px solid orange;border-bottom:1px solid orange;-moz-box-sizing:border-box;box-sizing:border-box;opacity:.5}
|
|
1
deps/codemirror/matchesonscrollbar.min.js
vendored
1
deps/codemirror/matchesonscrollbar.min.js
vendored
@ -1 +0,0 @@
|
|||||||
!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("./searchcursor"),require("../scroll/annotatescrollbar")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./searchcursor","../scroll/annotatescrollbar"],t):t(CodeMirror)}(function(h){"use strict";function o(t,e,i,o){this.cm=t;var n,s={listenForChanges:!1};for(n in this.options=o)s[n]=o[n];s.className||(s.className="CodeMirror-search-match"),this.annotation=t.annotateScrollbar(s),this.query=e,this.caseFold=i,this.gap={from:t.firstLine(),to:t.lastLine()+1},this.matches=[],this.update=null,this.findMatches(),this.annotation.update(this.matches);var a=this;t.on("change",this.changeHandler=function(t,e){a.onChange(e)})}h.defineExtension("showMatchesOnScrollbar",function(t,e,i){return new o(this,t,e,i=(i="string"==typeof i?{className:i}:i)||{})});function c(t,e,i){return t<=e?t:Math.max(e,t+i)}o.prototype.findMatches=function(){if(this.gap){for(var t=0;t<this.matches.length;t++){if((e=this.matches[t]).from.line>=this.gap.to)break;e.to.line>=this.gap.from&&this.matches.splice(t--,1)}for(var e,i=this.cm.getSearchCursor(this.query,h.Pos(this.gap.from,0),{caseFold:this.caseFold,multiline:this.options.multiline}),o=this.options&&this.options.maxMatches||1e3;i.findNext();){if((e={from:i.from(),to:i.to()}).from.line>=this.gap.to)break;if(this.matches.splice(t++,0,e),this.matches.length>o)break}this.gap=null}},o.prototype.onChange=function(t){var e=t.from.line,i=h.changeEnd(t).line,o=i-t.to.line;if(this.gap?(this.gap.from=Math.min(c(this.gap.from,e,o),t.from.line),this.gap.to=Math.max(c(this.gap.to,e,o),t.from.line)):this.gap={from:t.from.line,to:i+1},o)for(var n=0;n<this.matches.length;n++){var s=this.matches[n],a=c(s.from.line,e,o),a=(a!=s.from.line&&(s.from=h.Pos(a,s.from.ch)),c(s.to.line,e,o));a!=s.to.line&&(s.to=h.Pos(a,s.to.ch))}clearTimeout(this.update);var r=this;this.update=setTimeout(function(){r.updateAfterChange()},250)},o.prototype.updateAfterChange=function(){this.findMatches(),this.annotation.update(this.matches)},o.prototype.clear=function(){this.cm.off("change",this.changeHandler),this.annotation.clear()}});
|
|
1
deps/codemirror/search.min.js
vendored
1
deps/codemirror/search.min.js
vendored
File diff suppressed because one or more lines are too long
1
deps/codemirror/searchcursor.min.js
vendored
1
deps/codemirror/searchcursor.min.js
vendored
File diff suppressed because one or more lines are too long
1
deps/codemirror/trailingspace.min.js
vendored
1
deps/codemirror/trailingspace.min.js
vendored
@ -1 +0,0 @@
|
|||||||
!function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(o){o.defineOption("showTrailingSpace",!1,function(e,i,n){(n=n==o.Init?!1:n)&&!i?e.removeOverlay("trailingspace"):!n&&i&&e.addOverlay({token:function(e){for(var i=e.string.length,n=i;n&&/\s/.test(e.string.charAt(n-1));--n);return n>e.pos?(e.pos=n,null):(e.pos=i,"trailingspace")},name:"trailingspace"})})});
|
|
22
deps/codemirror/update.sh
vendored
22
deps/codemirror/update.sh
vendored
@ -1,22 +0,0 @@
|
|||||||
LINKS="
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/dialog/dialog.min.css
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/dialog/dialog.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/edit/trailingspace.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/lint/javascript-lint.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/scroll/annotatescrollbar.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/search/matchesonscrollbar.min.css
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/search/matchesonscrollbar.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/search/search.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/search/searchcursor.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/css/css.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/htmlmixed/htmlmixed.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/javascript/javascript.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/xml/xml.min.js
|
|
||||||
https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/base16-dark.min.css
|
|
||||||
"
|
|
||||||
|
|
||||||
for link in $LINKS; do
|
|
||||||
wget $link -O `basename $link`
|
|
||||||
done
|
|
1
deps/codemirror/xml.min.js
vendored
1
deps/codemirror/xml.min.js
vendored
File diff suppressed because one or more lines are too long
66
deps/codemirror_src/editor.mjs
vendored
Normal file
66
deps/codemirror_src/editor.mjs
vendored
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import {EditorState} from "@codemirror/state"
|
||||||
|
import {EditorView} from '@codemirror/view';
|
||||||
|
import {javascript} from "@codemirror/lang-javascript"
|
||||||
|
import {html} from "@codemirror/lang-html"
|
||||||
|
import {css} from "@codemirror/lang-css"
|
||||||
|
import {search} from "@codemirror/search"
|
||||||
|
import {oneDark} from "@codemirror/theme-one-dark"
|
||||||
|
import {lineNumbers, highlightActiveLineGutter, highlightSpecialChars, drawSelection, dropCursor, rectangularSelection, crosshairCursor, highlightActiveLine, keymap} from '@codemirror/view';
|
||||||
|
import {foldGutter, indentOnInput, syntaxHighlighting, defaultHighlightStyle, bracketMatching, foldKeymap} from '@codemirror/language';
|
||||||
|
import {history, defaultKeymap, historyKeymap} from '@codemirror/commands';
|
||||||
|
import {highlightSelectionMatches, searchKeymap} from '@codemirror/search';
|
||||||
|
import {autocompletion, closeBracketsKeymap, completionKeymap} from '@codemirror/autocomplete';
|
||||||
|
import {lintKeymap} from '@codemirror/lint';
|
||||||
|
|
||||||
|
let updateListenerExtension = EditorView.updateListener.of((update) => {
|
||||||
|
if (update.docChanged && update.view.onDocChange) {
|
||||||
|
update.view.onDocChange();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const extensions = [
|
||||||
|
lineNumbers(),
|
||||||
|
highlightActiveLineGutter(),
|
||||||
|
highlightSpecialChars(),
|
||||||
|
history(),
|
||||||
|
foldGutter(),
|
||||||
|
drawSelection(),
|
||||||
|
dropCursor(),
|
||||||
|
EditorState.allowMultipleSelections.of(true),
|
||||||
|
indentOnInput(),
|
||||||
|
syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
|
||||||
|
bracketMatching(),
|
||||||
|
autocompletion(),
|
||||||
|
rectangularSelection(),
|
||||||
|
crosshairCursor(),
|
||||||
|
highlightActiveLine(),
|
||||||
|
highlightSelectionMatches(),
|
||||||
|
keymap.of([
|
||||||
|
...defaultKeymap,
|
||||||
|
...searchKeymap,
|
||||||
|
...historyKeymap,
|
||||||
|
...foldKeymap,
|
||||||
|
...completionKeymap,
|
||||||
|
...lintKeymap
|
||||||
|
]),
|
||||||
|
javascript(),
|
||||||
|
html(),
|
||||||
|
css(),
|
||||||
|
search(),
|
||||||
|
oneDark,
|
||||||
|
updateListenerExtension,
|
||||||
|
];
|
||||||
|
|
||||||
|
function TildeFriendsEditorView(parent) {
|
||||||
|
return new EditorView({
|
||||||
|
extensions: extensions,
|
||||||
|
parent: parent,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export {
|
||||||
|
TildeFriendsEditorView,
|
||||||
|
EditorState,
|
||||||
|
EditorView,
|
||||||
|
extensions,
|
||||||
|
};
|
15
deps/codemirror_src/package.json
vendored
Normal file
15
deps/codemirror_src/package.json
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"@codemirror/lang-css": "^6.2.1",
|
||||||
|
"@codemirror/lang-html": "^6.4.7",
|
||||||
|
"@codemirror/lang-javascript": "^6.2.1",
|
||||||
|
"@codemirror/lang-json": "^6.0.1",
|
||||||
|
"@codemirror/theme-one-dark": "^6.1.2",
|
||||||
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||||
|
"codemirror": "^6.0.1",
|
||||||
|
"rollup": "^4.9.5"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@rollup/plugin-terser": "^0.4.4"
|
||||||
|
}
|
||||||
|
}
|
12
deps/codemirror_src/rollup.config.mjs
vendored
Normal file
12
deps/codemirror_src/rollup.config.mjs
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import {nodeResolve} from "@rollup/plugin-node-resolve"
|
||||||
|
import terser from '@rollup/plugin-terser';
|
||||||
|
export default {
|
||||||
|
input: "./editor.mjs",
|
||||||
|
output: {
|
||||||
|
file: "../codemirror/cm6.js",
|
||||||
|
format: "es",
|
||||||
|
plugins: [terser()],
|
||||||
|
},
|
||||||
|
plugins: [nodeResolve()]
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user