我正在使用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);


所有这些听起来似乎都是小故障,我正在寻找一种更好的方法。

最佳答案

您可以在.find()返回的对象上调用markText,它将返回标记的{from, to}位置(如果清除了标记,则返回null)。

08-19 01:45