11个版本
0.2.5 | 2019年12月29日 |
---|---|
0.2.4 | 2019年12月29日 |
0.1.5 | 2019年12月28日 |
214在 模板引擎中
每月下载量 27
17KB
90 行
Hiccup
受Clojure的Hiccup启发的宏。目前不保证内联代码执行的支持。 此库的主要目标是防止HTML标签未闭合。
基本元素
宏`hiccup!`接收一个可变字符串作为第一个参数,并修改该字符串以输出HTML。元素的顺序是
tag
作为第一个元素。- 标签内可选的属性应紧跟在标签名后,格式为
{attribute1=>"value1 value2 ... valuen", attr=>"value"}
。此外,属性应位于{...}
内,并且通过,
分隔每个键值对。元素应写为key=>"value"
,其中key是一个符号,后面跟着一个箭头(=>
),然后是作为字符串的值"value"
。 - 在(可选)标签名或属性
{...}
之后,可以包含[...]
,它可以包含其他标签,例如p["text"]
或常规字符串值。 - 在
[...]
内,你还可以将字符串替换为(...)
中的某些简单 Rust 代码。这可能类似于p[format!("{:?}", 3 + 4)]
或div[(x)]
,其中 x 在外部已定义。
Clojure 和 Rust Hiccup 之间的区别
- Clojure:
[:a :href "http://github.com":} "GitHub"]
- Rust:
a{href=>"http://github.com":}["GitHub"]
用法
将依赖项添加到 Cargo.toml
[dependencies]
hiccup = "0.2.5"
使用 hiccup!
宏的代码示例
use hiccup::hiccup;
fn main() {
let mut html = String::new();
let _ = hiccup!(&mut html,
html[
head[meta{name=>"author", content=>"Julia Naomi"}
title["Hiccup guide"]]
body{class=>"amazing hiccup guide"}[
h1{font=>"bold", color=>"red"}["Hiccup is the best!"]
p["please lookup clojure's hiccup for better ideas on this macro"]]
]);
assert_eq!(html,"<html><head><meta name=\"author\" content=\"Julia Naomi\"/>\
<title>Hiccup guide</title></head><body class=\"amazing hiccup guide\">\
<h1 font=\"bold\" color=\"red\">Hiccup is the best!</h1>\
<p>please lookup clojure\'s hiccup for better ideas on this macro</p></body></html>");
}
带有远程代码执行
let mut html_inner = String::new();
let mut html_outer = String::new();
let x = "inner my str";
let y = "my str2";
let z = "my str3";
let _ = hiccup!(&mut html_inner,
div[
div{hello=>"inner world"}[(x)]
]
);
let _ = hiccup!(&mut html_outer,
html[
body{class=>"amazing hiccup guide"}[
p["please lookup clojure's hiccup for better ideas on this macro"]
div[
div{hello=>"world"}[(html_inner)]
div[(y.to_owned() + " " + z)]
p["bye"]
]
]
]);
assert_eq!(html_outer,"<html><body class=\"amazing hiccup guide\">\
<p>please lookup clojure\'s hiccup for better ideas on this macro</p>\
<div><div hello=\"world\"><div><div hello=\"inner world\">inner my str</div></div></div>\
<div>my str2 my str3</div><p>bye</p></div></body></html>");
常见问题解答
- 是否可以使用此库作为 XML 模板?
是的,我最近在测试中添加了一个更通用的 XML 用例。
fn main() {
let mut out = String::new();
let _ = hiccup!(&mut out,
xml{metas=>"I forgot them all", version=>"any version"}[
family[name{name=>"Rubiechiov", origin=>"Kazakhstan"}]
members{class=>"close family"}[
member{age=>"oldest", color=>"yellow"}["some name"]
member{age=>"mid-age", color=>"yellow"}["some other name"]
member{age=>"yougest", color=>"brown"}["Julia"]]
]);
assert_eq!(out,"<xml metas=\"I forgot them all\" version=\"any version\"><family>\
<name name=\"Rubiechiov\" origin=\"Kazakhstan\"/></family><members class=\"close family\">\
<member age=\"oldest\" color=\"yellow\">some name</member>\
<member age=\"mid-age\" color=\"yellow\">some other name</member>\
<member age=\"yougest\" color=\"brown\">Julia</member></members></xml>");
}
贡献
请将你包含在宏中的功能作为 PR 的名称 并附带测试