#标记语言 #配置文件 #标记 #语言 #文件格式 #SML #简单

simpleml

Stenway 定义的 Simple Markup Language 格式的解析器/编写器的 Rust 实现。请参阅 https://dev.stenway.com/SML/。SML 在 WSV 的基础上构建,允许数据的分层结构。

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 中使用

MIT 许可证

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文件。函数 parseparse_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 结构。它提供了几个配置选项,包括

  1. 任何自定义结束关键字
  2. SML属性WSV表的列对齐
  3. 缩进字符串(这必须是空白字符)

空白字符的列表定义如下

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