#css #html-css #safe #expansion #macro #generate-html #ust

rtml

(r)ust 宏用于 h(tml) 扩展 => rtml. (r)ust 类型安全 (css) => rcss

21 个版本 (重大更新)

0.17.0 2023 年 2 月 26 日
0.15.0 2023 年 2 月 5 日
0.3.2 2022 年 12 月 30 日

Rust 模式 中排名 #1071

自定义许可

130KB
3K SLoC

rtml

描述

(r)ust 宏用于 h(tml) 扩展 => rtml

(r)ust 类型安全 (css) => rcss

用法

fn main() {
    use rtml::*;
    // Use the macros to generate some HTML
    let document = html! {
        .lang = "en",
            head!{
                title!{
                    "Title of the document"
                }
            },
            body!{
                    div!{
                        "text",
                        h1!{
                            "This is a heading"
                        },
                        p!{
                            "This is a paragraph"
                        }
                    }
            }
    }.render();

    println!("{}", document);
}

输出的 HTML 将是非格式化的。但与以下等效

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Page Title</title>
  </head>
<body>

<div>
  text
  <h1>This is a Heading</h1>
  <p>This is a paragraph.</p>
</div>

</body>
</html> 

当存在属性时,它们会先出现,然后再添加任何嵌套的内部 HTML。

div!{ .style="background-color: red;" }

当 HTML 需要构建时,调用 render()

入门指南

将 rtml crate 的最新版本安装到您的项目中

使用您计划使用的特定标签或通过添加此 use 语句引用所有标签。

  use rtml::p;  
  // or 
  use rtml::*;

CSS

Rtml 还支持类型安全 CSS。

fn main() {
    use rtml::*;
    // Use the macros to generate some CSS
    let css = css! {
      p {
        background: "yellow",
        color: "red"
      }
    }.render();

    println!("{}", css);
}

真实内联 CSS 与 rcss 之间的主要区别是值是字符串。另一个区别是属性以逗号 , 分隔,而不是以分号 ; 分隔。

尚未实现 At-rules 和 Functions。

类型安全 HTML 属性

rtml 允许通过标签使用提供额外的类型安全层。例如,

a! { .href="/documents", My Documents }
<a href="/documents">My Documents</a>

a 标签上允许正确的属性。如果您不熟悉,您可能会尝试使用无效的 src 属性。大多数其他网站构建项目都不会阻止不兼容的属性使用。

在 rtml 中,有一个有用的错误。

a! { .src="/documents", My Documents }
<a src="/documents">My Documents</a>
the trait bound `src: ACompat` is not satisified
the following other types implement the trait `ACompat`:
accesskey
class
contenteditable
dir
download
draggable
hidden
href
and 13 others

将此错误分解如下,

trait 约束src: ACompat...

  • src : 是尝试使用的属性的名称
  • ACompat : 是需要实现的 trait,每个标签都有自己的版本。例如,DivCompatStyleCompat
  • accesskey class contenteditable : 是支持的属性中的一小部分,Rust 按字母顺序列出它们,因此不会显示所有

特殊字符

rtml 和 rcss 在幕后使用结构体和特性,以确保最大的类型安全。正因为如此,由于 Rust 与 rtml 之间有一些共享的关键字,所以存在一些特殊的注意事项。字符 - 在标识符中是不允许的。因此,将所有 - 替换为下划线 _。示例:将 -webkit-line-clamp 使用 _webkit_line_clamp

关键字 rtml
作为 _作为
类型 _类型
种类 _种类
对于 _对于
循环 _循环
在哪里 _在哪里
异步 _异步

组件

尚未实现

依赖项