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//! - Syntax highlighting is light: keywords, strings, numbers and comments for
47//! common languages. It is not Monaco or Shiki.
48//! - No Mermaid, D2 or infographic. These blocks show their source.
49//! - No KaTeX unless the page loads KaTeX as a global (`window.katex`).
50//! - The browser does not reconnect a stream. A dropped stream shows the
51//! error state.
52
53mod assets;
54mod markstream;
55mod plugin;
56mod script;
57pub mod sse;
58#[cfg(test)]
59mod test_support;
60mod vendored;
61
62pub use assets::{ASSETS_NAMESPACE, MARKSTREAM_ASSETS, MARKSTREAM_VERSION, VUE_VERSION};
63pub use markstream::{
64 ALLOW_TRUSTED_META, HtmlPolicy, Markstream, Mode, Theme, markstream_allow_trusted,
65};
66pub use plugin::{MarkstreamPlugin, PLUGIN_NAME};
67pub use script::{markstream_head, markstream_preloads, markstream_script, markstream_stylesheet};
68
69/// Compiles the README code blocks as doctests.
70#[doc = include_str!("../README.md")]
71#[cfg(doctest)]
72pub struct ReadmeDoctests;