diff --git a/src/export/html.rs b/src/export/html.rs
index 3a3b264..dc771fb 100644
--- a/src/export/html.rs
+++ b/src/export/html.rs
@@ -1,11 +1,13 @@
use rowan::{NodeOrToken, WalkEvent};
use std::cmp::min;
use std::fmt;
+use std::fmt::Write as _;
use super::TraversalContext;
use super::Traverser;
use crate::ast::*;
use crate::syntax::SyntaxToken;
+use crate::SyntaxKind;
/// A wrapper for escaping sensitive characters in html.
///
@@ -38,7 +40,7 @@ impl> fmt::Display for HtmlEscape {
b'&' => write!(f, "&")?,
b'\'' => write!(f, "'")?,
b'"' => write!(f, """)?,
- _ => unreachable!(),
+ _ => {}
}
}
@@ -239,15 +241,14 @@ impl Traverser for HtmlExport {
let path = path.as_ref().map(|path| path.text()).unwrap_or_default();
if link.is_image() {
- self.output += &format!(r#"
"#, HtmlEscape(path));
+ let _ = write!(&mut self.output, r#"
"#, HtmlEscape(path));
return ctx.skip();
}
- self.output += &format!(r#""#, HtmlEscape(path));
+ let _ = write!(&mut self.output, r#""#, HtmlEscape(path));
if !link.has_description() {
- self.output += &HtmlEscape(path).to_string();
- self.output += "";
+ let _ = write!(&mut self.output, "{}", HtmlEscape(path));
return ctx.skip();
}
}
@@ -302,12 +303,8 @@ impl Traverser for HtmlExport {
}
WalkEvent::Leave(_) => {
match self.table_row {
- TableRow::Body => {
- self.output += "";
- }
- TableRow::Header => {
- self.output += "";
- }
+ TableRow::Body => self.output += "",
+ TableRow::Header => self.output += "",
_ => {}
}
self.output += "";
@@ -383,64 +380,111 @@ impl Traverser for HtmlExport {
fn headline(&mut self, event: WalkEvent<&Headline>, ctx: &mut TraversalContext) {
if let WalkEvent::Enter(headline) = event {
let level = min(headline.level(), 6);
- self.output += &format!("");
+ let _ = write!(&mut self.output, "");
for elem in headline.title() {
match elem {
NodeOrToken::Node(node) => self.node(node, ctx),
NodeOrToken::Token(token) => self.token(token, ctx),
}
}
- self.output += &format!("");
+ let _ = write!(&mut self.output, "");
}
}
- #[tracing::instrument(skip(self, _ctx))]
- fn inline_src(&mut self, _event: WalkEvent<&InlineSrc>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn inline_src(&mut self, _event: WalkEvent<&InlineSrc>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn inline_call(&mut self, _event: WalkEvent<&InlineCall>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn inline_call(&mut self, _event: WalkEvent<&InlineCall>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn special_block(&mut self, _event: WalkEvent<&SpecialBlock>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn special_block(&mut self, _event: WalkEvent<&SpecialBlock>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn export_block(&mut self, _event: WalkEvent<&ExportBlock>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn export_block(&mut self, _event: WalkEvent<&ExportBlock>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn source_block(&mut self, _event: WalkEvent<&SourceBlock>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn source_block(&mut self, _event: WalkEvent<&SourceBlock>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn babel_call(&mut self, _event: WalkEvent<&BabelCall>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn babel_call(&mut self, _event: WalkEvent<&BabelCall>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn clock(&mut self, _event: WalkEvent<&Clock>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn clock(&mut self, _event: WalkEvent<&Clock>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn cookie(&mut self, _event: WalkEvent<&Cookie>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn cookie(&mut self, _event: WalkEvent<&Cookie>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn radio_target(&mut self, _event: WalkEvent<&RadioTarget>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn radio_target(&mut self, _event: WalkEvent<&RadioTarget>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn drawer(&mut self, _event: WalkEvent<&Drawer>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn drawer(&mut self, _event: WalkEvent<&Drawer>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn dyn_block(&mut self, _event: WalkEvent<&DynBlock>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn dyn_block(&mut self, _event: WalkEvent<&DynBlock>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn fn_def(&mut self, _event: WalkEvent<&FnDef>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn fn_def(&mut self, _event: WalkEvent<&FnDef>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn fn_ref(&mut self, _event: WalkEvent<&FnRef>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn fn_ref(&mut self, _event: WalkEvent<&FnRef>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn macros(&mut self, _event: WalkEvent<&Macros>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn macros(&mut self, _event: WalkEvent<&Macros>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn timestamp(&mut self, _event: WalkEvent<&Timestamp>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn timestamp(&mut self, event: WalkEvent<&Timestamp>, ctx: &mut TraversalContext) {
+ if let WalkEvent::Enter(t) = event {
+ self.output += r#""#;
+ for e in t.syntax.children_with_tokens() {
+ match e {
+ NodeOrToken::Token(t) if t.kind() == SyntaxKind::MINUS2 => {
+ self.output += "–";
+ }
+ NodeOrToken::Token(t) => {
+ self.output += t.text();
+ }
+ _ => {}
+ }
+ }
+ self.output += r#""#;
+ ctx.skip();
+ }
+ }
- #[tracing::instrument(skip(self, _ctx))]
- fn target(&mut self, _event: WalkEvent<&Target>, _ctx: &mut TraversalContext) {}
+ #[tracing::instrument(skip(self, ctx))]
+ fn target(&mut self, _event: WalkEvent<&Target>, ctx: &mut TraversalContext) {
+ ctx.skip();
+ }
#[tracing::instrument(skip(self, ctx))]
fn latex_fragment(&mut self, event: WalkEvent<&LatexFragment>, ctx: &mut TraversalContext) {