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 在 模板引擎 中
4,051 每月下载量
用于 34 个 crates (23 个直接)
63KB
1K SLoC
Horrorshow
一个基于宏的 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 <html /></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);
}