识别字符是用引号还是单引号括起来

Recognize if character is wrapped inside quotes or single quotes

本文关键字:单引号 起来 字符 识别      更新时间:2023-09-26

我正试图解决用冒号美化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()会在括号之前找到分号,并认为冒号后面需要一个空格。

我知道这是一个非常棘手的问题,但我想解决这个问题
我想我应该检查分号是否被引号或单引号包围,在这种情况下忽略它,继续寻找下一个分号或括号。

我该怎么办?

您可能可以使用regex或其他几种方法破解此问题,但它们仍然可能存在意外的边缘情况(有很多不同的方法来处理字符串)。

这就是美化工程一直在努力解决的前瞻性问题。该项目中使用的解析器在前瞻性/后向性方面非常出色,这正是您在这里真正想要做的。您不希望将行作为文本获取,而是希望沿着标记向前走,查找;{标记。这将删除所讨论的边缘情况,因为字符串令牌(其中包含;)不是;令牌。

根据代码的不同,您可能能够保存当前状态,并调用令牌生成器继续前进,直到它遇到其中一个令牌,然后弹回到您保存的状态。

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

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
}

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