use super::{FacetFeature, FacetOutput}; use std::fmt::Write; pub struct HtmlFacetOutput { writer: W, } impl HtmlFacetOutput { pub fn new(writer: W) -> Self { Self { writer } } pub fn into_inner(self) -> W { self.writer } } impl FacetOutput for HtmlFacetOutput { type Error = std::fmt::Error; fn write_text(&mut self, text: &str) -> Result<(), Self::Error> { for c in text.chars() { match c { '&' => self.writer.write_str("&")?, '<' => self.writer.write_str("<")?, '>' => self.writer.write_str(">")?, _ => self.writer.write_char(c)?, } } Ok(()) } fn start_feature(&mut self, feature: &FacetFeature<'_>) -> Result<(), Self::Error> { match feature { FacetFeature::Bold => write!(self.writer, ""), FacetFeature::Italic => write!(self.writer, ""), FacetFeature::Code => write!(self.writer, ""), FacetFeature::Underline => write!(self.writer, ""), FacetFeature::Strikethrough => write!(self.writer, ""), FacetFeature::Highlight => write!(self.writer, ""), FacetFeature::Link { uri } => { write!(self.writer, " self.writer.write_str("%22")?, _ => self.writer.write_char(c)?, } } write!(self.writer, "\">") } FacetFeature::DidMention { did } => { write!( self.writer, "", did ) } FacetFeature::AtMention { at_uri } => { write!(self.writer, "", at_uri) } FacetFeature::Tag { tag } => { write!( self.writer, "", tag ) } FacetFeature::Id { id } => { if let Some(id) = id { write!(self.writer, "", id) } else { write!(self.writer, "") } } } } fn end_feature(&mut self, feature: &FacetFeature<'_>) -> Result<(), Self::Error> { match feature { FacetFeature::Bold => write!(self.writer, ""), FacetFeature::Italic => write!(self.writer, ""), FacetFeature::Code => write!(self.writer, ""), FacetFeature::Underline => write!(self.writer, ""), FacetFeature::Strikethrough => write!(self.writer, ""), FacetFeature::Highlight => write!(self.writer, ""), FacetFeature::Link { .. } | FacetFeature::DidMention { .. } | FacetFeature::AtMention { .. } | FacetFeature::Tag { .. } => write!(self.writer, ""), FacetFeature::Id { .. } => write!(self.writer, ""), } } } pub fn render_faceted_html( text: &str, facets: &[super::NormalizedFacet<'_>], ) -> Result { let mut output = HtmlFacetOutput::new(String::new()); super::process_faceted_text(text, facets, &mut output)?; Ok(output.into_inner()) }