获取匹配标签之间的价值? (CodeMirror)

时间:2015-06-01 06:34:18

标签: javascript codemirror

我正在使用Codemirror 5.3。

我在混合模式文档中标记匹配html以突出显示开始和结束标记 - 这很有效。 (https://codemirror.net/demo/matchtags.html

我正在尝试捕获标记之间的内容(在我的情况下使用上下文菜单操作,我右键单击标记),因此我可以将其发送到外部进程。

我使用var tm = doc.getAllMarks();,因为我是标签匹配而不是书签,我几乎知道数组中只有两个项目。但是,此返回的TextMarker数组(尽我所知)包含标记的{line, ch}游标。

是否有正确的方法来获得标记的起始位置和结束位置 - 直接或作为线条和字符位置?我能想到的最好的就是迭代每个:

[].lines[0].parent.lines

并查看CodeMirror.Line的每个实例是否都有markedSpans对象,这会给我行索引,然后使用[].lines[0].markedSpans[0].from[].lines[0].markedSpans[0].to来查找位置标记中的字符。然后使用doc.getRange抓取内容并将其随机播放以进行处理......如下所示:

var tm = doc.getAllMarks(),
    lines = tm[0].lines[0].parent.lines,
    range = {
        from: { line: 0, ch: 0},
        to: { line: 0, ch: 0 }
    },
    hack = 0,
    textContent = "";
for (var i=0,j=lines.length;i<j;i++) {
    if (lines[i].hasOwnProperty("markedSpans")) {
        if (hack==0) { // sorry, i'm in a hurry
            range.from.line = i;
            range.from.ch = lines[i].markedSpans.from;
            hack=1;
        } else {
            range.to.line = i;
            range.to.ch = lines[i].markedSpans.to;
        }
    }
}
textContent = doc.getRange(range.from,range.to);

所有这些听起来都非常糟糕,我正在寻找更好的方法。

1 个答案:

答案 0 :(得分:1)

您可以在markText返回的对象上调用.find(),它会返回标记的{from, to}位置(如果标记已被清除,则返回null。)< / p>