16个版本 (稳定版)

3.5.0 2023年11月1日
2.5.0 2023年11月1日
2.4.0 2023年10月17日
2.3.0 2023年1月17日
0.2.1 2019年4月29日

解析器实现中排名317

每月下载22
2 crates中使用

MIT授权MIT

100KB
3.5K SLoC

C 2K SLoC Rust 1.5K SLoC // 0.0% comments

Syncat样式表

本文档仅包含syncat_stylesheetcrate的使用说明。有关这些样式表的语法和语义的文档,请参阅syncat-themes仓库。

样式表

样式表从文件中加载。所有导入将在加载过程中相对于文件解析。

// colours.syncat
$variable: red;
$value: bryellow;

// syncat.syncat
import "./colours.syncat";
declaration variable { color: $variable; }
declaration value { color: $value; }
let stylesheet = Stylesheet::from_file("syncat.syncat");

查询

查询以树的形式呈现,因为这些样式表通常用于将属性(即样式)应用于树(例如解析树)。

每个Query节点都有一个kindtoken,这些必须提供。这些节点还可以包含子节点,这些子节点也是Query,它们可以有更多子查询。

在匹配规则时,将规则节点与树的右侧分支进行匹配。

例如,以下源代码

$hello: world;

您可以使用以下Query

let mut query = Query::new("declaration", "$hello: world;");
query.add_child(Query::new("variable", "$hello"));
query.add_child(Query::new("value", "$world"));

它对应于以下树

(declaration (variable "$hello")
             (value "world"))

然后可以通过使用Stylesheet::style方法将树与Stylesheet进行匹配。如果有匹配项,将返回Some(style),如果没有匹配项,则返回None。通常这种区别并不重要,因此您可以展开到默认的Style

let style = stylesheet.style(&query).unwrap_or_default();
// successfully:
declaration value {} // because the value is on the right-most branch, and has the declaration as a parent
variable + value {} // because the value is on the right-most branch, and a direct sibling of the variable
declaration {} // because the declaration is a parent of the rightmost branch
value & "world" {} // because the value on the right-most branch has token "world"

// unsuccessfully
declaration > variable {} // because the variable is not on the right-most branch
value & "wor" {} // because the token "wor" does not match the token "world"
declaration variable value {} // because the value is not nested within the variable
declaration > {} // because the declaration is not the node directly at the end of the right-most branch

应用

一旦您有了Style值,您可以使用Style::getStyle::try_get方法提取其属性。 Style::get将检索原始值,而Style::try_get将尝试将此值转换为上下文类型。

启用 ansi_term 功能(默认不启用)时,提供了到 ansi_term::Style 的转换。或者,您可以直接从 Style 提取您期望的任何属性,并按您的选择进行解释。

let content: String = style.try_get("content")?.unwrap_or_else(|| String::from("hello world"));
let ansi_style: ansi_term::Style = style.try_into()?;
println!("{}", ansi_style.paint(content));

依赖项

~3-5MB
~91K SLoC