webzille / cssparser
将CSS文件解析为抽象语法树数据结构
Requires
- php: ^8.1
This package is auto-updated.
Last update: 2024-10-01 00:20:49 UTC
README
将CSS文件解析为一个简单的抽象语法树(AST)数据结构。
关于Webzille / CssParser
此包解析CSS文件,并将每个结构放入CSS文件中出现顺序的单独对象中。目前的AST结构相对简单,有大量改进空间。
安装
要开始使用此包解析CSS文件,您需要通过Composer运行以下命令。
composer require webzille/cssparser
用法
使用解析器非常简单。要解析CSS文件并获取生成的AST数据结构(即节点),
$parser = new Parser("stylesheet.css"); $nodes = $parser->parse()->getNodes();
然后可以使用格式类来渲染CSS。如果不使用它,则使用默认格式。
$format = (new CssFormat)->setIndent(" ")->setNewLine("\n"); $render = new Render($nodes, $format); $css = trim($render->css());
该示例设置与未使用格式对象时的默认缩进和换行符相同。
$render = new Render($nodes); $css = trim($render->css());
如果您想要压缩CSS,而不是设置空字符串作为缩进和换行符,您可以简单地使用minify()
方法,该方法接受一个可选的布尔参数作为其值以使压缩动态(基于特定条件或用户输入)。
$minified = true; $format = (new CssFormat)->minify($minified); $render = new Render($nodes, $format); $css = trim($render->css()); // The following is the same as the previous $format = (new CssFormat)->minify(); $render = new Render($nodes, $format); $css = trim($render->css());
目前,压缩CSS只是整行CSS。
工厂
工厂类提供了一种简单的方法来访问包中所有可用的类,以便在不必要地实例化对象到变量的情况下轻松使用单行。
$parser = new Parser("stylesheet.css"); $nodes = $parser->parse()->getNodes(); // VS $nodes = CSS::parser("stylesheet.css")->parse()->getNodes(); $format = (new Format)->minify(); // VS $format = CSS::format()->minify(); $optimize = CSS::optimize($nodes)->removeDuplicates(); // And other chained methods if you need them $search = CSS::search($nodes)->searchByType(Selector::class); $css = CSS::render($optimize->getNodes(), $format)->css();
搜索
提供搜索实用程序类以帮助通过多种方式搜索CSS AST数据结构。您可以搜索特定的选择器、属性、属性/值对或其他各种方法。要使用搜索实用程序,您既可以自己实例化该类,也可以使用静态搜索工厂方法来获取实例并在一行中进行搜索。
$search = CSS::search($nodes); // Or the following if you prefer $search = new Search($nodes);
如果您使用静态工厂方法,可以轻松地将其他方法链接到它,而无需在代码中添加额外的行或使用括号。
目前包含以下搜索方法
- searchByType: 在AST数据结构中搜索每个特定类型的节点实例。除了可选的 $node 参数(AST数据结构)外,$type 参数应采用
AtRule::class
形式。如果没有提供 $node,它将使用 $node
$search->searchByType(Comment::class);
- searchBySelector: 搜索请求的选择器。匹配可以是部分或完整的,它不是严格的。
- searchByProperty: 此方法要么搜索请求的属性,要么在您提供要匹配的属性的值的情况下搜索属性/值对。
- searchByClass: 此方法搜索包含请求类的选择器。假设您不会提供它,点号会自动添加。
- searchById: 如前所述的搜索方法,它搜索请求的ID。您不应该在参数中在ID名称之前添加哈希符号,它会自动添加。
- searchByAttribute: 在可用的选择器中搜索请求属性的任何出现。(例如
href
在a[href=^]
中)。 - searchByPseudo: 搜索请求伪类的任何出现。您不应该在参数中输入您要查找的伪类符号。(例如
:after
)。 - searchByMedia: 在at规则中搜索任何请求的媒体查询。查询可以是部分或全部。
- find: 这是一个将多个搜索添加到单个结果集的方法。它期望一个包含搜索条件的数组。
$criteria = [ [ 'type' => 'type', 'value' => \Webzille\CssParser\Nodes\AtRule::class ], [ 'type' => 'property', 'property' => 'font-family', 'value' => 'MyFont' ], [ 'type' => 'selector', 'value' => '.container' ] ]; $search = CSS::search($nodes)->find($criteria); $results = $search->results();
- searchResults: 此方法使用您之前搜索查询的结果作为搜索标准(即搜索的“草垛”)的搜索主题,格式与之前find方法中预期的格式相同。
您通过results()
方法获取结果,如果您不希望在各个搜索查询之间混合结果,您需要通过clearResults()
方法在搜索之间清除结果。
有关搜索的更全面示例,您可以查看提供的searchDemo.php。
优化
此包还提供了一个优化实用工具类,您可以使用它来优化解析后的CSS数据结构,稍后您可以将其渲染为压缩或格式化的CSS。就像搜索实用工具类一样,您可以直接初始化类,或使用静态工厂方法,原因与搜索实用工具类相同。
$optimizer = CSS::optimize($nodes); // Or the following if you prefer or not going to chain any methods to it. $optimizer = new Optimize($nodes);
它目前提供的以下优化选项。
- removeWhitespace: 此方法做两件事,它移除任何重复的空白(例如,如果在一个
content
属性中有多个空格),并且移除所有注释。 - removeDuplicates: 此方法移除任何重复的属性,只要它们的值不是供应商前缀(它目前完全忽略任何具有供应商前缀值的属性,因此您可以有多个具有相同供应商前缀值的属性)。
- toShorthand: 此方法尽可能将属性转换为简写形式(根据提供的属性及其值,不填充任何会使其成为可能且不会影响最终结果的数据)。
- optimizeColors: 此方法所做的全部是将十六进制颜色转换为它们的简写形式,只要可能。
- vendorPrefix: 此方法将供应商前缀添加到属性(以及必要时添加到值),以最大化浏览器兼容性。
如果您想/需要,可以将所有(或您需要的所有)优化方法链接在一起,以便在渲染之前对它们进行优化。(正如我在demo.php中所做的那样)。
每个方法都会记录它们所做的每个更改,您可以通过getModified()
方法检索这些更改。您还可以通过clearModified()
方法在优化方法之间清除日志,如果您想查看每个方法做了什么而不受其他方法的日志混乱的影响。
记录的每个修改的行号相对于原始解析的CSS文件,而不是渲染的CSS。
有关更全面的优化示例,您可以查看提供的optimizeDemo.php。
贡献
欢迎为Webzille CSS解析器做出贡献!请确保您向开发分支提交拉取请求。
许可证
本项目受MIT许可证许可 - 有关详细信息,请参阅LICENSE文件。