3

我试图根据括号的级别以及它们是否匹配来突出显示括号。所以第一级得到下面的类paren_1,第二级得到paren_2等等。如果有的话,我也想突出显示插入符号旁边的括号集。这意味着如果您在括号(打开或关闭)旁边有插入符号,它应该突出显示所述括号及其对应的括号。我的(损坏的)实现显示在小提琴中。

这工作得很好。问题如下

  1. 如果输入字符串中有 HTML,那么一切都会分开。我尝试在将 html 发送到 using 之前对其进行转义jQuery('<div />').text(text).html(),这可行,但会破坏插入符号的位置。
  2. 如果“同一级别”上有多个括号,并且插入符号位于一组旁边,则它突出显示的内容超出了应有的范围。
  3. 如果有不匹配的括号,它应该用红色或类似的东西突出显示。这也不起作用,我不知道如何实现它。我已经尽力了,但一切都失败了。

JSFiddle:http: //jsfiddle.net/yWzWV/1/

大家请注意:我对 javascript 或 jquery 都不太擅长,所以如果这段代码让你眼花缭乱,请原谅我。

提前致谢!

4

1 回答 1

5

问题已解决,但我遇到了另一个问题。这是修复的问题:http: //jsfiddle.net/Axvgf/

这是更改后的方法:

function colorize(text, pos) {
    var i = 0, current_times = 0;
    var startc = '(', endc = ')';
    var current = -1;

    var entities = {'>': '&gt;','<':'&lt;'}; 
    var p2 = 0;
    var regex = new RegExp(Object.keys(entities).join("|"),'g');   
    var converted = text.replace(regex, function(x, j) {
        if(pos > j) p2 += entities[x].length - 1; 
        return entities[x];
    });

    pos += p2;
    var parens = [], indices = [], o = {};
    var newText = converted.replace(/((?:\\)*)([()])/g, function(full, escape, x, idx) {
        var len = escape.split(/\\/g).length - 1;
        if (len % 2 == 0) {
            indices.push(idx);
            if (x == startc) ++i;
            o[idx] = { selected: false, type: x, depth: i, idx: idx, pair: -1, extra: escape };
            if (idx == pos) o[idx].selected = true;
            if (x == startc) parens.push(idx);
            else {
                if (parens.length > 0) {
                    var p = parens.pop();
                    o[idx].pair = p;
                    if (o[p].selected) o[idx].selected = true;
                    o[p].pair = idx;
                    if (o[idx].selected) o[p].selected = true;
                }
                --i
            }
        }
    });
    newtext = converted;     
    indices = indices.sort(function(x,y) { return Number(y) - Number(x); });
    indices.forEach(function(i) {
        newtext = newtext.substr(0,i) + o[i].extra +
        "<span class='" + (o[i].pair == -1 ? "unmatched " : "paren_" + (o[i].depth % 5)) + 
        (o[i].selected ? " selected_paren": "") + "'>" + o[i].type + "</span>" + 
        newtext.substr(i + 1 + o[i].extra.length)
    });
    return newtext;
}
于 2012-12-24T12:53:57.140 回答