autumn_plugin_markstream/lib.rs
1//! markstream for Autumn: render and stream Markdown with Maud and htmx.
2//!
3//! Add [`MarkstreamPlugin`] to the app. Put [`markstream_head()`] in the page
4//! head. Render Markdown with [`Markstream`], and stream it with
5//! [`sse::markstream_sse`]:
6//!
7//! ```rust,no_run
8//! use autumn_plugin_markstream::sse::{markstream_sse, stream};
9//! use autumn_plugin_markstream::{Markstream, MarkstreamPlugin, Mode, markstream_head};
10//! use autumn_web::prelude::*;
11//!
12//! #[get("/")]
13//! async fn index() -> Markup {
14//! html! {
15//! html {
16//! head { (markstream_head()) }
17//! body {
18//! (Markstream::new("# Hello\n\nSome *Markdown*."))
19//! (Markstream::stream("/answer").mode(Mode::Chat))
20//! }
21//! }
22//! }
23//! }
24//!
25//! #[get("/answer")]
26//! async fn answer() -> impl IntoResponse {
27//! markstream_sse(stream::iter(["## Answer\n", "Some ", "*text*."]))
28//! }
29//!
30//! # async fn run() {
31//! autumn_web::app()
32//! .plugin(MarkstreamPlugin::new())
33//! .routes(routes![index, answer])
34//! .run()
35//! .await;
36//! # }
37//! ```
38//!
39//! The crate vendors markstream-vue [`MARKSTREAM_VERSION`] and Vue
40//! [`VUE_VERSION`] (runtime build). Autumn serves them from memory under
41//! `/static/_plugins/markstream/`. The page needs no inline script and no
42//! import map, so the default Autumn CSP works.
43//!
44//! # Limits
45//!
46//! - No syntax highlighting. Code blocks render as plain `<pre>`.
47//! - No Mermaid, D2 or infographic. These blocks show their source.
48//! - No KaTeX unless the page loads KaTeX as a global (`window.katex`).
49//! - The browser does not reconnect a stream. A dropped stream shows the
50//! error state.
51
52mod assets;
53mod markstream;
54mod plugin;
55mod script;
56pub mod sse;
57#[cfg(test)]
58mod test_support;
59mod vendored;
60
61pub use assets::{ASSETS_NAMESPACE, MARKSTREAM_ASSETS, MARKSTREAM_VERSION, VUE_VERSION};
62pub use markstream::{
63 ALLOW_TRUSTED_META, HtmlPolicy, Markstream, Mode, Theme, markstream_allow_trusted,
64};
65pub use plugin::{MarkstreamPlugin, PLUGIN_NAME};
66pub use script::{markstream_head, markstream_preloads, markstream_script, markstream_stylesheet};
67
68/// Compiles the README code blocks as doctests.
69#[doc = include_str!("../README.md")]
70#[cfg(doctest)]
71pub struct ReadmeDoctests;