我尝试在JavaScript中实现CSS解析,以便:
a {
color: red;
}
解析为对象:
{
'a' {
'color': 'red'
}
}
首先,是否有JavaScript / jQuery库可以使用?
我的实现非常基本,所以我确信它无论如何都不是万无一失的。例如,它对基本CSS工作正常,但对以下类型的属性:
background: url(data:image/png;base64, ....);
它失败了,因为我使用split(';')
来分离property:value
对。这里,;
出现在value
中,所以它也在那个点分离。
有没有其他方法可以做到这一点?
代码如下:
parseCSS: function(css) {
var rules = {};
css = this.removeComments(css);
var blocks = css.split('}');
blocks.pop();
var len = blocks.length;
for (var i = 0; i < len; i++)
{
var pair = blocks[i].split('{');
rules[$.trim(pair[0])] = this.parseCSSBlock(pair[1]);
}
return rules;
},
parseCSSBlock: function(css) {
var rule = {};
var declarations = css.split(';');
declarations.pop();
var len = declarations.length;
for (var i = 0; i < len; i++)
{
var loc = declarations[i].indexOf(':');
var property = $.trim(declarations[i].substring(0, loc));
var value = $.trim(declarations[i].substring(loc + 1));
if (property != "" && value != "")
rule[property] = value;
}
return rule;
},
removeComments: function(css) {
return css.replace(/\/\*(\r|\n|.)*\*\//g,"");
}
谢谢你!
5条答案
按热度按时间unguejic1#
您可以轻松地使用浏览器自己的CSSOM来解析CSS:
对于每个返回的规则,您可以查看
rule.style
中的属性。有关示例,请参阅http://jsfiddle.net/v2JsZ/。c2e8gylq2#
有一个用Javascript编写的CSS解析器JSCSSP
wlzqhblo3#
要编写最简单的解析器,请遵循规范中定义的标记化和CSS语法的确切规则。注意,您不必通过墨迹来实现规范。您可以从最有可能遇到的小部分和CSS开始,然后从那里扩展。更好的是,跳过整个过程,使用@Matthew的解决方案,除非这是一个学习练习。
JavaScript有各种各样的词法扫描器和解析器生成器。整个语法都可以在w3的网站上找到。当你可以简单地使用它和解析器生成器来生成JavaScript中的解析器时,为什么还要重复工作呢?
CSS的生产规则如下所示。
mrphzbgm4#
简单的例子,没有测试,但应该工作,我在我的项目中使用类似的。
von4xj4u5#
这是阿特金斯的一个解析器,它严格遵循规范
https://github.com/tabatkins/parse-css
有一个pretty good video说明这个解析器与其他解析器的工作方式