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

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

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

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

Есть ли стратегия, так или иначе вызывающая linter асинхронно, чтобы я мог выполнить вызов 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