2013-04-16 11 views
11

Przykłady pokazują tylko, jak zaimplementować dodatki JSON i Javascript lint z CodeMirror (edytor oparty na skrypcie JavaScript), które są synchroniczne.Korzystanie z asynchronicznego źródła ostrzeżeń dla funkcji kłód CodeMirror

Niestety, nie ma parserów/lint'erów opartych na JavaScript, które są łatwo dostępne dla większości języków. Chciałbym zaimplementować własną bibliotekę dla Pythona. Niestety wygląda na to, że istniejący addon lintów jest zależny od wykładziny (która wywołuje wtyczkę lint) i jest synchroniczna.

angelozerr mówi, że w remoting-lint.js znajduje się wtyczka "CodeMirror.remotingValidator", ale Github pokazuje, że ten plik został usunięty. marijnh mówi, że został usunięty, ponieważ nie był "ogólnie przydatny", ale nie wyjaśnia żadnych alternatyw.

Czy istnieje strategia, aby w jakiś sposób wywoływać linter asynchronicznie, aby móc wykonać wywołanie Ajax, aby zdalnie przeanalizować kod?

Odpowiedz

16

Pewnie, że jest. Szybki przegląd zawartości ostatniej wersji programu remoting-lint.js (https://github.com/marijnh/CodeMirror/commit/27f097ed75561e846bdb955f13f8dd2bcf0b589e) pokazuje, że było to niewiele więcej niż żądanie jQuery AJAX, które wywołuje wywołanie zwracane do funkcji jako parametru. To wywołanie zwrotne zostanie przekazane tylko wtedy, gdy opcja "asynchroniczna" zostanie podana do wtyczki Lint. Zauważ, że niektóre opcje są przekazywane do CodeMirror, które mogą nie być odpowiednie dla ciebie. Opcje związane z lintami to "rynny" i "lintWith".

Należy zauważyć, że Python przedstawia tylko jeden błąd na raz, ale dodatek lint akceptuje listę błędów. Z powodu tego pierwszego, ten ostatni będzie miał najwyżej jeden przedmiot.

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, 
    }, 
}); 

mam napisali bardzo prosty projekt, aby ten trochę bardziej prosta: https://github.com/dsoprea/CodeMirrorRemoteValidator

+2

dobrze najprościej, +1 za gotowość do dzielenia się swoją wiedzą (odpowiedziało na własny post) i dodatkowego wysiłku ogłaszanie projektu Github. –

+2

O to właśnie chodzi. –

Powiązane problemy