#css #style-sheet #serialization #parser #transformation #minification #source

lewp-css

CSS 样式表的领域模型。允许有效地进行最小化和转换,如自动补全和通过其他crate的删除。为 lewp 更新和维护的版本。

2 个不稳定版本

0.2.0 2022 年 3 月 26 日
0.1.22 2022 年 3 月 4 日

#8 in #minification


用于 lewp

MPL-2.0 许可证

1MB
21K SLoC

lewp-css - 以前称为 css

序言

这个仓库是 https://github.com/lemonrock/css 的一个分支。我喜欢最初的工作,并想进一步维护它。

因为这个crate似乎不再积极维护,并且我无法从作者那里得到回应,所以这个仓库以 lewp-css 的名称在crates.io上发布。

描述

lewp-css 是一个 Rust crate,实现了 CSS 样式表的解析器和序列化器。它使用了 cssparser crate。它封装了从 servo 的样式源代码分叉的源代码。非常感谢Mozilla的Servo团队所做的大量努力和成就。

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

[dependencies]
lewp-css = "*"

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

use ::lewp_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属性的 support。然而,对解析和计算 calc()attr()var() 的 full support 已存在。

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

随着成熟,这个 crate 将会经常破坏兼容性。它也不关注 semver。在某些时候,如果我坚持下去,它应该会稳定下来,然后可以采用更谨慎的方法。

[css] 正在开始摆脱其根源,以不同的方法支持 calc()attr(),页面选择器的支持,评估 attr(),不标准化缩写属性等,所有这些都有助于使 CSS 更容易操作、优化和序列化。

许可

本项目的许可协议为 Mozilla 公共许可证 2.0 (MPL-2.0)。从 Servo 分支的代码也根据 Mozilla 公共许可证 2.0 许可。Servo 开发者(Mozilla 基金会的一部分)保留了未修改的样式源代码的版权,以及其实现方法,该方法是从 Servo 分支的。

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

CSS 修改

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

@media

  • 使用欧几里得算法对 aspect-ratios 进行标准化
  • 将分辨率降低到像素密度(例如 DPI 为 96 等于 1)或 DPI(总是更大的)
  • '100%' 的关键帧百分比写为 'to'

@font-face

  • 删除字体功能设置的重复设置名称
  • 将字体功能设置写为 '0' 和 '1' 而不是 'on' 和 'off'

@viewport

  • 将 user-zoom 值标准化为 'zoom' 和 'fixed'

CSS 修正和升级

TODO

属性声明和类似声明

  • 如果值是 0(例如宽度),则不要指定尺寸
  • 可以在属性声明列表中省略最后的分号(在 W3C 解析器中始终有效)
  • 优化 css 颜色以最小尺寸,无论是十六进制、rgb 还是名称
  • 限制可解析的属性的有效范围,用于 @page 规则

@-规则

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

媒体查询

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

依赖项

~3.5MB
~69K SLoC