67 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* global workerUtil */
 | |
| 'use strict';
 | |
| 
 | |
| /* exported editorWorker */
 | |
| const editorWorker = workerUtil.createWorker({
 | |
|   url: '/edit/editor-worker.js'
 | |
| });
 | |
| 
 | |
| /* exported linter */
 | |
| const linter = (() => {
 | |
|   const lintingUpdatedListeners = [];
 | |
|   const unhookListeners = [];
 | |
|   const linters = [];
 | |
|   const cms = new Set();
 | |
| 
 | |
|   return {
 | |
|     register,
 | |
|     run,
 | |
|     enableForEditor,
 | |
|     disableForEditor,
 | |
|     onLintingUpdated,
 | |
|     onUnhook
 | |
|   };
 | |
| 
 | |
|   function onUnhook(cb) {
 | |
|     unhookListeners.push(cb);
 | |
|   }
 | |
| 
 | |
|   function onLintingUpdated(cb) {
 | |
|     lintingUpdatedListeners.push(cb);
 | |
|   }
 | |
| 
 | |
|   function onUpdateLinting(...args) {
 | |
|     for (const cb of lintingUpdatedListeners) {
 | |
|       cb(...args);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function enableForEditor(cm) {
 | |
|     cm.setOption('lint', {onUpdateLinting, getAnnotations});
 | |
|     cms.add(cm);
 | |
|   }
 | |
| 
 | |
|   function disableForEditor(cm) {
 | |
|     cm.setOption('lint', false);
 | |
|     cms.delete(cm);
 | |
|     for (const cb of unhookListeners) {
 | |
|       cb(cm);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function register(linterFn) {
 | |
|     linters.push(linterFn);
 | |
|   }
 | |
| 
 | |
|   function run() {
 | |
|     for (const cm of cms) {
 | |
|       cm.performLint();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function getAnnotations(...args) {
 | |
|     return Promise.all(linters.map(fn => fn(...args)))
 | |
|       .then(results => [].concat(...results.filter(Boolean)));
 | |
|   }
 | |
| })();
 |