Skip to main content

Crate molt

Crate molt 

Source
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>&lt;script&gt;</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.
ssgssg
Static site generation.
wasmwasm
WebAssembly bindings.

Macros§

html
Builds a node tree from nested markup-like syntax.