From 3d1b5f2115fae0ad929a39ed4b44cc4bd8173497 Mon Sep 17 00:00:00 2001
From: Noah Hellman
out.write_str("{ self.list_tightness.push(*tight); match kind { - ListKind::Unordered | ListKind::Task => { - self.out.write_str("out.write_str("
{ - self.out.write_str("
1 { - write!(self.out, r#" start="{}""#, start)?; + write!(out, r#" start="{}""#, start)?; } if let Some(ty) = match numbering { Decimal => None, @@ -121,65 +121,64 @@ impl<'s, I: Iterator
\n")?; } - self.out.write_char('\n')?; + out.write_char('\n')?; Ok(()) } - - fn write_escape(&mut self, mut s: &str, escape_quotes: bool) -> std::fmt::Result { - let mut ent = ""; - while let Some(i) = s.find(|c| { - match c { - '<' => Some("<"), - '>' => Some(">"), - '&' => Some("&"), - '"' if escape_quotes => Some("""), - _ => None, - } - .map_or(false, |s| { - ent = s; - true - }) - }) { - self.out.write_str(&s[..i])?; - self.out.write_str(ent)?; - s = &s[i + 1..]; - } - self.out.write_str(s) - } - - fn write_text(&mut self, s: &str) -> std::fmt::Result { - self.write_escape(s, false) - } - - fn write_attr(&mut self, s: &str) -> std::fmt::Result { - self.write_escape(s, true) - } +} + +fn write_text- >, W: std::fmt::Write> Writer<'s, I, W> { RomanLower => Some('i'), RomanUpper => Some('I'), } { - write!(self.out, r#" type="{}""#, ty)?; + write!(out, r#" type="{}""#, ty)?; } } } } Container::ListItem | Container::TaskListItem { .. } => { - self.out.write_str("
- self.out.write_str("
self.out.write_str("
- out.write_str("
out.write_str("
- { assert!(self.footnote_number.is_none()); self.footnote_number = Some((*number).try_into().unwrap()); if !self.encountered_footnote { self.encountered_footnote = true; - self.out - .write_str("
\n ")?; + out.write_str("\n
\n\n")?; + out.write_str("
\n\n ")?, + Container::Div { .. } => out.write_str("")?, Container::Paragraph => { if matches!(self.list_tightness.last(), Some(true)) { continue; } if self.footnote_number.is_none() { - self.out.write_str("")?; + out.write_str("")?; } else { self.close_para = true; } } - Container::Heading { level, .. } => write!(self.out, "", level)?, - Container::TableCell { head: false, .. } => self.out.write_str("")?, - Container::TableCell { head: true, .. } => self.out.write_str("")?, - Container::Caption => self.out.write_str("")?, - Container::DescriptionTerm => self.out.write_str("")?, - Container::CodeBlock { .. } => self.out.write_str("")?, - Container::Span => self.out.write_str("")?, - Container::Link(..) => self.out.write_str("")?, + Container::Heading { level, .. } => write!(out, "", level)?, + Container::TableCell { head: false, .. } => out.write_str("")?, + Container::TableCell { head: true, .. } => out.write_str("")?, + Container::Caption => out.write_str("")?, + Container::DescriptionTerm => out.write_str("")?, + Container::CodeBlock { .. } => out.write_str("")?, + Container::Span => out.write_str("")?, + Container::Link(..) => out.write_str("")?, Container::Image(src, ..) => { if self.img_alt_text == 1 { if !src.is_empty() { - self.out.write_str(r#"" src=""#)?; - self.write_attr(&src)?; + out.write_str(r#"" src=""#)?; + write_attr(&src, &mut out)?; } - self.out.write_str(r#"">"#)?; + out.write_str(r#"">"#)?; } self.img_alt_text -= 1; } - Container::Verbatim => self.out.write_str("")?, + Container::Verbatim => out.write_str("")?, Container::Math { display } => { - self.out.write_str(if display { + out.write_str(if display { r#"\]"# } else { r#"\)"# @@ -380,88 +379,97 @@ impl<'s, I: Iterator
\n\n")?; } - write!(self.out, "
- ", number)?; + write!(out, "
- ", number)?; continue; } - Container::Table => self.out.write_str("
- >, W: std::fmt::Write> Writer<'s, I, W> { Container::RawBlock { .. } | Container::RawInline { .. } => { self.raw = Raw::None; } - Container::Subscript => self.out.write_str("")?, - Container::Superscript => self.out.write_str("")?, - Container::Insert => self.out.write_str("")?, - Container::Delete => self.out.write_str("")?, - Container::Strong => self.out.write_str("")?, - Container::Emphasis => self.out.write_str("")?, - Container::Mark => self.out.write_str("")?, + Container::Subscript => out.write_str("")?, + Container::Superscript => out.write_str("")?, + Container::Insert => out.write_str("")?, + Container::Delete => out.write_str("")?, + Container::Strong => out.write_str("")?, + Container::Emphasis => out.write_str("")?, + Container::Mark => out.write_str("")?, } } Event::Str(s) => match self.raw { - Raw::None if self.img_alt_text > 0 => self.write_attr(&s)?, - Raw::None => self.write_text(&s)?, - Raw::Html => self.out.write_str(&s)?, + Raw::None if self.img_alt_text > 0 => write_attr(&s, &mut out)?, + Raw::None => write_text(&s, &mut out)?, + Raw::Html => out.write_str(&s)?, Raw::Other => {} }, Event::FootnoteReference(_tag, number) => { if self.img_alt_text == 0 { write!( - self.out, + out, r##"{}"##, number, number, number )?; } } - Event::Symbol(sym) => write!(self.out, ":{}:", sym)?, - Event::LeftSingleQuote => self.out.write_str("‘")?, - Event::RightSingleQuote => self.out.write_str("’")?, - Event::LeftDoubleQuote => self.out.write_str("“")?, - Event::RightDoubleQuote => self.out.write_str("”")?, - Event::Ellipsis => self.out.write_str("…")?, - Event::EnDash => self.out.write_str("–")?, - Event::EmDash => self.out.write_str("—")?, - Event::NonBreakingSpace => self.out.write_str(" ")?, - Event::Hardbreak => self.out.write_str("
\n")?, - Event::Softbreak => self.out.write_char('\n')?, + Event::Symbol(sym) => write!(out, ":{}:", sym)?, + Event::LeftSingleQuote => out.write_str("‘")?, + Event::RightSingleQuote => out.write_str("’")?, + Event::LeftDoubleQuote => out.write_str("“")?, + Event::RightDoubleQuote => out.write_str("”")?, + Event::Ellipsis => out.write_str("…")?, + Event::EnDash => out.write_str("–")?, + Event::EmDash => out.write_str("—")?, + Event::NonBreakingSpace => out.write_str(" ")?, + Event::Hardbreak => out.write_str("
\n")?, + Event::Softbreak => out.write_char('\n')?, Event::Escape | Event::Blankline => unreachable!("filtered out"), Event::ThematicBreak(attrs) => { - self.out.write_str("\n
")?; + out.write_str(">")?; } } self.first_line = false; } if self.encountered_footnote { - self.out.write_str("\n(s: &str, out: W) -> std::fmt::Result +where + W: std::fmt::Write, +{ + write_escape(s, false, out) +} + +fn write_attr (s: &str, out: W) -> std::fmt::Result +where + W: std::fmt::Write, +{ + write_escape(s, true, out) +} + +fn write_escape (mut s: &str, escape_quotes: bool, mut out: W) -> std::fmt::Result +where + W: std::fmt::Write, +{ + let mut ent = ""; + while let Some(i) = s.find(|c| { + match c { + '<' => Some("<"), + '>' => Some(">"), + '&' => Some("&"), + '"' if escape_quotes => Some("""), + _ => None, + } + .map_or(false, |s| { + ent = s; + true + }) + }) { + out.write_str(&s[..i])?; + out.write_str(ent)?; + s = &s[i + 1..]; + } + out.write_str(s) }