javascript - 为 CodeMirror 的 lint 功能使用异步警告源

标签 javascript python ajax syntax-highlighting codemirror

示例仅展示了如何使用同步的 CodeMirror(语法高亮的基于 Javascript 的编辑器)实现 JSON 和 Javascript lint 插件。

不幸的是,大多数语言都没有现成可用的基于 Javascript 的解析器/lint'ers。我想为 Python 实现我自己的 linter。不幸的是,现有的 lint 插件似乎依赖于同步的 linter(lint 插件调用)。

angelozerr 说 remoting-lint.js 中有一个“CodeMirror.remotingValidator”插件,但 Github 显示该文件已被删除。 marijnh 说它被删除是因为它“通常没有用”,但没有说明任何替代方案。

是否有某种策略以某种方式异步调用 linter,以便我可以进行 Ajax 调用以远程解析代码?

最佳答案

当然有。快速浏览最新版本 remoting-lint.js (https://github.com/marijnh/CodeMirror/commit/27f097ed75561e846bdb955f13f8dd2bcf0b589e) 的内容表明,它只不过是一个 jQuery AJAX 请求,它调用作为参数提供给函数的回调。仅当为 lint 插件提供“async”选项时才会传递此回调。请注意,我有一些选项被传递到 CodeMirror 中,这些选项可能与您无关。与 lint 相关的选项是“gutters”和“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

关于javascript - 为 CodeMirror 的 lint 功能使用异步警告源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16031072/

相关文章:

javascript - Javascript 代码仅在我将其放在正文部分时才有效

javascript - 不刷新页面获取单选值

jquery - 您可以在 jquery 中的另一个 AJAX 调用中进行 AJAX 调用吗?

javascript - 函数内的 JS setInterval 将同时调用,导致更新错误的元素

javascript - 将数组传递给 blazors IJSRuntime.InvokeAsync

python - 在 Python 中屏幕抓取基于 Javascript 的网页

Python 打印元素发生在下一个元素之后

python - 如何在python中获取对象属性的类型

javascript - 从ajax传递数据到node js时 undefined variable

javascript - emberjs - 在更大的模板中有条件地渲染模板