Expand description
Typed HTML support for Rust.
§Philosophy
HTML is easy to get started with, but hard to get right. There are several hundred element kinds, element attributes, and deeply nested hierachies - with some relationships even being conditional on each other. Remembering all of this is difficult and error-prone, but luckily we don’t have to remember any of this by using the type system! Rust’s type system enables us to model the entire HTML spec, allowing us to catch all errors ahead of time during compilation.
This project comes in layers. The bottom-most layer is the HTML spec itself. We
download it, and parse it into definition files. We then take these definitions,
and use it to generate the html-sys
crate. This crate is semantically correct,
and knows how to render itself to string representations. We then combine
html-sys
with web-sys
(wip) to create a higher-level HTML interface,
complete with support for events. This can be used to manipulate HTML both in
browser (wip) and non-browser contexts.
§Examples
We can create HTML structures one-by-one:
#![recursion_limit = "512"]
use html::text_content::OrderedList;
let tree = OrderedList::builder()
.list_item(|li| li.text("nori").class("cat"))
.list_item(|li| li.text("chashu").class("cat"))
.build();
let string = tree.to_string();
But we can also use Rust’s native control flow structures such as loops to iterate over items and create HTML:
#![recursion_limit = "512"]
use html::text_content::OrderedList;
let mut ol = OrderedList::builder();
for name in ["hello", "world"] {
ol.list_item(|li| li.text(name));
}
let tree = ol.build();
We can also create elements separately and append them later:
#![recursion_limit = "512"]
use html::text_content::{OrderedList, ListItem};
let mut ol = OrderedList::builder();
let li = ListItem::builder().text("hello").build();
ol.push(li);
let tree = ol.build();
Modules§
- content
- Content sectioning elements
- edits
- Demarcating edits elements
- embedded
- Embedded content elements
- forms
- Forms elements
- inline_
text - Inline text elements
- interactive
- Interactive elements
- media
- Image and multimedia content
- metadata
- Metadata elements
- root
- Root elements
- scripting
- Scripting elements
- tables
- Table content elements
- text_
content - Text content elements
- web_
components - Web Components
Traits§
- Embedded
Content - The Embedded content category
- Flow
Content - The Flow content category
- Heading
Content - The Heading content category
- Html
Element - An HTML Element
- Interactive
Content - The Interactive content category
- Metadata
Content - The Metadata content category
- Palpable
Content - The Palpable content category
- Phrasing
Content - The Phrasing content category
- Render
- Render an HTML element to a string.
- Script
Supporting Content - The Script-supporting elements content category
- Sectioning
Content - The Sectioning content category
- Transparent
Content - The Transparent content category