16个版本 (稳定版)
3.5.0 | 2023年11月1日 |
---|---|
2.5.0 |
|
2.4.0 | 2023年10月17日 |
2.3.0 | 2023年1月17日 |
0.2.1 | 2019年4月29日 |
在解析器实现中排名317
每月下载22次
在 2 crates中使用
100KB
3.5K SLoC
Syncat样式表
本文档仅包含syncat_stylesheet
crate的使用说明。有关这些样式表的语法和语义的文档,请参阅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
节点都有一个kind
和token
,这些必须提供。这些节点还可以包含子节点,这些子节点也是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::get
或Style::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