7 个版本 (2 个稳定版本)
1.0.1 | 2024年4月10日 |
---|---|
1.0.0 | 2024年4月7日 |
0.3.0 | 2024年3月17日 |
0.2.2 | 2024年2月3日 |
0.1.0 | 2024年1月27日 |
#1105 在 解析器实现
每月33次下载
在 simpleml_macro 中使用
43KB
859 行
SimpleML
这个包是 Simple Markup Language 规范的 Rust 实现。该规范建立在 Simple Markup Language 规范之上,并提供了一个人性化的配置文件格式。
更新日志
1.0.1
将依赖项 whitespacesv 从 1.0.1 更新到 1.0.2,它 修复了写入斜杠数组时的 panic。由于 SML 是建立在 WSV 之上的,这也影响了 SMLWriter。
1.0.0
这个包现在是 1.0 版本!在这个版本中没有引入任何破坏性更改,但它修复了以下不规范的 SML 会导致 panic 的错误
Root
InnerElement
# No closing tag
End
解析
这个crate仅提供了两个API用于解析SML文件。函数 parse 和 parse_owned 将解析SML输入,返回一个Result。Ok变体是来自 tree_iterators_rs crate的 tree_iterators_rs crate的TreeNode,表示层次结构中的元素。我选择在此基础上构建,以便在处理SML内容时,为您提供那里构建的所有树遍历实用方法。我建议将 use tree_iterators_rs::prelude::*;
添加到处理SML内容的文件中,以便将遍历方法引入作用域。这两个API之间的唯一区别是,parse 使用 Cow<'_, str> 来表示SML节点,而 parse_owned 使用String来表示SML节点。如果您不想处理生命周期,请使用 parse_owned。
由于SML是WSV的扩展,我还引入了 whitespacesv 作为依赖项。
内联声明
如果您计划在Rust代码或构建系统中包含任何SimpleML,请考虑使用 simpleml_macro 来维护所有内容都处于有效的SML格式。
编写
为了编写SML文件,请使用 SMLWriter 结构。它提供了几个配置选项,包括
- 任何自定义结束关键字
- SML属性WSV表的列对齐
- 缩进字符串(这必须是空白字符)
空白字符的列表定义如下
Codepoint Name
U+0009 Character Tabulation
U+000A Line Feed
U+000B Line Tabulation
U+000C Form Feed
U+000D Carriage Return
U+0020 Space
U+0085 Next Line
U+00A0 No-Break Space
U+1680 Ogham Space Mark
U+2000 En Quad
U+2001 Em Quad
U+2002 En Space
U+2003 Em Space
U+2004 Three-Per-Em Space
U+2005 Four-Per-Em Space
U+2006 Six-Per-Em Space
U+2007 Figure Space
U+2008 Punctuation Space
U+2009 Thin Space
U+200A Hair Space
U+2028 Line Separator
U+2029 Paragraph Separator
U+202F Narrow No-Break Space
U+205F Medium Mathematical Space
U+3000 Ideographic Space
如何使用SMLWriter的示例如下
use tree_iterators_rs::prelude::*;
use simpleml::{SMLWriter, SMLElement, SMLAttribute};
// Build up our value set
let my_sml_values = TreeNode {
value: SMLElement {
name: "Configuration",
attributes: Vec::with_capacity(0),
},
children: Some(vec![
TreeNode {
value: SMLElement {
name: "Video",
attributes: vec![
SMLAttribute {
name: "Resolution",
values: vec![Some("1280"), Some("720")],
},
SMLAttribute {
name: "RefreshRate",
values: vec![Some("60")],
},
SMLAttribute {
name: "Fullscreen",
values: vec![Some("true")],
},
],
},
children: None,
},
TreeNode {
value: SMLElement {
name: "Audio",
attributes: vec![
SMLAttribute {
name: "Volume",
values: vec![Some("100")],
},
SMLAttribute {
name: "Music",
values: vec![Some("80")],
},
],
},
children: None,
},
TreeNode {
value: SMLElement {
name: "Player",
attributes: vec![SMLAttribute {
name: "Name",
values: vec![Some("Hero 123")],
}],
},
children: None,
},
]),
};
// actually write the values
let str = SMLWriter::new(my_sml_values)
// Setting up a custom end keyword
.with_end_keyword(Some("my_custom_end_keyword"))
// Using 8 spaces as the indent string. The default is 4 spaces.
.indent_with(" ")
.unwrap()
// Align the WSV tables to the right.
.align_columns(whitespacesv::ColumnAlignment::Right)
.to_string()
.unwrap();
/// Result:
/// Configuration
/// Video
/// Resolution 1280 720
/// RefreshRate 60
/// Fullscreen true
/// my_custom_end_keyword
/// Audio
/// Volume 100
/// Music 80
/// my_custom_end_keyword
/// Player
/// Name "Hero 123"
/// my_custom_end_keyword
/// my_custom_end_keyword
println!("{}", str);
依赖关系
~2.5MB
~11K SLoC