Использование асинхронного источника предупреждений для функции lint CodeMirror

примеры показывают только, как реализовать JSON и Javascript lint аддоны с CodeMirror (редактор на основе Javascript с подсветкой синтаксиса), которые являются синхронными.

к сожалению, для большинства языков нет доступных синтаксических анализаторов/Линт на основе Javascript. Я хотел бы реализовать свой собственный Линтер для Python. К сожалению, кажется, что существующий аддон lint зависит от того, что Линтер (который вызывает плагин lint) является синхронным.

angelozerr говорит что есть "CodeMirror.remotingvalidator " плагин, расположенный в remoting-lint.js, но Github показывает, что этот файл был удален. marijnh говорит, что он был удален, потому что он "не был вообще полезен", но не уточняет никаких альтернатив.

есть ли стратегия для вызова линтера асинхронно, чтобы я мог выполнить вызов Ajax для удаленного анализа кода?

1 ответов


конечно же, есть. Быстрый просмотр содержимого последней версии remoting-lint.js (https://github.com/marijnh/CodeMirror/commit/27f097ed75561e846bdb955f13f8dd2bcf0b589e) показывает, что это было немного больше, чем запрос jQuery AJAX, который вызывает обратный вызов, предоставленный функции в качестве параметра. Этот обратный вызов будет передан только в том случае, если опция" async " задана плагину lint. Обратите внимание, что у меня есть некоторые параметры, передаваемые в CodeMirror, которые могут не иметь отношения к вы. Линт-связанные опции "водостоки" и "lintWith".

обратите внимание, что Python представляет только одну ошибку за раз, но что аддон lint принимает список ошибок. Из-за первого у последнего будет только один предмет, самое большее.

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