atproto blogging
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}