at main 69 lines 2.5 kB view raw
1use super::{FacetFeature, FacetOutput}; 2use std::fmt::Write; 3 4pub struct MarkdownFacetOutput<W: Write> { 5 writer: W, 6} 7 8impl<W: Write> MarkdownFacetOutput<W> { 9 pub fn new(writer: W) -> Self { 10 Self { writer } 11 } 12 13 pub fn into_inner(self) -> W { 14 self.writer 15 } 16} 17 18impl<W: Write> FacetOutput for MarkdownFacetOutput<W> { 19 type Error = std::fmt::Error; 20 21 fn write_text(&mut self, text: &str) -> Result<(), Self::Error> { 22 self.writer.write_str(text) 23 } 24 25 fn start_feature(&mut self, feature: &FacetFeature<'_>) -> Result<(), Self::Error> { 26 match feature { 27 FacetFeature::Bold => write!(self.writer, "**"), 28 FacetFeature::Italic => write!(self.writer, "_"), 29 FacetFeature::Code => write!(self.writer, "`"), 30 FacetFeature::Strikethrough => write!(self.writer, "~~"), 31 FacetFeature::Highlight => write!(self.writer, "=="), 32 FacetFeature::Link { .. } 33 | FacetFeature::DidMention { .. } 34 | FacetFeature::AtMention { .. } 35 | FacetFeature::Tag { .. } => write!(self.writer, "["), 36 // No markdown equivalent 37 FacetFeature::Underline | FacetFeature::Id { .. } => Ok(()), 38 } 39 } 40 41 fn end_feature(&mut self, feature: &FacetFeature<'_>) -> Result<(), Self::Error> { 42 match feature { 43 FacetFeature::Bold => write!(self.writer, "**"), 44 FacetFeature::Italic => write!(self.writer, "_"), 45 FacetFeature::Code => write!(self.writer, "`"), 46 FacetFeature::Strikethrough => write!(self.writer, "~~"), 47 FacetFeature::Highlight => write!(self.writer, "=="), 48 FacetFeature::Link { uri } => write!(self.writer, "]({})", uri), 49 FacetFeature::DidMention { did } => { 50 write!(self.writer, "](https://bsky.app/profile/{})", did) 51 } 52 FacetFeature::AtMention { at_uri } => write!(self.writer, "]({})", at_uri), 53 FacetFeature::Tag { tag } => { 54 write!(self.writer, "](https://bsky.app/hashtag/{})", tag) 55 } 56 // No markdown equivalent 57 FacetFeature::Underline | FacetFeature::Id { .. } => Ok(()), 58 } 59 } 60} 61 62pub fn render_faceted_markdown( 63 text: &str, 64 facets: &[super::NormalizedFacet<'_>], 65) -> Result<String, std::fmt::Error> { 66 let mut output = MarkdownFacetOutput::new(String::new()); 67 super::process_faceted_text(text, facets, &mut output)?; 68 Ok(output.into_inner()) 69}