diff options
author | David Tolnay <dtolnay@gmail.com> | 2020-11-08 21:58:53 -0800 |
---|---|---|
committer | David Tolnay <dtolnay@gmail.com> | 2020-11-08 22:26:30 -0800 |
commit | c712ba7aabcedb5b8423ff19fd26fd0e95802e15 (patch) | |
tree | 28e0d714c726922d63d6d552d027ed1b67a73574 /src | |
parent | eaa69142059c04ca14aa23ffeb1fe1469663403f (diff) |
Escape <> in rendered toc
Diffstat (limited to 'src')
-rw-r--r-- | src/renderer/html_handlebars/helpers/toc.rs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/renderer/html_handlebars/helpers/toc.rs b/src/renderer/html_handlebars/helpers/toc.rs index 7a5d8a28..bde5383e 100644 --- a/src/renderer/html_handlebars/helpers/toc.rs +++ b/src/renderer/html_handlebars/helpers/toc.rs @@ -1,4 +1,5 @@ use std::collections::BTreeMap; +use std::io; use std::path::Path; use crate::utils; @@ -102,7 +103,7 @@ impl HelperDef for RenderToc { // Part title if let Some(title) = item.get("part") { out.write("<li class=\"part-title\">")?; - out.write(title)?; + write_escaped(out, title)?; out.write("</li>")?; continue; } @@ -160,7 +161,7 @@ impl HelperDef for RenderToc { html::push_html(&mut markdown_parsed_name, parser); // write to the handlebars template - out.write(&markdown_parsed_name)?; + write_escaped(out, &markdown_parsed_name)?; } if path_exists { @@ -204,3 +205,18 @@ fn write_li_open_tag( li.push_str("\">"); out.write(&li) } + +fn write_escaped(out: &mut dyn Output, mut title: &str) -> io::Result<()> { + let needs_escape: &[char] = &['<', '>']; + while let Some(next) = title.find(needs_escape) { + out.write(&title[..next])?; + match title.as_bytes()[next] { + b'<' => out.write("<")?, + b'>' => out.write(">")?, + _ => unreachable!(), + } + title = &title[next + 1..]; + } + out.write(title)?; + Ok(()) +} |