Expand description
Fast, type-safe HTML generation for Rust and WebAssembly.
A composite tree of plain values, escaped by default and rendered compact or pretty,
compiled to native code or to wasm32-unknown-unknown.
§Getting started
use molt::prelude::*;
let card = article()
.add_class("card p-4")
.child(h1().text("Welcome to Molt!").add_class("text-2xl"))
.child(p().text("Ultra-fast HTML generation compiled to WebAssembly."));
println!("{}", card.render_pretty());§Escaping
Text content and attribute values are escaped when they enter the tree, not when it
is rendered, so nothing is escaped twice and nothing is missed. Node::Raw is the
documented way to inject markup you already trust.
URL attributes (href, src, action, srcset, … — the list is in
core::url_policy) are checked when the tree is written: a javascript: or
vbscript: URL, or data:text/html, renders as #, and so does a data: document in
an iframe, frame, embed or object. The check also covers a value stored with
Attribute::raw, and srcdoc is written empty.
Element::trusted_url opts out for a URL you wrote yourself. Tag and attribute names
are validated too. See SECURITY.md.
use molt::prelude::*;
assert_eq!(p().text("<script>").render(), "<p><script></p>");§Render modes
Render::render produces a single line; Render::render_pretty indents. Both take
their configuration from a RenderOptions value rather than global state, so two
threads can render the same tree differently at the same time.
§Limits
Rendering has no depth limit by default: the writer walks an explicit stack instead of
recursing, and so do Clone, PartialEq, Hash and Drop. What deep trees do cost is
output size in pretty mode, which is quadratic in depth because every line carries one
indent string per level. When depth comes from untrusted input, bound it with
RenderOptions::with_max_depth. See Render and SECURITY.md.
§Golden fixtures
The rendered markup of a whole page, a sitemap and a feed is compared byte for byte with
files in tests/fixtures/, so a change to the output of valid input cannot go unnoticed.
MIGRATION.md lists what changed between releases.
Re-exports§
pub use crate::core::Attribute;pub use crate::core::Element;pub use crate::core::Node;pub use crate::core::Render;pub use crate::core::RenderOptions;pub use crate::document::Document;pub use crate::layout::Layout;
Modules§
- accessibility
- Accessibility helpers and a debug-time audit.
- core
- The core engine: the node tree, the renderer and escaping.
- document
- Whole-page assembly.
- elements
- Constructors for every HTML element Molt supports.
- feed
- RSS 2.0 feed generation.
- layout
- Reusable page layouts.
- macros
- The
html!declarative macro. - prelude
- One import that gets you from nothing to a rendered page.
- seo
- SEO metadata: Open Graph, Twitter Cards and the common
<meta>block. - sitemap
- XML sitemap generation.
- ssg
ssg - Static site generation.
- wasm
wasm - WebAssembly bindings.
Macros§
- html
- Builds a node tree from nested markup-like syntax.