Skip to main content

oino_ui/extras/
markdown.rs

1//! `Markdown` node (§4.5.2).
2
3use serde::{Deserialize, Serialize};
4
5use crate::node::{Common, IntoNode, Node};
6
7/// Markdown text (§4.5.2). TUI: pulldown-cmark; app: `renderChatMarkdown`
8/// (marked + `DOMPurify`). Links open through `openUrl`, never navigate the webview.
9#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct Markdown {
12    /// Common node props (`key`, `style`, `block`, `fallback`).
13    #[serde(flatten)]
14    pub common: Common,
15    /// Markdown source (≤ 256 KiB, §4.8).
16    pub source: String,
17}
18
19impl Markdown {
20    /// A markdown node.
21    #[must_use]
22    pub fn new(source: impl Into<String>) -> Self {
23        Self {
24            common: Common::new(),
25            source: source.into(),
26        }
27    }
28}
29
30impl IntoNode for Markdown {}
31impl From<Markdown> for Node {
32    fn from(m: Markdown) -> Self {
33        Node::Markdown(m)
34    }
35}