use serde::Serialize; use super::render_context::RenderContext; use crate::error::CustomError; use crate::intermediate::ISrcBlock; use crate::intermediate::ISrcSegment; use super::macros::render; #[derive(Debug, Serialize)] #[serde(tag = "type")] #[serde(rename = "src_block")] pub(crate) struct RenderSrcBlock { lines: Vec, language: Option, post_blank: organic::types::PostBlank, } #[derive(Debug, Serialize)] pub(crate) struct RenderSrcLine { children: Vec, } #[derive(Debug, Serialize)] #[serde(tag = "type")] pub(crate) enum RenderSrcSegment { #[serde(rename = "raw_text")] RawText { content: String }, #[serde(rename = "highlight_start")] HighlightStart { name: String }, #[serde(rename = "highlight_end")] HighlightEnd, } render!(RenderSrcBlock, ISrcBlock, original, _render_context, { let lines = original .lines .iter() .map(|original_line| { let children = original_line .children .iter() .map(|original_segment| match original_segment { ISrcSegment::RawText(body) => RenderSrcSegment::RawText { content: body.to_owned(), }, ISrcSegment::HighlightStart { name } => RenderSrcSegment::HighlightStart { name: css_safe_name(name), }, ISrcSegment::HighlightEnd => RenderSrcSegment::HighlightEnd, }) .collect(); RenderSrcLine { children } }) .collect(); Ok(RenderSrcBlock { lines, language: original.language.clone(), post_blank: original.post_blank, }) }); fn css_safe_name(inp: S) -> String where std::string::String: From, { let inp: String = inp.into(); inp.replace(".", "_") }