我正在尝试使用冒号字符修复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()
会在括号前找到半冒号,并认为冒号后面需要一个空格。
我知道这是一个非常有利的案例,但我想解决这个问题 我想我应该检查分号是否被引号或单引号括起来,在这种情况下忽略它并继续寻找下一个半色或括号。
我该怎么办?
答案 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
}
我无法想象尝试格式化的代码会更糟糕。