CodeMirror - 从编辑器外部获取linting结果

时间:2017-01-08 16:19:01

标签: javascript forms validation codemirror lint

我正在使用很棒的CodeMirror库。我正在实现的代码编辑器是表单的一部分,因此我想用linting进行基本检查,看看用户的输入是否有效。除非代码没问题,否则我不想处理表单。

所以问题是:CodeMirror编辑器实例上是否有一个方法可以让我检索linting的结果?我正在查看文档和Google,但未能找到任何有用的信息。这个performLint方法被添加到编辑器中,但它不会返回linting的结果。

4 个答案:

答案 0 :(得分:6)

没有特定的方法来获取linting结果,但是在lint选项对象中定义getAnnotations属性时会提供一个钩子。

这是一个触发linting的基本选项对象:

var codeMirrorOptions = {
    "lineNumbers": true,
    "indentWithTabs": true,
    "mode": "css",
    "gutters": ['CodeMirror-lint-markers'],
    "lint": true
}

您可以指定一个对象(而不是布尔值)作为lint属性:

"lint": {
    "getAnnotations": css_validator,
    "async": true 
}

然后,定义自己的验证器功能。此函数只能调用CodeMirror的捆绑验证器:

     function css_validator(cm, updateLinting, options) {
            // call the built in css linter from addon/lint/css-lint.js
            var errors = CodeMirror.lint.css(cm);

            updateLinting(errors);

        }

此时你已经复制了lint:true的行为 - 但现在errors变量包含一个lint错误数组。如果errors.length == 0,则未发现任何错误。

注意:此示例假设您正在使用CSS,但同样适用于其他类型。

答案 1 :(得分:2)

@Clem的答案将我引向了正确的方向,尽管我确实遇到了一些问题。第一个是在控制台中反复看到Bad option: onUpdateLinting(请参见Codemirror issue的报道)。第二个是有时看到注释数组包含空条目。这是我传递到Codemirror的衬棉配置,可以解决这些问题。请注意,我使用的是react-codemirror2,但是选项以相同的格式传递到Codemirror中。我的组件有一个可选的onLintingComplete回调函数,可以由使用组件提供,并且您将在下面看到该回调函数传递给lint批注数组的地方:

  lint: onLintingComplete
    ? {
        onUpdateLinting: (_annotationsNotSorted, annotations) =>
          onLintingComplete(
            // sometimes codemirror includes null annotations in the array, so we want to filter these out
            annotations.filter(annotation => annotation != null)
          ),
        // This empty lint options object is needed here, see: https://github.com/codemirror/CodeMirror/issues/4198
        options: {}, 
      }
    : true,

答案 2 :(得分:1)

lint.js中的updateLinting函数将其注释(和编辑器)传递给onUpdateLinting选项:

if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm);

所以您要做的就是将处理程序作为lint选项属性:

lint: { onUpdateLinting: handleErrors }

答案 3 :(得分:0)

这是Dezzas答案的提示:

dir="fa,fb,fc"
subdir="s1,s2,s3"
eval mkdir -p test/{$dir}/{$subdir}

否则,它将失败。