#style-sheet #css-parser #css-selectors #minification #source #serialization #rules

nightly css

一个使用 cssparser 和 selectors 插件来为 CSS 样式表提供领域模型的 crate。旨在允许有效地压缩 CSS 和 CSS 转换,如自动前缀化和其他 crate 的移除

22 个版本

使用旧的 Rust 2015

0.0.22 2017年11月10日
0.0.21 2017年11月10日
0.0.7 2017年10月15日

#1648 in 网页编程

40 个月下载量
3 个 crates(2 个直接使用) 中使用

MPL-2.0 许可证

785KB
18K SLoC

css

css 是一个 Rust crate,实现了 CSS 样式表解析器和序列化器。它使用 cssparser crate。它封装了从 servo 中分叉的原始样式源代码。对构建 Servo 的 Mozillians 的辛勤工作和成就表示衷心的感谢。

要开始使用,请向 Cargo.toml 添加依赖项,例如:

[dependencies]
css = "*"

然后添加一些简单的代码,例如 lib.rs 的形式:

extern crate css;
use ::css::Stylesheet;

// Parse
let stylesheetUtf8String: String = ...;
let stylesheet = Stylesheet::parse(&stylesheetUtf8String).expect("Wasn't a valid stylesheet");

// Serialize

use ::std::fmt::Write;

let mut destination: Write = ...
const include_source_urls: bool = false;
stylesheet.to_css(&mut destination, include_source_urls).expect("Wrote out a stylesheet");

目的

我构建了这个 crate,以便创建 Autoprefixer 和 PurifyCSS 的 Rust 版本。为什么?因为我的 cordial 网络服务器面向互联网,鉴于 NodeJS 代码的性质,它不能作为依赖项。它还可以用于评估 @media@viewportcalc() / var() / attr() 规则和表达式。

因此,它还不够完整。我欢迎补丁来添加对常见(和不那么常见)CSS 属性的支持。然而,对解析和计算 calc()attr()var() 的完整支持是存在的。

请注意,与网络浏览器不同,css 不会忽略它不理解的内容。这是故意的;这使得捕获 CSS 代码中的假设变得更容易。如果您认为应该解析某些内容,请修补源代码。

这个crate在成熟过程中会经常破坏兼容性,并且根本不关心semver。如果我一直坚持下去,它应该会稳定下来,然后适合采用更谨慎的方法。

css正在开始偏离其起源,采用了不同的方法来处理calc()attr()、页面选择器的支持、评估attr()、不归一化缩写属性等,所有这些都有助于使CSS更容易操作、优化和序列化。

许可

本项目采用Mozilla Public License 2.0 (MPL-2.0)许可。从Servo分叉的代码也采用Mozilla Public License 2.0许可。Servo开发者(Mozilla基金会的一部分)保留了未经修改的样式源代码的版权,以及从Servo分叉的实现方法。

在src/selectors/temporary_fork(来自"https://github.com/servo/servo",rev = "4f984a6428a0f497e311a0800efa55166c15aac6")中有一个临时分叉的selectors crate(及其依赖servo_arc),也来自Servo。一旦发布了新的selectors crate版本(如0.19.0),它就会被移除。

CSS修改

这些是对CSS在解析或序列化时的微小调整,主要是为了使其更高效。

@media

  • 使用欧几里得算法归一化纵横比
  • 分辨率降低到像素密度(例如,96 DPI = 1密度)或每厘米点数(总是更大)
  • '100%'的关键帧百分比写作'to'

@font-face

  • 移除字体特征设置中重复的设置名称
  • 字体特征设置以'0'和'1'的形式编写,而不是'开'和'关'

@viewport

  • 将用户缩放值归一化到'zoom'和'fixed'

CSS修正和升级

TODO

属性声明和类似声明

  • 如果值是0(例如宽度),则不要指定维度
  • 可以在属性声明列表中省略最后的';'(在任何情况下都有效于W3C解析器)
  • 优化css颜色到最小的大小,无论是十六进制、rgb还是名称
  • 限制可以解析的@page规则的有效属性范围

@-rules

  • 通过删除重复的规则、强制定义到缩写形式等来优化@viewport
  • 输出前缀 -ms-、-o- 用于 @viewport,并删除不受支持的属性(仅针对Opera的orientation,仅针对IE11 / Edge的width和height)
  • 支持解析 @counter-style Symbol::Image()

媒体查询

  • 支持第4级运算符语法(例如 >=
  • 支持在布尔上下文中解析,其中省略了值并默认为零(0)或无,例如对于网格、颜色等
  • 支持通过在序列化时省略默认值为零(0)或not()来压缩CSS

依赖关系

~4MB
~79K SLoC