Need help with horrorshow-rs?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

Stebalien
242 Stars 18 Forks Other 225 Commits 4 Opened issues

Description

A macro-based html builder for rust

Services available

!
?

Need anything else?

Contributors list

# 10,556
Emacs
IPFS
network...
libp2p
200 commits
# 9,263
Rust
Shell
serde
gosu
4 commits
# 249,319
Node.js
Rust
rust-li...
html-te...
2 commits
# 256,023
Rust
Discord
mtg
python3
2 commits
# 76,668
Shell
templat...
macro
fronten...
1 commit
# 531,762
Rust
Shell
rigid-b...
html-te...
1 commit
# 25,000
Erlang
pooling
apache
gRPC
1 commit
# 10,763
TypeScr...
mocking...
react-s...
raven
1 commit
# 594,143
Shell
rust-li...
html-te...
C++
1 commit

Horrorshow

Build Status Documentation crates.io

A macro-based html templating library, compatible with stable rust (currently requires rust >= 1.37).

Features

This crate will degrade gracefully when compiled without

std
(disable the "std" feature) and even without
alloc
(disable the "alloc" feature).

When compiled with

alloc
but without
std
:
  • Template::write_to_io()
    is not defined.
  • Templates may only emit errors implementing
    ToString
    and all such errors are immediately converted to strings.

When compiled with just core:

  • RenderBox
    is no longer defined (no allocation).
  • The
    Template::into_string()
    and
    Template::write_to_string()
    are no longer defined. The only template rendering method available is
    Template::write_to_fmt()
    .
  • Templates may only emit static
    &str
    errors, and only the first is recorded.

Example:

#[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

" } p { // Insert raw text (unescaped) : Raw("Let's count 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 = "\
\
\
  \
    <title>Hello world!</title>\
  \
  \
    <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>\
  \
";
assert_eq!(expected, actual);

}

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.