2013-04-16 3 views
11

이 예제는 동기식 인 CodeMirror (구문 강조 표시 Javascript 기반 편집기)로 JSON 및 Javascript lint 애드온을 구현하는 방법을 보여줍니다.CodeMirror의 보풀 기능을위한 비동기 경고 소스 사용

불행히도 대부분의 언어에서 쉽게 사용할 수있는 Javascript 기반 파서/lint'ers가 없습니다. 나는 Python을위한 자체 linter를 구현하고 싶다. 불행히도, 마치 기존의 lint addon이 lint (lint plugin이 호출하는)에 의존하는 것처럼 보입니다.

angelozerr은 remoting-lint.js에 "CodeMirror.remotingValidator"플러그인이 있지만 Github는이 파일이 제거되었음을 보여줍니다. marijnh는 그것이 "일반적으로 유용하지 않기"때문에 제거되었지만 대안을 분명히하지는 않는다고 말했습니다.

어쨌든 linter를 비동기 적으로 호출하기위한 전략이 있습니까? 그렇다면 코드를 원격으로 구문 분석하기 위해 Ajax 호출을 수행 할 수 있습니까?

답변

16

물론 있습니다. remoting-lint.js의 마지막 버전 (https://github.com/marijnh/CodeMirror/commit/27f097ed75561e846bdb955f13f8dd2bcf0b589e)의 내용을 간략하게 살펴보면 jQuery AJAX 요청보다 약간 더 많음을 알 수 있습니다.이 요청은 함수에 매개 변수로 제공되는 콜백을 호출합니다. 이 콜백은 "async"옵션이 lint plugin에 주어진 경우에만 전달됩니다. CodeMirror에 전달되는 몇 가지 옵션이 있습니다. 이는 관련이 없을 수 있습니다. 보풀 관련 옵션은 "거터"및 "lintWith"입니다.

파이썬은 한 번에 하나의 오류 만 표시하지만 lint addon은 오류 목록을 허용한다는 점에 유의하십시오. 전자의 경우, 후자는 하나의 항목 만 가질 수 있습니다. 나는이 좀 더 간단하게 만들 수있는 매우 간단한 프로젝트 게시 한

function python_validator(cm, updateLinting, options) { 
    var text = cm.getValue() + "\n"; 

    if(text.trim() == "") 
    { 
     updateLinting(cm, []); 
     return; 
    } 

    function result_cb(error) 
    { 
     var found = []; 

     if(error != null) { 
      var start_line = error.line_no; 
      var start_char = error.column_no; 
      var end_line = error.line_no; 
      var end_char = error.column_no; 
      var message = error.message; 

      found.push({ 
       from: CodeMirror.Pos(start_line - 1, start_char), 
       to: CodeMirror.Pos(end_line - 1, end_char), 
       message: message 
      }); 
     } 

     updateLinting(cm, found); 
    } 

    check_python_syntax(text, result_cb) 
}; 

var text_obj = $discriminator_text.get()[0]; 
var editor = CodeMirror.fromTextArea(text_obj, { 
    mode: { name: "python", 
      version: 2, 
      singleLineStringErrors: false }, 
    lineNumbers: true, 
    indentUnit: 4, 
    tabMode: "shift", 
    matchBrackets: true, 
    styleActiveLine: true, 
    lineWrapping: false, 
    gutters: ["CodeMirror-lint-markers"], 
    lintWith: { 
     "getAnnotations": python_validator, 
     "async" : true, 
    }, 
}); 

: 잘 넣어 https://github.com/dsoprea/CodeMirrorRemoteValidator

+2

, +1을 지식을 공유 할 수있는 의지에 대한과의 여분의 노력 (자신의 게시물을 대답) github 프로젝트 게시. –

+2

그게 전부입니다. –