mdbook_preprocessor_utils/
html.rs

1use anyhow::Result;
2use serde::Serialize;
3use std::fmt::Write;
4
5#[derive(Default)]
6pub struct HtmlElementBuilder {
7  html: String,
8}
9
10impl HtmlElementBuilder {
11  pub fn new() -> Self {
12    let html = String::from("<div");
13    HtmlElementBuilder { html }
14  }
15
16  pub fn attr(&mut self, key: &str, value: &str) -> &mut Self {
17    let value_escaped = html_escape::encode_double_quoted_attribute(&value);
18    write!(&mut self.html, r#" {key}="{value_escaped}""#).unwrap();
19    self
20  }
21
22  pub fn data(&mut self, key: &str, value: impl Serialize) -> Result<&mut Self> {
23    let value_json = serde_json::to_string(&value)?;
24    let value_escaped = html_escape::encode_double_quoted_attribute(&value_json);
25    write!(&mut self.html, r#" data-{key}="{value_escaped}""#).unwrap();
26    Ok(self)
27  }
28
29  pub fn finish(mut self) -> String {
30    write!(&mut self.html, "></div>").unwrap();
31    self.html
32  }
33}