识别字符是否包含在引号或单引号内

时间:2013-11-18 22:21:50

标签: javascript css

我正在尝试使用冒号字符修复beautify-js的问题。

问题是它在每个冒号后添加了一个空格,如果我写的话,这就是问题:

a:hover 
a::before
::selection
etc

因为它变成了:

a: hover 
a: : before
: : selection
etc

所以我添加了这个函数,帮助我从正在分析的冒号开始找到CSS行的结尾。

function getrow() {
  var test1 = source_text.substr(pos, source_text.indexOf(';') + 1);
  var test2 = source_text.substr(pos, source_text.indexOf('{') + 1);

  if(test1.length > test2.length) {
    return test2;
  } else {
    return test1;
  }
}

有了这个,我可以这样做:

if(getrow().indexOf("{") !== -1){
  output.push(ch);
} else {
  output.push(ch, " ");
}

分析结肠时。
如果行以括号结束,则表示任何冒号后面都不需要空格 如果不是,则意味着它以分号结束,因此冒号后面需要一个空格。

我认为这个补丁效果很好。在这种情况下唯一的问题是:

a:not("[data-test='some;content']") {

因为在这种情况下getrow()会在括号前找到半冒号,并认为冒号后面需要一个空格。

我知道这是一个非常有利的案例,但我想解决这个问题 我想我应该检查分号是否被引号或单引号括起来,在这种情况下忽略它并继续寻找下一个半色或括号。

我该怎么办?

2 个答案:

答案 0 :(得分:0)

你可能会在使用正则表达式或其他几种方法时破解它,但它们仍然可能有意想不到的边缘情况(有很多不同的方法来做字符串)。

这是一个展望美化项目一直在努力的问题。该项目中使用的解析器非常适合前瞻/后退,这就是您真正想要做的事情。您希望沿着标记向前查找;{标记,而不是将行作为文本。这将删除有问题的边缘情况,因为字符串标记(其中包含;)不是;标记。

根据代码,您可以保存当前状态并调用tokenizer向前走,直到遇到其中一个令牌,然后弹回到已保存的状态。

答案 1 :(得分:0)

看起来我已用以下代码修复了每个错误:

var text_after_pos = source_text.replace(new RegExp("('|\").*('|\")", "gm"), "").substr(pos - 1) + ";",
    semicolon = text_after_pos.substr(0, text_after_pos.indexOf(';')).length,
    closed_brace = text_after_pos.substr(0, text_after_pos.indexOf('}')).length,
    open_brace = text_after_pos.substr(0, text_after_pos.indexOf('{')).length,
    test1 = (semicolon > closed_brace) ? closed_brace : semicolon;

    //console.log(text_after_pos);
    if (test1 > open_brace && open_brace !== 0) {
         output.push(ch);
    } else {
         output.push(ch, " ");
    }

我首先删除大括号之间的文本,而不是运行其余的测试以了解冒号后是否需要空格。

我用这个奇怪的CSS示例测试了它:

a {
    color: purple
}
::selected {
    color: purple
}
a {
    color: purple
}
a:hover {
    color: purple
}
a {
    color: purple
}
a:not("foobar\";{}omg") {
    content: 'example\';{} text';
    content: "example\";}{ text"
}
a {
    color: purple
}

我无法想象尝试格式化的代码会更糟糕。