forked from cory/tildefriends
		
	CodeMirror 6.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4767 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		| @@ -1,5 +1,6 @@ | ||||
| import {LitElement, html, css, svg} from '/static/lit/lit-all.min.js'; | ||||
|  | ||||
| let cm6; | ||||
| let gSocket; | ||||
|  | ||||
| let gCurrentFile; | ||||
| @@ -201,7 +202,7 @@ class TfFilesElement extends LitElement { | ||||
| 			let buffer = await file.arrayBuffer(); | ||||
| 			let text = new TextDecoder('latin1').decode(buffer); | ||||
| 			gFiles[file.name] = { | ||||
| 				doc: new CodeMirror.Doc(text, guessMode(file.name)), | ||||
| 				doc: new cm6.EditorState.create({doc: text, extensions: cm6.extensions}), | ||||
| 				buffer: buffer, | ||||
| 				generation: -1, | ||||
| 				isNew: true, | ||||
| @@ -435,7 +436,7 @@ function is_edit_only() { | ||||
| 	return window.location.search == '?editonly=1' || window.innerWidth < 1024; | ||||
| } | ||||
|  | ||||
| function edit() { | ||||
| async function edit() { | ||||
| 	if (editing()) { | ||||
| 		return; | ||||
| 	} | ||||
| @@ -444,33 +445,15 @@ function edit() { | ||||
| 	document.getElementById("editPane").style.display = 'flex'; | ||||
| 	document.getElementById('viewPane').style.display =  is_edit_only() ? 'none' : 'flex'; | ||||
|  | ||||
| 	ensureLoaded([ | ||||
| 		{tagName: "script", attributes: {src: "/codemirror/codemirror.min.js"}}, | ||||
| 		{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/base16-dark.min.css"}}, | ||||
| 		{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/matchesonscrollbar.min.css"}}, | ||||
| 		{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/dialog.min.css"}}, | ||||
| 		{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/codemirror.min.css"}}, | ||||
| 		{tagName: "link", attributes: {rel: "stylesheet", href: "/codemirror/lint.css"}}, | ||||
| 		{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); | ||||
| 	try { | ||||
| 		cm6 = await import('/codemirror/cm6.js'); | ||||
| 		gEditor = cm6.TildeFriendsEditorView(document.getElementById("editor")); | ||||
| 		gEditor.onDocChange = updateFiles; | ||||
| 		await load(); | ||||
| 	} catch (error) { | ||||
| 		alert(`${error.message}\n\n${error.stack}`); | ||||
| 		closeEditor(); | ||||
| 		}); | ||||
| 	}); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| function trace() { | ||||
| @@ -491,15 +474,16 @@ function loadFile(name, id) { | ||||
| 		} | ||||
| 		return response.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)) { | ||||
| 			openFile(Object.keys(gFiles).sort()[0]); | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| function load(path) { | ||||
| 	return fetch((path || url()) + 'view').then(function(response) { | ||||
| async function load(path) { | ||||
| 	let response = await fetch((path || url()) + 'view'); | ||||
| 	if (!response.ok) { | ||||
| 		if (response.status == 404) { | ||||
| 			return null; | ||||
| @@ -507,29 +491,7 @@ function load(path) { | ||||
| 			throw new Error(response.status + ' ' + response.statusText); | ||||
| 		} | ||||
| 	} | ||||
| 		return 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(); | ||||
| 			}); | ||||
| 		} | ||||
| 	let json = await response.json(); | ||||
| 	gFiles = {}; | ||||
| 	let isApp = false; | ||||
| 	let promises = []; | ||||
| @@ -552,12 +514,11 @@ function load(path) { | ||||
| 		let text = '// New script.\n'; | ||||
| 		gCurrentFile = 'app.js'; | ||||
| 		gFiles[gCurrentFile] = { | ||||
| 				doc: new CodeMirror.Doc(text, guessMode(gCurrentFile)), | ||||
| 			doc: cm6.EditorState.create({doc: text, extensions: cm6.extensions}), | ||||
| 		}; | ||||
| 		openFile(gCurrentFile); | ||||
| 	} | ||||
| 	return Promise.all(promises); | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| function closeEditor() { | ||||
| @@ -573,8 +534,8 @@ function explodePath() { | ||||
| function save(save_to) { | ||||
| 	document.getElementById("save").disabled = true; | ||||
| 	if (gCurrentFile) { | ||||
| 		gFiles[gCurrentFile].doc = gEditor.getDoc(); | ||||
| 		if (!gFiles[gCurrentFile].isNew && !gFiles[gCurrentFile].doc.isClean(gFiles[gCurrentFile].doc.changeGeneration())) { | ||||
| 		gFiles[gCurrentFile].doc = gEditor.state; | ||||
| 		if (!gFiles[gCurrentFile].isNew && !gFiles[gCurrentFile].doc.doc.toString() == gFiles[gCurrentFile].original) { | ||||
| 			delete gFiles[gCurrentFile].buffer; | ||||
| 		} | ||||
| 	} | ||||
| @@ -592,7 +553,7 @@ function save(save_to) { | ||||
| 	let promises = []; | ||||
| 	for (let name of Object.keys(gFiles)) { | ||||
| 		let file = gFiles[name]; | ||||
| 		if (!file.isNew && file.doc.isClean(file.generation)) { | ||||
| 		if (!file.isNew && file.doc.doc.toString() == file.original) { | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| @@ -603,7 +564,7 @@ function save(save_to) { | ||||
| 			headers: { | ||||
| 				'Content-Type': 'application/binary', | ||||
| 			}, | ||||
| 			body: file.buffer ?? file.doc.getValue(), | ||||
| 			body: file.buffer ?? file.doc.doc.toString(), | ||||
| 		}).then(function(response) { | ||||
| 			if (!response.ok) { | ||||
| 				throw new Error('Saving "' + name + '": ' + response.status + ' ' + response.statusText); | ||||
| @@ -648,7 +609,7 @@ function save(save_to) { | ||||
| 	}).finally(function() { | ||||
| 		document.getElementById("save").disabled = false; | ||||
| 		Object.values(gFiles).forEach(function(file) { | ||||
| 			file.generation = file.doc.changeGeneration(); | ||||
| 			file.original = file.doc.doc.toString(); | ||||
| 		}); | ||||
| 		updateFiles(); | ||||
| 	}); | ||||
| @@ -1029,11 +990,13 @@ function connectSocket(path) { | ||||
| } | ||||
|  | ||||
| function openFile(name) { | ||||
| 	let newDoc = (name && gFiles[name]) ? gFiles[name].doc : new CodeMirror.Doc("", guessMode(name)); | ||||
| 	let oldDoc = gEditor.swapDoc(newDoc); | ||||
| 	let newDoc = (name && gFiles[name]) ? gFiles[name].doc : cm6.EditorState.create({doc: "", extensions: cm6.extensions}); | ||||
| 	let oldDoc = gEditor.state; | ||||
| 	gEditor.setState(newDoc); | ||||
|  | ||||
| 	if (gFiles[gCurrentFile]) { | ||||
| 		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; | ||||
| 		} | ||||
| 	} | ||||
| @@ -1046,7 +1009,7 @@ function updateFiles() { | ||||
| 	let files = document.getElementsByTagName("tf-files-pane")[0]; | ||||
| 	if (files) { | ||||
| 		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; | ||||
| 	} | ||||
| @@ -1055,7 +1018,7 @@ function updateFiles() { | ||||
|  | ||||
| function makeNewFile(name) { | ||||
| 	gFiles[name] = { | ||||
| 		doc: new CodeMirror.Doc("", guessMode(name)), | ||||
| 		doc: cm6.EditorState.create({extensions: cm6.extensions}), | ||||
| 		generation: -1, | ||||
| 	}; | ||||
| 	openFile(name); | ||||
|   | ||||
| @@ -27,11 +27,7 @@ | ||||
| 				</div> | ||||
| 				<div class="hbox" style="height: 100%"> | ||||
| 					<tf-files-pane></tf-files-pane> | ||||
| 					<div id="docPane" style="display: flex; flex: 1 1 50%; flex-flow: column"> | ||||
| 						<div style="flex: 1 1 50%; position: relative"> | ||||
| 							<textarea id="editor" class="main"></textarea> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div style="display: flex; flex: 1 1 50%; flex-flow: column" id="editor"></div> | ||||
| 				</div> | ||||
| 			</div> | ||||
| 			<div id="viewPane" class="vbox" style="flex: 1 1; overflow: auto"> | ||||
|   | ||||
| @@ -64,14 +64,8 @@ a:active { | ||||
| 	color: #eee8d5; | ||||
| } | ||||
|  | ||||
| .CodeMirror { | ||||
| .cm-editor { | ||||
| 	height: 100%; | ||||
| 	padding: 0; | ||||
| 	top: 0; | ||||
| 	left: 0; | ||||
| 	right: 0; | ||||
| 	bottom: 0; | ||||
| 	position: absolute; | ||||
| } | ||||
|  | ||||
| .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()] | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user