2013-04-16 9 views
11

Gli esempi mostrano solo come implementare il JSON Il mondo lint JavaScript con CodeMirror (editor di Javascript a base di evidenziazione della sintassi), che sono sincroni.Utilizzando una fonte di allarme asincrono per la funzione di pelucchi CodeMirror

Purtroppo, non ci sono i parser/lint'ers prontamente disponibili per la maggior parte delle lingue JavaScript-based. Mi piacerebbe implementare il mio linter per Python. Sfortunatamente, sembra che l'addon di lint esistente dipenda dal linter (che il plugin richiama il lint) sia sincrono.

angelozerr dice che esiste un plugin "CodeMirror.remotingValidator" che si trova in remoting-lint.js, ma Github mostra che questo file è stato rimosso. marijnh dice che è stato rimosso perché "non è generalmente utile", ma non chiarisce alcuna alternativa.

Esiste una strategia per, in qualche modo, chiamando il linter in modo asincrono, in modo che io possa fare una chiamata AJAX al fine di analizzare il codice da remoto?

risposta

16

Certo che c'è. Una rapida occhiata ai contenuti dell'ultima versione di remoting-lint.js (https://github.com/marijnh/CodeMirror/commit/27f097ed75561e846bdb955f13f8dd2bcf0b589e) mostra che era poco più di una richiesta jQuery AJAX, che richiama un callback fornito alla funzione come parametro. Questa callback sarà passata solo se l'opzione "async" viene data al plugin lint. Nota che ho alcune opzioni che vengono passate in CodeMirror che potrebbero non essere rilevanti per te. Le opzioni relative ai pelucchi sono "gutters" e "lintWith".

Si noti che Python presenta solo un errore alla volta, ma che l'addon di lint accetta un elenco di errori. A causa del primo, il secondo avrà sempre un solo oggetto, al massimo.

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

ho postato un progetto molto semplice per rendere questo un po 'più semplice: https://github.com/dsoprea/CodeMirrorRemoteValidator

+2

ben messo, uno per la volontà di condividere le tue conoscenze (risposto alla tua posta) e lo sforzo supplementare di pubblicare un progetto github. –

+2

Ecco di cosa si tratta. –