html: extract Writer::render_{event, epilogue}
This commit is contained in:
parent
3d1b5f2115
commit
8eafdf073b
1 changed files with 344 additions and 329 deletions
55
src/html.rs
55
src/html.rs
|
@ -74,14 +74,21 @@ impl Default for Writer {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Writer {
|
impl Writer {
|
||||||
fn write<'s>(
|
fn write<'s, I, W>(&mut self, mut events: I, mut out: W) -> std::fmt::Result
|
||||||
&mut self,
|
where
|
||||||
events: impl Iterator<Item = Event<'s>>,
|
I: Iterator<Item = Event<'s>>,
|
||||||
mut out: impl std::fmt::Write,
|
W: std::fmt::Write,
|
||||||
) -> std::fmt::Result {
|
{
|
||||||
for e in events {
|
events.try_for_each(|e| self.render_event(&e, &mut out))?;
|
||||||
|
self.render_epilogue(&mut out)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render_event<'s, W>(&mut self, e: &Event<'s>, mut out: W) -> std::fmt::Result
|
||||||
|
where
|
||||||
|
W: std::fmt::Write,
|
||||||
|
{
|
||||||
if matches!(&e, Event::Blankline | Event::Escape) {
|
if matches!(&e, Event::Blankline | Event::Escape) {
|
||||||
continue;
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let close_para = self.close_para;
|
let close_para = self.close_para;
|
||||||
|
@ -99,7 +106,7 @@ impl Writer {
|
||||||
out.write_char('\n')?;
|
out.write_char('\n')?;
|
||||||
}
|
}
|
||||||
if self.img_alt_text > 0 && !matches!(c, Container::Image(..)) {
|
if self.img_alt_text > 0 && !matches!(c, Container::Image(..)) {
|
||||||
continue;
|
return Ok(());
|
||||||
}
|
}
|
||||||
match &c {
|
match &c {
|
||||||
Container::Blockquote => out.write_str("<blockquote")?,
|
Container::Blockquote => out.write_str("<blockquote")?,
|
||||||
|
@ -139,7 +146,7 @@ impl Writer {
|
||||||
out.write_str("<section role=\"doc-endnotes\">\n<hr>\n<ol>\n")?;
|
out.write_str("<section role=\"doc-endnotes\">\n<hr>\n<ol>\n")?;
|
||||||
}
|
}
|
||||||
write!(out, "<li id=\"fn{}\">", number)?;
|
write!(out, "<li id=\"fn{}\">", number)?;
|
||||||
continue;
|
return Ok(());
|
||||||
}
|
}
|
||||||
Container::Table => out.write_str("<table")?,
|
Container::Table => out.write_str("<table")?,
|
||||||
Container::TableRow { .. } => out.write_str("<tr")?,
|
Container::TableRow { .. } => out.write_str("<tr")?,
|
||||||
|
@ -147,7 +154,7 @@ impl Writer {
|
||||||
Container::Div { .. } => out.write_str("<div")?,
|
Container::Div { .. } => out.write_str("<div")?,
|
||||||
Container::Paragraph => {
|
Container::Paragraph => {
|
||||||
if matches!(self.list_tightness.last(), Some(true)) {
|
if matches!(self.list_tightness.last(), Some(true)) {
|
||||||
continue;
|
return Ok(());
|
||||||
}
|
}
|
||||||
out.write_str("<p")?;
|
out.write_str("<p")?;
|
||||||
}
|
}
|
||||||
|
@ -175,7 +182,7 @@ impl Writer {
|
||||||
if self.img_alt_text == 1 {
|
if self.img_alt_text == 1 {
|
||||||
out.write_str("<img")?;
|
out.write_str("<img")?;
|
||||||
} else {
|
} else {
|
||||||
continue;
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Container::Verbatim => out.write_str("<code")?,
|
Container::Verbatim => out.write_str("<code")?,
|
||||||
|
@ -185,7 +192,7 @@ impl Writer {
|
||||||
} else {
|
} else {
|
||||||
Raw::Other
|
Raw::Other
|
||||||
};
|
};
|
||||||
continue;
|
return Ok(());
|
||||||
}
|
}
|
||||||
Container::Subscript => out.write_str("<sub")?,
|
Container::Subscript => out.write_str("<sub")?,
|
||||||
Container::Superscript => out.write_str("<sup")?,
|
Container::Superscript => out.write_str("<sup")?,
|
||||||
|
@ -293,7 +300,7 @@ impl Writer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Container::Math { display } => {
|
Container::Math { display } => {
|
||||||
out.write_str(if display { r#">\["# } else { r#">\("# })?;
|
out.write_str(if *display { r#">\["# } else { r#">\("# })?;
|
||||||
}
|
}
|
||||||
_ => out.write_char('>')?,
|
_ => out.write_char('>')?,
|
||||||
}
|
}
|
||||||
|
@ -303,7 +310,7 @@ impl Writer {
|
||||||
out.write_char('\n')?;
|
out.write_char('\n')?;
|
||||||
}
|
}
|
||||||
if self.img_alt_text > 0 && !matches!(c, Container::Image(..)) {
|
if self.img_alt_text > 0 && !matches!(c, Container::Image(..)) {
|
||||||
continue;
|
return Ok(());
|
||||||
}
|
}
|
||||||
match c {
|
match c {
|
||||||
Container::Blockquote => out.write_str("</blockquote>")?,
|
Container::Blockquote => out.write_str("</blockquote>")?,
|
||||||
|
@ -342,7 +349,7 @@ impl Writer {
|
||||||
Container::Div { .. } => out.write_str("</div>")?,
|
Container::Div { .. } => out.write_str("</div>")?,
|
||||||
Container::Paragraph => {
|
Container::Paragraph => {
|
||||||
if matches!(self.list_tightness.last(), Some(true)) {
|
if matches!(self.list_tightness.last(), Some(true)) {
|
||||||
continue;
|
return Ok(());
|
||||||
}
|
}
|
||||||
if self.footnote_number.is_none() {
|
if self.footnote_number.is_none() {
|
||||||
out.write_str("</p>")?;
|
out.write_str("</p>")?;
|
||||||
|
@ -362,7 +369,7 @@ impl Writer {
|
||||||
if self.img_alt_text == 1 {
|
if self.img_alt_text == 1 {
|
||||||
if !src.is_empty() {
|
if !src.is_empty() {
|
||||||
out.write_str(r#"" src=""#)?;
|
out.write_str(r#"" src=""#)?;
|
||||||
write_attr(&src, &mut out)?;
|
write_attr(src, &mut out)?;
|
||||||
}
|
}
|
||||||
out.write_str(r#"">"#)?;
|
out.write_str(r#"">"#)?;
|
||||||
}
|
}
|
||||||
|
@ -370,7 +377,7 @@ impl Writer {
|
||||||
}
|
}
|
||||||
Container::Verbatim => out.write_str("</code>")?,
|
Container::Verbatim => out.write_str("</code>")?,
|
||||||
Container::Math { display } => {
|
Container::Math { display } => {
|
||||||
out.write_str(if display {
|
out.write_str(if *display {
|
||||||
r#"\]</span>"#
|
r#"\]</span>"#
|
||||||
} else {
|
} else {
|
||||||
r#"\)</span>"#
|
r#"\)</span>"#
|
||||||
|
@ -389,9 +396,9 @@ impl Writer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::Str(s) => match self.raw {
|
Event::Str(s) => match self.raw {
|
||||||
Raw::None if self.img_alt_text > 0 => write_attr(&s, &mut out)?,
|
Raw::None if self.img_alt_text > 0 => write_attr(s, &mut out)?,
|
||||||
Raw::None => write_text(&s, &mut out)?,
|
Raw::None => write_text(s, &mut out)?,
|
||||||
Raw::Html => out.write_str(&s)?,
|
Raw::Html => out.write_str(s)?,
|
||||||
Raw::Other => {}
|
Raw::Other => {}
|
||||||
},
|
},
|
||||||
Event::FootnoteReference(_tag, number) => {
|
Event::FootnoteReference(_tag, number) => {
|
||||||
|
@ -426,11 +433,19 @@ impl Writer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.first_line = false;
|
self.first_line = false;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn render_epilogue<W>(&mut self, mut out: W) -> std::fmt::Result
|
||||||
|
where
|
||||||
|
W: std::fmt::Write,
|
||||||
|
{
|
||||||
if self.encountered_footnote {
|
if self.encountered_footnote {
|
||||||
out.write_str("\n</ol>\n</section>")?;
|
out.write_str("\n</ol>\n</section>")?;
|
||||||
}
|
}
|
||||||
out.write_char('\n')?;
|
out.write_char('\n')?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue