#html-templating #template #html

no-std horrorshow

使用 Rust 宏编写的模板库

28 个版本

0.8.4 2021 年 10 月 13 日
0.8.3 2020 年 3 月 21 日
0.8.1 2020 年 2 月 21 日
0.7.0 2019 年 8 月 28 日
0.5.2 2015 年 6 月 26 日

#41模板引擎

Download history 1723/week @ 2024-03-04 1103/week @ 2024-03-11 862/week @ 2024-03-18 964/week @ 2024-03-25 1158/week @ 2024-04-01 991/week @ 2024-04-08 958/week @ 2024-04-15 980/week @ 2024-04-22 868/week @ 2024-04-29 1217/week @ 2024-05-06 1142/week @ 2024-05-13 886/week @ 2024-05-20 779/week @ 2024-05-27 1176/week @ 2024-06-03 1066/week @ 2024-06-10 956/week @ 2024-06-17

4,051 每月下载量
用于 34 个 crates (23 个直接)

MIT/Apache

63KB
1K SLoC

Horrorshow

Build Status Documentation crates.io

一个基于宏的 HTML 模板库,兼容稳定 Rust(当前需要 rust >= 1.37)。

特性

当编译时不包含 std(禁用“std”特性)甚至不包含 alloc(禁用“alloc”特性)时,此 crate 将优雅地降级。

当编译包含 alloc 但不包含 std

  • Template::write_to_io() 未定义。
  • 模板只能发出实现 ToString 的错误,并且所有此类错误都立即转换为字符串。

当仅编译 core 时

  • RenderBox 不再定义(无分配)。
  • Template::into_string()Template::write_to_string() 不再定义。唯一的模板渲染方法是 Template::write_to_fmt()
  • 模板只能发出静态 &str 错误,并且只记录第一个。

示例

#[macro_use]
extern crate horrorshow;
use horrorshow::prelude::*;
use horrorshow::helper::doctype;

fn main() {
    let actual = format!("{}", html! {
        : doctype::HTML;
        html {
            head {
                title : "Hello world!";
            }
            body {
                // attributes
                h1(id="heading") {
                    // Insert escaped text
                    : "Hello! This is <html />"
                }
                p {
                    // Insert raw text (unescaped)
                    : Raw("Let's <i>count</i> to 10!")
                }
                ol(id="count") {
                    // You can embed for loops, while loops, and if statements.
                    @ for i in 0..10 {
                        li(first? = (i == 0)) {
                            // Format some text.
                            : format_args!("{}", i+1)
                        }
                    }
                }
                // You need semi-colons for tags without children.
                br; br;
                p {
                    // You can also embed closures.
                    |tmpl| {
                        tmpl << "Easy!";
                    }
                }
            }
        }
    });

    let expected = "\
    <!DOCTYPE html>\
    <html>\
      <head>\
        <title>Hello world!</title>\
      </head>\
      <body>\
        <h1 id=\"heading\">Hello! This is &lt;html /&gt;</h1>\
        <p>Let's <i>count</i> to 10!</p>\
        <ol id=\"count\">\
          <li first>1</li>\
          <li>2</li>\
          <li>3</li>\
          <li>4</li>\
          <li>5</li>\
          <li>6</li>\
          <li>7</li>\
          <li>8</li>\
          <li>9</li>\
          <li>10</li>\
        </ol>\
        <br /><br />\
        <p>Easy!</p>\
      </body>\
    </html>";
    assert_eq!(expected, actual);
}

无运行时依赖

特性