#html-macro #syntax #yew #replace #editor-friendly #rust-idiomatic

defy

用更符合Rust风格、更友好的语法替换yew::html!宏

6个版本

0.1.5 2023年4月14日
0.1.4 2023年3月19日
0.1.2 2023年2月26日

#220 in 值格式化

每月43次下载

Apache-2.0

24KB
480

defy

GitHub actions crates.io crates.io docs.rs GitHub GitHub

用更符合Rust风格、更友好的语法替换yew::html!

这个crate中使用的语法主要受到kotlinx.htmlhorrorshow的启发。

示例

use defy::defy;

struct Datum {
    field:   &'static str,
    display: bool,
    label:   Label,
}
enum Label {
    First(i32),
    Second(u64),
}
let data = vec![
    Datum { field: "foo", display: false, label: Label::First(1) },
    Datum { field: "bar", display: true, label: Label::Second(2) },
];

let vnode = defy! {
    h1 {
        + "Hello world";
    }
    ul {
        for datum in data {
            let field = datum.field;
            if datum.display {
                li(data-length = field.len().to_string()) {
                    + field;
                }
            }
            match datum.label {
                Label::First(i) if i > 3 => {
                    h2 { +i; }
                }
                Label::Second(i) => {
                    h3 { +i; }
                }
                _ => { +"unmatched"; }
            }
        }
    }
};

// Rendering code omitted
assert_eq!(
    vnode_html.as_str().replace(['\n', ' '], ""),
    r#"
        <h1>Hello world</h1>
        <ul>
            unmatched
            <li data-length="3">bar</li>
            <h3>2</h3>
        </ul>
    "#
    .replace(['\n', ' '], "")
);

为什么要发明另一种语法?

Yew已经提供了几个编辑器插件来帮助编辑器将html!块作为HTML语法处理。然而,编辑器覆盖范围不完整,并且与常规Rust语法交互奇怪。defy使用与常规Rust语法相似的语法(类似于ron的想法)并为如for循环等结构提供了更好的语法糖。

依赖关系

~275–730KB
~17K SLoC