2013-04-16 17 views
11

के लिए एक एसिंक्रोनस चेतावनी स्रोत का उपयोग करना उदाहरण केवल दिखाते हैं कि JSM और जावास्क्रिप्ट लिंट एडॉन्स को CodeMirror (सिंटैक्स-हाइलाइटिंग जावास्क्रिप्ट-आधारित संपादक) के साथ कैसे कार्यान्वित किया जाए, जो सिंक्रोनस हैं।CodeMirror की लिंट सुविधा

दुर्भाग्यवश, अधिकांश भाषाओं के लिए जावास्क्रिप्ट-आधारित पार्सर्स/लिंटर्स आसानी से उपलब्ध नहीं हैं। मैं पाइथन के लिए अपना खुद का लिटर लागू करना चाहता हूं। दुर्भाग्यवश, ऐसा लगता है कि मौजूदा लिंट एडन सिंक्रोनस होने पर लिटर (जो लिंट प्लगइन आक्रमण करता है) पर निर्भर करता है।

angelozerr का कहना है कि remoting-lint.js में स्थित "CodeMirror.remotingValidator" प्लगइन है, लेकिन गिथब दिखाता है कि यह फ़ाइल हटा दी गई थी। मारिजन कहते हैं कि इसे हटा दिया गया था क्योंकि यह "आम तौर पर उपयोगी नहीं था", लेकिन किसी भी विकल्प को स्पष्ट नहीं करता है।

क्या किसी भी तरह से लिनटर को असीमित रूप से कॉल करने की कोई रणनीति है, ताकि मैं कोड को दूरस्थ रूप से पार्स करने के लिए अजाक्स कॉल कर सकूं?

उत्तर

16

निश्चित रूप से वहाँ है। Remoting-lint.js (https://github.com/marijnh/CodeMirror/commit/27f097ed75561e846bdb955f13f8dd2bcf0b589e) के अंतिम संस्करण की सामग्री के माध्यम से एक त्वरित रूप से पता चलता है कि यह एक jQuery AJAX अनुरोध से थोड़ा अधिक था, जो पैरामीटर के रूप में फ़ंक्शन को प्रदान किए गए कॉलबैक को आमंत्रित करता है। यह कॉलबैक केवल तभी पारित किया जाएगा जब "async" विकल्प लिंट प्लगइन को दिया जाता है। ध्यान दें कि मेरे पास कोडमिरर में कुछ विकल्प पारित किए जा रहे हैं जो आपके लिए प्रासंगिक नहीं हो सकते हैं। लिंट से संबंधित विकल्प "गटर" और "लिंटविथ" हैं।

ध्यान दें कि पायथन केवल एक समय में एक त्रुटि प्रस्तुत करता है, लेकिन लिंट एडन त्रुटियों की एक सूची स्वीकार करता है। पूर्व की वजह से, उत्तरार्द्ध में केवल एक ही वस्तु होगी, अधिकतर।

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 आपकी ज्ञान को साझा करने की इच्छा के लिए और के लिए अतिरिक्त प्रयास (अपनी पोस्ट जवाब) एक जिथब परियोजना पोस्ट करना। –

+2

यही सब कुछ है। –

संबंधित मुद्दे