webzille/cssparser

将CSS文件解析为抽象语法树数据结构

V1.3 2024-05-28 19:39 UTC

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: 在可用的选择器中搜索请求属性的任何出现。(例如 hrefa[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文件。