2012-12-23 84 views
4

我想根据它们的级别以及它们是否匹配来突出显示括号。所以第一级获得以下类paren_1,第二级获得paren_2等。如果有的话,我想突出显示插入符号旁边的圆括号。意思是如果你在括号旁边开了一个插入符(开或关),它应该突出显示所述括号及其对应的括号。小提琴中显示了我的(破碎的)实现。突出显示输入框内的括号

这工作得很好。问题如下

  1. 如果输入字符串中有HTML,则所有内容都会分开。我试图在使用jQuery('<div />').text(text).html()发送它之前尝试转义html,该工作可行,但废弃插入位置。
  2. 如果“同一级别”上有多个括号,并且插入符号紧挨着一个集合,它将突出显示比它应该显示的更多。
  3. 如果有不匹配的括号,应该用红色或类似的方式突出显示。这不起作用,我不知道如何实现它。我尽力而为,但一切都失败了。

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

注意给大家:我在没有办法很好用JavaScript或jQuery的,所以你必须,如果这个代码使你的眼睛流血原谅我。

在此先感谢!

+0

你应该看看jsfiddles源代码,看看他们是如何做到这一点。你的问题太宽泛了。 – goat

+0

@rambocoder:它是如何广泛的?我已经详细说明了它的各个方面。我试过的,我想实现的。 –

+0

建议您将演示范围缩小到较小的组件,使用较少的代码专注于特定的难度区域,并删除不会导致问题的任何非关键代码 – charlietfl

回答

2

问题解决了,但我遇到了另一个问题。下面是与修复的小提琴: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; 
}