coffeescript-lint.js
11 years ago
coffeescript-lint.min.js
11 years ago
css-lint.js
11 years ago
css-lint.min.js
11 years ago
javascript-lint.js
11 years ago
javascript-lint.min.js
11 years ago
json-lint.js
11 years ago
json-lint.min.js
11 years ago
lint.css
11 years ago
lint.js
11 years ago
lint.min.js
11 years ago
yaml-lint.js
11 years ago
yaml-lint.min.js
11 years ago
lint.min.js
34 lines
| 1 | |
| 2 | (function(mod){if(typeof exports=="object"&&typeof module=="object") |
| 3 | mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) |
| 4 | define(["../../lib/codemirror"],mod);else |
| 5 | mod(CodeMirror);})(function(CodeMirror){"use strict";var GUTTER_ID="CodeMirror-lint-markers";function showTooltip(e,content){var tt=document.createElement("div");tt.className="CodeMirror-lint-tooltip";tt.appendChild(content.cloneNode(true));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";} |
| 6 | CodeMirror.on(document,"mousemove",position);position(e);if(tt.style.opacity!=null)tt.style.opacity=1;return tt;} |
| 7 | function rm(elt){if(elt.parentNode)elt.parentNode.removeChild(elt);} |
| 8 | function hideTooltip(tt){if(!tt.parentNode)return;if(tt.style.opacity==null)rm(tt);tt.style.opacity=0;setTimeout(function(){rm(tt);},600);} |
| 9 | function showTooltipFor(e,content,node){var tooltip=showTooltip(e,content);function hide(){CodeMirror.off(node,"mouseout",hide);if(tooltip){hideTooltip(tooltip);tooltip=null;}} |
| 10 | 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;}} |
| 11 | if(!tooltip)return clearInterval(poll);},400);CodeMirror.on(node,"mouseout",hide);} |
| 12 | function LintState(cm,options,hasGutter){this.marked=[];this.options=options;this.timeout=null;this.hasGutter=hasGutter;this.onMouseOver=function(e){onMouseOver(cm,e);};} |
| 13 | function parseOptions(cm,options){if(options instanceof Function)return{getAnnotations:options};if(!options||options===true)options={};if(!options.getAnnotations)options.getAnnotations=cm.getHelper(CodeMirror.Pos(0,0),"lint");if(!options.getAnnotations)throw new Error("Required option 'getAnnotations' missing (lint addon)");return options;} |
| 14 | function clearMarks(cm){var state=cm.state.lint;if(state.hasGutter)cm.clearGutter(GUTTER_ID);for(var i=0;i<state.marked.length;++i) |
| 15 | state.marked[i].clear();state.marked.length=0;} |
| 16 | function makeMarker(labels,severity,multiple,tooltips){var marker=document.createElement("div"),inner=marker;marker.className="CodeMirror-lint-marker-"+severity;if(multiple){inner=marker.appendChild(document.createElement("div"));inner.className="CodeMirror-lint-marker-multiple";} |
| 17 | if(tooltips!=false)CodeMirror.on(inner,"mouseover",function(e){showTooltipFor(e,labels,inner);});return marker;} |
| 18 | function getMaxSeverity(a,b){if(a=="error")return a;else return b;} |
| 19 | 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);} |
| 20 | return lines;} |
| 21 | function annotationTooltip(ann){var severity=ann.severity;if(!severity)severity="error";var tip=document.createElement("div");tip.className="CodeMirror-lint-message-"+severity;tip.appendChild(document.createTextNode(ann.message));return tip;} |
| 22 | function startLinting(cm){var state=cm.state.lint,options=state.options;var passOptions=options.options||options;if(options.async||options.getAnnotations.async) |
| 23 | options.getAnnotations(cm.getValue(),updateLinting,passOptions,cm);else |
| 24 | updateLinting(cm,options.getAnnotations(cm.getValue(),passOptions,cm));} |
| 25 | function updateLinting(cm,annotationsNotSorted){clearMarks(cm);var state=cm.state.lint,options=state.options;var annotations=groupByLine(annotationsNotSorted);for(var line=0;line<annotations.length;++line){var anns=annotations[line];if(!anns)continue;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-"+severity,__annotation:ann}));} |
| 26 | if(state.hasGutter) |
| 27 | cm.setGutterMarker(line,GUTTER_ID,makeMarker(tipLabel,maxSeverity,anns.length>1,state.options.tooltips));} |
| 28 | if(options.onUpdateLinting)options.onUpdateLinting(annotationsNotSorted,annotations,cm);} |
| 29 | function onChange(cm){var state=cm.state.lint;if(!state)return;clearTimeout(state.timeout);state.timeout=setTimeout(function(){startLinting(cm);},state.options.delay||500);} |
| 30 | function popupSpanTooltip(ann,e){var target=e.target||e.srcElement;showTooltipFor(e,annotationTooltip(ann),target);} |
| 31 | 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"));for(var i=0;i<spans.length;++i){var ann=spans[i].__annotation;if(ann)return popupSpanTooltip(ann,e);}} |
| 32 | CodeMirror.defineOption("lint",false,function(cm,val,old){if(old&&old!=CodeMirror.Init){clearMarks(cm);cm.off("change",onChange);CodeMirror.off(cm.getWrapperElement(),"mouseover",cm.state.lint.onMouseOver);clearTimeout(cm.state.lint.timeout);delete cm.state.lint;} |
| 33 | 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,parseOptions(cm,val),hasLintGutter);cm.on("change",onChange);if(state.options.tooltips!=false) |
| 34 | CodeMirror.on(cm.getWrapperElement(),"mouseover",state.onMouseOver);startLinting(cm);}});}); |